diff options
author | Skotlex <Skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2011-08-30 20:16:23 +0000 |
---|---|---|
committer | Skotlex <Skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2011-08-30 20:16:23 +0000 |
commit | 32bd768b5462ed9b276dee8cacb4b6fb785174f0 (patch) | |
tree | 839fc2058158e39c17761754e4f9e840d51f6d20 /src/char_sql | |
parent | cb3625654de982e48663bc3da7245dfaa1285ed3 (diff) | |
download | hercules-32bd768b5462ed9b276dee8cacb4b6fb785174f0.tar.gz hercules-32bd768b5462ed9b276dee8cacb4b6fb785174f0.tar.bz2 hercules-32bd768b5462ed9b276dee8cacb4b6fb785174f0.tar.xz hercules-32bd768b5462ed9b276dee8cacb4b6fb785174f0.zip |
- Updated mmo_char_tosql and memitemdata_to_sql to keep a count of errors while saving a character. If there are any errors, the in-memory copy (cp) will not be updated. Should fix dupes that can happen when a intermediary save fails because of sql access being down.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@14949 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/char_sql')
-rw-r--r-- | src/char_sql/char.c | 85 |
1 files changed, 61 insertions, 24 deletions
diff --git a/src/char_sql/char.c b/src/char_sql/char.c index 535338177..f7c9e0fa0 100644 --- a/src/char_sql/char.c +++ b/src/char_sql/char.c @@ -409,6 +409,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) int diff = 0; char save_status[128]; //For displaying save information. [Skotlex] struct mmo_charstatus *cp; + int errors = 0; //If there are any errors while saving, "cp" will not be updated at the end. StringBuf buf; if (char_id!=p->char_id) return 0; @@ -425,22 +426,28 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) //map inventory data if( memcmp(p->inventory, cp->inventory, sizeof(p->inventory)) ) { - memitemdata_to_sql(p->inventory, MAX_INVENTORY, p->char_id, TABLE_INVENTORY); - strcat(save_status, " inventory"); + if (!memitemdata_to_sql(p->inventory, MAX_INVENTORY, p->char_id, TABLE_INVENTORY)) + strcat(save_status, " inventory"); + else + errors++; } //map cart data if( memcmp(p->cart, cp->cart, sizeof(p->cart)) ) { - memitemdata_to_sql(p->cart, MAX_CART, p->char_id, TABLE_CART); - strcat(save_status, " cart"); + if (!memitemdata_to_sql(p->cart, MAX_CART, p->char_id, TABLE_CART)) + strcat(save_status, " cart"); + else + errors++; } //map storage data if( memcmp(p->storage.items, cp->storage.items, sizeof(p->storage.items)) ) { - memitemdata_to_sql(p->storage.items, MAX_STORAGE, p->account_id, TABLE_STORAGE); - strcat(save_status, " storage"); + if (!memitemdata_to_sql(p->storage.items, MAX_STORAGE, p->account_id, TABLE_STORAGE)) + strcat(save_status, " storage"); + else + errors++; } #ifdef TXT_SQL_CONVERT @@ -452,9 +459,9 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) char_db, p->char_id, p->account_id, p->slot, esc_name) ) { Sql_ShowDebug(sql_handle); - } - - strcat(save_status, " creation"); + errors++; + } else + strcat(save_status, " creation"); } #endif @@ -499,8 +506,9 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) p->account_id, p->char_id) ) { Sql_ShowDebug(sql_handle); - } - strcat(save_status, " status"); + errors++; + } else + strcat(save_status, " status"); } //Values that will seldom change (to speed up saving) @@ -525,9 +533,9 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) p->account_id, p->char_id) ) { Sql_ShowDebug(sql_handle); - } - - strcat(save_status, " status2"); + errors++; + } else + strcat(save_status, " status2"); } /* Mercenary Owner */ @@ -536,8 +544,10 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) (p->spear_calls != cp->spear_calls) || (p->spear_faith != cp->spear_faith) || (p->sword_calls != cp->sword_calls) || (p->sword_faith != cp->sword_faith) ) { - mercenary_owner_tosql(char_id, p); - strcat(save_status, " mercenary"); + if (mercenary_owner_tosql(char_id, p)) + strcat(save_status, " mercenary"); + else + errors++; } //memo points @@ -547,7 +557,10 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`) if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", memo_db, p->char_id) ) + { Sql_ShowDebug(sql_handle); + errors++; + } //insert here. StringBuf_Clear(&buf); @@ -566,9 +579,11 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) if( count ) { if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) ) + { Sql_ShowDebug(sql_handle); + errors++; + } } - strcat(save_status, " memo"); } @@ -583,7 +598,10 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) { //`skill` (`char_id`, `id`, `lv`) if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", skill_db, p->char_id) ) + { Sql_ShowDebug(sql_handle); + errors++; + } StringBuf_Clear(&buf); StringBuf_Printf(&buf, "INSERT INTO `%s`(`char_id`,`id`,`lv`) VALUES ", skill_db); @@ -601,7 +619,10 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) if( count ) { if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) ) + { Sql_ShowDebug(sql_handle); + errors++; + } } strcat(save_status, " skills"); @@ -619,7 +640,10 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) if(diff == 1) { //Save friends if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", friend_db, char_id) ) + { Sql_ShowDebug(sql_handle); + errors++; + } StringBuf_Clear(&buf); StringBuf_Printf(&buf, "INSERT INTO `%s` (`char_id`, `friend_account`, `friend_id`) VALUES ", friend_db); @@ -636,12 +660,12 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) if( count ) { if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) ) + { Sql_ShowDebug(sql_handle); - else - strcat(save_status, " friends"); + errors++; + } } - else //Friend list cleared. - strcat(save_status, " friends"); + strcat(save_status, " friends"); } #ifdef HOTKEY_SAVING @@ -660,8 +684,10 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) } if(diff) { if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) ) + { Sql_ShowDebug(sql_handle); - else + errors++; + } else strcat(save_status, " hotkeys"); } #endif @@ -669,7 +695,8 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) if (save_status[0]!='\0' && save_log) ShowInfo("Saved char %d - %s:%s.\n", char_id, p->name, save_status); #ifndef TXT_SQL_CONVERT - memcpy(cp, p, sizeof(struct mmo_charstatus)); + if (!errors) + memcpy(cp, p, sizeof(struct mmo_charstatus)); #else aFree(cp); #endif @@ -688,6 +715,7 @@ int memitemdata_to_sql(const struct item items[], int max, int id, int tableswit struct item item; // temp storage variable bool* flag; // bit array for inventory matching bool found; + int errors = 0; switch (tableswitch) { case TABLE_INVENTORY: tablename = inventory_db; selectoption = "char_id"; break; @@ -770,7 +798,10 @@ int memitemdata_to_sql(const struct item items[], int max, int id, int tableswit StringBuf_Printf(&buf, " WHERE `id`='%d' LIMIT 1", item.id); if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) ) + { Sql_ShowDebug(sql_handle); + errors++; + } } found = flag[i] = true; //Item dealt with, @@ -780,7 +811,10 @@ int memitemdata_to_sql(const struct item items[], int max, int id, int tableswit if( !found ) {// Item not present in inventory, remove it. if( SQL_ERROR == Sql_Query(sql_handle, "DELETE from `%s` where `id`='%d'", tablename, item.id) ) + { Sql_ShowDebug(sql_handle); + errors++; + } } } SqlStmt_Free(stmt); @@ -812,12 +846,15 @@ int memitemdata_to_sql(const struct item items[], int max, int id, int tableswit } if( found && SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) ) + { Sql_ShowDebug(sql_handle); + errors++; + } StringBuf_Destroy(&buf); aFree(flag); - return 0; + return errors; } int mmo_char_tobuf(uint8* buf, struct mmo_charstatus* p); |