From 1624d1d57db3cfde3b4f42a55580f5a1e742f28e Mon Sep 17 00:00:00 2001 From: ultramage Date: Sat, 26 Jul 2008 20:45:57 +0000 Subject: Merged the /loginmerge branch (topic:192754) * the login server storage, ipban and logging systems have been abstracted and now provide a common interface; the rest has been merged into a single login server core (no more login/login_sql duplicity) * storage systems are now added via compiler options (WITH_SQL / WITH_TXT) * multiple storage engines can be compiled in at the same time, and the config option account.engine defines which one will be used. * due to MySQL autoincrement limitations, accounts with id '0' will not be supported; account IDs from this point on should start from '1'. * login_log() functions now again record IP addresses in dotted format, not as 4-byte integers (undo from r6868). * removed config options that defined column names in the login table * removed `memo` and `error message` columns from login db/savefile * moved `loginlog` table to the logs database * added sql files upgrade_svn12975.sql and upgrade_svn12975_log.sql * due to changes to the login table layout, I added an !optional! sql file (upgrade_svn12975_view.sql) that will provide a certain degree of backwards compatibility with existing software; read the instructions inside carefully! * moved third-party includes/libs to a separate directory * updated project files / makefiles Changed the way GM levels are handled * removed conf/gm_account.txt * added the gm level column to the txt savefile (after 'email' column) * gm level information is now transferred along with account data For open problems see bugreport:1889. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@13000 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/txt-converter/login-converter.c | 205 ++++++++---------------------------- 1 file changed, 41 insertions(+), 164 deletions(-) (limited to 'src/txt-converter') diff --git a/src/txt-converter/login-converter.c b/src/txt-converter/login-converter.c index edd59d77b..78717287d 100644 --- a/src/txt-converter/login-converter.c +++ b/src/txt-converter/login-converter.c @@ -1,157 +1,50 @@ // (c) eAthena Dev Team - Licensed under GNU GPL // For more information, see LICENCE in the main folder +#define WITH_TXT +#define WITH_SQL + #include "../common/cbasetypes.h" -#include "../common/mmo.h" +#include "../common/mmo.h" // struct mmo_account #include "../common/core.h" -#include "../common/db.h" #include "../common/showmsg.h" -#include "../common/sql.h" -#include "../common/malloc.h" - +#include "../login/account.h" #include -#include #include -char login_account_id[256]="account_id"; -char login_userid[256]="userid"; -char login_user_pass[256]="user_pass"; -char login_db[256]="login"; -char globalreg_db[256]="global_reg_value"; - -static DBMap* gm_account_db=NULL; // int account_id -> struct gm_account* +#define LOGIN_CONF_NAME "conf/login_athena.conf" -int db_server_port = 3306; -char db_server_ip[32] = "127.0.0.1"; -char db_server_id[32] = "ragnarok"; -char db_server_pw[32] = "ragnarok"; -char db_server_logindb[32] = "ragnarok"; +AccountDB* txtdb = NULL; +AccountDB* sqldb = NULL; -#define INTER_CONF_NAME "conf/inter_athena.conf" -#define GM_ACCOUNT_NAME "conf/GM_account.txt" -#define ACCOUNT_TXT_NAME "save/account.txt" //-------------------------------------------------------- -int isGM(int account_id) -{ - struct gm_account* p = (struct gm_account*)idb_get(gm_account_db,account_id); - return( p != NULL ) ? p->level : 0; -} - -int read_gm_account() -{ - char line[8192]; - struct gm_account *p; - FILE *fp; - int line_counter = 0, gm_counter = 0; - - ShowStatus("Starting reading gm_account\n"); - - if( (fp = fopen(GM_ACCOUNT_NAME,"r")) == NULL ) - return 1; - - gm_account_db = idb_alloc(DB_OPT_RELEASE_DATA); - - while(fgets(line,sizeof(line),fp)) - { - line_counter++; - if ((line[0] == '/' && line[1] == '/') || line[0] == '\0' || line[0] == '\n' || line[0] == '\r') - continue; - - p = (struct gm_account*)aMalloc(sizeof(struct gm_account)); - if(p==NULL){ - ShowFatalError("gm_account: out of memory!\n"); - exit(EXIT_FAILURE); - } - - if(sscanf(line,"%d %d",&p->account_id,&p->level) != 2 || p->level <= 0) { - ShowWarning("gm_account: unsupported data format [conf/GM_account.txt] on line %d\n", line_counter); - continue; - } - else { - if(p->level > 99) - p->level = 99; - p = (struct gm_account*)idb_put(gm_account_db,p->account_id,p); - if( p ) - aFree(p);// old entry replaced - gm_counter++; - ShowInfo("GM ID: %d Level: %d\n",p->account_id,p->level); - } - } - - fclose(fp); - ShowStatus("%d ID of gm_accounts read.\n", gm_counter); - return 0; -} - int convert_login(void) { - Sql* mysql_handle; - SqlStmt* stmt; - int line_counter = 0; - FILE *fp; - int account_id, logincount, user_level, state, n, i; - char line[2048], userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048]; - int unban_time, expiration_time; - char dummy[2048]; + AccountDBIterator* iter; + struct mmo_account acc; - mysql_handle = Sql_Malloc(); - if ( SQL_ERROR == Sql_Connect(mysql_handle, db_server_id, db_server_pw, db_server_ip, db_server_port, db_server_logindb) ) + if( !txtdb->init(txtdb) || !sqldb->init(sqldb) ) { - Sql_ShowDebug(mysql_handle); - Sql_Free(mysql_handle); - exit(EXIT_FAILURE); - } - ShowStatus("Connect: Success!\n"); - - ShowStatus("Convert start...\n"); - fp = fopen(ACCOUNT_TXT_NAME,"r"); - if(fp == NULL) + ShowFatalError("Initialization failed, unable to start conversion.\n"); return 0; + } - while(fgets(line,sizeof(line),fp) != NULL) - { - line_counter++; - if(line[0]=='/' && line[1]=='/') - continue; - - 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", - &account_id, userid, pass, lastlogin, &sex, &logincount, &state, - email, error_message, &expiration_time, last_ip, memo, &unban_time, dummy, &n); + ShowStatus("Conversion started...\n"); + //TODO: do some counting & statistics - if (i < 13) { - ShowWarning("Skipping incompatible data on line %d\n", line_counter); - continue; - } - - if (i > 13) - ShowWarning("Reading login account variables is not implemented, data will be lost! (line %d)\n", line_counter); - - user_level = isGM(account_id); - ShowInfo("Converting user (id: %d, name: %s, gm level: %d)\n", account_id, userid, user_level); - - stmt = SqlStmt_Malloc(mysql_handle); - if( SQL_ERROR == SqlStmt_Prepare(stmt, - "REPLACE INTO `login` " - "(`account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level`, `error_message`, `expiration_time`, `last_ip`, `memo`, `unban_time`, `state`) " - "VALUES " - "(%d, ?, ?, '%s', '%c', %d, '%s', %d, '%s', %d, '%s', '%s', %d, %d)", - account_id, lastlogin, sex, logincount, email, user_level, error_message, expiration_time, last_ip, memo, unban_time, state) - || SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_STRING, userid, strnlen(userid, 255)) - || SQL_ERROR == SqlStmt_BindParam(stmt, 1, SQLDT_STRING, pass, strnlen(pass, 32)) - || SQL_ERROR == SqlStmt_Execute(stmt) ) - { - SqlStmt_ShowDebug(stmt); - } - SqlStmt_Free(stmt); - - //TODO: parse the rest of the line to read the login-stored account variables, and import them to `global_reg_value` - // then remove the 'dummy' buffer + iter = txtdb->iterator(txtdb); + while( iter->next(iter, &acc) ) + { + ShowInfo("Converting user (id: %d, name: %s, gm level: %d)...", acc.account_id, acc.userid, acc.level); + if( sqldb->create(sqldb, &acc) ) + ShowMessage(CL_GREEN "success.\n"); + else + ShowMessage(CL_RED "failed!\n"); } - fclose(fp); - Sql_Free(mysql_handle); + iter->destroy(iter); - ShowStatus("Convert end...\n"); + ShowStatus("Conversion finished.\n"); return 0; } @@ -162,7 +55,7 @@ int login_config_read(const char* cfgName) char line[1024], w1[1024], w2[1024]; FILE *fp; - ShowStatus("Start reading interserver configuration: %s\n", cfgName); + ShowStatus("Start reading login server configuration: %s\n", cfgName); fp=fopen(cfgName,"r"); if(fp==NULL){ @@ -179,56 +72,40 @@ int login_config_read(const char* cfgName) if(i!=2) continue; - //add for DB connection - if(strcmpi(w1,"db_server_ip")==0){ - strcpy(db_server_ip, w2); - ShowStatus("set db_server_ip : %s\n",w2); - } - else if(strcmpi(w1,"db_server_port")==0){ - db_server_port=atoi(w2); - ShowStatus("set db_server_port : %s\n",w2); - } - else if(strcmpi(w1,"db_server_id")==0){ - strcpy(db_server_id, w2); - ShowStatus("set db_server_id : %s\n",w2); - } - else if(strcmpi(w1,"db_server_pw")==0){ - strcpy(db_server_pw, w2); - ShowStatus("set db_server_pw : %s\n",w2); - } - else if(strcmpi(w1,"db_server_logindb")==0){ - strcpy(db_server_logindb, w2); - ShowStatus("set db_server_logindb : %s\n",w2); - } + txtdb->set_property(txtdb, w1, w2); + sqldb->set_property(sqldb, w1, w2); + //support the import command, just like any other config - else if(strcmpi(w1,"import")==0){ + if( strcmpi(w1,"import") == 0 ) login_config_read(w2); - } } + fclose(fp); - ShowStatus("End reading interserver configuration...\n"); + ShowStatus("End reading login server configuration...\n"); return 0; } int do_init(int argc, char** argv) { int input; - login_config_read( (argc > 1) ? argv[1] : INTER_CONF_NAME ); - read_gm_account(); + + txtdb = account_db_txt(); + sqldb = account_db_sql(); + + login_config_read( (argc > 1) ? argv[1] : LOGIN_CONF_NAME ); ShowInfo("\nWarning : Make sure you backup your databases before continuing!\n"); ShowInfo("\nDo you wish to convert your Login Database to SQL? (y/n) : "); input = getchar(); + if(input == 'y' || input == 'Y') convert_login(); + return 0; } void do_final(void) { - if( gm_account_db ) - { - db_destroy(gm_account_db); - gm_account_db = NULL; - } + txtdb->destroy(txtdb); + sqldb->destroy(sqldb); } -- cgit v1.2.3-70-g09d2