diff options
-rw-r--r-- | Changelog.txt | 2 | ||||
-rw-r--r-- | Dev/bugs.txt | 3 | ||||
-rw-r--r-- | src/char_sql/char.c | 200 | ||||
-rw-r--r-- | src/char_sql/char.h | 4 | ||||
-rw-r--r-- | src/char_sql/int_guild.c | 98 | ||||
-rw-r--r-- | src/char_sql/int_party.c | 4 | ||||
-rw-r--r-- | src/char_sql/int_pet.c | 5 | ||||
-rw-r--r-- | src/char_sql/int_storage.c | 3 |
8 files changed, 318 insertions, 1 deletions
diff --git a/Changelog.txt b/Changelog.txt index 4d2618fa4..ed6542de7 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,8 @@ Date Added 12/19 + * Added -DFASTCHAR to char_sql for testing performance work + before I merge it into the main running code [MouseJstr] * Added ShowDebug(), Debug(), DisplayDebug(), printDebug(), CL_DEBUG, MSG_DEBUG to _ShowMessage() [MC Cameri] * Replaced many \033[x;xm with their corresponding CL_xx constants [MC Cameri] * Separated NPCs and Maps from map_athena.conf into npcs_list.txt and maps_list.conf [MC Cameri] diff --git a/Dev/bugs.txt b/Dev/bugs.txt index c22b7e43c..22262c54c 100644 --- a/Dev/bugs.txt +++ b/Dev/bugs.txt @@ -123,3 +123,6 @@ Progress: 0% Knight, get spiral pierce, get off the peco, log off, log in, and get back on the peco. You will not have Spiral Pierce anymore and you will have lost the skill points + + blacksmith hammerfall on the new_1-1.gat's bridge crashes server + hunter spamming traps crashes server diff --git a/src/char_sql/char.c b/src/char_sql/char.c index 41d2341f0..e26d92af7 100644 --- a/src/char_sql/char.c +++ b/src/char_sql/char.c @@ -37,11 +37,18 @@ #include "strlib.h" #include "itemdb.h" #include "inter.h" +#ifdef FASTCHAR +#include "db.h" +#endif /* FASTCHAR */ #ifdef MEMWATCH #include "memwatch.h" #endif +#ifdef FASTCHAR +static struct dbt *char_db_; + +#endif /* FASTCHAR */ char char_db[256] = "char"; char cart_db[256] = "cart_inventory"; char inventory_db[256] = "inventory"; @@ -150,6 +157,11 @@ int GM_num = 0; int console = 0; +#ifdef FASTCHAR +#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y) + + +#endif /* FASTCHAR */ //------------------------------------------------- // Set Character online/offline [Wizputer] //------------------------------------------------- @@ -285,22 +297,55 @@ void insert_friends(int char_id_count){ } } +#ifdef FASTCHAR +int compare_item(struct item *a, struct item *b) { + return ( + (a->id == b->id) && + (a->nameid == b->nameid) && + (a->amount == b->amount) && + (a->equip == b->equip) && + (a->identify == b->identify) && + (a->refine == b->refine) && + (a->attribute == b->attribute) && + (a->card[0] == b->card[0]) && + (a->card[1] == b->card[1]) && + (a->card[2] == b->card[2]) && + (a->card[3] == b->card[3])); +} + +#endif /* FASTCHAR */ //===================================================================================================== int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ int i=0,party_exist,guild_exist; int eqcount=1; int noteqcount=1; +#ifdef FASTCHAR + int diff = 0; +#endif /* FASTCHAR */ char temp_str[1024]; char *tmp_p = tmp_sql; +#ifndef FASTCHAR +#else /* FASTCHAR */ + struct mmo_charstatus *cp; +#endif /* FASTCHAR */ struct itemtemp mapitem; +#ifdef FASTCHAR + +#endif /* FASTCHAR */ if (char_id!=p->char_id) return 0; +#ifdef FASTCHAR + cp = numdb_search(char_db_,char_id); + +#endif /* FASTCHAR */ save_flag = p->char_id; printf("(\033[1;32m%d\033[0m) %s \trequest save char data - ",char_id,char_dat[0].name); +#ifndef FASTCHAR +#endif /* not FASTCHAR */ //for(testcount=1;testcount<50;testcount++){//---------------------------test count-------------------- // printf("test count : %d\n", testcount); // eqcount=1; @@ -310,8 +355,16 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ //----------------------------------------------------------------------------------------------------- //=========================================map inventory data > memory =============================== +#ifdef FASTCHAR + diff = 0; + +#endif /* FASTCHAR */ //map inventory data for(i=0;i<MAX_INVENTORY;i++){ +#ifdef FASTCHAR + if (!compare_item(&p->inventory[i], &cp->inventory[i])) + diff = 1; +#endif /* FASTCHAR */ if(p->inventory[i].nameid>0){ if(itemdb_isequip(p->inventory[i].nameid)==1){ mapitem.equip[eqcount].flag=0; @@ -345,15 +398,30 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ } } } +#ifdef FASTCHAR + +#endif /* FASTCHAR */ //printf("- Save item data to MySQL!\n"); +#ifndef FASTCHAR memitemdata_to_sql(mapitem, eqcount, noteqcount, p->char_id,TABLE_INVENTORY); +#else /* FASTCHAR */ + if (diff) + memitemdata_to_sql(mapitem, eqcount, noteqcount, p->char_id,TABLE_INVENTORY); +#endif /* FASTCHAR */ //=========================================map cart data > memory ==================================== eqcount=1; noteqcount=1; +#ifdef FASTCHAR + diff = 0; +#endif /* FASTCHAR */ //map cart data for(i=0;i<MAX_CART;i++){ +#ifdef FASTCHAR + if (!compare_item(&p->cart[i], &cp->cart[i])) + diff = 1; +#endif /* FASTCHAR */ if(p->cart[i].nameid>0){ if(itemdb_isequip(p->cart[i].nameid)==1){ mapitem.equip[eqcount].flag=0; @@ -389,10 +457,34 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ } //printf("- Save cart data to MySQL!\n"); +#ifndef FASTCHAR memitemdata_to_sql(mapitem, eqcount, noteqcount, p->char_id,TABLE_CART); +#else /* FASTCHAR */ + if (diff) + memitemdata_to_sql(mapitem, eqcount, noteqcount, p->char_id,TABLE_CART); +#endif /* FASTCHAR */ //===================================================================================================== +#ifdef FASTCHAR + if ((p->base_exp != cp->base_exp) || (p->class != cp->class) || + (p->base_level != cp->base_level) || (p->job_level != cp->job_level) || + (p->job_exp != cp->job_exp) || (p->zeny != cp->zeny) || + (p->last_point.x != cp->last_point.x) || (p->last_point.y != cp->last_point.y) || + (p->max_hp != cp->max_hp) || (p->hp != cp->hp) || + (p->max_sp != cp->max_sp) || (p->sp != cp->sp) || + (p->status_point != cp->status_point) || (p->skill_point != cp->skill_point) || + (p->str != cp->str) || (p->agi != cp->agi) || (p->vit != cp->vit) || + (p->int_ != cp->int_) || (p->dex != cp->dex) || (p->luk != cp->luk) || + (p->option != cp->option) || (p->karma != cp->karma) || (p->manner != cp->manner) || + (p->party_id != cp->party_id) || (p->guild_id != cp->guild_id) || + (p->pet_id != cp->pet_id) || (p->hair != cp->hair) || (p->hair_color != cp->hair_color) || + (p->clothes_color != cp->clothes_color) || (p->weapon != cp->weapon) || + (p->shield != cp->shield) || (p->head_top != cp->head_top) || + (p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom) || + (p->partner_id != cp->partner_id)) { + +#endif /* FASTCHAR */ //}//---------------------------test count------------------------------ //check party_exist party_exist=0; @@ -449,6 +541,20 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle)); } +#ifdef FASTCHAR + } + + diff = 0; + + for(i=0;i<10;i++){ + if((strcmp(p->memo_point[i].map,cp->memo_point[i].map) == 0) && (p->memo_point[i].x == cp->memo_point[i].x) && (p->memo_point[i].y == cp->memo_point[i].y)) + continue; + diff = 1; + break; + } + + if (diff) { +#endif /* FASTCHAR */ //printf("- Save memo data to MySQL!\n"); //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`) sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, p->char_id); @@ -465,7 +571,21 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ printf("DB server Error (insert `memo`)- %s\n", mysql_error(&mysql_handle)); } } +#ifdef FASTCHAR + } +#endif /* FASTCHAR */ +#ifdef FASTCHAR + diff = 0; + for(i=0;i<MAX_SKILL;i++) + if((p->skill[i].id != cp->skill[i].id) || (p->skill[i].lv != cp->skill[i].lv) || + (p->skill[i].flag != cp->skill[i].flag)) { + diff = 1; + break; + } + + if (diff) { +#endif /* FASTCHAR */ //printf("- Save skill data to MySQL!\n"); //`skill` (`char_id`, `id`, `lv`) sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, p->char_id); @@ -477,7 +597,11 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ for(i=0;i<MAX_SKILL;i++){ if(p->skill[i].id){ if (p->skill[i].id && p->skill[i].flag!=1) { +#ifndef FASTCHAR sprintf(tmp_sql,"INSERT delayed INTO `%s`(`char_id`, `id`, `lv`) VALUES ('%d', '%d','%d')", +#else /* FASTCHAR */ + sprintf(tmp_sql,"INSERT INTO `%s`(`char_id`, `id`, `lv`) VALUES ('%d', '%d','%d')", +#endif /* FASTCHAR */ skill_db, char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2); if(mysql_query(&mysql_handle, tmp_sql)) { printf("DB server Error (insert `skill`)- %s\n", mysql_error(&mysql_handle)); @@ -485,8 +609,27 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ } } } +#ifdef FASTCHAR + } +#endif /* FASTCHAR */ +#ifndef FASTCHAR +#else /* FASTCHAR */ + diff = 0; + for(i=0;i<p->global_reg_num;i++) { + if ((p->global_reg[i].str == NULL) && (cp->global_reg[i].str == NULL)) + continue; + if (((p->global_reg[i].str == NULL) != (cp->global_reg[i].str == NULL)) || + (p->global_reg[i].value != cp->global_reg[i].value) || + strcmp(p->global_reg[i].str, cp->global_reg[i].str) != 0) { + diff = 1; + break; + } + } + + if (diff) { +#endif /* FASTCHAR */ //printf("- Save global_reg_value data to MySQL!\n"); //`global_reg_value` (`char_id`, `str`, `value`) sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, p->char_id); @@ -506,26 +649,54 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ } } } +#ifdef FASTCHAR + } +#endif /* FASTCHAR */ // Friends list // account_id, friend_id0, name0, ... tmp_p += sprintf(tmp_p, "REPLACE INTO `%s` (`id`, `account_id`",friend_db); +#ifdef FASTCHAR + diff = 0; + +#endif /* FASTCHAR */ for (i=0;i<20;i++) tmp_p += sprintf(tmp_p, ", `friend_id%d`, `name%d`", i, i); tmp_p += sprintf(tmp_p, ") VALUES (NULL, '%d'", char_id); +#ifndef FASTCHAR for (i=0;i<20;i++) +#else /* FASTCHAR */ + + for (i=0;i<20;i++) { +#endif /* FASTCHAR */ tmp_p += sprintf(tmp_p, ", '%d', '%s'", p->friend_id[i], p->friend_name[i]); +#ifdef FASTCHAR + if ((p->friend_id[i] != cp->friend_id[i]) || + strcmp(p->friend_name[i], cp->friend_name[i])) + diff = 1; + } +#endif /* FASTCHAR */ tmp_p += sprintf(tmp_p, ")"); +#ifndef FASTCHAR mysql_query(&mysql_handle, tmp_sql); +#else /* FASTCHAR */ + + if (diff) + mysql_query(&mysql_handle, tmp_sql); +#endif /* FASTCHAR */ printf("saving char is done.\n"); save_flag = 0; +#ifdef FASTCHAR + memcpy(cp, p, sizeof(struct mmo_charstatus)); + +#endif /* FASTCHAR */ return 0; } @@ -759,12 +930,22 @@ int memitemdata_to_sql(struct itemtemp mapitem, int eqcount, int noteqcount, int // printf("=================================================================================\n"); // } +#ifdef FASTCHAR + +#endif /* FASTCHAR */ return 0; } //===================================================================================================== int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){ int i, n; char *tmp_p = tmp_sql; +#ifdef FASTCHAR + struct mmo_charstatus *cp; + + cp = numdb_search(char_db_,char_id); + if (cp != NULL) + free(cp); +#endif /* FASTCHAR */ memset(p, 0, sizeof(struct mmo_charstatus)); @@ -1006,12 +1187,22 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){ printf("char data load success]\n"); //ok. all data load successfuly! +#ifdef FASTCHAR + cp = (struct mmo_charstatus *) malloc(sizeof(struct mmo_charstatus)); + memcpy(cp, p, sizeof(struct mmo_charstatus)); + numdb_insert(char_db_, char_id,cp); + +#endif /* FASTCHAR */ return 1; } //========================================================================================================== int mmo_char_sql_init(void) { int i; +#ifdef FASTCHAR + char_db_=numdb_init(); + +#endif /* FASTCHAR */ printf("init start.......\n"); // memory initialize // no need to set twice size in this routine. but some cause segmentation error. :P @@ -3205,4 +3396,13 @@ int do_init(int argc, char **argv){ return 0; } +#ifdef FASTCHAR + +#undef mysql_query + +int debug_mysql_query(char *file, int line, void *mysql, const char *q) { + printf("sql: %s:%d# %s\n", file, line, q); + return mysql_query((MYSQL *) mysql, q); +} +#endif /* FASTCHAR */ diff --git a/src/char_sql/char.h b/src/char_sql/char.h index 4b4fdaf04..da2300d38 100644 --- a/src/char_sql/char.h +++ b/src/char_sql/char.h @@ -73,6 +73,10 @@ extern char login_db_account_id[32]; extern int lowest_gm_level; +#ifdef FASTCHAR +extern int debug_mysql_query(char *file, int line, void *mysql, const char *q); + +#endif /* FASTCHAR */ #endif #include "inter.h" diff --git a/src/char_sql/int_guild.c b/src/char_sql/int_guild.c index def93d9f3..5c3480ca6 100644 --- a/src/char_sql/int_guild.c +++ b/src/char_sql/int_guild.c @@ -46,6 +46,9 @@ int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len) int mapif_guild_info(int fd,struct guild *g); int guild_break_sub(void *key,void *data,va_list ap); +#ifdef FASTCHAR +#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y) +#endif /* FASTCHAR */ // Save guild into sql int inter_guild_tosql(struct guild *g,int flag) @@ -65,7 +68,11 @@ int inter_guild_tosql(struct guild *g,int flag) if (g->guild_id<=0) return -1; +#ifndef FASTCHAR printf("(\033[1;35m%d\033[0m) Request save guild - ",g->guild_id); +#else /* FASTCHAR */ + printf("(\033[1;35m%d\033[0m) Request save guild -(flag 0x%x) ",g->guild_id, flag); +#endif /* FASTCHAR */ jstrescapecpy(t_name, g->name); @@ -199,6 +206,7 @@ int inter_guild_tosql(struct guild *g,int flag) } if (flag&2||guild_member==0){ +#ifndef FASTCHAR //printf("- Insert guild %d to guild_member\n",g->guild_id); for(i=0;i<g->max_member;i++){ if (g->member[i].account_id>0){ @@ -226,6 +234,48 @@ int inter_guild_tosql(struct guild *g,int flag) } } } +#else /* FASTCHAR */ + struct StringBuf sbuf; + struct StringBuf sbuf2; + int first = 1; + StringBuf_Init(&sbuf2); + StringBuf_Init(&sbuf); + + StringBuf_Printf(&sbuf,"REPLACE `%s` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) VALUES \n", guild_member_db); + + StringBuf_Printf(&sbuf2, "UPDATE `%s` SET `guild_id`='%d' WHERE `char_id` IN (",char_db, g->guild_id); + + //printf("- Insert guild %d to guild_member\n",g->guild_id); + for(i=0;i<g->max_member;i++){ + if (g->member[i].account_id>0){ + struct guild_member *m = &g->member[i]; + if (first == 0) { + StringBuf_Printf(&sbuf , ", "); + StringBuf_Printf(&sbuf2, ", "); + } else + first = 0; + StringBuf_Printf(&sbuf, "('%d','%d','%d','%d','%d', '%d','%d','%d','%d','%d','%d','%d','%d','%d','%s')\n", + g->guild_id, + m->account_id,m->char_id, + m->hair,m->hair_color,m->gender, + m->class,m->lv,m->exp,m->exp_payper,m->online,m->position, + 0,0, + jstrescapecpy(t_member,m->name)); + + StringBuf_Printf(&sbuf2, "'%d'", m->char_id); + } + } + StringBuf_Printf(&sbuf2,")"); + + if(mysql_query(&mysql_handle, StringBuf_Value(&sbuf))) + printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); + + if(mysql_query(&mysql_handle, StringBuf_Value(&sbuf2))) + printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); + + StringBuf_Destroy(&sbuf2); + StringBuf_Destroy(&sbuf); +#endif /* FASTCHAR */ } if (flag&4||guild_member==0){ @@ -520,18 +570,42 @@ struct guild * inter_guild_fromsql(int guild_id) // Save guild_castle to sql int inter_guildcastle_tosql(struct guild_castle *gc) { +#ifdef FASTCHAR + struct guild_castle *gcopy; +#endif /* FASTCHAR */ // `guild_castle` (`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`) if (gc==NULL) return 0; //printf("Save to guild_castle\n"); +#ifndef FASTCHAR sprintf(tmp_sql,"DELETE FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, gc->castle_id); //printf(" %s\n",tmp_sql); if(mysql_query(&mysql_handle, tmp_sql) ) { printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); return 0; - } +#else /* FASTCHAR */ + + gcopy = numdb_search(castle_db_,gc->castle_id); + if (gcopy == NULL) { + gcopy = (struct guild_castle *) malloc(sizeof(struct guild_castle)); + numdb_insert(castle_db_, gc->castle_id, gcopy); + } else { + if ((gcopy->castle_id == gc->castle_id) && + (strcmp(gcopy->map_name, gc->map_name) == 0) && + (strcmp(gcopy->castle_event, gc->castle_event) == 0) && + (memcmp(&gcopy->guild_id, &gc->guild_id, &gc->GID7 - &gc->guild_id) == 0)) + return 0; +#endif /* FASTCHAR */ + } +#ifndef FASTCHAR sprintf(tmp_sql,"INSERT INTO `%s` " +#else /* FASTCHAR */ + + memcpy(gcopy, gc, sizeof(struct guild_castle)); + + sprintf(tmp_sql,"REPLACE INTO `%s` " +#endif /* FASTCHAR */ "(`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`," "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`," "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`)" @@ -564,9 +638,26 @@ int inter_guildcastle_tosql(struct guild_castle *gc) // Read guild_castle from sql int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc) { +#ifndef FASTCHAR +#else /* FASTCHAR */ + + struct guild_castle *gcopy; +#endif /* FASTCHAR */ if (gc==NULL) return 0; //printf("Read from guild_castle\n"); +#ifdef FASTCHAR + + gcopy = numdb_search(castle_db_,gc->castle_id); + if (gcopy == NULL) { + gcopy = (struct guild_castle *) malloc(sizeof(struct guild_castle)); + numdb_insert(castle_db_, gc->castle_id, gcopy); + } else { + memcpy(gc, gcopy, sizeof(struct guild_castle)); + return 0; + } + +#endif /* FASTCHAR */ memset(gc,0,sizeof(struct guild_castle)); gc->castle_id=castle_id; if (castle_id==-1) return 0; @@ -616,6 +707,11 @@ int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc) } mysql_free_result(sql_res) ; //resource free +#ifdef FASTCHAR + + memcpy(gcopy, gc, sizeof(struct guild_castle)); + +#endif /* FASTCHAR */ return 0; } diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c index 297481453..a03936744 100644 --- a/src/char_sql/int_party.c +++ b/src/char_sql/int_party.c @@ -17,6 +17,10 @@ int mapif_party_broken(int party_id,int flag); int party_check_empty(struct party *p); int mapif_parse_PartyLeave(int fd,int party_id,int account_id); +#ifdef FASTCHAR +#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y) + +#endif /* FASTCHAR */ // Save party to mysql int inter_party_tosql(int party_id,struct party *p) { diff --git a/src/char_sql/int_pet.c b/src/char_sql/int_pet.c index 14d2144c7..96ab3f6f4 100644 --- a/src/char_sql/int_pet.c +++ b/src/char_sql/int_pet.c @@ -12,6 +12,11 @@ struct s_pet *pet_pt; static int pet_newid = 100; +#ifdef FASTCHAR +#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y) + + +#endif /* FASTCHAR */ //--------------------------------------------------------- int inter_pet_tosql(int pet_id, struct s_pet *p) { diff --git a/src/char_sql/int_storage.c b/src/char_sql/int_storage.c index 7c8c8ce4a..455ff42c4 100644 --- a/src/char_sql/int_storage.c +++ b/src/char_sql/int_storage.c @@ -13,6 +13,9 @@ struct storage *storage_pt=NULL; struct guild_storage *guild_storage_pt=NULL; +#ifdef FASTCHAR +#define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y) +#endif /* FASTCHAR */ // storage data -> DB conversion int storage_tosql(int account_id,struct storage *p){ |