root/src/txt-converter/login-converter.c @ 1

Revision 1, 6.6 kB (checked in by jinshiro, 17 years ago)
Line 
1// (c) eAthena Dev Team - Licensed under GNU GPL
2// For more information, see LICENCE in the main folder
3
4#include "../common/cbasetypes.h"
5#include "../common/mmo.h"
6#include "../common/core.h"
7#include "../common/db.h"
8#include "../common/showmsg.h"
9#include "../common/sql.h"
10#include "../common/malloc.h"
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15
16char login_account_id[256]="account_id";
17char login_userid[256]="userid";
18char login_user_pass[256]="user_pass";
19char login_db[256]="login";
20char globalreg_db[256]="global_reg_value";
21
22static DBMap* gm_account_db=NULL; // int account_id -> struct gm_account*
23
24int db_server_port = 3306;
25char db_server_ip[32] = "127.0.0.1";
26char db_server_id[32] = "ragnarok";
27char db_server_pw[32] = "ragnarok";
28char db_server_logindb[32] = "ragnarok";
29
30#define INTER_CONF_NAME "conf/inter_athena.conf"
31#define GM_ACCOUNT_NAME "conf/GM_account.txt"
32#define ACCOUNT_TXT_NAME "save/account.txt"
33//--------------------------------------------------------
34
35int isGM(int account_id)
36{
37        struct gm_account* p = (struct gm_account*)idb_get(gm_account_db,account_id);
38        return( p != NULL ) ? p->level : 0;
39}
40
41int read_gm_account()
42{
43        char line[8192];
44        struct gm_account *p;
45        FILE *fp;
46        int line_counter = 0, gm_counter = 0;
47       
48        ShowStatus("Starting reading gm_account\n");
49       
50        if( (fp = fopen(GM_ACCOUNT_NAME,"r")) == NULL )
51                return 1;
52       
53        gm_account_db = idb_alloc(DB_OPT_RELEASE_DATA);
54       
55        while(fgets(line,sizeof(line),fp))
56        {
57                line_counter++;
58                if ((line[0] == '/' && line[1] == '/') || line[0] == '\0' || line[0] == '\n' || line[0] == '\r')
59                        continue;
60               
61                p = (struct gm_account*)aMalloc(sizeof(struct gm_account));
62                if(p==NULL){
63                        ShowFatalError("gm_account: out of memory!\n");
64                        exit(EXIT_FAILURE);
65                }
66               
67                if(sscanf(line,"%d %d",&p->account_id,&p->level) != 2 || p->level <= 0) {
68                        ShowWarning("gm_account: unsupported data format [conf/GM_account.txt] on line %d\n", line_counter);
69                        continue;
70                }
71                else {
72                        if(p->level > 99)
73                                p->level = 99;
74                        p = (struct gm_account*)idb_put(gm_account_db,p->account_id,p);
75                        if( p )
76                                aFree(p);// old entry replaced
77                        gm_counter++;
78                        ShowInfo("GM ID: %d Level: %d\n",p->account_id,p->level);
79                }
80        }
81
82        fclose(fp);
83        ShowStatus("%d ID of gm_accounts read.\n", gm_counter);
84        return 0;
85}
86
87int convert_login(void)
88{
89        Sql* mysql_handle;
90        SqlStmt* stmt;
91        int line_counter = 0;
92        FILE *fp;
93        int account_id, logincount, user_level, state, n, i;
94        char line[2048], userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048];
95        int unban_time, expiration_time;
96        char dummy[2048];
97
98        mysql_handle = Sql_Malloc();
99        if ( SQL_ERROR == Sql_Connect(mysql_handle, db_server_id, db_server_pw, db_server_ip, db_server_port, db_server_logindb) )
100        {
101                Sql_ShowDebug(mysql_handle);
102                Sql_Free(mysql_handle);
103                exit(EXIT_FAILURE);
104        }
105        ShowStatus("Connect: Success!\n");
106       
107        ShowStatus("Convert start...\n");
108        fp = fopen(ACCOUNT_TXT_NAME,"r");
109        if(fp == NULL)
110                return 0;
111
112        while(fgets(line,sizeof(line),fp) != NULL)
113        {
114                line_counter++;
115                if(line[0]=='/' && line[1]=='/')
116                        continue;
117
118                i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t%[^\t]\t%[^\t]\t%d\t%[^\t]\t%[^\t]\t%d\t%[^\r\n]%n",
119                        &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
120                        email, error_message, &expiration_time, last_ip, memo, &unban_time, dummy, &n);
121
122                if (i < 13) {
123                        ShowWarning("Skipping incompatible data on line %d\n", line_counter);
124                        continue;
125                }
126
127                if (i > 13)
128                        ShowWarning("Reading login account variables is not implemented, data will be lost! (line %d)\n", line_counter);
129
130                user_level = isGM(account_id);
131                ShowInfo("Converting user (id: %d, name: %s, gm level: %d)\n", account_id, userid, user_level);
132               
133                stmt = SqlStmt_Malloc(mysql_handle);
134                if( SQL_ERROR == SqlStmt_Prepare(stmt, 
135                        "REPLACE INTO `login` "
136                        "(`account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level`, `error_message`, `expiration_time`, `last_ip`, `memo`, `unban_time`, `state`) "
137                        "VALUES "
138                        "(%d, ?, ?, '%s', '%c', %d, '%s', %d, '%s', %d, '%s', '%s', %d, %d)",
139                        account_id, lastlogin, sex, logincount, email, user_level, error_message, expiration_time, last_ip, memo, unban_time, state)
140                ||      SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_STRING, userid, strnlen(userid, 255))
141                ||      SQL_ERROR == SqlStmt_BindParam(stmt, 1, SQLDT_STRING, pass, strnlen(pass, 32))
142                ||      SQL_ERROR == SqlStmt_Execute(stmt) )
143                {
144                        SqlStmt_ShowDebug(stmt);
145                }
146                SqlStmt_Free(stmt);
147       
148                //TODO: parse the rest of the line to read the login-stored account variables, and import them to `global_reg_value`
149                //      then remove the 'dummy' buffer
150        }
151        fclose(fp);
152        Sql_Free(mysql_handle);
153
154        ShowStatus("Convert end...\n");
155
156        return 0;
157}
158
159int login_config_read(const char* cfgName)
160{
161        int i;
162        char line[1024], w1[1024], w2[1024];
163        FILE *fp;
164
165        ShowStatus("Start reading interserver configuration: %s\n", cfgName);
166
167        fp=fopen(cfgName,"r");
168        if(fp==NULL){
169                ShowError("File not found: %s\n", cfgName);
170                return 1;
171        }
172
173        while(fgets(line, sizeof(line), fp))
174        {
175                if(line[0] == '/' && line[1] == '/')
176                        continue;
177
178                i=sscanf(line,"%[^:]:%s", w1, w2);
179                if(i!=2)
180                        continue;
181
182                //add for DB connection
183                if(strcmpi(w1,"db_server_ip")==0){
184                        strcpy(db_server_ip, w2);
185                        ShowStatus("set db_server_ip : %s\n",w2);
186                }
187                else if(strcmpi(w1,"db_server_port")==0){
188                        db_server_port=atoi(w2);
189                        ShowStatus("set db_server_port : %s\n",w2);
190                }
191                else if(strcmpi(w1,"db_server_id")==0){
192                        strcpy(db_server_id, w2);
193                        ShowStatus("set db_server_id : %s\n",w2);
194                }
195                else if(strcmpi(w1,"db_server_pw")==0){
196                        strcpy(db_server_pw, w2);
197                        ShowStatus("set db_server_pw : %s\n",w2);
198                }
199                else if(strcmpi(w1,"db_server_logindb")==0){
200                        strcpy(db_server_logindb, w2);
201                        ShowStatus("set db_server_logindb : %s\n",w2);
202                }
203                //support the import command, just like any other config
204                else if(strcmpi(w1,"import")==0){
205                        login_config_read(w2);
206                }
207        }
208        fclose(fp);
209        ShowStatus("End reading interserver configuration...\n");
210        return 0;
211}
212
213int do_init(int argc, char** argv)
214{
215        int input;
216        login_config_read( (argc > 1) ? argv[1] : INTER_CONF_NAME );
217        read_gm_account();
218
219        ShowInfo("\nWarning : Make sure you backup your databases before continuing!\n");
220        ShowInfo("\nDo you wish to convert your Login Database to SQL? (y/n) : ");
221        input = getchar();
222        if(input == 'y' || input == 'Y')
223                convert_login();
224        return 0;
225}
226
227void do_final(void)
228{
229        if( gm_account_db )
230        {
231                db_destroy(gm_account_db);
232                gm_account_db = NULL;
233        }
234}
Note: See TracBrowser for help on using the browser.