summaryrefslogtreecommitdiff
path: root/src/char_sql
diff options
context:
space:
mode:
authorFlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-09-20 11:09:36 +0000
committerFlavioJS <FlavioJS@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-09-20 11:09:36 +0000
commit5245e666a09df5f401c1329bf5ee1fc1b09b1d16 (patch)
treedcf032743e890fddd400b268b75a0868976b0a0b /src/char_sql
parentd23c508bcc38520970156e5e25f14b03714878eb (diff)
downloadhercules-5245e666a09df5f401c1329bf5ee1fc1b09b1d16.tar.gz
hercules-5245e666a09df5f401c1329bf5ee1fc1b09b1d16.tar.bz2
hercules-5245e666a09df5f401c1329bf5ee1fc1b09b1d16.tar.xz
hercules-5245e666a09df5f401c1329bf5ee1fc1b09b1d16.zip
* Merged the tmpsql branch:
- Abstraction for the sql code (sql.c/h). - New configure script and makefiles. - Restored txt zeny logging code. (r10814) - Rewrote mapserver's sql code - itemdb, mobdb, mapreg, logs. (r10814) - Fixed a precedence issue (&& and ) in char_sql/char.c. (r10833) - Improved db reading code a bit for consistency. (r11077) - Added separate atcommand for mail deletion. (r11077) - Corrected a few messages that said "new" instead of "unread". (r11077) - Broadcast (*) messages now use "*" as the target's name (not ""). (r11077) - Moved StringBuf code from utils.c/h to strlib.c/h. (r11084 r11117) - Some misc login server cleanups (reformatting etc). (r11136) - Corrected/modified some header entries. (r11141 r11147 11148) - Adjusted VS project files. (r11147) - Adjusted the way the sql charserver does item saving. (r11192) - Corrected usage of reserved keyword 'friend' in mmo.h. (r11192) git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@11245 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/char_sql')
-rw-r--r--src/char_sql/Makefile28
-rw-r--r--src/char_sql/Makefile.in56
-rw-r--r--src/char_sql/char.c2213
-rw-r--r--src/char_sql/char.h28
-rw-r--r--src/char_sql/int_guild.c868
-rw-r--r--src/char_sql/int_guild.h25
-rw-r--r--src/char_sql/int_homun.c217
-rw-r--r--src/char_sql/int_homun.h2
-rw-r--r--src/char_sql/int_party.c318
-rw-r--r--src/char_sql/int_party.h2
-rw-r--r--src/char_sql/int_pet.c140
-rw-r--r--src/char_sql/int_pet.h2
-rw-r--r--src/char_sql/int_storage.c358
-rw-r--r--src/char_sql/int_storage.h3
-rw-r--r--src/char_sql/inter.c321
-rw-r--r--src/char_sql/inter.h22
-rw-r--r--src/char_sql/itemdb.c219
-rw-r--r--src/char_sql/itemdb.h44
18 files changed, 2093 insertions, 2773 deletions
diff --git a/src/char_sql/Makefile b/src/char_sql/Makefile
deleted file mode 100644
index 21fd1f339..000000000
--- a/src/char_sql/Makefile
+++ /dev/null
@@ -1,28 +0,0 @@
-all sql: char-server_sql
-
-COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o \
- ../common/obj/db.o ../common/obj/plugins.o ../common/obj/lock.o \
- ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/utils.o \
- ../common/obj/strlib.o ../common/obj/grfio.o \
- ../common/obj/mapindex.o ../common/obj/ers.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h \
- ../common/version.h ../common/db.h ../common/plugins.h ../common/lock.h \
- ../common/malloc.h ../common/showmsg.h ../common/utils.h ../common/strlib.h \
- ../common/grfio.h ../common/mapindex.h
-
-char-server_sql: char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o int_homun.o itemdb.o $(COMMON_OBJ)
- $(CC) -o ../../$@ $^ $(LIB_S)
-
-clean:
- rm -f *.o ../../char-server_sql GNUmakefile
-
-# DO NOT DELETE
-
-char.o: char.c char.h ../common/strlib.h itemdb.h ../common/showmsg.h
-inter.o: inter.c inter.h int_party.h int_guild.h int_storage.h int_pet.h int_homun.h ../common/mmo.h char.h ../common/socket.h ../common/showmsg.h
-int_party.o: int_party.c int_party.h inter.h ../common/mmo.h char.h ../common/socket.h ../common/timer.h ../common/db.h ../common/showmsg.h
-int_guild.o: int_guild.c int_guild.h inter.h ../common/mmo.h char.h ../common/socket.h ../common/db.h ../common/showmsg.h
-int_storage.o: int_storage.c int_storage.h char.h itemdb.h ../common/showmsg.h
-int_pet.o: int_pet.c int_pet.h inter.h char.h ../common/mmo.h ../common/socket.h ../common/db.h ../common/showmsg.h
-int_homun.o: int_homun.c int_homun.h inter.h char.h ../common/mmo.h ../common/socket.h ../common/db.h ../common/showmsg.h
-itemdb.o: itemdb.c itemdb.h ../common/db.h ../common/mmo.h ../common/showmsg.h
diff --git a/src/char_sql/Makefile.in b/src/char_sql/Makefile.in
new file mode 100644
index 000000000..b47869208
--- /dev/null
+++ b/src/char_sql/Makefile.in
@@ -0,0 +1,56 @@
+COMMON_OBJ = ../common/obj/core.o ../common/obj/socket.o ../common/obj/timer.o \
+ ../common/obj/db.o ../common/obj/plugins.o ../common/obj/lock.o \
+ ../common/obj/malloc.o ../common/obj/showmsg.o ../common/obj/utils.o \
+ ../common/obj/strlib.o ../common/obj/grfio.o \
+ ../common/obj/mapindex.o ../common/obj/ers.o ../common/obj_sql/sql.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h \
+ ../common/version.h ../common/db.h ../common/plugins.h ../common/lock.h \
+ ../common/malloc.h ../common/showmsg.h ../common/utils.h \
+ ../common/strlib.h ../common/grfio.h \
+ ../common/mapindex.h ../common/ers.h ../common/sql.h
+
+CHAR_OBJ = char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o int_homun.o
+
+HAVE_MYSQL=@HAVE_MYSQL@
+ifeq ($(HAVE_MYSQL),yes)
+ CHAR_SERVER_SQL_DEPENDS=$(CHAR_OBJ) $(COMMON_OBJ)
+else
+ CHAR_SERVER_SQL_DEPENDS=needs_mysql
+endif
+
+#####################################################################
+.PHONY : all char-server_sql clean help
+
+all: char-server_sql
+
+char-server_sql: $(CHAR_SERVER_SQL_DEPENDS)
+ @CC@ @LDFLAGS@ -o ../../char-server_sql@EXEEXT@ $(CHAR_OBJ) $(COMMON_OBJ) @LIBS@ @MYSQL_LIBS@
+
+clean:
+ rm -f *.o ../../char-server_sql@EXEEXT@
+
+help:
+ @echo "possible targets are 'char-server_sql' 'all' 'clean' 'help'"
+ @echo "'char-server_sql' - char server (SQL version)"
+ @echo "'all' - builds all above targets"
+ @echo "'clean' - cleans builds and objects"
+ @echo "'help' - outputs this message"
+
+#####################################################################
+
+needs_mysql:
+ @echo "MySQL not found or disabled by the configure script"
+ @exit 1
+
+%.o: %.c
+ @CC@ @CFLAGS@ @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $<
+
+# DO NOT DELETE
+
+char.o: char.c char.h $(COMMON_H)
+inter.o: inter.c inter.h int_party.h int_guild.h int_storage.h int_pet.h int_homun.h $(COMMON_H)
+int_party.o: int_party.c int_party.h inter.h $(COMMON_H)
+int_guild.o: int_guild.c int_guild.h inter.h $(COMMON_H)
+int_storage.o: int_storage.c int_storage.h char.h $(COMMON_H)
+int_pet.o: int_pet.c int_pet.h inter.h char.h $(COMMON_H)
+int_homun.o: int_homun.c int_homun.h inter.h char.h $(COMMON_H)
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index 458f784e8..e2baa3b9e 100644
--- a/src/char_sql/char.c
+++ b/src/char_sql/char.c
@@ -2,17 +2,21 @@
// For more information, see LICENCE in the main folder
#include "../common/cbasetypes.h"
+#include "../common/strlib.h"
+#include "../common/core.h"
+#include "../common/timer.h"
#include "../common/mmo.h"
#include "../common/db.h"
#include "../common/malloc.h"
+#include "../common/mapindex.h"
#include "../common/showmsg.h"
-#include "../common/strlib.h"
+#include "../common/socket.h"
+#include "../common/version.h"
#include "../common/utils.h"
-
#include "inter.h"
#include "int_guild.h"
#include "int_homun.h"
-#include "itemdb.h"
+#include "int_party.h"
#include "char.h"
#include <sys/types.h>
@@ -25,7 +29,6 @@
#endif
#include <time.h>
#include <signal.h>
-#include <fcntl.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
@@ -121,7 +124,7 @@ static int max_account_id = DEFAULT_MAX_ACCOUNT_ID, max_char_id = DEFAULT_MAX_CH
static int online_check = 1; //If one, it won't let players connect when their account is already registered online and will send the relevant map server a kick user request. [Skotlex]
// Advanced subnet check [LuzZza]
-struct _subnet {
+struct s_subnet {
uint32 subnet;
uint32 mask;
uint32 char_ip;
@@ -146,7 +149,6 @@ struct {
} auth_fifo[AUTH_FIFO_SIZE];
int auth_fifo_pos = 0;
-struct mmo_charstatus char_dat;
int char_num, char_max;
int max_connect_user = 0;
int gm_allow_level = 99;
@@ -214,11 +216,8 @@ void set_char_online(int map_id, int char_id, int account_id)
struct online_char_data* character;
if ( char_id != 99 ) {
- sprintf(tmp_sql, "UPDATE `%s` SET `online`='1' WHERE `char_id`='%d'",char_db,char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `online`='1' WHERE `char_id`='%d'", char_db, char_id) )
+ Sql_ShowDebug(sql_handle);
if (max_account_id < account_id || max_char_id < char_id)
{ //Notify map-server of the new max IDs [Skotlex]
@@ -270,20 +269,19 @@ void set_char_offline(int char_id, int account_id)
struct online_char_data* character;
if ( char_id == 99 )
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `account_id`='%d'", char_db, account_id);
- else {
+ {
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `online`='0' WHERE `account_id`='%d'", char_db, account_id) )
+ Sql_ShowDebug(sql_handle);
+ }
+ else
+ {
cp = idb_get(char_db_,char_id);
inter_guild_CharOffline(char_id, cp?cp->guild_id:-1);
if (cp)
idb_remove(char_db_,char_id);
- sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, char_id);
-
- if (mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, char_id) )
+ Sql_ShowDebug(sql_handle);
}
if ((character = idb_get(online_char_db, account_id)) != NULL)
@@ -358,21 +356,12 @@ void set_all_offline(int id)
void set_all_offline_sql(void)
{
//Set all players to 'OFFLINE'
- sprintf(tmp_sql, "UPDATE `%s` SET `online` = '0'", char_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql, "UPDATE `%s` SET `online` = '0'", guild_member_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql, "UPDATE `%s` SET `connect_member` = '0'", guild_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `online` = '0'", char_db) )
+ Sql_ShowDebug(sql_handle);
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `online` = '0'", guild_member_db) )
+ Sql_ShowDebug(sql_handle);
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `connect_member` = '0'", guild_db) )
+ Sql_ShowDebug(sql_handle);
}
//----------------------------------------------------------------------
@@ -398,26 +387,31 @@ void read_gm_account(void)
aFree(gm_account);
GM_num = 0;
- sprintf(tmp_sql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'",login_db_account_id,login_db_level,login_db,login_db_level,lowest_gm_level);
- if (mysql_query(&lmysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&lmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- lsql_res = mysql_store_result(&lmysql_handle);
- if (lsql_res) {
- gm_account = (struct gm_account*)aCalloc(sizeof(struct gm_account) * (size_t)mysql_num_rows(lsql_res), 1);
- while ((lsql_row = mysql_fetch_row(lsql_res))) {
- gm_account[GM_num].account_id = atoi(lsql_row[0]);
- gm_account[GM_num].level = atoi(lsql_row[1]);
- GM_num++;
+ if( SQL_ERROR == Sql_Query(lsql_handle, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'", login_db_account_id, login_db_level, login_db, login_db_level, lowest_gm_level) )
+ Sql_ShowDebug(sql_handle);
+
+ if( Sql_NumRows(lsql_handle) > 0 )
+ {
+ char* data;
+
+ CREATE(gm_account, struct gm_account, (size_t)Sql_NumRows(lsql_handle));
+ while( SQL_SUCCESS == Sql_NextRow(lsql_handle) )
+ {
+ // account_id
+ Sql_GetData(lsql_handle, 0, &data, NULL);
+ gm_account[GM_num].account_id = atoi(data);
+ // account_id
+ Sql_GetData(lsql_handle, 1, &data, NULL);
+ gm_account[GM_num].level = atoi(data);
+ ++GM_num;
}
}
+ Sql_FreeResult(lsql_handle);
- mysql_free_result(lsql_res);
mapif_send_gmaccounts();
}
#endif //TXT_SQL_CONVERT
-int compare_item(struct item *a, struct item *b)
+int compare_item(const struct item* a, const struct item* b)
{
if(a->id == b->id &&
@@ -444,15 +438,15 @@ static void* create_charstatus(DBKey key, va_list args)
return cp;
}
#endif //TXT_SQL_CONVERT
-int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
- int i=0,j;
+
+int mmo_char_tosql(int char_id, struct mmo_charstatus* p)
+{
+ int i = 0;
int count = 0;
int diff = 0;
- char *tmp_ptr; //Building a single query should be more efficient than running
- //multiple queries for each thing about to be saved, right? [Skotlex]
char save_status[128]; //For displaying save information. [Skotlex]
struct mmo_charstatus *cp;
- struct itemtmp mapitem[MAX_GUILD_STORAGE];
+ StringBuf buf;
if (char_id!=p->char_id) return 0;
@@ -462,68 +456,35 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
cp = aCalloc(1, sizeof(struct mmo_charstatus));
#endif
+ StringBuf_Init(&buf);
memset(save_status, 0, sizeof(save_status));
- diff = 0;
+
//map inventory data
- for(i=0;i<MAX_INVENTORY;i++){
- if (!compare_item(&p->inventory[i], &cp->inventory[i]))
- diff = 1;
- if(p->inventory[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->inventory[i].id;
- mapitem[count].nameid=p->inventory[i].nameid;
- mapitem[count].amount = p->inventory[i].amount;
- mapitem[count].equip = p->inventory[i].equip;
- mapitem[count].identify = p->inventory[i].identify;
- mapitem[count].refine = p->inventory[i].refine;
- mapitem[count].attribute = p->inventory[i].attribute;
- for (j=0; j<MAX_SLOTS; j++)
- mapitem[count].card[j] = p->inventory[i].card[j];
- count++;
- }
+ 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");
}
- //printf("- Save item data to MySQL!\n");
- if (diff)
- if (!memitemdata_to_sql(mapitem, count, p->char_id,TABLE_INVENTORY))
- strcat(save_status, " inventory");
-
- count = 0;
- diff = 0;
//map cart data
- for(i=0;i<MAX_CART;i++){
- if (!compare_item(&p->cart[i], &cp->cart[i]))
- diff = 1;
- if(p->cart[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->cart[i].id;
- mapitem[count].nameid=p->cart[i].nameid;
- mapitem[count].amount = p->cart[i].amount;
- mapitem[count].equip = p->cart[i].equip;
- mapitem[count].identify = p->cart[i].identify;
- mapitem[count].refine = p->cart[i].refine;
- mapitem[count].attribute = p->cart[i].attribute;
- for (j=0; j<MAX_SLOTS; j++)
- mapitem[count].card[j] = p->cart[i].card[j];
- count++;
- }
+ 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 (diff)
- if (!memitemdata_to_sql(mapitem, count, p->char_id,TABLE_CART))
- strcat(save_status, " cart");
#ifdef TXT_SQL_CONVERT
{ //Insert the barebones to then update the rest.
- char t_name[NAME_LENGTH*2];
- jstrescapecpy(t_name, p->name);
- sprintf(tmp_sql, "REPLACE INTO `%s` (`char_id`, `account_id`, `char_num`, `name`) VALUES ('%d', '%d', '%d', '%s')",
- char_db, p->char_id, p->account_id, p->char_num, t_name);
- if(mysql_query(&mysql_handle, tmp_sql))
+ char esc_name[NAME_LENGTH*2+1];
+
+ Sql_EscapeStringLen(sql_handle, esc_name, p->name, strnlen(p->name, NAME_LENGTH));
+ if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`account_id`, `char_num`, `name`) VALUES ('%d', '%d', '%s')",
+ char_db, p->account_id, p->char_num, esc_name) )
{
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " creation");
+ Sql_ShowDebug(sql_handle);
+ }
+
+ strcat(save_status, " creation");
}
#endif
@@ -544,11 +505,11 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
(p->head_mid != cp->head_mid) || (p->head_bottom != cp->head_bottom)
)
{ //Save status
- sprintf(tmp_sql ,"UPDATE `%s` SET `base_level`='%d', `job_level`='%d',"
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `base_level`='%d', `job_level`='%d',"
"`base_exp`='%u', `job_exp`='%u', `zeny`='%d',"
"`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d',"
"`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d',"
- "`option`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',`homun_id`='%d'," //[orn] add homun_id (homunculus id)
+ "`option`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d',`homun_id`='%d',"
"`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d',"
"`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d'"
" WHERE `account_id`='%d' AND `char_id` = '%d'",
@@ -556,19 +517,15 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
p->base_exp, p->job_exp, p->zeny,
p->max_hp, p->hp, p->max_sp, p->sp, p->status_point, p->skill_point,
p->str, p->agi, p->vit, p->int_, p->dex, p->luk,
- p->option, p->party_id, p->guild_id, p->pet_id, p->hom_id, //[orn] add homun_id (homunculus id)
+ p->option, p->party_id, p->guild_id, p->pet_id, p->hom_id,
p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom,
mapindex_id2name(p->last_point.map), p->last_point.x, p->last_point.y,
mapindex_id2name(p->save_point.map), p->save_point.x, p->save_point.y,
- p->account_id, p->char_id
- );
-
- if(mysql_query(&mysql_handle, tmp_sql))
+ p->account_id, p->char_id) )
{
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " status");
+ Sql_ShowDebug(sql_handle);
+ }
+ strcat(save_status, " status");
}
//Values that will seldom change (to speed up saving)
@@ -581,7 +538,7 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
(p->fame != cp->fame)
)
{
- sprintf(tmp_sql ,"UPDATE `%s` SET `class`='%d',"
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `class`='%d',"
"`hair`='%d',`hair_color`='%d',`clothes_color`='%d',"
"`partner_id`='%d', `father`='%d', `mother`='%d', `child`='%d',"
"`karma`='%d',`manner`='%d', `fame`='%d'"
@@ -590,108 +547,81 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
p->hair, p->hair_color, p->clothes_color,
p->partner_id, p->father, p->mother, p->child,
p->karma, p->manner, p->fame,
- p->account_id, p->char_id
- );
- if(mysql_query(&mysql_handle, tmp_sql))
+ p->account_id, p->char_id) )
{
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " status2");
- }
-
-
- diff = 0;
+ Sql_ShowDebug(sql_handle);
+ }
- for(i=0;i<MAX_MEMOPOINTS;i++){
- if(p->memo_point[i].map == cp->memo_point[i].map && p->memo_point[i].x == cp->memo_point[i].x && p->memo_point[i].y == cp->memo_point[i].y)
- continue;
- diff = 1;
- break;
+ strcat(save_status, " status2");
}
- if (diff)
- { //Save memo
+ //memo points
+ if( memcmp(p->memo_point, cp->memo_point, sizeof(p->memo_point)) )
+ {
+ char esc_mapname[NAME_LENGTH*2+1];
+
//`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, p->char_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", memo_db, p->char_id) )
+ Sql_ShowDebug(sql_handle);
//insert here.
- tmp_ptr = tmp_sql;
- tmp_ptr += sprintf(tmp_ptr, "INSERT INTO `%s`(`char_id`,`map`,`x`,`y`) VALUES ", memo_db);
- count = 0;
- for(i=0;i<MAX_MEMOPOINTS;i++){
- if(p->memo_point[i].map){
- tmp_ptr += sprintf(tmp_ptr,"('%d', '%s', '%d', '%d'),",
- char_id, mapindex_id2name(p->memo_point[i].map), p->memo_point[i].x, p->memo_point[i].y);
- count++;
+ StringBuf_Clear(&buf);
+ StringBuf_Printf(&buf, "INSERT INTO `%s`(`char_id`,`map`,`x`,`y`) VALUES ", memo_db);
+ for( i = 0, count = 0; i < MAX_MEMOPOINTS; ++i )
+ {
+ if( p->memo_point[i].map )
+ {
+ if( count )
+ StringBuf_AppendStr(&buf, ",");
+ Sql_EscapeString(sql_handle, esc_mapname, mapindex_id2name(p->memo_point[i].map));
+ StringBuf_Printf(&buf, "('%d', '%s', '%d', '%d')", char_id, esc_mapname, p->memo_point[i].x, p->memo_point[i].y);
+ ++count;
}
}
- if (count)
- { //Dangerous? Only if none of the above sprintf worked. [Skotlex]
- tmp_ptr[-1] = '\0'; //Remove the trailing comma.
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " memo");
- } else //Memo Points cleared (how is this possible?).
- strcat(save_status, " memo");
+ if( count )
+ {
+ if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+ }
+
+ strcat(save_status, " memo");
}
- diff = 0;
- for(i=0;i<MAX_SKILL;i++) {
+ //FIXME: is this neccessary? [ultramage]
+ for(i=0;i<MAX_SKILL;i++)
if ((p->skill[i].lv != 0) && (p->skill[i].id == 0))
p->skill[i].id = i; // Fix skill tree
- 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)
- { //Save skills
-
+ //skills
+ if( memcmp(p->skill, cp->skill, sizeof(p->skill)) )
+ {
//`skill` (`char_id`, `id`, `lv`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, p->char_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- tmp_ptr = tmp_sql;
- tmp_ptr += sprintf(tmp_ptr,"INSERT INTO `%s`(`char_id`,`id`,`lv`) VALUES ", skill_db);
- count = 0;
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", skill_db, p->char_id) )
+ Sql_ShowDebug(sql_handle);
+
+ StringBuf_Clear(&buf);
+ StringBuf_Printf(&buf, "INSERT INTO `%s`(`char_id`,`id`,`lv`) VALUES ", skill_db);
//insert here.
- for(i=0;i<MAX_SKILL;i++){
+ for( i = 0, count = 0; i < MAX_SKILL; ++i )
+ {
if(p->skill[i].id && p->skill[i].flag!=1)
{
- tmp_ptr += sprintf(tmp_ptr,"('%d','%d','%d'),",
- char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2);
- count++;
+ if( count )
+ StringBuf_AppendStr(&buf, ",");
+ StringBuf_Printf(&buf, "('%d','%d','%d')", char_id, p->skill[i].id, (p->skill[i].flag == 0 ? p->skill[i].lv : p->skill[i].flag - 2));
+ ++count;
}
}
-
- if (count)
+ if( count )
{
- tmp_ptr[-1] = '\0'; //Remove trailing comma.
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
- strcat(save_status, " skills");
- } else //Skills removed (reset?)
- strcat(save_status, " skills");
+ if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+ }
+
+ strcat(save_status, " skills");
}
+
diff = 0;
for(i = 0; i < MAX_FRIENDS; i++){
if(p->friends[i].char_id != cp->friends[i].char_id ||
@@ -702,58 +632,54 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
}
if(diff == 1)
- { //Save friends
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", friend_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- tmp_ptr = tmp_sql;
- tmp_ptr += sprintf(tmp_ptr, "INSERT INTO `%s` (`char_id`, `friend_account`, `friend_id`) VALUES ", friend_db);
- count = 0;
- for(i = 0; i < MAX_FRIENDS; i++){
- if(p->friends[i].char_id > 0)
+ { //Save friends
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", friend_db, char_id) )
+ Sql_ShowDebug(sql_handle);
+
+ StringBuf_Clear(&buf);
+ StringBuf_Printf(&buf, "INSERT INTO `%s` (`char_id`, `friend_account`, `friend_id`) VALUES ", friend_db);
+ for( i = 0, count = 0; i < MAX_FRIENDS; ++i )
+ {
+ if( p->friends[i].char_id > 0 )
{
- tmp_ptr += sprintf(tmp_ptr, "('%d','%d','%d'),", char_id, p->friends[i].account_id, p->friends[i].char_id);
+ if( count )
+ StringBuf_AppendStr(&buf, ",");
+ StringBuf_Printf(&buf, "('%d','%d','%d')", char_id, p->friends[i].account_id, p->friends[i].char_id);
count++;
}
}
- if (count)
+ if( count )
{
- tmp_ptr[-1] = '\0'; //Remove the last comma. [Skotlex]
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else
+ if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+ else
strcat(save_status, " friends");
- } else //Friend list cleared.
+ }
+ else //Friend list cleared.
strcat(save_status, " friends");
-
}
#ifdef HOTKEY_SAVING
// hotkeys
- tmp_ptr = tmp_sql;
- tmp_ptr += sprintf(tmp_ptr, "REPLACE INTO `%s` (`char_id`, `hotkey`, `type`, `itemskill_id`, `skill_lvl`) VALUES ", hotkey_db);
+ StringBuf_Clear(&buf);
+ StringBuf_Printf(&buf, "REPLACE INTO `%s` (`char_id`, `hotkey`, `type`, `itemskill_id`, `skill_lvl`) VALUES ", hotkey_db);
diff = 0;
for(i = 0; i < ARRAYLENGTH(p->hotkeys); i++){
if(memcmp(&p->hotkeys[i], &cp->hotkeys[i], sizeof(struct hotkey)))
{
- tmp_ptr += sprintf(tmp_ptr, "('%d','%d','%d','%d','%d'),", char_id, i, p->hotkeys[i].type, p->hotkeys[i].id , p->hotkeys[i].lv);
+ if( diff )
+ StringBuf_AppendStr(&buf, ",");// not the first hotkey
+ StringBuf_Printf(&buf, "('%d','%u','%u','%u','%u')", char_id, (unsigned int)i, (unsigned int)p->hotkeys[i].type, p->hotkeys[i].id , (unsigned int)p->hotkeys[i].lv);
diff = 1;
}
}
if(diff) {
- tmp_ptr[-1] = 0;
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else {
+ if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+ else
strcat(save_status, " hotkeys");
- }
}
#endif
+ StringBuf_Destroy(&buf);
if (save_status[0]!='\0' && save_log)
ShowInfo("Saved char %d - %s:%s.\n", char_id, p->name, save_status);
#ifndef TXT_SQL_CONVERT
@@ -764,129 +690,138 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
return 0;
}
-// [Ilpalazzo-sama]
-int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id, int tableswitch)
+/// Saves an array of 'item' entries into the specified table.
+int memitemdata_to_sql(const struct item items[], int max, int id, int tableswitch)
{
- int i,j, flag, id;
- char* tablename;
- char selectoption[16];
- char* str_p = tmp_sql;
+ StringBuf buf;
+ SqlStmt* stmt;
+ int i;
+ int j;
+ const char* tablename;
+ const char* selectoption;
+ struct item item; // temp storage variable
+ bool* flag; // bit array for inventory matching
+ bool found;
switch (tableswitch) {
- case TABLE_INVENTORY: tablename = inventory_db; sprintf(selectoption,"char_id"); break;
- case TABLE_CART: tablename = cart_db; sprintf(selectoption,"char_id"); break;
- case TABLE_STORAGE: tablename = storage_db; sprintf(selectoption,"account_id"); break;
- case TABLE_GUILD_STORAGE: tablename = guild_storage_db; sprintf(selectoption,"guild_id"); break;
+ case TABLE_INVENTORY: tablename = inventory_db; selectoption = "char_id"; break;
+ case TABLE_CART: tablename = cart_db; selectoption = "char_id"; break;
+ case TABLE_STORAGE: tablename = storage_db; selectoption = "account_id"; break;
+ case TABLE_GUILD_STORAGE: tablename = guild_storage_db; selectoption = "guild_id"; break;
default:
ShowError("Invalid table name!\n");
return 1;
}
- //=======================================mysql database data > memory===============================================
-
- str_p += sprintf(str_p, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
- for (j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
+ // The following code compares inventory with current database values
+ // and performs modification/deletion/insertion only on relevant rows.
+ // This approach is more complicated than a trivial delete&insert, but
+ // it significantly reduces cpu load on the database server.
- str_p += sprintf(str_p, " FROM `%s` WHERE `%s`='%d'", tablename, selectoption, char_id);
+ StringBuf_Init(&buf);
+ StringBuf_AppendStr(&buf, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
+ for( j = 0; j < MAX_SLOTS; ++j )
+ StringBuf_Printf(&buf, ", `card%d`", j);
+ StringBuf_Printf(&buf, " FROM `%s` WHERE `%s`='%d'", tablename, selectoption, id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ stmt = SqlStmt_Malloc(sql_handle);
+ if( SQL_ERROR == SqlStmt_PrepareStr(stmt, StringBuf_Value(&buf))
+ || SQL_ERROR == SqlStmt_Execute(stmt) )
+ {
+ SqlStmt_ShowDebug(stmt);
+ SqlStmt_Free(stmt);
+ StringBuf_Clear(&buf);
return 1;
}
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- while ((sql_row = mysql_fetch_row(sql_res))) {
- flag = 0;
- id = atoi(sql_row[0]);
- for(i = 0; i < count; i++) {
- if(mapitem[i].flag == 1)
- continue;
- if(mapitem[i].nameid == atoi(sql_row[1])
- && mapitem[i].card[0] == atoi(sql_row[7])
- && mapitem[i].card[2] == atoi(sql_row[9])
- && mapitem[i].card[3] == atoi(sql_row[10])
- ) { //They are the same item.
- for (j = 0; j<MAX_SLOTS && mapitem[i].card[j] == atoi(sql_row[7+j]); j++);
- if (j == MAX_SLOTS &&
- mapitem[i].amount == atoi(sql_row[2]) &&
- mapitem[i].equip == atoi(sql_row[3]) &&
- mapitem[i].identify == atoi(sql_row[4]) &&
- mapitem[i].refine == atoi(sql_row[5]) &&
- mapitem[i].attribute == atoi(sql_row[6]))
- { //Do nothing.
- } else
-//==============================================Memory data > SQL ===============================
-#ifndef TXT_SQL_CONVERT
- if(!itemdb_isequip(mapitem[i].nameid))
- { //Quick update of stackable items. Update Qty and Equip should be enough, but in case we are also updating identify
- sprintf(tmp_sql,"UPDATE `%s` SET `equip`='%d', `identify`='%d', `amount`='%d' WHERE `id`='%d' LIMIT 1",
- tablename, mapitem[i].equip, mapitem[i].identify,mapitem[i].amount, id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- } else
-#endif //TXT_SQL_CONVERT
- { //Equipment or Misc item, just update all fields.
- str_p = tmp_sql;
- str_p += sprintf(str_p,"UPDATE `%s` SET `equip`='%d', `identify`='%d', `refine`='%d',`attribute`='%d'",
- tablename, mapitem[i].equip, mapitem[i].identify, mapitem[i].refine, mapitem[i].attribute);
-
- for(j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`=%d", j, mapitem[i].card[j]);
-
- str_p += sprintf(str_p,", `amount`='%d' WHERE `id`='%d' LIMIT 1",
- mapitem[i].amount, id);
-
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- flag = mapitem[i].flag = 1; //Item dealt with,
- break; //skip to next item in the db.
- }
- }
- if(!flag) { //Item not updated, remove it.
- sprintf(tmp_sql,"DELETE from `%s` where `id`='%d'", tablename, id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
- }
- mysql_free_result(sql_res);
- }
- for(i = 0; i < count; i++) {
- if(!mapitem[i].flag) {
- str_p = tmp_sql;
- str_p += sprintf(str_p,"INSERT INTO `%s`(`%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`",
- tablename, selectoption);
- for(j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p,", `card%d`", j);
+ SqlStmt_BindColumn(stmt, 0, SQLDT_INT, &item.id, 0, NULL, NULL);
+ SqlStmt_BindColumn(stmt, 1, SQLDT_SHORT, &item.nameid, 0, NULL, NULL);
+ SqlStmt_BindColumn(stmt, 2, SQLDT_SHORT, &item.amount, 0, NULL, NULL);
+ SqlStmt_BindColumn(stmt, 3, SQLDT_USHORT, &item.equip, 0, NULL, NULL);
+ SqlStmt_BindColumn(stmt, 4, SQLDT_CHAR, &item.identify, 0, NULL, NULL);
+ SqlStmt_BindColumn(stmt, 5, SQLDT_CHAR, &item.refine, 0, NULL, NULL);
+ SqlStmt_BindColumn(stmt, 6, SQLDT_CHAR, &item.attribute, 0, NULL, NULL);
+ for( j = 0; j < MAX_SLOTS; ++j )
+ SqlStmt_BindColumn(stmt, 7+j, SQLDT_SHORT, &item.card[j], 0, NULL, NULL);
+
+ // bit array indicating which inventory items have already been matched
+ flag = (bool*) aCallocA(max, sizeof(bool));
+
+ while( SQL_SUCCESS == SqlStmt_NextRow(stmt) )
+ {
+ bool found = false;
+ // search for the presence of the item in the char's inventory
+ for( i = 0; i < max; ++i )
+ {
+ if( flag[i] )
+ continue; // this item was matched already, skip it
- str_p += sprintf(str_p,") VALUES ( '%d','%d', '%d', '%d', '%d', '%d', '%d'",
- char_id, mapitem[i].nameid, mapitem[i].amount, mapitem[i].equip, mapitem[i].identify, mapitem[i].refine,
- mapitem[i].attribute);
+ if( items[i].id == 0 )
+ { // to make skipping empty entries faster and to prevent saving them later
+ flag[i] = true;
+ continue;
+ }
- for(j=0; j<MAX_SLOTS; j++)
- str_p +=sprintf(str_p,", '%d'",mapitem[i].card[j]);
-
- strcat(tmp_sql, ")");
- if(mysql_query(&mysql_handle, tmp_sql))
+ if( compare_item(&items[i], &item) )
+ ; // Equal - do nothing.
+ else
{
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ // update all fields.
+ StringBuf_Clear(&buf);
+ StringBuf_Printf(&buf, "UPDATE `%s` SET `amount`='%d', `equip`='%d', `identify`='%d', `refine`='%d',`attribute`='%d'",
+ tablename, items[i].amount, items[i].equip, items[i].identify, items[i].refine, items[i].attribute);
+ for( j = 0; j < MAX_SLOTS; ++j )
+ StringBuf_Printf(&buf, ", `card%d`=%d", j, items[i].card[j]);
+ StringBuf_Printf(&buf, ", `amount`='%d' WHERE `id`='%d' LIMIT 1", items[i].amount, item.id);
+
+ if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+
}
+
+ found = flag[i] = true; //Item dealt with,
+ break; //skip to next item in the db.
+ }
+ 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);
+ }
+ }
+ SqlStmt_Free(stmt);
+
+ StringBuf_Clear(&buf);
+ StringBuf_Printf(&buf, "INSERT INTO `%s`(`%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`", tablename, selectoption);
+ for( j = 0; j < MAX_SLOTS; ++j )
+ StringBuf_Printf(&buf, ", `card%d`", j);
+ StringBuf_AppendStr(&buf, ") VALUES ");
+
+ found = false;
+ // insert non-matched items into the db as new items
+ for( i = 0, found = 0; i < max; ++i )
+ {
+ if( !flag[i] )
+ {
+ if( found )
+ StringBuf_AppendStr(&buf, ",");
+ else
+ found = true;
+
+ StringBuf_Printf(&buf, "('%d', '%d', '%d', '%d', '%d', '%d', '%d'",
+ id, items[i].nameid, items[i].amount, items[i].equip, items[i].identify, items[i].refine, items[i].attribute);
+ for( j = 0; j < MAX_SLOTS; ++j )
+ StringBuf_Printf(&buf, ", '%d'", items[i].card[j]);
+ StringBuf_AppendStr(&buf, ")");
}
}
+
+ if( found && SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+
+ StringBuf_Destroy(&buf);
+ aFree(flag);
+
return 0;
}
@@ -894,10 +829,12 @@ int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id, int tab
//=====================================================================================================
int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything)
{
- int i,j, n;
+ int i,j;
char t_msg[128] = "";
- char* str_p = tmp_sql;
struct mmo_charstatus* cp;
+ StringBuf buf;
+ char* data;
+ size_t len;
memset(p, 0, sizeof(struct mmo_charstatus));
@@ -905,80 +842,76 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything
if (save_log) ShowInfo("Char load request (%d)\n", char_id);
// read char data
- sprintf(tmp_sql, "SELECT "
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT "
"`char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`,"
"`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,"
"`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`hair`,"
"`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`,"
"`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`"
- " FROM `%s` WHERE `char_id` = '%d'", char_db, char_id);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- if (!sql_res) {
- ShowError("Load char failed (%d - table %s).\n", char_id, char_db);
+ " FROM `%s` WHERE `char_id` = '%d'", char_db, char_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
-
- sql_row = mysql_fetch_row(sql_res);
- if (!sql_row) { //Just how does this happens? [Skotlex]
+ if( SQL_SUCCESS != Sql_NextRow(sql_handle) )
+ {
ShowError("Requested non-existant character id: %d!\n", char_id);
- mysql_free_result(sql_res);
+ Sql_FreeResult(sql_handle);
return 0;
}
p->char_id = char_id;
- p->account_id = atoi(sql_row[1]);
- p->char_num = atoi(sql_row[2]);
- strncpy(p->name, sql_row[3], NAME_LENGTH-1);
- p->class_ = atoi(sql_row[4]);
- p->base_level = atoi(sql_row[5]);
- p->job_level = atoi(sql_row[6]);
- p->base_exp = (unsigned int)cap_value(atof(sql_row[7]), 0, UINT_MAX);
- p->job_exp = (unsigned int)cap_value(atof(sql_row[8]), 0, UINT_MAX);
- p->zeny = atoi(sql_row[9]);
- p->str = atoi(sql_row[10]);
- p->agi = atoi(sql_row[11]);
- p->vit = atoi(sql_row[12]);
- p->int_ = atoi(sql_row[13]);
- p->dex = atoi(sql_row[14]);
- p->luk = atoi(sql_row[15]);
- p->max_hp = atoi(sql_row[16]);
- p->hp = atoi(sql_row[17]);
- p->max_sp = atoi(sql_row[18]);
- p->sp = atoi(sql_row[19]);
- p->status_point = (unsigned short)cap_value(atoi(sql_row[20]), 0, USHRT_MAX);
- p->skill_point = (unsigned short)cap_value(atoi(sql_row[21]), 0, USHRT_MAX);
- p->option = atoi(sql_row[22]);
- p->karma = atoi(sql_row[23]);
- p->manner = atoi(sql_row[24]);
- p->party_id = atoi(sql_row[25]);
- p->guild_id = atoi(sql_row[26]);
- p->pet_id = atoi(sql_row[27]);
- p->hom_id = atoi(sql_row[28]);
- p->hair = atoi(sql_row[29]);
- p->hair_color = atoi(sql_row[30]);
- p->clothes_color = atoi(sql_row[31]);
- p->weapon = atoi(sql_row[32]);
- p->shield = atoi(sql_row[33]);
- p->head_top = atoi(sql_row[34]);
- p->head_mid = atoi(sql_row[35]);
- p->head_bottom = atoi(sql_row[36]);
- p->last_point.map = mapindex_name2id(sql_row[37]); p->last_point.x = atoi(sql_row[38]); p->last_point.y = atoi(sql_row[39]);
- p->save_point.map = mapindex_name2id(sql_row[40]); p->save_point.x = atoi(sql_row[41]); p->save_point.y = atoi(sql_row[42]);
- p->partner_id = atoi(sql_row[43]);
- p->father = atoi(sql_row[44]);
- p->mother = atoi(sql_row[45]);
- p->child = atoi(sql_row[46]);
- p->fame = atoi(sql_row[47]);
-
+ //TODO: prepared statement goes here >_> [ultramage]
+ Sql_GetData(sql_handle, 1, &data, NULL); p->account_id = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); p->char_num = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, &len); memcpy(p->name, data, min(len, NAME_LENGTH));
+ Sql_GetData(sql_handle, 4, &data, NULL); p->class_ = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); p->base_level = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); p->job_level = atoi(data);
+ Sql_GetData(sql_handle, 7, &data, NULL); p->base_exp = (unsigned int)cap_value(strtoul(data,NULL,10), 0, UINT_MAX);
+ Sql_GetData(sql_handle, 8, &data, NULL); p->job_exp = (unsigned int)cap_value(strtoul(data,NULL,10), 0, UINT_MAX);
+ Sql_GetData(sql_handle, 9, &data, NULL); p->zeny = atoi(data);
+ Sql_GetData(sql_handle, 10, &data, NULL); p->str = atoi(data);
+ Sql_GetData(sql_handle, 11, &data, NULL); p->agi = atoi(data);
+ Sql_GetData(sql_handle, 12, &data, NULL); p->vit = atoi(data);
+ Sql_GetData(sql_handle, 13, &data, NULL); p->int_ = atoi(data);
+ Sql_GetData(sql_handle, 14, &data, NULL); p->dex = atoi(data);
+ Sql_GetData(sql_handle, 15, &data, NULL); p->luk = atoi(data);
+ Sql_GetData(sql_handle, 16, &data, NULL); p->max_hp = atoi(data);
+ Sql_GetData(sql_handle, 17, &data, NULL); p->hp = atoi(data);
+ Sql_GetData(sql_handle, 18, &data, NULL); p->max_sp = atoi(data);
+ Sql_GetData(sql_handle, 19, &data, NULL); p->sp = atoi(data);
+ Sql_GetData(sql_handle, 20, &data, NULL); p->status_point = (unsigned short)cap_value(atoi(data), 0, USHRT_MAX);
+ Sql_GetData(sql_handle, 21, &data, NULL); p->skill_point = (unsigned short)cap_value(atoi(data), 0, USHRT_MAX);
+ Sql_GetData(sql_handle, 22, &data, NULL); p->option = atoi(data);
+ Sql_GetData(sql_handle, 23, &data, NULL); p->karma = atoi(data);
+ Sql_GetData(sql_handle, 24, &data, NULL); p->manner = atoi(data);
+ Sql_GetData(sql_handle, 25, &data, NULL); p->party_id = atoi(data);
+ Sql_GetData(sql_handle, 26, &data, NULL); p->guild_id = atoi(data);
+ Sql_GetData(sql_handle, 27, &data, NULL); p->pet_id = atoi(data);
+ Sql_GetData(sql_handle, 28, &data, NULL); p->hom_id = atoi(data);
+ Sql_GetData(sql_handle, 29, &data, NULL); p->hair = atoi(data);
+ Sql_GetData(sql_handle, 30, &data, NULL); p->hair_color = atoi(data);
+ Sql_GetData(sql_handle, 31, &data, NULL); p->clothes_color = atoi(data);
+ Sql_GetData(sql_handle, 32, &data, NULL); p->weapon = atoi(data);
+ Sql_GetData(sql_handle, 33, &data, NULL); p->shield = atoi(data);
+ Sql_GetData(sql_handle, 34, &data, NULL); p->head_top = atoi(data);
+ Sql_GetData(sql_handle, 35, &data, NULL); p->head_mid = atoi(data);
+ Sql_GetData(sql_handle, 36, &data, NULL); p->head_bottom = atoi(data);
+ Sql_GetData(sql_handle, 37, &data, NULL); p->last_point.map = mapindex_name2id(data);
+ Sql_GetData(sql_handle, 38, &data, NULL); p->last_point.x = atoi(data);
+ Sql_GetData(sql_handle, 39, &data, NULL); p->last_point.y = atoi(data);
+ Sql_GetData(sql_handle, 40, &data, NULL); p->save_point.map = mapindex_name2id(data);
+ Sql_GetData(sql_handle, 41, &data, NULL); p->save_point.x = atoi(data);
+ Sql_GetData(sql_handle, 42, &data, NULL); p->save_point.y = atoi(data);
+ Sql_GetData(sql_handle, 43, &data, NULL); p->partner_id = atoi(data);
+ Sql_GetData(sql_handle, 44, &data, NULL); p->father = atoi(data);
+ Sql_GetData(sql_handle, 45, &data, NULL); p->mother = atoi(data);
+ Sql_GetData(sql_handle, 46, &data, NULL); p->child = atoi(data);
+ Sql_GetData(sql_handle, 47, &data, NULL); p->fame = atoi(data);
+
//free mysql result.
- mysql_free_result(sql_res);
+ Sql_FreeResult(sql_handle);
strcat (t_msg, " status");
if (!load_everything) // For quick selection of data when displaying the char menu
@@ -986,149 +919,120 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything
//read memo data
//`memo` (`memo_id`,`char_id`,`map`,`x`,`y`)
- sprintf(tmp_sql, "SELECT `map`,`x`,`y` FROM `%s` WHERE `char_id`='%d' ORDER by `memo_id`",memo_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `map`,`x`,`y` FROM `%s` WHERE `char_id`='%d' ORDER by `memo_id`", memo_db, char_id) )
+ Sql_ShowDebug(sql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- p->memo_point[i].map = mapindex_name2id(sql_row[0]);
- p->memo_point[i].x=atoi(sql_row[1]);
- p->memo_point[i].y=atoi(sql_row[2]);
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " memo");
+ for( i = 0; i < MAX_MEMOPOINTS && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ Sql_GetData(sql_handle, 0, &data, NULL); p->memo_point[i].map = mapindex_name2id(data);
+ Sql_GetData(sql_handle, 1, &data, NULL); p->memo_point[i].x = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); p->memo_point[i].y = atoi(data);
}
+ strcat(t_msg, " memo");
//read inventory
//`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- str_p += sprintf(str_p, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
-
- for (j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
- str_p += sprintf(str_p, " FROM `%s` WHERE `char_id`='%d'", inventory_db, char_id);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- p->inventory[i].id = atoi(sql_row[0]);
- p->inventory[i].nameid = atoi(sql_row[1]);
- p->inventory[i].amount = atoi(sql_row[2]);
- p->inventory[i].equip = atoi(sql_row[3]);
- p->inventory[i].identify = atoi(sql_row[4]);
- p->inventory[i].refine = atoi(sql_row[5]);
- p->inventory[i].attribute = atoi(sql_row[6]);
- for (j=0; j<MAX_SLOTS; j++)
- p->inventory[i].card[j] = atoi(sql_row[7+j]);
+ StringBuf_Init(&buf);
+ StringBuf_AppendStr(&buf, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
+ for( j = 0; j < MAX_SLOTS; ++j )
+ StringBuf_Printf(&buf, ", `card%d`", j);
+ StringBuf_Printf(&buf, " FROM `%s` WHERE `char_id`='%d'", inventory_db, char_id);
+
+ if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+ for( i = 0; i < MAX_INVENTORY && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ Sql_GetData(sql_handle, 0, &data, NULL); p->inventory[i].id = atoi(data);
+ Sql_GetData(sql_handle, 1, &data, NULL); p->inventory[i].nameid = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); p->inventory[i].amount = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); p->inventory[i].equip = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); p->inventory[i].identify = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); p->inventory[i].refine = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); p->inventory[i].attribute = atoi(data);
+ for( j = 0; j < MAX_SLOTS; ++j )
+ {
+ Sql_GetData(sql_handle, 7 + j, &data, NULL); p->inventory[i].card[j] = atoi(data);
}
- mysql_free_result(sql_res);
- strcat (t_msg, " inventory");
}
+ strcat(t_msg, " inventory");
//read cart
//`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
- str_p = tmp_sql;
- str_p += sprintf(str_p, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
- for (j = 0; j < MAX_SLOTS; j++) str_p += sprintf(str_p, ", `card%d`", j);
- str_p += sprintf(str_p, " FROM `%s` WHERE `char_id`='%d'", cart_db, char_id);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- p->cart[i].id = atoi(sql_row[0]);
- p->cart[i].nameid = atoi(sql_row[1]);
- p->cart[i].amount = atoi(sql_row[2]);
- p->cart[i].equip = atoi(sql_row[3]);
- p->cart[i].identify = atoi(sql_row[4]);
- p->cart[i].refine = atoi(sql_row[5]);
- p->cart[i].attribute = atoi(sql_row[6]);
- for(j=0; j<MAX_SLOTS; j++)
- p->cart[i].card[j] = atoi(sql_row[7+j]);
+ StringBuf_Clear(&buf);
+ StringBuf_AppendStr(&buf, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`");
+ for( j = 0; j < MAX_SLOTS; ++j )
+ StringBuf_Printf(&buf, ", `card%d`", j);
+ StringBuf_Printf(&buf, " FROM `%s` WHERE `char_id`='%d'", cart_db, char_id);
+
+ if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+ for( i = 0; i < MAX_CART && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ Sql_GetData(sql_handle, 0, &data, NULL); p->cart[i].id = atoi(data);
+ Sql_GetData(sql_handle, 1, &data, NULL); p->cart[i].nameid = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); p->cart[i].amount = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); p->cart[i].equip = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); p->cart[i].identify = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); p->cart[i].refine = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); p->cart[i].attribute = atoi(data);
+ for( j = 0; j < MAX_SLOTS; ++j )
+ {
+ Sql_GetData(sql_handle, 7 + j, &data, NULL); p->cart[i].card[j] = atoi(data);
}
- mysql_free_result(sql_res);
- strcat (t_msg, " cart");
}
+ strcat(t_msg, " cart");
//read skill
//`skill` (`char_id`, `id`, `lv`)
- sprintf(tmp_sql, "SELECT `id`, `lv` FROM `%s` WHERE `char_id`='%d'",skill_db, char_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){
- n = atoi(sql_row[0]);
- p->skill[n].id = n; //memory!? shit!.
- p->skill[n].lv = atoi(sql_row[1]);
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " skills");
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `id`, `lv` FROM `%s` WHERE `char_id`='%d'", skill_db, char_id) )
+ Sql_ShowDebug(sql_handle);
+ for( i = 0; i < MAX_SKILL && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ int n;
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ n = atoi(data);
+ p->skill[n].id = n; //FIXME: why not use a boolean?
+ Sql_GetData(sql_handle, 1, &data, NULL);
+ p->skill[n].lv = atoi(data);
}
+ strcat(t_msg, " skills");
//Friend list
//Shamelessly stolen from its_sparky (ie: thanks) and then assimilated by [Skotlex]
- sprintf(tmp_sql, "SELECT f.friend_account, f.friend_id, c.name FROM `%s` f LEFT JOIN `%s` c ON f.friend_account=c.account_id AND f.friend_id=c.char_id WHERE f.char_id='%d'", friend_db, char_db, char_id);
-
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res)
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT c.name, f.friend_account, f.friend_id FROM `%s` f LEFT JOIN `%s` c ON f.friend_account=c.account_id AND f.friend_id=c.char_id WHERE f.char_id='%d'", friend_db, char_db, char_id) )
+ Sql_ShowDebug(sql_handle);
+ for( i = 0; i < MAX_FRIENDS && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
{
- for(i = 0; (sql_row = mysql_fetch_row(sql_res)) && i<MAX_FRIENDS; i++)
- {
- if(sql_row) { //need to check if we have sql_row before we check if we have sql_row[2] because we don't want a segfault
- if(sql_row[2]) {
- p->friends[i].account_id = atoi(sql_row[0]);
- p->friends[i].char_id = atoi(sql_row[1]);
- strncpy(p->friends[i].name, sql_row[2], NAME_LENGTH-1); //The -1 is to avoid losing the ending \0 [Skotlex]
- }
- }
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " friends");
+ // name
+ Sql_GetData(sql_handle, 0, &data, &len);
+ if( *data == '\0' )
+ continue;
+ memcpy(p->friends[i].name, data, min(len, NAME_LENGTH));
+ Sql_GetData(sql_handle, 1, &data, NULL); p->friends[i].account_id = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); p->friends[i].char_id = atoi(data);
}
+ strcat(t_msg, " friends");
#ifdef HOTKEY_SAVING
//Hotkeys
- sprintf(tmp_sql, "SELECT `hotkey`, `type`, `itemskill_id`, `skill_lvl` FROM `%s` WHERE `char_id`='%d'", hotkey_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n", mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__, __LINE__, tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- while ((sql_row = mysql_fetch_row(sql_res))) {
- n = atoi(sql_row[0]);
- if( n < 0 || n >= HOTKEY_SAVING)
- continue;
- p->hotkeys[n].type = atoi(sql_row[1]);
- p->hotkeys[n].id = atoi(sql_row[2]);
- p->hotkeys[n].lv = atoi(sql_row[3]);
- }
- mysql_free_result(sql_res);
- strcat (t_msg, " hotkeys");
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `hotkey`, `type`, `itemskill_id`, `skill_lvl` FROM `%s` WHERE `char_id`='%d'", hotkey_db, char_id) )
+ Sql_ShowDebug(sql_handle);
+ while( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ int n;
+ Sql_GetData(sql_handle, 0, &data, NULL); n = atoi(data);
+ if( n < 0 || n >= HOTKEY_SAVING )
+ continue;
+ Sql_GetData(sql_handle, 1, &data, NULL); p->hotkeys[n].type = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); p->hotkeys[n].id = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); p->hotkeys[n].lv = atoi(data);
}
+ strcat(t_msg, " hotkeys");
#endif
if (save_log) ShowInfo("Loaded char (%d - %s): %s\n", char_id, p->name, t_msg); //ok. all data load successfuly!
+ Sql_FreeResult(sql_handle);
+ StringBuf_Destroy(&buf);
cp = idb_ensure(char_db_, char_id, create_charstatus);
memcpy(cp, p, sizeof(struct mmo_charstatus));
@@ -1140,8 +1044,7 @@ int mmo_char_sql_init(void)
{
ShowInfo("Begin Initializing.......\n");
char_db_= db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA, sizeof(int));
- // memory initialize
- memset(&char_dat, 0, sizeof(struct mmo_charstatus));
+
if(char_per_account == 0){
ShowStatus("Chars per Account: 'Unlimited'.......\n");
}else{
@@ -1168,18 +1071,13 @@ int make_new_char_sql(int fd, unsigned char *dat)
{
struct char_session_data *sd;
char name[NAME_LENGTH];
- char t_name[NAME_LENGTH*2];
+ char esc_name[NAME_LENGTH*2+1];
unsigned int i; // Used in for loop and comparing with strlen, safe to be unsigned. [Lance]
- int char_id, temp;
+ int char_id;
- strncpy(name, dat, NAME_LENGTH);
- name[NAME_LENGTH-1] = '\0'; //Always terminate string.
+ safestrncpy(name, dat, NAME_LENGTH);
normalize_name(name,TRIM_CHARS); //Normalize character name. [Skotlex]
- jstrescapecpy(t_name, name);
-
- // disabled until fixed >.>
- // Note: escape characters should be added to jstrescape()!
- //mysql_real_escape_string(&mysql_handle, t_name, t_name_temp, sizeof(t_name_temp));
+ Sql_EscapeStringLen(sql_handle, esc_name, name, strnlen(name, NAME_LENGTH));
if (!session_isValid(fd) || !(sd = (struct char_session_data*)session[fd]->session_data))
return -2;
@@ -1194,22 +1092,14 @@ int make_new_char_sql(int fd, unsigned char *dat)
//check for charcount (maxchars) :)
if(char_per_account != 0){
- sprintf(tmp_sql, "SELECT `account_id` FROM `%s` WHERE `account_id` = '%d'", char_db, sd->account_id);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- //ok
- temp = (int)mysql_num_rows(sql_res);
- if(temp >= char_per_account){
- //hehe .. limit exceeded :P
- ShowInfo("Create char failed (%d): charlimit exceeded.\n", sd->account_id);
- mysql_free_result(sql_res);
- return -2;
- }
- mysql_free_result(sql_res);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id` FROM `%s` WHERE `account_id` = '%d'", char_db, sd->account_id) )
+ Sql_ShowDebug(sql_handle);
+ if( Sql_NumRows(sql_handle) >= char_per_account )
+ {
+ //hehe .. limit exceeded :P
+ ShowInfo("Create char failed (%d): charlimit exceeded.\n", sd->account_id);
+ Sql_FreeResult(sql_handle);
+ return -2;
}
}
@@ -1231,14 +1121,10 @@ int make_new_char_sql(int fd, unsigned char *dat)
(dat[31] >= 9)) { // hair color (dat[31] can not be negativ)
if (log_char) {
// char.log to charlog
- sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
"VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- charlog_db,"make new char error", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ charlog_db,"make new char error", sd->account_id, dat[30], esc_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]) )
+ Sql_ShowDebug(sql_handle);
}
ShowWarning("Create char failed (%d): stats error (bot cheat?!)\n", sd->account_id);
return -2;
@@ -1249,31 +1135,23 @@ int make_new_char_sql(int fd, unsigned char *dat)
if (dat[i] < 1 || dat[i] > 9) {
if (log_char) {
// char.log to charlog
- sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
"VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- charlog_db,"make new char error", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ charlog_db, "make new char error", sd->account_id, dat[30], esc_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]) )
+ Sql_ShowDebug(sql_handle);
}
ShowWarning("Create char failed (%d): stats error (bot cheat?!)\n", sd->account_id);
- return -2;
+ return -2;
}
} // now we know that every stat has proper value but we have to check if str/int agi/luk vit/dex pairs are correct
if( ((dat[24]+dat[27]) > 10) || ((dat[25]+dat[29]) > 10) || ((dat[26]+dat[28]) > 10) ) {
if (log_char) {
// char.log to charlog
- sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
- "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- charlog_db,"make new char error", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
+ "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
+ charlog_db, "make new char error", sd->account_id, dat[30], esc_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]) )
+ Sql_ShowDebug(sql_handle);
}
ShowWarning("Create char failed (%d): stats error (bot cheat?!)\n", sd->account_id);
return -2;
@@ -1281,93 +1159,58 @@ int make_new_char_sql(int fd, unsigned char *dat)
if (log_char) {
// char.log to charlog
- sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s`(`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
"VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- charlog_db,"make new char", sd->account_id, dat[30], t_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
- //query
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ charlog_db, "make new char", sd->account_id, dat[30], esc_name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]) )
+ Sql_ShowDebug(sql_handle);
}
//printf("make new char %d-%d %s %d, %d, %d, %d, %d, %d - %d, %d\n",
// fd, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]);
//Check Name (already in use?)
- sprintf(tmp_sql, "SELECT 1 FROM `%s` WHERE `name` = '%s'",char_db, t_name);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT 1 FROM `%s` WHERE `name` = '%s'", char_db, esc_name) )
+ {
+ Sql_ShowDebug(sql_handle);
return -2;
}
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- temp = (int)mysql_num_rows(sql_res);
- mysql_free_result(sql_res);
- if (temp > 0) {
- ShowInfo("Create char failed: charname already in use\n");
- return -1;
- }
+ if( Sql_NumRows(sql_handle) > 0 )
+ {
+ ShowInfo("Create char failed: charname already in use\n");
+ return -1;
}
// check char slot.
- sprintf(tmp_sql, "SELECT `account_id`, `char_num` FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d'",char_db, sd->account_id, dat[30]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if(sql_res){
- temp = (int)mysql_num_rows(sql_res);
- mysql_free_result(sql_res);
- if (temp > 0) {
- ShowWarning("Create char failed (%d, slot: %d), slot already in use\n", sd->account_id, dat[30]);
- return -2;
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`, `char_num` FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d'", char_db, sd->account_id, dat[30]) )
+ Sql_ShowDebug(sql_handle);
+ if( Sql_NumRows(sql_handle) > 0 )
+ {
+ ShowWarning("Create char failed (%d, slot: %d), slot already in use\n", sd->account_id, dat[30]);
+ return -2;
}
//New Querys [Sirius]
//Insert the char to the 'chardb' ^^
- sprintf(tmp_sql, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
- "`max_sp`, `sp`, `hair`, `hair_color`, `last_map`, `last_x`, `last_y`, `save_map`, `save_x`, `save_y`) VALUES ("
- "'%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
- char_db, sd->account_id , dat[30] , t_name, start_zeny, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29],
- (40 * (100 + dat[26])/100) , (40 * (100 + dat[26])/100 ), (11 * (100 + dat[27])/100), (11 * (100 + dat[27])/100), dat[33], dat[31],
- mapindex_id2name(start_point.map), start_point.x, start_point.y, mapindex_id2name(start_point.map), start_point.x, start_point.y);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
+ "`max_sp`, `sp`, `hair`, `hair_color`, `last_map`, `last_x`, `last_y`, `save_map`, `save_x`, `save_y`) VALUES ("
+ "'%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
+ char_db, sd->account_id , dat[30] , esc_name, start_zeny, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29],
+ (40 * (100 + dat[26])/100) , (40 * (100 + dat[26])/100 ), (11 * (100 + dat[27])/100), (11 * (100 + dat[27])/100), dat[33], dat[31],
+ mapindex_id2name(start_point.map), start_point.x, start_point.y, mapindex_id2name(start_point.map), start_point.x, start_point.y) )
+ {
+ Sql_ShowDebug(sql_handle);
return -2; //No, stop the procedure!
}
//Now we need the charid from sql!
- if(mysql_field_count(&mysql_handle) == 0 &&
- mysql_insert_id(&mysql_handle) > 0)
- char_id = (int)mysql_insert_id(&mysql_handle);
- else {
- //delete the char ..(no trash in DB!) but how is this possible?
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' AND `name` = '%s'", char_db, sd->account_id, dat[30], t_name);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return -2; //XD end of the (World? :P) .. charcreate (denied)
- }
+ char_id = (int)Sql_LastInsertId(sql_handle);
//Give the char the default items
//`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`)
if (start_weapon > 0) { //add Start Weapon (Knife?)
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id, start_weapon,1,0x02,1);
- if (mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id, start_weapon, 1, 0x02, 1) )
+ Sql_ShowDebug(sql_handle);
}
if (start_armor > 0) { //Add default armor (cotton shirt?)
- sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id, start_armor,1,0x10,1);
- if (mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id, start_armor, 1, 0x10, 1) )
+ Sql_ShowDebug(sql_handle);
}
ShowInfo("Created char: account: %d, char: %d, slot: %d, name: %s\n", sd->account_id, char_id, dat[30], name);
@@ -1382,58 +1225,50 @@ int make_new_char_sql(int fd, unsigned char *dat)
*/
int delete_char_sql(int char_id, int partner_id)
{
- char char_name[NAME_LENGTH], t_name[NAME_LENGTH*2]; //Name needs be escaped.
- int account_id, party_id, guild_id, hom_id, char_base_level;
-
- sprintf(tmp_sql, "SELECT `name`,`account_id`,`party_id`,`guild_id`,`base_level`,`homun_id` FROM `%s` WHERE `char_id`='%d'",char_db, char_id);
+ char name[NAME_LENGTH];
+ char esc_name[NAME_LENGTH*2+1]; //Name needs be escaped.
+ int account_id;
+ int party_id;
+ int guild_id;
+ int hom_id;
+ int base_level;
+ char* data;
+ size_t len;
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if(sql_res)
- sql_row = mysql_fetch_row(sql_res);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `name`,`account_id`,`party_id`,`guild_id`,`base_level`,`homun_id` FROM `%s` WHERE `char_id`='%d'", char_db, char_id) )
+ Sql_ShowDebug(sql_handle);
- if (sql_res == NULL || sql_row == NULL)
+ if( SQL_SUCCESS != Sql_NextRow(sql_handle) )
{
ShowError("delete_char_sql: Unable to fetch character data, deletion aborted.\n");
- if (sql_res)
- mysql_free_result(sql_res);
+ Sql_FreeResult(sql_handle);
return -1;
}
- strncpy(char_name, sql_row[0], NAME_LENGTH);
- char_name[NAME_LENGTH-1] = '\0';
- jstrescapecpy(t_name, char_name); //Escape string for sql use... [Skotlex]
- account_id = atoi(sql_row[1]);
- party_id = atoi(sql_row[2]);
- guild_id = atoi(sql_row[3]);
- char_base_level = atoi(sql_row[4]);
- hom_id = atoi(sql_row[5]);
- mysql_free_result(sql_res); //Let's free this as soon as possible to avoid problems later on.
+
+ Sql_GetData(sql_handle, 0, &data, &len); safestrncpy(name, data, NAME_LENGTH);
+ Sql_GetData(sql_handle, 1, &data, NULL); account_id = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); party_id = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); guild_id = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); base_level = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); hom_id = atoi(data);
+
+ Sql_EscapeStringLen(sql_handle, esc_name, data, min(len, NAME_LENGTH));
+ Sql_FreeResult(sql_handle);
//check for config char del condition [Lupus]
- if( ( char_del_level > 0 && char_base_level >= char_del_level )
- || ( char_del_level < 0 && char_base_level <= -char_del_level )
+ if( ( char_del_level > 0 && base_level >= char_del_level )
+ || ( char_del_level < 0 && base_level <= -char_del_level )
) {
- ShowInfo("Char deletion aborted: %s, BaseLevel: %i\n",char_name,char_base_level);
+ ShowInfo("Char deletion aborted: %s, BaseLevel: %i\n", name, base_level);
return -1;
}
/* Divorce [Wizputer] */
if (partner_id) {
- sprintf(tmp_sql,"UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'",char_db,partner_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE (`nameid`='%d' OR `nameid`='%d') AND `char_id`='%d'",inventory_db,WEDDING_RING_M,WEDDING_RING_F,partner_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'", char_db, partner_id) )
+ Sql_ShowDebug(sql_handle);
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE (`nameid`='%d' OR `nameid`='%d') AND `char_id`='%d'", inventory_db, WEDDING_RING_M, WEDDING_RING_F, partner_id) )
+ Sql_ShowDebug(sql_handle);
}
//Make the character leave the party [Skotlex]
@@ -1442,36 +1277,41 @@ int delete_char_sql(int char_id, int partner_id)
/* delete char's pet */
//Delete the hatched pet if you have one...
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d' AND `incuvate` = '0'",pet_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d' AND `incuvate` = '0'", pet_db, char_id) )
+ Sql_ShowDebug(sql_handle);
// Komurka's suggested way to clear pets, modified by [Skotlex] (because I always personalize what I do :X)
//Removing pets that are in the char's inventory....
{ //NOTE: The syntax for multi-table deletes is a bit changed between 4.0 and 4.1 regarding aliases, so we have to consider the version... [Skotlex]
//Since we only care about the major and minor version, a double conversion is good enough. (4.1.20 -> 4.10000)
- double mysql_version = atof(mysql_get_server_info(&mysql_handle));
-
- sprintf(tmp_sql,
- "delete FROM `%s` USING `%s` as c LEFT JOIN `%s` as i ON c.char_id = i.char_id, `%s` as p WHERE c.char_id = '%d' AND i.card0 = -256 AND p.pet_id = (i.card1|(i.card2<<2))",
- (mysql_version<4.1?pet_db:"p"), char_db, inventory_db, pet_db, char_id);
-
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- //Removing pets that are in the char's cart....
- sprintf(tmp_sql,
- "delete FROM `%s` USING `%s` as c LEFT JOIN `%s` as i ON c.char_id = i.char_id, `%s` as p WHERE c.char_id = '%d' AND i.card0 = -256 AND p.pet_id = (i.card1|(i.card2<<2))",
- (mysql_version<4.1?pet_db:"p"), char_db, cart_db, pet_db, char_id);
-
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ //double mysql_version = atof(mysql_get_server_info(&mysql_handle));
+ //
+ //sprintf(tmp_sql,
+ //"delete FROM `%s` USING `%s` as c LEFT JOIN `%s` as i ON c.char_id = i.char_id, `%s` as p WHERE c.char_id = '%d' AND i.card0 = -256 AND p.pet_id = (i.card1|(i.card2<<2))",
+ // (mysql_version<4.1?pet_db:"p"), char_db, inventory_db, pet_db, char_id);
+ //
+ //if(mysql_query(&mysql_handle, tmp_sql)) {
+ // ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ // ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ //}
+
+ ////Removing pets that are in the char's cart....
+ //sprintf(tmp_sql,
+ //"delete FROM `%s` USING `%s` as c LEFT JOIN `%s` as i ON c.char_id = i.char_id, `%s` as p WHERE c.char_id = '%d' AND i.card0 = -256 AND p.pet_id = (i.card1|(i.card2<<2))",
+ // (mysql_version<4.1?pet_db:"p"), char_db, cart_db, pet_db, char_id);
+ //
+ //if(mysql_query(&mysql_handle, tmp_sql)) {
+ // ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
+ // ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ //}
+
+ //## TODO double-check the functionality of this query
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE pet_id IN "
+ "(SELECT card1|card2<<2 FROM `%s` WHERE char_id = '%d' AND card0 = -256"
+ " UNION"
+ " SELECT card1|card2<<2 FROM `%s` WHERE char_id = '%d' AND card0 = -256)",
+ pet_db, inventory_db, char_id, cart_db, char_id) )
+ Sql_ShowDebug(sql_handle);
}
/* remove homunculus */
@@ -1479,126 +1319,68 @@ int delete_char_sql(int char_id, int partner_id)
inter_delete_homunculus(hom_id);
/* delete char's friends list */
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d'",friend_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d'", friend_db, char_id) )
+ Sql_ShowDebug(sql_handle);
/* delete char from other's friend list */
//NOTE: Won't this cause problems for people who are already online? [Skotlex]
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `friend_id` = '%d'",friend_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `friend_id` = '%d'", friend_db, char_id) )
+ Sql_ShowDebug(sql_handle);
#ifdef HOTKEY_SAVING
/* delete hotkeys */
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", hotkey_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", hotkey_db, char_id) )
+ Sql_ShowDebug(sql_handle);
#endif
/* delete inventory */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",inventory_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", inventory_db, char_id) )
+ Sql_ShowDebug(sql_handle);
/* delete cart inventory */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",cart_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", cart_db, char_id) )
+ Sql_ShowDebug(sql_handle);
/* delete memo areas */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", memo_db, char_id) )
+ Sql_ShowDebug(sql_handle);
/* delete character registry */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'", reg_db, char_id) )
+ Sql_ShowDebug(sql_handle);
/* delete skills */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", skill_db, char_id) )
+ Sql_ShowDebug(sql_handle);
#ifdef ENABLE_SC_SAVING
/* status changes */
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",
- scdata_db, account_id, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", scdata_db, account_id, char_id) )
+ Sql_ShowDebug(sql_handle);
#endif
if (log_char) {
- sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `account_id`,`char_num`,`char_msg`,`name`) VALUES (NOW(), '%d', '%d', 'Deleted char (CID %d)', '%s')",
- charlog_db, account_id, 0, char_id, t_name);
- //query
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s`(`time`, `account_id`,`char_num`,`char_msg`,`name`) VALUES (NOW(), '%d', '%d', 'Deleted char (CID %d)', '%s')",
+ charlog_db, account_id, 0, char_id, esc_name) )
+ Sql_ShowDebug(sql_handle);
}
/* delete character */
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",char_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", char_db, char_id) )
+ Sql_ShowDebug(sql_handle);
/* No need as we used inter_guild_leave [Skotlex]
// Also delete info from guildtables.
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",guild_member_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", guild_member_db, char_id) )
+ Sql_ShowDebug(sql_handle);
*/
- sprintf(tmp_sql, "SELECT `guild_id` FROM `%s` WHERE `master` = '%s'", guild_db, t_name);
-
- if (mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- } else {
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res == NULL) {
- if (mysql_errno(&mysql_handle) != 0)
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- return -1;
- } else {
- int rows = (int)mysql_num_rows(sql_res);
- mysql_free_result(sql_res);
- if (rows > 0) {
- mapif_parse_BreakGuild(0,guild_id);
- }
- else if (guild_id) //Leave your guild.
- inter_guild_leave(guild_id, account_id, char_id);
- }
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id` FROM `%s` WHERE `master` = '%s'", guild_db, esc_name) )
+ Sql_ShowDebug(sql_handle);
+ else if( Sql_NumRows(sql_handle) > 0 )
+ mapif_parse_BreakGuild(0,guild_id);
+ else if( guild_id )
+ inter_guild_leave(guild_id, account_id, char_id);// Leave your guild.
return 0;
}
@@ -1674,28 +1456,21 @@ int mmo_char_tobuf(uint8* buf, struct mmo_charstatus* p)
int mmo_char_send006b(int fd, struct char_session_data* sd)
{
int i, j, found_num = 0;
+ char* data;
set_char_online(-1, 99, sd->account_id);
//search char.
- sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id` = '%d' AND `char_num` < '%d'",char_db, sd->account_id, MAX_CHARS);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- found_num = (int)mysql_num_rows(sql_res);
-// ShowInfo("number of chars: %d\n", found_num);
- i = 0;
- while((sql_row = mysql_fetch_row(sql_res))) {
- sd->found_char[i] = atoi(sql_row[0]);
- i++;
- }
- mysql_free_result(sql_res);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id` FROM `%s` WHERE `account_id` = '%d' AND `char_num` < '%d'", char_db, sd->account_id, MAX_CHARS) )
+ Sql_ShowDebug(sql_handle);
+ for( i = 0; i < MAX_CHARS && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ // char_id
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ sd->found_char[i] = atoi(data);
}
-
- for(i = found_num; i < MAX_CHARS; i++)
+ found_num = i;
+ for( ; i < MAX_CHARS; ++i )
sd->found_char[i] = -1;
if (save_log)
@@ -1708,6 +1483,7 @@ int mmo_char_send006b(int fd, struct char_session_data* sd)
memset(WFIFOP(fd,4), 0, 20); // unknown bytes
for(i = 0; i < found_num; i++)
{
+ struct mmo_charstatus char_dat;
mmo_char_fromsql(sd->found_char[i], &char_dat, false);
j += mmo_char_tobuf(WFIFOP(fd,j), &char_dat);
}
@@ -1925,71 +1701,65 @@ int parse_fromlogin(int fd)
{
int acc, sex;
unsigned char buf[16];
- MYSQL_RES* sql_res2;
acc = RFIFOL(fd,2);
sex = RFIFOB(fd,6);
- if (acc > 0) {
- sprintf(tmp_sql, "SELECT `char_id`,`class`,`skill_point`,`guild_id` FROM `%s` WHERE `account_id` = '%d'",char_db, acc);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( acc > 0 )
+ {
+ int char_id[MAX_CHARS];
+ int class_[MAX_CHARS];
+ int guild_id[MAX_CHARS];
+ int num;
+ int i;
+ char* data;
+
+ // get characters
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`class`,`guild_id` FROM `%s` WHERE `account_id` = '%d'", char_db, acc) )
+ Sql_ShowDebug(sql_handle);
+ for( i = 0; i < MAX_CHARS && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ // char_id
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ char_id[i] = atoi(data);
+ // class
+ Sql_GetData(sql_handle, 1, &data, NULL);
+ class_[i] = atoi(data);
+ // guild_id
+ Sql_GetData(sql_handle, 2, &data, NULL);
+ guild_id[i] = atoi(data);
}
- sql_res2 = mysql_store_result(&mysql_handle);
-
- while(sql_res2 && (sql_row = mysql_fetch_row(sql_res2))) {
- int char_id, guild_id, jobclass, skill_point, class_;
- char_id = atoi(sql_row[0]);
- jobclass = atoi(sql_row[1]);
- skill_point = atoi(sql_row[2]);
- guild_id = atoi(sql_row[3]);
- class_ = jobclass;
- if (jobclass == JOB_BARD || jobclass == JOB_DANCER ||
- jobclass == JOB_CLOWN || jobclass == JOB_GYPSY ||
- jobclass == JOB_BABY_BARD || jobclass == JOB_BABY_DANCER) {
+ num = i;
+ for( i = 0; i < num; ++i )
+ {
+ if( class_[i] == JOB_BARD || class_[i] == JOB_DANCER ||
+ class_[i] == JOB_CLOWN || class_[i] == JOB_GYPSY ||
+ class_[i] == JOB_BABY_BARD || class_[i] == JOB_BABY_DANCER )
+ {
// job modification
- if (jobclass == JOB_BARD || jobclass == JOB_DANCER) {
- class_ = (sex) ? JOB_BARD : JOB_DANCER;
- } else if (jobclass == JOB_CLOWN || jobclass == JOB_GYPSY) {
- class_ = (sex) ? JOB_CLOWN : JOB_GYPSY;
- } else if (jobclass == JOB_BABY_BARD || jobclass == JOB_BABY_DANCER) {
- class_ = (sex) ? JOB_BABY_BARD : JOB_BABY_DANCER;
- }
+ if( class_[i] == JOB_BARD || class_[i] == JOB_DANCER )
+ class_[i] = (sex ? JOB_BARD : JOB_DANCER);
+ else if( class_[i] == JOB_CLOWN || class_[i] == JOB_GYPSY )
+ class_[i] = (sex ? JOB_CLOWN : JOB_GYPSY);
+ else if( class_[i] == JOB_BABY_BARD || class_[i] == JOB_BABY_DANCER )
+ class_[i] = (sex ? JOB_BABY_BARD : JOB_BABY_DANCER);
// remove specifical skills of classes 19,20 4020,4021 and 4042,4043
- sprintf(tmp_sql, "SELECT `lv` FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- while(( sql_row = mysql_fetch_row(sql_res))) {
- skill_point += atoi(sql_row[0]);
- }
- mysql_free_result(sql_res);
- }
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `skill_point` = `skill_point` +"
+ " (SELECT SUM(lv) FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330' AND `lv` > '0')"
+ " WHERE `char_id` = '%d'",
+ char_db, skill_db, char_id[i], char_id[i]) )
+ Sql_ShowDebug(sql_handle);
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'", skill_db, char_id[i]) )
+ Sql_ShowDebug(sql_handle);
}
// to avoid any problem with equipment and invalid sex, equipment is unequiped.
- sprintf(tmp_sql, "UPDATE `%s` SET `equip` = '0' WHERE `char_id` = '%d'",inventory_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d' , `skill_point`='%d' , `weapon`='0' , `shield`='0' , `head_top`='0' , `head_mid`='0' , `head_bottom`='0' WHERE `char_id` = '%d'",char_db, class_, skill_point, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- if (guild_id) //If there is a guild, update the guild_member data [Skotlex]
- inter_guild_sex_changed(guild_id, acc, char_id, sex);
- }
- if (sql_res2)
- mysql_free_result(sql_res2);
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `equip` = '0' WHERE `char_id` = '%d'", inventory_db, char_id[i]) )
+ Sql_ShowDebug(sql_handle);
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `class`='%d', `weapon`='0', `shield`='0', `head_top`='0', `head_mid`='0', `head_bottom`='0' WHERE `char_id`='%d'", char_db, class_[i], char_id[i]) )
+ Sql_ShowDebug(sql_handle);
+
+ if( guild_id[i] )// If there is a guild, update the guild_member data [Skotlex]
+ inter_guild_sex_changed(guild_id[i], acc, char_id[i], sex);
+ }
+ Sql_FreeResult(sql_handle);
}
// disconnect player if online on char-server
for(i = 0; i < fd_max; i++) {
@@ -2220,74 +1990,59 @@ int save_accreg2(unsigned char* buf, int len)
void char_read_fame_list(void)
{
int i;
- struct fame_list fame_item;
+ char* data;
+ size_t len;
// Empty ranking lists
memset(smith_fame_list, 0, sizeof(smith_fame_list));
memset(chemist_fame_list, 0, sizeof(chemist_fame_list));
memset(taekwon_fame_list, 0, sizeof(taekwon_fame_list));
// Build Blacksmith ranking list
- sprintf(tmp_sql, "SELECT `char_id`,`fame`, `name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_BLACKSMITH, JOB_WHITESMITH, JOB_BABY_BLACKSMITH, fame_list_size_smith);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- i = 0;
- while((sql_row = mysql_fetch_row(sql_res))) {
- fame_item.id = atoi(sql_row[0]);
- fame_item.fame = atoi(sql_row[1]);
- strncpy(fame_item.name, sql_row[2], NAME_LENGTH);
- memcpy(&smith_fame_list[i], &fame_item, sizeof(struct fame_list));
-
- if (++i == fame_list_size_smith)
- break;
- }
- mysql_free_result(sql_res);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_BLACKSMITH, JOB_WHITESMITH, JOB_BABY_BLACKSMITH, fame_list_size_smith) )
+ Sql_ShowDebug(sql_handle);
+ for( i = 0; i < fame_list_size_smith && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ // char_id
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ smith_fame_list[i].id = atoi(data);
+ // fame
+ Sql_GetData(sql_handle, 1, &data, &len);
+ smith_fame_list[i].fame = atoi(data);
+ // name
+ Sql_GetData(sql_handle, 2, &data, &len);
+ memcpy(smith_fame_list[i].name, data, min(len, NAME_LENGTH));
}
// Build Alchemist ranking list
- sprintf(tmp_sql, "SELECT `char_id`,`fame`, `name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_ALCHEMIST, JOB_CREATOR, JOB_BABY_ALCHEMIST, fame_list_size_chemist);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- i = 0;
- while((sql_row = mysql_fetch_row(sql_res))) {
- fame_item.id = atoi(sql_row[0]);
- fame_item.fame = atoi(sql_row[1]);
- strncpy(fame_item.name, sql_row[2], NAME_LENGTH);
-
- memcpy(&chemist_fame_list[i], &fame_item, sizeof(struct fame_list));
-
- if (++i == fame_list_size_chemist)
- break;
- }
- mysql_free_result(sql_res);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_ALCHEMIST, JOB_CREATOR, JOB_BABY_ALCHEMIST, fame_list_size_chemist) )
+ Sql_ShowDebug(sql_handle);
+ for( i = 0; i < fame_list_size_chemist && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ // char_id
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ chemist_fame_list[i].id = atoi(data);
+ // fame
+ Sql_GetData(sql_handle, 1, &data, &len);
+ chemist_fame_list[i].fame = atoi(data);
+ // name
+ Sql_GetData(sql_handle, 2, &data, &len);
+ memcpy(chemist_fame_list[i].name, data, min(len, NAME_LENGTH));
}
// Build Taekwon ranking list
- sprintf(tmp_sql, "SELECT `char_id`,`fame`, `name` FROM `%s` WHERE `fame`>0 AND (`class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_TAEKWON, fame_list_size_taekwon);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- i = 0;
- while((sql_row = mysql_fetch_row(sql_res))) {
- fame_item.id = atoi(sql_row[0]);
- fame_item.fame = atoi(sql_row[1]);
- strncpy(fame_item.name, sql_row[2], NAME_LENGTH);
-
- memcpy(&taekwon_fame_list[i], &fame_item, sizeof(struct fame_list));
-
- if (++i == fame_list_size_taekwon)
- break;
- }
- mysql_free_result(sql_res);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", char_db, JOB_TAEKWON, fame_list_size_taekwon) )
+ Sql_ShowDebug(sql_handle);
+ for( i = 0; i < fame_list_size_taekwon && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ // char_id
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ taekwon_fame_list[i].id = atoi(data);
+ // fame
+ Sql_GetData(sql_handle, 1, &data, &len);
+ taekwon_fame_list[i].fame = atoi(data);
+ // name
+ Sql_GetData(sql_handle, 2, &data, &len);
+ memcpy(taekwon_fame_list[i].name, data, min(len, NAME_LENGTH));
+ }
+ Sql_FreeResult(sql_handle);
}
// Send map-servers the fame ranking lists
@@ -2340,22 +2095,23 @@ void char_update_fame_list(int type, int index, int fame)
//Returns 1 on found, 0 on not found (buffer is filled with Unknown char name)
int char_loadName(int char_id, char* name)
{
- sprintf(tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
+ char* data;
+ size_t len;
- if (sql_row)
- memcpy(name, sql_row[0], NAME_LENGTH);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, char_id) )
+ Sql_ShowDebug(sql_handle);
+ else if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ Sql_GetData(sql_handle, 0, &data, &len);
+ memset(name, 0, NAME_LENGTH);
+ memcpy(name, data, min(len, NAME_LENGTH));
+ return 1;
+ }
else
+ {
memcpy(name, unknown_char_name, NAME_LENGTH);
- if (sql_res) mysql_free_result(sql_res);
-
- return (sql_row) ? 1 : 0;
+ }
+ return 0;
}
int search_mapserver(unsigned short map, uint32 ip, uint16 port);
@@ -2393,11 +2149,8 @@ int parse_frommap(int fd)
mapif_sendallwos(fd, buf, WBUFW(buf,2));
}
memset(&server[id], 0, sizeof(struct mmo_map_server));
- sprintf(tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[id]);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[id]) )
+ Sql_ShowDebug(sql_handle);
server_fd[id] = -1;
online_char_db->foreach(online_char_db,char_db_setoffline,id); //Tag relevant chars as 'in disconnected' server.
}
@@ -2495,35 +2248,34 @@ int parse_frommap(int fd)
int aid, cid;
aid = RFIFOL(fd,2);
cid = RFIFOL(fd,6);
- sprintf(tmp_sql, "SELECT type, tick, val1, val2, val3, val4 from `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",
- scdata_db, aid, cid);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT type, tick, val1, val2, val3, val4 from `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",
+ scdata_db, aid, cid) )
+ {
+ Sql_ShowDebug(sql_handle);
break;
}
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- struct status_change_data data;
- int count = 0;
+ if( Sql_NumRows(sql_handle) > 0 )
+ {
+ struct status_change_data scdata;
+ int count;
+ char* data;
+
WFIFOHEAD(fd,14+50*sizeof(struct status_change_data));
WFIFOW(fd,0) = 0x2b1d;
WFIFOL(fd,4) = aid;
WFIFOL(fd,8) = cid;
- while((sql_row = mysql_fetch_row(sql_res)) && count < 50)
+ for( count = 0; count < 50 && SQL_SUCCESS == Sql_NextRow(sql_handle); ++count )
{
- data.type = atoi(sql_row[0]);
- data.tick = atoi(sql_row[1]);
- data.val1 = atoi(sql_row[2]);
- data.val2 = atoi(sql_row[3]);
- data.val3 = atoi(sql_row[4]);
- data.val4 = atoi(sql_row[5]);
- memcpy(WFIFOP(fd, 14+count*sizeof(struct status_change_data)), &data, sizeof(struct status_change_data));
- count++;
+ Sql_GetData(sql_handle, 0, &data, NULL); scdata.type = atoi(data);
+ Sql_GetData(sql_handle, 1, &data, NULL); scdata.tick = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); scdata.val1 = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); scdata.val2 = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); scdata.val3 = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); scdata.val4 = atoi(data);
+ memcpy(WFIFOP(fd, 14+count*sizeof(struct status_change_data)), &scdata, sizeof(struct status_change_data));
}
if (count >= 50)
ShowWarning("Too many status changes for %d:%d, some of them were not loaded.\n", aid, cid);
- mysql_free_result(sql_res);
if (count > 0)
{
WFIFOW(fd,2) = 14 + count*sizeof(struct status_change_data);
@@ -2531,13 +2283,11 @@ int parse_frommap(int fd)
WFIFOSET(fd,WFIFOW(fd,2));
//Clear the data once loaded.
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", scdata_db, aid, cid);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", scdata_db, aid, cid) )
+ Sql_ShowDebug(sql_handle);
}
}
+ Sql_FreeResult(sql_handle);
#endif
RFIFOSKIP(fd, 10);
}
@@ -2598,6 +2348,7 @@ int parse_frommap(int fd)
(character = idb_get(online_char_db, aid)) != NULL &&
character->char_id == cid))
{
+ struct mmo_charstatus char_dat;
memcpy(&char_dat, RFIFOP(fd,13), sizeof(struct mmo_charstatus));
mmo_char_tosql(cid, &char_dat);
} else { //This may be valid on char-server reconnection, when re-sending characters that already logged off.
@@ -2648,6 +2399,7 @@ int parse_frommap(int fd)
int map_id, map_fd = -1;
struct online_char_data* data;
struct mmo_charstatus* char_data;
+ struct mmo_charstatus char_dat;
map_id = search_mapserver(RFIFOW(fd,18), ntohl(RFIFOL(fd,24)), ntohs(RFIFOW(fd,28))); //Locate mapserver by ip and port.
if (map_id >= 0)
@@ -2677,7 +2429,8 @@ int parse_frommap(int fd)
WFIFOL(map_fd,12) = (unsigned long)0; //TODO: connect_until_time, how do I figure it out right now?
memcpy(WFIFOP(map_fd,20), char_data, sizeof(struct mmo_charstatus));
WFIFOSET(map_fd, WFIFOW(map_fd,2));
- data = idb_ensure(online_char_db, RFIFOL(fd, 2), create_online_char_data);
+
+ data = idb_ensure(online_char_db, RFIFOL(fd,2), create_online_char_data);
data->char_id = char_data->char_id;
data->server = map_id; //Update server where char is.
@@ -2739,110 +2492,117 @@ int parse_frommap(int fd)
if (RFIFOREST(fd) < 44)
return 0;
{
- char character_name[NAME_LENGTH], t_name[NAME_LENGTH*2];
+ char character_name[NAME_LENGTH];
+ char esc_name[NAME_LENGTH*2+1];// escaped character name
int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody)
+
memcpy(character_name, RFIFOP(fd,6), NAME_LENGTH);
character_name[NAME_LENGTH-1] = '\0';
- jstrescapecpy(t_name, character_name); //Escape string for sql use... [Skotlex]
+ Sql_EscapeStringLen(sql_handle, esc_name, character_name, strnlen(character_name, NAME_LENGTH));
// prepare answer
WFIFOHEAD(fd,34);
WFIFOW(fd,0) = 0x2b0f; // answer
WFIFOL(fd,2) = acc; // who want do operation
WFIFOW(fd,30) = RFIFOW(fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban
- sprintf(tmp_sql, "SELECT `account_id`,`name` FROM `%s` WHERE `name` = '%s'",char_db, t_name);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`name` FROM `%s` WHERE `name` = '%s'", char_db, esc_name) )
+ Sql_ShowDebug(sql_handle);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( Sql_NumRows(sql_handle) > 0 )
+ {
+ char* data;
+ size_t len;
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- if (mysql_num_rows(sql_res)) {
- sql_row = mysql_fetch_row(sql_res);
- memcpy(WFIFOP(fd,6), sql_row[1], NAME_LENGTH); // put correct name if found
- WFIFOW(fd,32) = 0; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
- switch(RFIFOW(fd, 30)) {
- case 1: // block
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd,10);
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value
- WFIFOL(login_fd,6) = 5; // status of the account
- WFIFOSET(login_fd,10);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ // name
+ Sql_GetData(sql_handle, 1, &data, &len);
+ if( len >= NAME_LENGTH )
+ memcpy(WFIFOP(fd,6), data, NAME_LENGTH);
+ else
+ {
+ memcpy(WFIFOP(fd,6), data, len);
+ memset(WFIFOP(fd,6+len), 0, NAME_LENGTH - len);
+ }
+ // account_id
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ WFIFOW(fd,32) = 0; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ switch(RFIFOW(fd, 30)) {
+ case 1: // block
+ if (acc == -1 || isGM(acc) >= isGM(atoi(data))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd,10);
+ WFIFOW(login_fd,0) = 0x2724;
+ WFIFOL(login_fd,2) = atoi(data); // account value
+ WFIFOL(login_fd,6) = 5; // status of the account
+ WFIFOSET(login_fd,10);
} else
- WFIFOW(fd,32) = 2; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 2: // ban
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd,18);
- WFIFOW(login_fd, 0) = 0x2725;
- WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value
- WFIFOW(login_fd, 6) = RFIFOW(fd,32); // year
- WFIFOW(login_fd, 8) = RFIFOW(fd,34); // month
- WFIFOW(login_fd,10) = RFIFOW(fd,36); // day
- WFIFOW(login_fd,12) = RFIFOW(fd,38); // hour
- WFIFOW(login_fd,14) = RFIFOW(fd,40); // minute
- WFIFOW(login_fd,16) = RFIFOW(fd,42); // second
- WFIFOSET(login_fd,18);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ WFIFOW(fd,32) = 3; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 2: // ban
+ if (acc == -1 || isGM(acc) >= isGM(atoi(data))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd,18);
+ WFIFOW(login_fd, 0) = 0x2725;
+ WFIFOL(login_fd, 2) = atoi(data); // account value
+ WFIFOW(login_fd, 6) = RFIFOW(fd,32); // year
+ WFIFOW(login_fd, 8) = RFIFOW(fd,34); // month
+ WFIFOW(login_fd,10) = RFIFOW(fd,36); // day
+ WFIFOW(login_fd,12) = RFIFOW(fd,38); // hour
+ WFIFOW(login_fd,14) = RFIFOW(fd,40); // minute
+ WFIFOW(login_fd,16) = RFIFOW(fd,42); // second
+ WFIFOSET(login_fd,18);
} else
- WFIFOW(fd,32) = 2; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 3: // unblock
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd,10);
- WFIFOW(login_fd,0) = 0x2724;
- WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value
- WFIFOL(login_fd,6) = 0; // status of the account
- WFIFOSET(login_fd,10);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ WFIFOW(fd,32) = 3; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 3: // unblock
+ if (acc == -1 || isGM(acc) >= isGM(atoi(data))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd,10);
+ WFIFOW(login_fd,0) = 0x2724;
+ WFIFOL(login_fd,2) = atoi(data); // account value
+ WFIFOL(login_fd,6) = 0; // status of the account
+ WFIFOSET(login_fd,10);
} else
- WFIFOW(fd,32) = 2; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 4: // unban
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd,6);
- WFIFOW(login_fd,0) = 0x272a;
- WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value
- WFIFOSET(login_fd,6);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ WFIFOW(fd,32) = 3; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 4: // unban
+ if (acc == -1 || isGM(acc) >= isGM(atoi(data))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd,6);
+ WFIFOW(login_fd,0) = 0x272a;
+ WFIFOL(login_fd,2) = atoi(data); // account value
+ WFIFOSET(login_fd,6);
} else
- WFIFOW(fd,32) = 2; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- case 5: // changesex
- if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) {
- if (login_fd > 0) { // don't send request if no login-server
- WFIFOHEAD(login_fd,6);
- WFIFOW(login_fd,0) = 0x2727;
- WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value
- WFIFOSET(login_fd,6);
- } else
- WFIFOW(fd,32) = 3; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ WFIFOW(fd,32) = 3; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
+ case 5: // changesex
+ if (acc == -1 || isGM(acc) >= isGM(atoi(data))) {
+ if (login_fd > 0) { // don't send request if no login-server
+ WFIFOHEAD(login_fd,6);
+ WFIFOW(login_fd,0) = 0x2727;
+ WFIFOL(login_fd,2) = atoi(data); // account value
+ WFIFOSET(login_fd,6);
} else
- WFIFOW(fd,32) = 2; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
- break;
- }
- } else {
- // character name not found
- memcpy(WFIFOP(fd,6), character_name, NAME_LENGTH);
- WFIFOW(fd,32) = 1; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
- }
- // send answer if a player ask, not if the server ask
- if (acc != -1) {
- WFIFOSET(fd, 34);
+ WFIFOW(fd,32) = 3; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ } else
+ WFIFOW(fd,32) = 2; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ break;
}
- mysql_free_result(sql_res);
+ } else {
+ // character name not found
+ memcpy(WFIFOP(fd,6), character_name, NAME_LENGTH);
+ WFIFOW(fd,32) = 1; // answer: 0-login-server request done, 1-player not found, 2-gm level too low, 3-login-server offline
+ }
+ Sql_FreeResult(sql_handle);
+ // send answer if a player ask, not if the server ask
+ if (acc != -1) {
+ WFIFOSET(fd, 34);
}
RFIFOSKIP(fd, 44);
@@ -2908,18 +2668,18 @@ int parse_frommap(int fd)
if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,8))
return 0;
{
- char motd[256], t_name[2*sizeof(char)*sizeof(server_name)+1], t_motd[512]; //Required for jstrescapecpy [Skotlex]
+ char motd[256];
+ char esc_motd[sizeof(motd)*2+1];
+ char esc_server_name[sizeof(server_name)*2+1];
+
strncpy(motd, RFIFOP(fd,10), 255); //First copy it to make sure the motd fits.
- motd[255]='\0';
- jstrescapecpy(t_motd,motd);
- jstrescapecpy(t_name,server_name);
-
- sprintf(tmp_sql, "INSERT INTO `ragsrvinfo` SET `index`='%d',`name`='%s',`exp`='%d',`jexp`='%d',`drop`='%d',`motd`='%s'",
- fd, t_name, RFIFOW(fd,2), RFIFOW(fd,4), RFIFOW(fd,6), t_motd);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ motd[255] = '\0';
+ Sql_EscapeString(sql_handle, esc_motd, motd);
+ Sql_EscapeString(sql_handle, esc_server_name, server_name);
+
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `ragsrvinfo` SET `index`='%d',`name`='%s',`exp`='%d',`jexp`='%d',`drop`='%d',`motd`='%s'",
+ fd, esc_server_name, RFIFOW(fd,2), RFIFOW(fd,4), RFIFOW(fd,6), esc_motd) )
+ Sql_ShowDebug(sql_handle);
RFIFOSKIP(fd,RFIFOW(fd,8));
}
break;
@@ -2956,29 +2716,31 @@ int parse_frommap(int fd)
return 0;
{
#ifdef ENABLE_SC_SAVING
- int count, aid, cid, i;
- struct status_change_data data;
- char *p = tmp_sql;
+ int count, aid, cid;
aid = RFIFOL(fd, 4);
cid = RFIFOL(fd, 8);
count = RFIFOW(fd, 12);
-
- p+= sprintf(p, "INSERT INTO `%s` (`account_id`, `char_id`, `type`, `tick`, `val1`, `val2`, `val3`, `val4`) VALUES ", scdata_db);
-
- for (i = 0; i < count; i++)
- {
- memcpy (&data, RFIFOP(fd, 14+i*sizeof(struct status_change_data)), sizeof(struct status_change_data));
- p += sprintf (p, " ('%d','%d','%hu','%d','%d','%d','%d','%d'),", aid, cid,
- data.type, data.tick, data.val1, data.val2, data.val3, data.val4);
- }
- if (count > 0)
+
+ if( count > 0 )
{
- *--p = '\0'; //Remove final comma.
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ struct status_change_data data;
+ StringBuf buf;
+ int i;
+
+ StringBuf_Init(&buf);
+ StringBuf_Printf(&buf, "INSERT INTO `%s` (`account_id`, `char_id`, `type`, `tick`, `val1`, `val2`, `val3`, `val4`) VALUES ", scdata_db);
+ for( i = 0; i < count; ++i )
+ {
+ memcpy (&data, RFIFOP(fd, 14+i*sizeof(struct status_change_data)), sizeof(struct status_change_data));
+ if( count > 0 )
+ StringBuf_AppendStr(&buf, ", ");
+ StringBuf_Printf(&buf, "('%d','%d','%hu','%d','%d','%d','%d','%d')", aid, cid,
+ data.type, data.tick, data.val1, data.val2, data.val3, data.val4);
}
+ if( SQL_ERROR == Sql_QueryStr(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+ StringBuf_Destroy(&buf);
}
#endif
RFIFOSKIP(fd, RFIFOW(fd, 2));
@@ -3156,36 +2918,35 @@ int parse_char(int fd)
case 0x66: // char select
FIFOSD_CHECK(3);
- sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d'",char_db, sd->account_id, RFIFOB(fd, 2));
- RFIFOSKIP(fd, 3);
+ do // TODO: poor code structure
+ {
+ struct mmo_charstatus char_dat;
+ char* data;
+ int char_id;
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- sql_row = sql_res?mysql_fetch_row(sql_res):NULL;
-
- if (sql_row)
+ if ( SQL_SUCCESS != Sql_Query(sql_handle, "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d'", char_db, sd->account_id, RFIFOB(fd,2))
+ || SQL_SUCCESS != Sql_NextRow(sql_handle)
+ || SQL_SUCCESS != Sql_GetData(sql_handle, 0, &data, NULL) )
{
- int char_id = atoi(sql_row[0]);
- mysql_free_result(sql_res); //Free'd as soon as possible
- mmo_char_fromsql(char_id, &char_dat, true);
- char_dat.sex = sd->sex;
- } else {
- mysql_free_result(sql_res);
+ //Not found?? May be forged packet.
+ Sql_ShowDebug(sql_handle);
+ Sql_FreeResult(sql_handle);
+ //TODO: perhaps add some reply? (otherwise it hangs the client)
break;
}
+ char_id = atoi(data);
+ Sql_FreeResult(sql_handle);
+ mmo_char_fromsql(char_id, &char_dat, true);
+ char_dat.sex = sd->sex;
+
if (log_char) {
- char escaped_name[NAME_LENGTH*2];
- sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `account_id`,`char_num`,`name`) VALUES (NOW(), '%d', '%d', '%s')",
- charlog_db, sd->account_id, RFIFOB(fd, 2), jstrescapecpy(escaped_name, char_dat.name));
- //query
- if(mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ char esc_name[NAME_LENGTH*2+1];
+
+ Sql_EscapeStringLen(sql_handle, esc_name, char_dat.name, strnlen(char_dat.name, NAME_LENGTH));
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s`(`time`, `account_id`,`char_num`,`name`) VALUES (NOW(), '%d', '%d', '%s')",
+ charlog_db, sd->account_id, RFIFOB(fd, 2), esc_name) )
+ Sql_ShowDebug(sql_handle);
}
ShowInfo("Selected char: (Account %d: %d - %s)\n", sd->account_id, RFIFOB(fd, 2), char_dat.name);
@@ -3250,6 +3011,22 @@ int parse_char(int fd)
WFIFOW(fd,26) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
WFIFOSET(fd,28);
}
+ {
+ //Send player to map
+ uint32 subnet_map_ip;
+ char map_name[MAP_NAME_LENGTH_EXT];
+ snprintf(map_name, MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(char_dat.last_point.map));
+ WFIFOHEAD(fd,28);
+ WFIFOW(fd,0) = 0x71;
+ WFIFOL(fd,2) = char_dat.char_id;
+ memcpy(WFIFOP(fd,6), map_name, MAP_NAME_LENGTH_EXT);
+
+ // Advanced subnet check [LuzZza]
+ subnet_map_ip = lan_subnetcheck(ipl);
+ WFIFOL(fd,22) = htonl((subnet_map_ip) ? subnet_map_ip : server[i].ip);
+ WFIFOW(fd,26) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
+ WFIFOSET(fd,28);
+ }
if (auth_fifo_pos >= AUTH_FIFO_SIZE)
auth_fifo_pos = 0;
auth_fifo[auth_fifo_pos].account_id = sd->account_id;
@@ -3273,7 +3050,8 @@ int parse_char(int fd)
WFIFOB(fd,2) = 1; // 01 = Server closed
WFIFOSET(fd,3);
break;
- }
+ }
+
//Send auth ok to map server
WFIFOHEAD(map_fd,20 + sizeof(struct mmo_charstatus));
WFIFOW(map_fd,0) = 0x2afd;
@@ -3284,9 +3062,11 @@ int parse_char(int fd)
WFIFOL(map_fd,12) = (unsigned long)auth_fifo[auth_fifo_pos].connect_until_time;
memcpy(WFIFOP(map_fd,20), &char_dat, sizeof(struct mmo_charstatus));
WFIFOSET(map_fd, WFIFOW(map_fd,2));
-
+
set_char_online(i, auth_fifo[auth_fifo_pos].char_id, auth_fifo[auth_fifo_pos].account_id);
auth_fifo_pos++;
+ } while(0);
+ RFIFOSKIP(fd,3);
break;
case 0x67: // make new
@@ -3313,14 +3093,13 @@ int parse_char(int fd)
}
{ //Send to player.
int len;
+ struct mmo_charstatus char_dat;
WFIFOHEAD(fd,110);
WFIFOW(fd,0) = 0x6d;
mmo_char_fromsql(i, &char_dat, false); //Only the short data is needed.
len = 2 + mmo_char_tobuf(WFIFOP(fd,2), &char_dat);
WFIFOSET(fd,len);
- RFIFOSKIP(fd,37);
- }
//to do
for(ch = 0; ch < MAX_CHARS; ch++) {
if (sd->found_char[ch] == -1) {
@@ -3328,6 +3107,9 @@ int parse_char(int fd)
break;
}
}
+
+ RFIFOSKIP(fd,37);
+ }
break;
case 0x68: // delete char
@@ -3336,8 +3118,10 @@ int parse_char(int fd)
if (cmd == 0x1fb) FIFOSD_CHECK(56);
{
int cid = RFIFOL(fd,2);
+ int char_pid=0;
- ShowInfo(CL_RED"Request Char Deletion: "CL_GREEN"%d (%d)"CL_RESET"\n", sd->account_id, cid);
+ WFIFOHEAD(fd,46);
+ ShowInfo(CL_RED" Request Char Deletion:"CL_GREEN"%d (%d)"CL_RESET"\n", sd->account_id, cid);
memcpy(email, RFIFOP(fd,6), 40);
RFIFOSKIP(fd,RFIFOREST(fd)); // hack to make the other deletion packet work
@@ -3371,41 +3155,32 @@ int parse_char(int fd)
}
/* Grab the partner id */
- sprintf(tmp_sql, "SELECT `partner_id` FROM `%s` WHERE `char_id`='%d'",char_db, cid);
-
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- sql_res = mysql_store_result(&mysql_handle);
-
- if(sql_res)
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `partner_id` FROM `%s` WHERE `char_id`='%d'", char_db, cid) )
+ Sql_ShowDebug(sql_handle);
+ else if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
{
- int char_pid=0;
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row)
- char_pid = atoi(sql_row[0]);
- mysql_free_result(sql_res);
-
- /* Delete character and partner (if any) */
- if(delete_char_sql(cid, char_pid)<0){
- //can't delete the char
- //either SQL error or can't delete by some CONFIG conditions
- //del fail
- WFIFOHEAD(fd,3);
- WFIFOW(fd,0) = 0x70;
- WFIFOB(fd,2) = 0;
- WFIFOSET(fd,3);
- break;
- }
- if (char_pid != 0)
- { /* If there is partner, tell map server to do divorce */
- WBUFW(buf,0) = 0x2b12;
- WBUFL(buf,2) = cid;
- WBUFL(buf,6) = char_pid;
- mapif_sendall(buf,10);
- }
+ char* data;
+
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ char_pid = atoi(data);
+ }
+
+ /* Delete character and partner (if any) */
+ if(delete_char_sql(cid, char_pid)<0){
+ //can't delete the char
+ //either SQL error or can't delete by some CONFIG conditions
+ //del fail
+ WFIFOW(fd, 0) = 0x70;
+ WFIFOB(fd, 2) = 0;
+ WFIFOSET(fd, 3);
+ break;
+ }
+ if (char_pid != 0)
+ { /* If there is partner, tell map server to do divorce */
+ WBUFW(buf,0) = 0x2b12;
+ WBUFL(buf,2) = cid;
+ WBUFL(buf,6) = char_pid;
+ mapif_sendall(buf,10);
}
/* Char successfully deleted.*/
WFIFOHEAD(fd,2);
@@ -3824,15 +3599,6 @@ void sql_config_read(const char* cfgName)
#ifndef TXT_SQL_CONVERT
else if(!strcmpi(w1,"db_path"))
strcpy(db_path,w2);
- //Map server option to use SQL item/mob-db or not
- else if(!strcmpi(w1,"use_sql_db")==0){
- db_use_sqldbs = config_switch(w2);
- ShowStatus("Using SQL dbs: %s\n",w2);
- }
- else if(!strcmpi(w1,"item_db_db"))
- strcpy(item_db_db,w2);
- else if(!strcmpi(w1,"item_db2_db"))
- strcpy(item_db2_db,w2);
#endif
//support the import command, just like any other config
else if(!strcmpi(w1,"import"))
@@ -4005,7 +3771,6 @@ int char_config_read(const char* cfgName)
void do_final(void)
{
ShowInfo("Doing final stage...\n");
- do_final_itemdb();
//check SQL save progress.
//wait until save char complete
@@ -4017,13 +3782,9 @@ void do_final(void)
flush_fifos();
mapindex_final();
-
- sprintf(tmp_sql,"DELETE FROM `ragsrvinfo");
- if (mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `ragsrvinfo") )
+ Sql_ShowDebug(sql_handle);
if(gm_account) {
aFree(gm_account);
@@ -4037,9 +3798,9 @@ void do_final(void)
char_db_->destroy(char_db_, NULL);
online_char_db->destroy(online_char_db, NULL);
- mysql_close(&mysql_handle);
- if(char_gm_read)
- mysql_close(&lmysql_handle);
+ Sql_Free(sql_handle);
+ if( lsql_handle )
+ Sql_Free(lsql_handle);
ShowInfo("ok! all done...\n");
}
@@ -4102,9 +3863,6 @@ int do_init(int argc, char **argv)
inter_init_sql((argc > 2) ? argv[2] : inter_cfgName); // inter server テハア篳ュ
ShowInfo("Finished reading the inter-server configuration.\n");
- //Read ItemDB
- do_init_itemdb();
-
ShowInfo("Initializing char server.\n");
online_char_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
mmo_char_sql_init();
@@ -4158,121 +3916,86 @@ int do_init(int argc, char **argv)
//Cleaning the tables for NULL entrys @ startup [Sirius]
//Chardb clean
ShowInfo("Cleaning the '%s' table...\n", char_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `account_id` = '0'", char_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = '0'", char_db) )
+ Sql_ShowDebug(sql_handle);
+
//guilddb clean
- ShowInfo("Cleaning the '%s' table...\n", guild_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_lv` = '0' AND `max_member` = '0' AND `exp` = '0' AND `next_exp` = '0' AND `average_lv` = '0'", guild_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
+ ShowInfo("Cleaning the '%s' table...\n", guild_db);
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_lv` = '0' AND `max_member` = '0' AND `exp` = '0' AND `next_exp` = '0' AND `average_lv` = '0'", guild_db) )
+ Sql_ShowDebug(sql_handle);
+
//guildmemberdb clean
ShowInfo("Cleaning the '%s' table...\n", guild_member_db);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '0' AND `account_id` = '0' AND `char_id` = '0'", guild_member_db);
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- ShowInfo("End of char server initilization function.\n");
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id` = '0' AND `account_id` = '0' AND `char_id` = '0'", guild_member_db) )
+ Sql_ShowDebug(sql_handle);
- ShowInfo("open port %d.....\n",char_port);
- char_fd = make_listen_bind(bind_ip, char_port);
+ ShowInfo("End of char server initilization function.\n");
ShowStatus("The char-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %d).\n\n", char_port);
return 0;
}
int char_child(int parent_id, int child_id)
{
- int tmp_id = 0;
- sprintf (tmp_sql, "SELECT `child` FROM `%s` WHERE `char_id` = '%d'", char_db, parent_id);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `child` FROM `%s` WHERE `char_id` = '%d'", char_db, parent_id) )
+ Sql_ShowDebug(sql_handle);
+ else if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ char* data;
+
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ if( child_id == atoi(data) )
+ {
+ Sql_FreeResult(sql_handle);
+ return 1;
+ }
}
- sql_res = mysql_store_result (&mysql_handle);
- sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
- if (sql_row)
- tmp_id = atoi (sql_row[0]);
- else
- ShowError("CHAR: child Failed!\n");
- if (sql_res) mysql_free_result (sql_res);
- if ( tmp_id == child_id )
- return 1;
- else
- return 0;
+ Sql_FreeResult(sql_handle);
+ return 0;
}
int char_married(int pl1, int pl2)
{
- int tmp_id = 0;
- sprintf (tmp_sql, "SELECT `partner_id` FROM `%s` WHERE `char_id` = '%d'", char_db, pl1);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `partner_id` FROM `%s` WHERE `char_id` = '%d'", char_db, pl1) )
+ Sql_ShowDebug(sql_handle);
+ else if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ char* data;
+
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ if( pl2 == atoi(data) )
+ {
+ Sql_FreeResult(sql_handle);
+ return 1;
+ }
}
- sql_res = mysql_store_result (&mysql_handle);
- sql_row = sql_res?mysql_fetch_row (sql_res):NULL;
- if (sql_row)
- tmp_id = atoi (sql_row[0]);
- else
- ShowError("CHAR: married Failed!\n");
- if (sql_res) mysql_free_result (sql_res);
- if ( tmp_id == pl2 )
- return 1;
- else
- return 0;
+ Sql_FreeResult(sql_handle);
+ return 0;
}
int char_family(int pl1, int pl2, int pl3)
{
- int charid, partnerid, childid;
- sprintf (tmp_sql, "SELECT `char_id`,`partner_id`,`child` FROM `%s` WHERE `char_id` IN ('%d','%d','%d')", char_db, pl1, pl2, pl3);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
- sql_res = mysql_store_result (&mysql_handle);
- if (!sql_res) return 0;
-
- while((sql_row = mysql_fetch_row(sql_res)))
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`partner_id`,`child` FROM `%s` WHERE `char_id` IN ('%d','%d','%d')", char_db, pl1, pl2, pl3) )
+ Sql_ShowDebug(sql_handle);
+ else while( SQL_SUCCESS == Sql_NextRow(sql_handle) )
{
- charid = atoi(sql_row[0]);
- partnerid = atoi(sql_row[1]);
- childid = atoi(sql_row[2]);
- if (charid == pl1) {
- if ((pl2 == partnerid && pl3 == childid) ||
- (pl3 == partnerid && pl2 == childid)
- ) {
- mysql_free_result (sql_res);
- return childid;
- }
- }
- if(charid == pl2) {
- if ((pl1 == partnerid && pl3 == childid) ||
- (pl3 == partnerid && pl1 == childid)
- ) {
- mysql_free_result (sql_res);
- return childid;
- }
- }
- if(charid == pl3) {
- if ((pl1 == partnerid && pl2 == childid) ||
- (pl2 == partnerid && pl1 == childid)
- ) {
- mysql_free_result (sql_res);
- return childid;
- }
+ int charid;
+ int partnerid;
+ int childid;
+ char* data;
+
+ Sql_GetData(sql_handle, 0, &data, NULL); charid = atoi(data);
+ Sql_GetData(sql_handle, 1, &data, NULL); partnerid = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); childid = atoi(data);
+
+ if( (pl1 == charid && ((pl2 == partnerid && pl3 == childid ) || (pl2 == childid && pl3 == partnerid))) ||
+ (pl1 == partnerid && ((pl2 == charid && pl3 == childid ) || (pl2 == childid && pl3 == charid ))) ||
+ (pl1 == childid && ((pl2 == charid && pl3 == partnerid) || (pl2 == partnerid && pl3 == charid ))) )
+ {
+ Sql_FreeResult(sql_handle);
+ return childid;
}
}
- mysql_free_result (sql_res);
+ Sql_FreeResult(sql_handle);
return 0;
}
diff --git a/src/char_sql/char.h b/src/char_sql/char.h
index 5af183033..c99d1e16a 100644
--- a/src/char_sql/char.h
+++ b/src/char_sql/char.h
@@ -4,37 +4,13 @@
#ifndef _CHAR_SQL_H_
#define _CHAR_SQL_H_
-#include "../common/core.h"
-#include "../common/socket.h"
-#include "../common/timer.h"
-#include "../common/mmo.h"
-#include "../common/version.h"
-#include "../common/db.h"
-#include "../common/mapindex.h"
-
-#include "inter.h"
-#include "int_pet.h"
-#include "int_guild.h"
-#include "int_party.h"
-#include "int_storage.h"
-#include "itemdb.h"
+struct mmo_charstatus;
#define START_CHAR_NUM 150000
#define MAX_MAP_SERVERS 30
#define DEFAULT_AUTOSAVE_INTERVAL 300*1000
-struct itemtmp {
- int flag;//checked = 1 else 0
- int id;
- short nameid;
- short amount;
- unsigned short equip;
- char identify;
- char refine;
- char attribute;
- short card[4];
-};
enum {
TABLE_INVENTORY,
TABLE_CART,
@@ -42,7 +18,7 @@ enum {
TABLE_GUILD_STORAGE,
};
-int memitemdata_to_sql(struct itemtmp mapitem[], int count, int char_id,int tableswitch);
+int memitemdata_to_sql(const struct item items[], int max, int id, int tableswitch);
int mapif_sendall(unsigned char *buf,unsigned int len);
int mapif_sendallwos(int fd,unsigned char *buf,unsigned int len);
diff --git a/src/char_sql/int_guild.c b/src/char_sql/int_guild.c
index b72c85ab2..f33f58097 100644
--- a/src/char_sql/int_guild.c
+++ b/src/char_sql/int_guild.c
@@ -1,10 +1,6 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
#include "../common/mmo.h"
#include "../common/cbasetypes.h"
#include "../common/strlib.h"
@@ -12,9 +8,14 @@
#include "../common/db.h"
#include "../common/malloc.h"
#include "../common/socket.h"
+#include "../common/timer.h"
+#include "char.h"
#include "inter.h"
#include "int_guild.h"
-#include "char.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
#define GS_MEMBER_UNMODIFIED 0x00
#define GS_MEMBER_MODIFIED 0x01
@@ -87,18 +88,10 @@ static int guild_save_timer(int tid, unsigned int tick, int id, int data) {
int inter_guild_removemember_tosql(int account_id, int char_id)
{
- sprintf(tmp_sql,"DELETE from `%s` where `account_id` = '%d' and `char_id` = '%d'", guild_member_db, account_id, char_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql,"UPDATE `%s` SET `guild_id` = '0' WHERE `char_id` = '%d'", char_db, char_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE from `%s` where `account_id` = '%d' and `char_id` = '%d'", guild_member_db, account_id, char_id) )
+ Sql_ShowDebug(sql_handle);
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `guild_id` = '0' WHERE `char_id` = '%d'", char_db, char_id) )
+ Sql_ShowDebug(sql_handle);
return 0;
}
#endif //TXT_SQL_CONVERT
@@ -120,19 +113,11 @@ int inter_guild_tosql(struct guild *g,int flag)
// temporary storage for str convertion. They must be twice the size of the
// original string to ensure no overflows will occur. [Skotlex]
- char t_name[NAME_LENGTH*2],
- t_master[NAME_LENGTH*2],
- t_mes1[120],
- t_mes2[240],
- t_member[NAME_LENGTH*2],
- t_position[NAME_LENGTH*2],
- t_alliance[NAME_LENGTH*2],
- t_ename[NAME_LENGTH*2],
- t_emes[80],
- t_info[240];
- char emblem_data[4096];
+ char t_info[256];
+ char esc_name[NAME_LENGTH*2+1];
+ char esc_master[NAME_LENGTH*2+1];
char new_guild = 0;
- int i=0, sql_index;
+ int i=0;
if (g->guild_id<=0 && g->guild_id != -1) return 0;
@@ -140,9 +125,9 @@ int inter_guild_tosql(struct guild *g,int flag)
ShowInfo("Save guild request ("CL_BOLD"%d"CL_RESET" - flag 0x%x).",g->guild_id, flag);
#endif
- jstrescapecpy(t_name, g->name);
-
- t_info[0]='\0';
+ Sql_EscapeStringLen(sql_handle, esc_name, g->name, strnlen(g->name, NAME_LENGTH));
+ Sql_EscapeStringLen(sql_handle, esc_master, g->master, strnlen(g->master, NAME_LENGTH));
+ *t_info = '\0';
#ifndef TXT_SQL_CONVERT
// Insert a new guild the guild
@@ -151,27 +136,19 @@ int inter_guild_tosql(struct guild *g,int flag)
strcat(t_info, " guild_create");
// Create a new guild
- sprintf(tmp_sql,"INSERT INTO `%s` "
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` "
"(`name`,`master`,`guild_lv`,`max_member`,`average_lv`,`char_id`) "
"VALUES ('%s', '%s', '%d', '%d', '%d', '%d')",
- guild_db,t_name,jstrescapecpy(t_master,g->master),g->guild_lv,g->max_member,g->average_lv,g->member[0].char_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
+ guild_db, esc_name, esc_master, g->guild_lv, g->max_member, g->average_lv, g->member[0].char_id) )
{
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ Sql_ShowDebug(sql_handle);
if (g->guild_id == -1)
return 0; //Failed to create guild!
- }
+ }
else
- {
- //New guild, catch id
- if(mysql_field_count(&mysql_handle) == 0 && mysql_insert_id(&mysql_handle) != 0)
- {
- g->guild_id = (int)mysql_insert_id(&mysql_handle);
- new_guild = 1;
- }
- else
- return 0; //Failed to get ID??
+ {
+ g->guild_id = (int)Sql_LastInsertId(sql_handle);
+ new_guild = 1;
}
}
#else
@@ -180,21 +157,15 @@ int inter_guild_tosql(struct guild *g,int flag)
{
strcat(t_info, " guild_create");
// Since the PK is guild id + master id, a replace will not be enough if we are overwriting data, we need to wipe the previous guild.
- sprintf(tmp_sql,"DELETE FROM `%s` where `guild_id` = '%d'", guild_db,g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` where `guild_id` = '%d'", guild_db, g->guild_id) )
+ Sql_ShowDebug(sql_handle);
// Create a new guild
- sprintf(tmp_sql,"REPLACE INTO `%s` "
+ if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` "
"(`guild_id`,`name`,`master`,`guild_lv`,`max_member`,`average_lv`,`char_id`) "
"VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%d')",
- guild_db,g->guild_id,t_name,jstrescapecpy(t_master,g->master),g->guild_lv,g->max_member,g->average_lv,g->member[0].char_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
+ guild_db, g->guild_id, esc_name, esc_master, g->guild_lv, g->max_member, g->average_lv, g->member[0].char_id) )
{
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ Sql_ShowDebug(sql_handle);
return 0; //Failed to create guild.
}
}
@@ -202,51 +173,79 @@ int inter_guild_tosql(struct guild *g,int flag)
// If we need an update on an existing guild or more update on the new guild
if (((flag & GS_BASIC_MASK) && !new_guild) || ((flag & (GS_BASIC_MASK & ~GS_BASIC)) && new_guild))
{
- sql_index = sprintf(tmp_sql,"UPDATE `%s` SET ", guild_db);
+ StringBuf buf;
+ bool add_comma = false;
+
+ StringBuf_Init(&buf);
+ StringBuf_Printf(&buf, "UPDATE `%s` SET ", guild_db);
if (flag & GS_EMBLEM)
{
- char * pData = emblem_data;
+ char emblem_data[sizeof(g->emblem_data)*2+1];
+ char* pData = emblem_data;
+
strcat(t_info, " emblem");
// Convert emblem_data to hex
+ //TODO: why not use binary directly? [ultramage]
for(i=0; i<g->emblem_len; i++){
*pData++ = dataToHex[(g->emblem_data[i] >> 4) & 0x0F];
*pData++ = dataToHex[g->emblem_data[i] & 0x0F];
}
*pData = 0;
- sql_index += sprintf(tmp_sql + sql_index,"`emblem_len`=%d,`emblem_id`=%d,`emblem_data`='%s',",g->emblem_len,g->emblem_id,emblem_data);
+ StringBuf_Printf(&buf, "`emblem_len`=%d, `emblem_id`=%d, `emblem_data`='%s'", g->emblem_len, g->emblem_id, emblem_data);
+ add_comma = true;
}
if (flag & GS_BASIC)
{
strcat(t_info, " basic");
- sql_index += sprintf(tmp_sql + sql_index,"`name`='%s', `master`='%s', `char_id`=%d,",t_name,jstrescapecpy(t_master,g->master),g->member[0].char_id);
+ if( add_comma )
+ StringBuf_AppendStr(&buf, ", ");
+ else
+ add_comma = true;
+ StringBuf_Printf(&buf, "`name`='%s', `master`='%s', `char_id`=%d", esc_name, esc_master, g->member[0].char_id);
}
if (flag & GS_CONNECT)
{
strcat(t_info, " connect");
- sql_index += sprintf(tmp_sql + sql_index,"`connect_member`=%d,`average_lv`=%d,",g->connect_member, g->average_lv);
+ if( add_comma )
+ StringBuf_AppendStr(&buf, ", ");
+ else
+ add_comma = true;
+ StringBuf_Printf(&buf, "`connect_member`=%d, `average_lv`=%d", g->connect_member, g->average_lv);
}
if (flag & GS_MES)
{
+ char esc_mes1[sizeof(g->mes1)*2+1];
+ char esc_mes2[sizeof(g->mes2)*2+1];
+
strcat(t_info, " mes");
- sql_index += sprintf(tmp_sql + sql_index,"`mes1`='%s',`mes2`='%s',",jstrescapecpy(t_mes1,g->mes1),jstrescapecpy(t_mes2,g->mes2));
+ if( add_comma )
+ StringBuf_AppendStr(&buf, ", ");
+ else
+ add_comma = true;
+ Sql_EscapeStringLen(sql_handle, esc_mes1, g->mes1, strnlen(g->mes1, sizeof(g->mes1)));
+ Sql_EscapeStringLen(sql_handle, esc_mes2, g->mes2, strnlen(g->mes2, sizeof(g->mes2)));
+ StringBuf_Printf(&buf, "`mes1`='%s', `mes2`='%s'", esc_mes1, esc_mes2);
}
if (flag & GS_LEVEL)
{
strcat(t_info, " level");
- sql_index += sprintf(tmp_sql + sql_index,"`guild_lv`=%d,`skill_point`=%d,`exp`=%u,`next_exp`=%u,`max_member`=%d,",g->guild_lv, g->skill_point, g->exp, g->next_exp, g->max_member);
- }
- sprintf(tmp_sql + sql_index -1," WHERE `guild_id`=%d", g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( add_comma )
+ StringBuf_AppendStr(&buf, ", ");
+ else
+ add_comma = true;
+ StringBuf_Printf(&buf, "`guild_lv`=%d, `skill_point`=%d, `exp`=%u, `next_exp`=%u, `max_member`=%d", g->guild_lv, g->skill_point, g->exp, g->next_exp, g->max_member);
}
+ StringBuf_Printf(&buf, " WHERE `guild_id`=%d", g->guild_id);
+ if( SQL_ERROR == Sql_Query(sql_handle, "%s", StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+ StringBuf_Destroy(&buf);
}
if (flag&GS_MEMBER)
{
struct guild_member *m;
+
strcat(t_info, " members");
// Update only needed players
for(i=0;i<g->max_member;i++){
@@ -257,26 +256,18 @@ int inter_guild_tosql(struct guild *g,int flag)
#endif
if(m->account_id) {
//Since nothing references guild member table as foreign keys, it's safe to use REPLACE INTO
- sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`name`) "
+ Sql_EscapeStringLen(sql_handle, esc_name, m->name, strnlen(m->name, NAME_LENGTH));
+ if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`name`) "
"VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%u','%d','%d','%d','%s')",
- guild_member_db, 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,
- jstrescapecpy(t_member,m->name));
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ guild_member_db, 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, esc_name) )
+ Sql_ShowDebug(sql_handle);
if (m->modified & GS_MEMBER_NEW)
{
- sprintf(tmp_sql,"UPDATE `%s` SET `guild_id` = '%d' WHERE `char_id` = '%d'",
- char_db, g->guild_id, m->char_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `guild_id` = '%d' WHERE `char_id` = '%d'",
+ char_db, g->guild_id, m->char_id) )
+ Sql_ShowDebug(sql_handle);
}
m->modified = GS_MEMBER_UNMODIFIED;
}
@@ -292,13 +283,10 @@ int inter_guild_tosql(struct guild *g,int flag)
if (!p->modified)
continue;
#endif
- sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) VALUES ('%d','%d', '%s','%d','%d')",
- guild_position_db, g->guild_id, i, jstrescapecpy(t_position,p->name),p->mode,p->exp_mode);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ Sql_EscapeStringLen(sql_handle, esc_name, p->name, strnlen(p->name, NAME_LENGTH));
+ if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) VALUES ('%d','%d','%s','%d','%d')",
+ guild_position_db, g->guild_id, i, esc_name, p->mode, p->exp_mode) )
+ Sql_ShowDebug(sql_handle);
p->modified = GS_POSITION_UNMODIFIED;
}
}
@@ -309,12 +297,10 @@ int inter_guild_tosql(struct guild *g,int flag)
// NOTE: no need to do it on both sides since both guilds in memory had
// their info changed, not to mention this would also mess up oppositions!
// [Skotlex]
-// sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",guild_alliance_db, g->guild_id,g->guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_alliance_db, g->guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) )
+ //if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'", guild_alliance_db, g->guild_id, g->guild_id) )
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id`='%d'", guild_alliance_db, g->guild_id) )
{
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ Sql_ShowDebug(sql_handle);
}
else
{
@@ -324,15 +310,11 @@ int inter_guild_tosql(struct guild *g,int flag)
struct guild_alliance *a=&g->alliance[i];
if(a->guild_id>0)
{
- sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) "
+ Sql_EscapeStringLen(sql_handle, esc_name, a->name, strnlen(a->name, NAME_LENGTH));
+ if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) "
"VALUES ('%d','%d','%d','%s')",
- guild_alliance_db, g->guild_id,a->opposition,a->guild_id,jstrescapecpy(t_alliance,a->name));
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) )
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ guild_alliance_db, g->guild_id, a->opposition, a->guild_id, esc_name) )
+ Sql_ShowDebug(sql_handle);
}
}
}
@@ -344,15 +326,17 @@ int inter_guild_tosql(struct guild *g,int flag)
for(i=0;i<MAX_GUILDEXPULSION;i++){
struct guild_expulsion *e=&g->expulsion[i];
if(e->account_id>0){
- sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) "
+ char esc_mes[sizeof(e->mes)*2+1];
+ char esc_acc[sizeof(e->acc)*2+1];
+
+ Sql_EscapeStringLen(sql_handle, esc_name, e->name, strnlen(e->name, NAME_LENGTH));
+ Sql_EscapeStringLen(sql_handle, esc_mes, e->mes, strnlen(e->mes, sizeof(e->mes)));
+ Sql_EscapeStringLen(sql_handle, esc_acc, e->acc, strnlen(e->acc, sizeof(e->acc)));
+ if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) "
"VALUES ('%d','%s','%s','%s','%d','%d','%d','%d')",
guild_expulsion_db, g->guild_id,
- jstrescapecpy(t_ename,e->name),jstrescapecpy(t_emes,e->mes),e->acc,e->account_id,e->rsv1,e->rsv2,e->rsv3 );
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ esc_name, esc_mes, esc_acc, e->account_id, e->rsv1, e->rsv2 ,e->rsv3) )
+ Sql_ShowDebug(sql_handle);
}
}
}
@@ -362,13 +346,9 @@ int inter_guild_tosql(struct guild *g,int flag)
//printf("- Insert guild %d to guild_skill\n",g->guild_id);
for(i=0;i<MAX_GUILDSKILL;i++){
if (g->skill[i].id>0 && g->skill[i].lv>0){
- sprintf(tmp_sql,"REPLACE INTO `%s` (`guild_id`,`id`,`lv`) VALUES ('%d','%d','%d')",
- guild_skill_db, g->guild_id,g->skill[i].id,g->skill[i].lv);
- //printf("%s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` (`guild_id`,`id`,`lv`) VALUES ('%d','%d','%d')",
+ guild_skill_db, g->guild_id, g->skill[i].id, g->skill[i].lv) )
+ Sql_ShowDebug(sql_handle);
}
}
}
@@ -377,213 +357,199 @@ int inter_guild_tosql(struct guild *g,int flag)
ShowInfo("Saved guild (%d - %s):%s\n",g->guild_id,g->name,t_info);
return 1;
}
+
#ifndef TXT_SQL_CONVERT
// Read guild from sql
struct guild * inter_guild_fromsql(int guild_id)
{
- int i;
- char * pstr, * pEmblemData;
struct guild *g;
+ char* data;
+ size_t len;
+ char* p;
+ int i;
- if (guild_id<=0) return NULL;
-
- g = idb_get(guild_db_,guild_id);
- if (g) return g;
+ if( guild_id <= 0 )
+ return NULL;
- g = (struct guild*)aCalloc(sizeof(struct guild), 1);
+ g = idb_get(guild_db_, guild_id);
+ if( g )
+ return g;
#ifdef NOISY
ShowInfo("Guild load request (%d)...\n", guild_id);
#endif
-
- sprintf(tmp_sql,"SELECT `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data` "
- "FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- aFree(g);
- return NULL;
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res==NULL || mysql_num_rows(sql_res)<1) {
- //Guild does not exists.
- if (sql_res) mysql_free_result(sql_res);
- aFree(g);
- return NULL;
- }
-
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row==NULL) {
- mysql_free_result(sql_res);
- aFree(g);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data` "
+ "FROM `%s` WHERE `guild_id`='%d'", guild_db, guild_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return NULL;
}
- g->guild_id=guild_id;
- strncpy(g->name,sql_row[0],NAME_LENGTH-1);
- strncpy(g->master,sql_row[1],NAME_LENGTH-1);
- g->guild_lv=atoi(sql_row[2]);
- g->connect_member=atoi(sql_row[3]);
- g->max_member = atoi(sql_row[4]);
- if (g->max_member > MAX_GUILD)
+ if( SQL_SUCCESS != Sql_NextRow(sql_handle) )
+ return NULL;// Guild does not exists.
+
+ CREATE(g, struct guild, 1);
+
+ g->guild_id = guild_id;
+ Sql_GetData(sql_handle, 0, &data, &len); memcpy(g->name, data, min(len, NAME_LENGTH));
+ Sql_GetData(sql_handle, 1, &data, &len); memcpy(g->master, data, min(len, NAME_LENGTH));
+ Sql_GetData(sql_handle, 2, &data, NULL); g->guild_lv = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); g->connect_member = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); g->max_member = atoi(data);
+ if( g->max_member > MAX_GUILD )
{ // Fix reduction of MAX_GUILD [PoW]
ShowWarning("Guild %d:%s specifies higher capacity (%d) than MAX_GUILD (%d)\n", guild_id, g->name, g->max_member, MAX_GUILD);
g->max_member = MAX_GUILD;
}
- g->average_lv=atoi(sql_row[5]);
- g->exp=(unsigned int)atof(sql_row[6]);
- g->next_exp=(unsigned int)atof(sql_row[7]);
- g->skill_point=atoi(sql_row[8]);
- //There shouldn't be a need to copy the very last char, as it's the \0 [Skotlex]
- strncpy(g->mes1,sql_row[9],59);
- strncpy(g->mes2,sql_row[10],119);
- g->emblem_len=atoi(sql_row[11]);
- g->emblem_id=atoi(sql_row[12]);
- //FIXME: check for sql_row[13]==NULL, just in case
- for(i=0,pstr=sql_row[13],pEmblemData=g->emblem_data; i < g->emblem_len; i++,pstr+=2){
- int c1=pstr[0],c2=pstr[1],x1=0,x2=0;
- if(c1>='0' && c1<='9')
- x1=c1-'0';
- else if(c1>='a' && c1<='f')
- x1=c1-'a'+10;
- else if(c1>='A' && c1<='F')
- x1=c1-'A'+10;
- if(c2>='0' && c2<='9')
- x2=c2-'0';
- else if(c2>='a' && c2<='f')
- x2=c2-'a'+10;
- else if(c2>='A' && c2<='F')
- x2=c2-'A'+10;
- *pEmblemData++=(x1<<4)|x2;
+ Sql_GetData(sql_handle, 5, &data, NULL); g->average_lv = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); g->exp = (unsigned int)strtoul(data, NULL, 10);
+ Sql_GetData(sql_handle, 7, &data, NULL); g->next_exp = (unsigned int)strtoul(data, NULL, 10);
+ Sql_GetData(sql_handle, 8, &data, NULL); g->skill_point = atoi(data);
+ Sql_GetData(sql_handle, 9, &data, &len); memcpy(g->mes1, data, min(len, sizeof(g->mes1)));
+ Sql_GetData(sql_handle, 10, &data, &len); memcpy(g->mes2, data, min(len, sizeof(g->mes2)));
+ Sql_GetData(sql_handle, 11, &data, &len); g->emblem_len = atoi(data);
+ Sql_GetData(sql_handle, 12, &data, &len); g->emblem_id = atoi(data);
+ Sql_GetData(sql_handle, 13, &data, &len);
+ // convert emblem data from hexadecimal to binary
+ //TODO: why not store it in the db as binary directly? [ultramage]
+ for( i = 0, p = g->emblem_data; i < g->emblem_len; ++i, ++p )
+ {
+ if( *data >= '0' && *data <= '9' )
+ *p = *data - '0';
+ else if( *data >= 'a' && *data <= 'f' )
+ *p = *data - 'a' + 10;
+ else if( *data >= 'A' && *data <= 'F' )
+ *p = *data - 'A' + 10;
+ *p <<= 4;
+ ++data;
+
+ if( *data >= '0' && *data <= '9' )
+ *p |= *data - '0';
+ else if( *data >= 'a' && *data <= 'f' )
+ *p |= *data - 'a' + 10;
+ else if( *data >= 'A' && *data <= 'F' )
+ *p |= *data - 'A' + 10;
+ ++data;
}
- mysql_free_result(sql_res);
//printf("- Read guild_member %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name` "
- "FROM `%s` WHERE `guild_id`='%d' ORDER BY `position`", guild_member_db, guild_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name` "
+ "FROM `%s` WHERE `guild_id`='%d' ORDER BY `position`", guild_member_db, guild_id) )
+ {
+ Sql_ShowDebug(sql_handle);
aFree(g);
return NULL;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<g->max_member);i++){
- struct guild_member *m = &g->member[i];
- m->account_id=atoi(sql_row[1]);
- m->char_id=atoi(sql_row[2]);
- m->hair=atoi(sql_row[3]);
- m->hair_color=atoi(sql_row[4]);
- m->gender=atoi(sql_row[5]);
- m->class_=atoi(sql_row[6]);
- m->lv=atoi(sql_row[7]);
- m->exp=strtoul(sql_row[8],NULL,10);
- m->exp_payper=atoi(sql_row[9]);
- m->online=atoi(sql_row[10]);
- m->position = atoi(sql_row[11]);
- if (m->position >= MAX_GUILDPOSITION) // Fix reduction of MAX_GUILDPOSITION [PoW]
- m->position = MAX_GUILDPOSITION - 1;
-
- strncpy(m->name,sql_row[14],NAME_LENGTH-1);
- m->modified = GS_MEMBER_UNMODIFIED;
- }
- mysql_free_result(sql_res);
+ for( i = 0; i < g->max_member && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ struct guild_member* m = &g->member[i];
+
+ Sql_GetData(sql_handle, 1, &data, NULL); m->account_id = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); m->char_id = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); m->hair = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); m->hair_color = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); m->gender = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); m->class_ = atoi(data);
+ Sql_GetData(sql_handle, 7, &data, NULL); m->lv = atoi(data);
+ Sql_GetData(sql_handle, 8, &data, NULL); m->exp = (unsigned int)strtoul(data, NULL, 10);
+ Sql_GetData(sql_handle, 9, &data, NULL); m->exp_payper = (unsigned int)atoi(data);
+ Sql_GetData(sql_handle, 10, &data, NULL); m->online = atoi(data);
+ Sql_GetData(sql_handle, 11, &data, NULL); m->position = atoi(data);
+ if( m->position >= MAX_GUILDPOSITION ) // Fix reduction of MAX_GUILDPOSITION [PoW]
+ m->position = MAX_GUILDPOSITION - 1;
+ //## TODO what about the rsv fields?
+ // rsv1 (12)
+ // rsv2 (13)
+ // name
+ Sql_GetData(sql_handle, 14, &data, &len); memcpy(m->name, data, min(len, NAME_LENGTH));
+ m->modified = GS_MEMBER_UNMODIFIED;
}
//printf("- Read guild_position %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`position`,`name`,`mode`,`exp_mode` FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id);
- //printf(" %s\n",tmp_sql);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`position`,`name`,`mode`,`exp_mode` FROM `%s` WHERE `guild_id`='%d'", guild_position_db, guild_id) )
+ {
+ Sql_ShowDebug(sql_handle);
aFree(g);
return NULL;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDPOSITION);i++){
- int position = atoi(sql_row[1]);
- struct guild_position *p = &g->position[position];
- strncpy(p->name,sql_row[2],NAME_LENGTH-1);
- p->mode=atoi(sql_row[3]);
- p->exp_mode=atoi(sql_row[4]);
- p->modified = GS_POSITION_UNMODIFIED;
- }
- mysql_free_result(sql_res);
+ while( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ int position;
+ struct guild_position* p;
+
+ Sql_GetData(sql_handle, 1, &data, NULL); position = atoi(data);
+ if( position < 0 || position >= MAX_GUILDPOSITION )
+ continue;// invalid position
+ p = &g->position[position];
+ Sql_GetData(sql_handle, 2, &data, &len); memcpy(p->name, data, min(len, NAME_LENGTH));
+ Sql_GetData(sql_handle, 3, &data, NULL); p->mode = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); p->exp_mode = atoi(data);
+ p->modified = GS_POSITION_UNMODIFIED;
}
//printf("- Read guild_alliance %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`opposition`,`alliance_id`,`name` FROM `%s` WHERE `guild_id`='%d'",guild_alliance_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`opposition`,`alliance_id`,`name` FROM `%s` WHERE `guild_id`='%d'", guild_alliance_db, guild_id) )
+ {
+ Sql_ShowDebug(sql_handle);
aFree(g);
return NULL;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDALLIANCE);i++){
- struct guild_alliance *a = &g->alliance[i];
- a->opposition=atoi(sql_row[1]);
- a->guild_id=atoi(sql_row[2]);
- strncpy(a->name,sql_row[3],NAME_LENGTH-1);
- }
- mysql_free_result(sql_res);
+ for( i = 0; i < MAX_GUILDALLIANCE && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ struct guild_alliance* a = &g->alliance[i];
+
+ Sql_GetData(sql_handle, 1, &data, NULL); a->opposition = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); a->guild_id = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, &len); memcpy(a->name, data, min(len, NAME_LENGTH));
}
//printf("- Read guild_expulsion %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3` FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3` FROM `%s` WHERE `guild_id`='%d'", guild_expulsion_db, guild_id) )
+ {
+ Sql_ShowDebug(sql_handle);
aFree(g);
return NULL;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDEXPULSION);i++){
- struct guild_expulsion *e = &g->expulsion[i];
-
- strncpy(e->name,sql_row[1],NAME_LENGTH-1);
- //No need to copy char 40, the null terminator. [Skotlex]
- strncpy(e->mes,sql_row[2],39);
- strncpy(e->acc,sql_row[3],39);
- e->account_id=atoi(sql_row[4]);
- e->rsv1=atoi(sql_row[5]);
- e->rsv2=atoi(sql_row[6]);
- e->rsv3=atoi(sql_row[7]);
- }
- mysql_free_result(sql_res);
+ for( i = 0; i < MAX_GUILDEXPULSION && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ struct guild_expulsion *e = &g->expulsion[i];
+
+ Sql_GetData(sql_handle, 1, &data, &len); memcpy(e->name, data, min(len, NAME_LENGTH));
+ Sql_GetData(sql_handle, 2, &data, &len); memcpy(e->mes, data, min(len, sizeof(e->mes)));
+ Sql_GetData(sql_handle, 3, &data, &len); memcpy(e->acc, data, min(len, sizeof(e->acc)));
+ Sql_GetData(sql_handle, 4, &data, NULL); e->account_id = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); e->rsv1 = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); e->rsv2 = atoi(data);
+ Sql_GetData(sql_handle, 7, &data, NULL); e->rsv3 = atoi(data);
}
//printf("- Read guild_skill %d from sql \n",guild_id);
- sprintf(tmp_sql,"SELECT `guild_id`,`id`,`lv` FROM `%s` WHERE `guild_id`='%d' ORDER BY `id`",guild_skill_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id`,`id`,`lv` FROM `%s` WHERE `guild_id`='%d' ORDER BY `id`", guild_skill_db, guild_id) )
+ {
+ Sql_ShowDebug(sql_handle);
aFree(g);
return NULL;
}
-
+
for(i = 0; i < MAX_GUILDSKILL; i++)
{ //Skill IDs must always be initialized. [Skotlex]
g->skill[i].id = i + GD_SKILLBASE;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res) {
- while ((sql_row = mysql_fetch_row(sql_res))){
- int id = atoi(sql_row[1])-GD_SKILLBASE;
- if (id >= 0 && id < MAX_GUILDSKILL)
- //I know this seems ridiculous, but the skills HAVE to be placed on their 'correct' array slot or things break x.x [Skotlex]
- g->skill[id].lv=atoi(sql_row[2]);
- }
- mysql_free_result(sql_res);
- }
+ while( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ int id;
+ // id
+ Sql_GetData(sql_handle, 1, &data, NULL);
+ id = atoi(data) - GD_SKILLBASE;
+ if( id < 0 && id >= MAX_GUILDSKILL )
+ continue;// invalid guild skill
+ // lv
+ Sql_GetData(sql_handle, 2, &data, NULL);
+ g->skill[id].lv = atoi(data);
+ }
+ Sql_FreeResult(sql_handle);
idb_put(guild_db_, guild_id, g); //Add to cache
g->save_flag |= GS_REMOVE; //But set it to be removed, in case it is not needed for long.
@@ -604,8 +570,7 @@ ShowDebug("Save guild_castle (%d)\n", gc->castle_id);
#endif
// sql_query("DELETE FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, gc->castle_id);
-
- sprintf(tmp_sql,"REPLACE INTO `%s` "
+ if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` "
"(`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`)"
@@ -613,12 +578,8 @@ ShowDebug("Save guild_castle (%d)\n", gc->castle_id);
guild_castle_db, gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE, gc->triggerD, gc->nextTime, gc->payTime,
gc->createTime, gc->visibleC,
gc->guardian[0].visible, gc->guardian[1].visible, gc->guardian[2].visible, gc->guardian[3].visible, gc->guardian[4].visible, gc->guardian[5].visible, gc->guardian[6].visible, gc->guardian[7].visible,
- gc->guardian[0].hp, gc->guardian[1].hp, gc->guardian[2].hp, gc->guardian[3].hp, gc->guardian[4].hp, gc->guardian[5].hp, gc->guardian[6].hp, gc->guardian[7].hp);
-
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ gc->guardian[0].hp, gc->guardian[1].hp, gc->guardian[2].hp, gc->guardian[3].hp, gc->guardian[4].hp, gc->guardian[5].hp, gc->guardian[6].hp, gc->guardian[7].hp) )
+ Sql_ShowDebug(sql_handle);
#ifndef TXT_SQL_CONVERT
memcpy(&castles[gc->castle_id],gc,sizeof(struct guild_castle));
@@ -631,6 +592,8 @@ ShowDebug("Save guild_castle (%d)\n", gc->castle_id);
int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc)
{
static int castles_init=0;
+ char* data;
+
if (gc==NULL) return 0;
if (castle_id==-1) return 0;
@@ -649,58 +612,54 @@ int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc)
}
memset(gc,0,sizeof(struct guild_castle));
- sprintf(tmp_sql,"SELECT `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, "
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `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`"
- " FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, castle_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ " FROM `%s` WHERE `castle_id`='%d'", guild_castle_db, castle_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
// ARU: This needs to be set even if there are no SQL results
gc->castle_id=castle_id;
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row==NULL){
- mysql_free_result(sql_res);
- return 1; //Assume empty castle.
- }
- gc->guild_id = atoi (sql_row[1]);
- gc->economy = atoi (sql_row[2]);
- gc->defense = atoi (sql_row[3]);
- gc->triggerE = atoi (sql_row[4]);
- gc->triggerD = atoi (sql_row[5]);
- gc->nextTime = atoi (sql_row[6]);
- gc->payTime = atoi (sql_row[7]);
- gc->createTime = atoi (sql_row[8]);
- gc->visibleC = atoi (sql_row[9]);
- gc->guardian[0].visible = atoi (sql_row[10]);
- gc->guardian[1].visible = atoi (sql_row[11]);
- gc->guardian[2].visible = atoi (sql_row[12]);
- gc->guardian[3].visible = atoi (sql_row[13]);
- gc->guardian[4].visible = atoi (sql_row[14]);
- gc->guardian[5].visible = atoi (sql_row[15]);
- gc->guardian[6].visible = atoi (sql_row[16]);
- gc->guardian[7].visible = atoi (sql_row[17]);
- gc->guardian[0].hp = atoi (sql_row[18]);
- gc->guardian[1].hp = atoi (sql_row[19]);
- gc->guardian[2].hp = atoi (sql_row[20]);
- gc->guardian[3].hp = atoi (sql_row[21]);
- gc->guardian[4].hp = atoi (sql_row[22]);
- gc->guardian[5].hp = atoi (sql_row[23]);
- gc->guardian[6].hp = atoi (sql_row[24]);
- gc->guardian[7].hp = atoi (sql_row[25]);
-
- if (save_log)
- ShowInfo("Loaded Castle %d (guild %d)\n",castle_id,gc->guild_id);
-
- }
- mysql_free_result(sql_res) ; //resource free
-
+ if( SQL_SUCCESS != Sql_NextRow(sql_handle) )
+ {
+ Sql_FreeResult(sql_handle);
+ return 1; //Assume empty castle.
+ }
+
+ Sql_GetData(sql_handle, 1, &data, NULL); gc->guild_id = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); gc->economy = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); gc->defense = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); gc->triggerE = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); gc->triggerD = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); gc->nextTime = atoi(data);
+ Sql_GetData(sql_handle, 7, &data, NULL); gc->payTime = atoi(data);
+ Sql_GetData(sql_handle, 8, &data, NULL); gc->createTime = atoi(data);
+ Sql_GetData(sql_handle, 9, &data, NULL); gc->visibleC = atoi(data);
+ Sql_GetData(sql_handle, 10, &data, NULL); gc->guardian[0].visible = atoi(data);
+ Sql_GetData(sql_handle, 11, &data, NULL); gc->guardian[1].visible = atoi(data);
+ Sql_GetData(sql_handle, 12, &data, NULL); gc->guardian[2].visible = atoi(data);
+ Sql_GetData(sql_handle, 13, &data, NULL); gc->guardian[3].visible = atoi(data);
+ Sql_GetData(sql_handle, 14, &data, NULL); gc->guardian[4].visible = atoi(data);
+ Sql_GetData(sql_handle, 15, &data, NULL); gc->guardian[5].visible = atoi(data);
+ Sql_GetData(sql_handle, 16, &data, NULL); gc->guardian[6].visible = atoi(data);
+ Sql_GetData(sql_handle, 17, &data, NULL); gc->guardian[7].visible = atoi(data);
+ Sql_GetData(sql_handle, 18, &data, NULL); gc->guardian[0].hp = atoi(data);
+ Sql_GetData(sql_handle, 19, &data, NULL); gc->guardian[1].hp = atoi(data);
+ Sql_GetData(sql_handle, 20, &data, NULL); gc->guardian[2].hp = atoi(data);
+ Sql_GetData(sql_handle, 21, &data, NULL); gc->guardian[3].hp = atoi(data);
+ Sql_GetData(sql_handle, 22, &data, NULL); gc->guardian[4].hp = atoi(data);
+ Sql_GetData(sql_handle, 23, &data, NULL); gc->guardian[5].hp = atoi(data);
+ Sql_GetData(sql_handle, 24, &data, NULL); gc->guardian[6].hp = atoi(data);
+ Sql_GetData(sql_handle, 25, &data, NULL); gc->guardian[7].hp = atoi(data);
+
+ Sql_FreeResult(sql_handle);
memcpy(&castles[castle_id],gc,sizeof(struct guild_castle));
+ if( save_log )
+ ShowInfo("Loaded Castle %d (guild %d)\n", castle_id, gc->guild_id);
+
return 1;
}
@@ -740,20 +699,24 @@ int inter_guild_CharOnline(int char_id, int guild_id) {
if (guild_id == -1) {
//Get guild_id from the database
- sprintf (tmp_sql , "SELECT guild_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT guild_id FROM `%s` WHERE char_id='%d'", char_db, char_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if(sql_res == NULL)
- return 0; //Eh? No guild?
-
- sql_row = mysql_fetch_row(sql_res);
- guild_id = sql_row?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
+ if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ char* data;
+
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ guild_id = atoi(data);
+ }
+ else
+ {
+ guild_id = 0;
+ }
+ Sql_FreeResult(sql_handle);
}
if (guild_id == 0)
return 0; //No guild...
@@ -785,20 +748,24 @@ int inter_guild_CharOffline(int char_id, int guild_id) {
if (guild_id == -1) {
//Get guild_id from the database
- sprintf (tmp_sql , "SELECT guild_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT guild_id FROM `%s` WHERE char_id='%d'", char_db, char_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if(sql_res == NULL)
- return 0; //Eh? No guild?
-
- sql_row = mysql_fetch_row(sql_res);
- guild_id = sql_row?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
+ if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ char* data;
+
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ guild_id = atoi(data);
+ }
+ else
+ {
+ guild_id = 0;
+ }
+ Sql_FreeResult(sql_handle);
}
if (guild_id == 0)
return 0; //No guild...
@@ -860,23 +827,28 @@ void inter_guild_sql_final(void)
int search_guildname(char *str)
{
int guild_id;
- char t_name[NAME_LENGTH*2];
+ char esc_name[NAME_LENGTH*2+1];
- jstrescapecpy(t_name, str);
+ Sql_EscapeStringLen(sql_handle, esc_name, str, strnlen(str, NAME_LENGTH));
//Lookup guilds with the same name
- sprintf (tmp_sql , "SELECT guild_id FROM `%s` WHERE name='%s'", guild_db, t_name);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT guild_id FROM `%s` WHERE name='%s'", guild_db, esc_name) )
+ {
+ Sql_ShowDebug(sql_handle);
return -1;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if(sql_res)
- sql_row = mysql_fetch_row(sql_res);
-
- guild_id = (sql_row&&sql_res&&sql_row[0])?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
+ if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ char* data;
+
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ guild_id = atoi(data);
+ }
+ else
+ {
+ guild_id = 0;
+ }
+ Sql_FreeResult(sql_handle);
return guild_id;
}
@@ -1228,56 +1200,58 @@ int mapif_guild_castle_datasave(int castle_id,int index,int value) // <Agit
return 0;
}
-int mapif_guild_castle_alldataload(int fd) {
- struct guild_castle* gc = (struct guild_castle *)aMalloc(sizeof(struct guild_castle));
- int i, len = 4;
- WFIFOHEAD(fd, len + MAX_GUILDCASTLE*sizeof(struct guild_castle));
- WFIFOW(fd,0) = 0x3842;
- sprintf(tmp_sql,"SELECT * FROM `%s` ORDER BY `castle_id`", guild_castle_db);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- for(i = 0; ((sql_row = mysql_fetch_row(sql_res)) && i < MAX_GUILDCASTLE); i++) {
- memset(gc, 0, sizeof(struct guild_castle));
- gc->castle_id = atoi(sql_row[0]);
- gc->guild_id = atoi(sql_row[1]);
- gc->economy = atoi(sql_row[2]);
- gc->defense = atoi(sql_row[3]);
- gc->triggerE = atoi(sql_row[4]);
- gc->triggerD = atoi(sql_row[5]);
- gc->nextTime = atoi(sql_row[6]);
- gc->payTime = atoi(sql_row[7]);
- gc->createTime = atoi(sql_row[8]);
- gc->visibleC = atoi(sql_row[9]);
- gc->guardian[0].visible = atoi(sql_row[10]);
- gc->guardian[1].visible = atoi(sql_row[11]);
- gc->guardian[2].visible = atoi(sql_row[12]);
- gc->guardian[3].visible = atoi(sql_row[13]);
- gc->guardian[4].visible = atoi(sql_row[14]);
- gc->guardian[5].visible = atoi(sql_row[15]);
- gc->guardian[6].visible = atoi(sql_row[16]);
- gc->guardian[7].visible = atoi(sql_row[17]);
- gc->guardian[0].visible = atoi(sql_row[18]);
- gc->guardian[1].visible = atoi(sql_row[19]);
- gc->guardian[2].visible = atoi(sql_row[20]);
- gc->guardian[3].visible = atoi(sql_row[21]);
- gc->guardian[4].visible = atoi(sql_row[22]);
- gc->guardian[5].visible = atoi(sql_row[23]);
- gc->guardian[6].visible = atoi(sql_row[24]);
- gc->guardian[7].visible = atoi(sql_row[25]);
- memcpy(WFIFOP(fd,len), gc, sizeof(struct guild_castle));
- len += sizeof(struct guild_castle);
- }
- mysql_free_result(sql_res);
- }
- WFIFOW(fd,2) = len;
- WFIFOSET(fd,len);
-
- aFree(gc);
+int mapif_guild_castle_alldataload(int fd)
+{
+ struct guild_castle s_gc;
+ struct guild_castle* gc = &s_gc;
+ int i;
+ int off;
+ char* data;
+ WFIFOHEAD(fd, 4 + MAX_GUILDCASTLE*sizeof(struct guild_castle));
+ WFIFOW(fd, 0) = 0x3842;
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `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` FROM `%s` ORDER BY `castle_id`", guild_castle_db) )
+ Sql_ShowDebug(sql_handle);
+ for( i = 0, off = 4; i < MAX_GUILDCASTLE && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ memset(gc, 0, sizeof(struct guild_castle));
+
+ Sql_GetData(sql_handle, 0, &data, NULL); gc->castle_id = atoi(data);
+ Sql_GetData(sql_handle, 1, &data, NULL); gc->guild_id = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); gc->economy = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); gc->defense = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); gc->triggerE = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); gc->triggerD = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); gc->nextTime = atoi(data);
+ Sql_GetData(sql_handle, 7, &data, NULL); gc->payTime = atoi(data);
+ Sql_GetData(sql_handle, 8, &data, NULL); gc->createTime = atoi(data);
+ Sql_GetData(sql_handle, 9, &data, NULL); gc->visibleC = atoi(data);
+ Sql_GetData(sql_handle, 10, &data, NULL); gc->guardian[0].visible = atoi(data);
+ Sql_GetData(sql_handle, 11, &data, NULL); gc->guardian[1].visible = atoi(data);
+ Sql_GetData(sql_handle, 12, &data, NULL); gc->guardian[2].visible = atoi(data);
+ Sql_GetData(sql_handle, 13, &data, NULL); gc->guardian[3].visible = atoi(data);
+ Sql_GetData(sql_handle, 14, &data, NULL); gc->guardian[4].visible = atoi(data);
+ Sql_GetData(sql_handle, 15, &data, NULL); gc->guardian[5].visible = atoi(data);
+ Sql_GetData(sql_handle, 16, &data, NULL); gc->guardian[6].visible = atoi(data);
+ Sql_GetData(sql_handle, 17, &data, NULL); gc->guardian[7].visible = atoi(data);
+ Sql_GetData(sql_handle, 18, &data, NULL); gc->guardian[0].hp = atoi(data);
+ Sql_GetData(sql_handle, 19, &data, NULL); gc->guardian[1].hp = atoi(data);
+ Sql_GetData(sql_handle, 20, &data, NULL); gc->guardian[2].hp = atoi(data);
+ Sql_GetData(sql_handle, 21, &data, NULL); gc->guardian[3].hp = atoi(data);
+ Sql_GetData(sql_handle, 22, &data, NULL); gc->guardian[4].hp = atoi(data);
+ Sql_GetData(sql_handle, 23, &data, NULL); gc->guardian[5].hp = atoi(data);
+ Sql_GetData(sql_handle, 24, &data, NULL); gc->guardian[6].hp = atoi(data);
+ Sql_GetData(sql_handle, 25, &data, NULL); gc->guardian[7].hp = atoi(data);
+
+ memcpy(WFIFOP(fd, off), gc, sizeof(struct guild_castle));
+ off += sizeof(struct guild_castle);
+ }
+ Sql_FreeResult(sql_handle);
+ WFIFOW(fd, 2) = off;
+ WFIFOSET(fd, off);
+
return 0;
}
@@ -1462,11 +1436,8 @@ int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int fl
g->save_flag |= GS_EXPULSION;
}else{
// Unknown guild, just update the player
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `account_id`='%d' AND `char_id`='%d'",char_db, account_id,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `guild_id`='0' WHERE `account_id`='%d' AND `char_id`='%d'", char_db, account_id, char_id) )
+ Sql_ShowDebug(sql_handle);
/* mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes); */
}
@@ -1542,66 +1513,39 @@ int mapif_parse_BreakGuild(int fd,int guild_id)
// Delete guild from sql
//printf("- Delete guild %d from guild\n",guild_id);
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_member_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_member_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_castle_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_castle_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_storage_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_storage_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d' OR `alliance_id` = '%d'", guild_alliance_db, guild_id, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id` = '%d' OR `alliance_id` = '%d'", guild_alliance_db, guild_id, guild_id) )
+ Sql_ShowDebug(sql_handle);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_position_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_position_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_skill_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_skill_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_expulsion_db, guild_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_expulsion_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
//printf("- Update guild %d of char\n",guild_id);
- sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'", char_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
mapif_guild_broken(guild_id,0);
-
+
if(log_inter)
inter_log("guild %s (id=%d) broken\n",g->name,guild_id);
-
+
//Remove the guild from memory. [Skotlex]
idb_remove(guild_db_, guild_id);
return 0;
diff --git a/src/char_sql/int_guild.h b/src/char_sql/int_guild.h
index f8b3e98c5..ade191e9f 100644
--- a/src/char_sql/int_guild.h
+++ b/src/char_sql/int_guild.h
@@ -4,17 +4,6 @@
#ifndef _INT_GUILD_SQL_H_
#define _INT_GUILD_SQL_H_
-int inter_guild_parse_frommap(int fd);
-int inter_guild_sql_init(void);
-void inter_guild_sql_final(void);
-int inter_guild_mapif_init(int fd);
-int inter_guild_leave(int guild_id,int account_id,int char_id);
-int mapif_parse_BreakGuild(int fd,int guild_id);
-int inter_guild_broken(int guild_id);
-int inter_guild_sex_changed(int guild_id,int account_id,int char_id, int gender);
-int inter_guild_CharOnline(int char_id, int guild_id);
-int inter_guild_CharOffline(int char_id, int guild_id);
-
#define GS_BASIC 0x0001
#define GS_MEMBER 0x0002
#define GS_POSITION 0x0004
@@ -29,6 +18,20 @@ int inter_guild_CharOffline(int char_id, int guild_id);
#define GS_BASIC_MASK (GS_BASIC | GS_EMBLEM | GS_CONNECT | GS_LEVEL | GS_MES)
#define GS_REMOVE 0x8000
+struct guild;
+struct guild_castle;
+
+int inter_guild_parse_frommap(int fd);
+int inter_guild_sql_init(void);
+void inter_guild_sql_final(void);
+int inter_guild_mapif_init(int fd);
+int inter_guild_leave(int guild_id,int account_id,int char_id);
+int mapif_parse_BreakGuild(int fd,int guild_id);
+int inter_guild_broken(int guild_id);
+int inter_guild_sex_changed(int guild_id,int account_id,int char_id, int gender);
+int inter_guild_CharOnline(int char_id, int guild_id);
+int inter_guild_CharOffline(int char_id, int guild_id);
+
//For the TXT->SQL converter.
int inter_guild_tosql(struct guild *g,int flag);
int inter_guildcastle_tosql(struct guild_castle *gc);
diff --git a/src/char_sql/int_homun.c b/src/char_sql/int_homun.c
index 42f4ef225..5c0c81f05 100644
--- a/src/char_sql/int_homun.c
+++ b/src/char_sql/int_homun.c
@@ -1,14 +1,19 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "char.h"
+#include "../common/mmo.h"
#include "../common/malloc.h"
#include "../common/strlib.h"
#include "../common/showmsg.h"
+#include "../common/socket.h"
+#include "../common/utils.h"
+#include "../common/sql.h"
+#include "char.h"
+#include "inter.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
struct s_homunculus *homun_pt;
@@ -68,154 +73,150 @@ int mapif_homunculus_created(int fd, int account_id, struct s_homunculus *sh, un
// Save/Update Homunculus Skills
int mapif_save_homunculus_skills(struct s_homunculus *hd)
{
+ SqlStmt* stmt;
int i;
- for(i=0; i<MAX_HOMUNSKILL; i++)
+ stmt = SqlStmt_Malloc(sql_handle);
+ if( SQL_ERROR == SqlStmt_Prepare(stmt, "REPLACE INTO `skill_homunculus` (`homun_id`, `id`, `lv`) VALUES (%d, ?, ?)", hd->hom_id) )
+ SqlStmt_ShowDebug(stmt);
+ for( i = 0; i < MAX_HOMUNSKILL; ++i )
{
- if(hd->hskill[i].id != 0 && hd->hskill[i].lv != 0 )
+ if( hd->hskill[i].id > 0 && hd->hskill[i].lv != 0 )
{
- sprintf(tmp_sql,"REPLACE INTO `skill_homunculus` (`homun_id`, `id`, `lv`) VALUES (%d, %d, %d)",
- hd->hom_id, hd->hskill[i].id, hd->hskill[i].lv);
-
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ SqlStmt_BindParam(stmt, 0, SQLDT_USHORT, &hd->hskill[i].id, 0);
+ SqlStmt_BindParam(stmt, 1, SQLDT_USHORT, &hd->hskill[i].lv, 0);
+ if( SQL_ERROR == SqlStmt_Execute(stmt) )
+ {
+ SqlStmt_ShowDebug(stmt);
+ SqlStmt_Free(stmt);
return 0;
}
}
}
+ SqlStmt_Free(stmt);
return 1;
}
int mapif_save_homunculus(int fd, int account_id, struct s_homunculus *hd)
{
- int flag =1;
- char t_name[NAME_LENGTH*2];
- jstrescapecpy(t_name, hd->name);
+ int flag = 1;
+ char esc_name[NAME_LENGTH*2+1];
- if(hd->hom_id==0) // new homunculus
- {
- sprintf(tmp_sql, "INSERT INTO `homunculus` "
+ Sql_EscapeStringLen(sql_handle, esc_name, hd->name, strnlen(hd->name, NAME_LENGTH));
+
+ if( hd->hom_id == 0 )
+ {// new homunculus
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `homunculus` "
"(`char_id`, `class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`, `rename_flag`, `vaporize`) "
"VALUES ('%d', '%d', '%s', '%d', '%u', '%u', '%d', '%d', %d, '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- hd->char_id, hd->class_,t_name,hd->level,hd->exp,hd->intimacy,hd->hunger, hd->str, hd->agi, hd->vit, hd->int_, hd->dex, hd->luk,
- hd->hp,hd->max_hp,hd->sp,hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize);
-
+ hd->char_id, hd->class_, esc_name, hd->level, hd->exp, hd->intimacy, hd->hunger, hd->str, hd->agi, hd->vit, hd->int_, hd->dex, hd->luk,
+ hd->hp, hd->max_hp, hd->sp, hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize) )
+ {
+ Sql_ShowDebug(sql_handle);
+ flag = 0;
+ }
+ else
+ {
+ hd->hom_id = (int)Sql_LastInsertId(sql_handle);
+ }
}
else
{
- sprintf(tmp_sql, "UPDATE `homunculus` SET `char_id`='%d', `class`='%d',`name`='%s',`level`='%d',`exp`='%u',`intimacy`='%u',`hunger`='%d', `str`='%d', `agi`='%d', `vit`='%d', `int`='%d', `dex`='%d', `luk`='%d', `hp`='%d',`max_hp`='%d',`sp`='%d',`max_sp`='%d',`skill_point`='%d', `rename_flag`='%d', `vaporize`='%d' WHERE `homun_id`='%d'",
- hd->char_id, hd->class_,t_name,hd->level,hd->exp,hd->intimacy,hd->hunger, hd->str, hd->agi, hd->vit, hd->int_, hd->dex, hd->luk,
- hd->hp,hd->max_hp,hd->sp,hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize, hd->hom_id);
- }
-
- if(mysql_query(&mysql_handle, tmp_sql)){
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- flag = 0;
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `homunculus` SET `char_id`='%d', `class`='%d',`name`='%s',`level`='%d',`exp`='%u',`intimacy`='%u',`hunger`='%d', `str`='%d', `agi`='%d', `vit`='%d', `int`='%d', `dex`='%d', `luk`='%d', `hp`='%d',`max_hp`='%d',`sp`='%d',`max_sp`='%d',`skill_point`='%d', `rename_flag`='%d', `vaporize`='%d' WHERE `homun_id`='%d'",
+ hd->char_id, hd->class_, esc_name, hd->level, hd->exp, hd->intimacy, hd->hunger, hd->str, hd->agi, hd->vit, hd->int_, hd->dex, hd->luk,
+ hd->hp, hd->max_hp, hd->sp, hd->max_sp, hd->skillpts, hd->rename_flag, hd->vaporize, hd->hom_id) )
+ {
+ Sql_ShowDebug(sql_handle);
+ flag = 0;
+ }
+ else
+ {
+ flag = mapif_save_homunculus_skills(hd);
+ mapif_saved_homunculus(fd, account_id, flag);
+ }
}
- if(hd->hom_id==0 && flag!=0)
- hd->hom_id = (int)mysql_insert_id(&mysql_handle); // new homunculus
- else
- {
- flag = mapif_save_homunculus_skills(hd);
- mapif_saved_homunculus(fd, account_id, flag);
- }
return flag;
}
// Load an homunculus
-int mapif_load_homunculus(int fd){
+int mapif_load_homunculus(int fd)
+{
int i;
- RFIFOHEAD(fd);
- memset(homun_pt, 0, sizeof(struct s_homunculus));
+ char* data;
+ size_t len;
- sprintf(tmp_sql,"SELECT `homun_id`,`char_id`,`class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`,`rename_flag`, `vaporize` FROM `homunculus` WHERE `homun_id`='%u'", RFIFOL(fd,6));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ memset(homun_pt, 0, sizeof(struct s_homunculus));
+ RFIFOHEAD(fd);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `homun_id`,`char_id`,`class`,`name`,`level`,`exp`,`intimacy`,`hunger`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `hp`,`max_hp`,`sp`,`max_sp`,`skill_point`,`rename_flag`, `vaporize` FROM `homunculus` WHERE `homun_id`='%u'", RFIFOL(fd,6)) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
-
- homun_pt->hom_id = RFIFOL(fd,6) ; //RFIFOL(fd,2);
- homun_pt->class_ = atoi(sql_row[2]);
- strncpy(homun_pt->name, sql_row[3], NAME_LENGTH);
- homun_pt->char_id = atoi(sql_row[1]);
- homun_pt->level = atoi(sql_row[4]);
- homun_pt->exp = atoi(sql_row[5]);
- homun_pt->intimacy = atoi(sql_row[6]);
- homun_pt->hunger = atoi(sql_row[7]);
- homun_pt->str = atoi(sql_row[8]);
- homun_pt->agi = atoi(sql_row[9]);
- homun_pt->vit = atoi(sql_row[10]);
- homun_pt->int_ = atoi(sql_row[11]);
- homun_pt->dex = atoi(sql_row[12]);
- homun_pt->luk = atoi(sql_row[13]);
- homun_pt->hp = atoi(sql_row[14]);
- homun_pt->max_hp = atoi(sql_row[15]);
- homun_pt->sp = atoi(sql_row[16]);
- homun_pt->max_sp = atoi(sql_row[17]);
- homun_pt->skillpts = atoi(sql_row[18]);
- homun_pt->rename_flag = atoi(sql_row[19]);
- homun_pt->vaporize = atoi(sql_row[20]);
+ if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ homun_pt->hom_id = RFIFOL(fd,6);
+ Sql_GetData(sql_handle, 1, &data, NULL); homun_pt->char_id = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); homun_pt->class_ = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, &len); memcpy(homun_pt->name, data, min(len, NAME_LENGTH));
+ Sql_GetData(sql_handle, 4, &data, NULL); homun_pt->level = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); homun_pt->exp = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); homun_pt->intimacy = (unsigned int)strtoul(data, NULL, 10);
+ homun_pt->intimacy = cap_value(homun_pt->intimacy, 0, 100000);
+ Sql_GetData(sql_handle, 7, &data, NULL); homun_pt->hunger = atoi(data);
+ homun_pt->hunger = cap_value(homun_pt->hunger, 0, 100);
+ Sql_GetData(sql_handle, 8, &data, NULL); homun_pt->str = atoi(data);
+ Sql_GetData(sql_handle, 9, &data, NULL); homun_pt->agi = atoi(data);
+ Sql_GetData(sql_handle, 10, &data, NULL); homun_pt->vit = atoi(data);
+ Sql_GetData(sql_handle, 11, &data, NULL); homun_pt->int_ = atoi(data);
+ Sql_GetData(sql_handle, 12, &data, NULL); homun_pt->dex = atoi(data);
+ Sql_GetData(sql_handle, 13, &data, NULL); homun_pt->luk = atoi(data);
+ Sql_GetData(sql_handle, 14, &data, NULL); homun_pt->hp = atoi(data);
+ Sql_GetData(sql_handle, 15, &data, NULL); homun_pt->max_hp = atoi(data);
+ Sql_GetData(sql_handle, 16, &data, NULL); homun_pt->sp = atoi(data);
+ Sql_GetData(sql_handle, 17, &data, NULL); homun_pt->max_sp = atoi(data);
+ Sql_GetData(sql_handle, 18, &data, NULL); homun_pt->skillpts = atoi(data);
+ Sql_GetData(sql_handle, 19, &data, NULL); homun_pt->rename_flag = atoi(data);
+ Sql_GetData(sql_handle, 20, &data, NULL); homun_pt->vaporize = atoi(data);
+
+ Sql_FreeResult(sql_handle);
}
- if(homun_pt->hunger < 0)
- homun_pt->hunger = 0;
- else if(homun_pt->hunger > 100)
- homun_pt->hunger = 100;
- if(homun_pt->intimacy > 100000)
- homun_pt->intimacy = 100000;
-
- mysql_free_result(sql_res);
// Load Homunculus Skill
- memset(homun_pt->hskill, 0, sizeof(homun_pt->hskill));
-
- sprintf(tmp_sql,"SELECT `id`,`lv` FROM `skill_homunculus` WHERE `homun_id`=%d",homun_pt->hom_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `id`,`lv` FROM `skill_homunculus` WHERE `homun_id`=%d", homun_pt->hom_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
- sql_res = mysql_store_result(&mysql_handle);
- if(sql_res){
- while((sql_row = mysql_fetch_row(sql_res))){
- i = (atoi(sql_row[0])-HM_SKILLBASE-1);
- homun_pt->hskill[i].id = atoi(sql_row[0]);
- homun_pt->hskill[i].lv = atoi(sql_row[1]);
- }
- }
-
- mysql_free_result(sql_res);
-
- if (save_log)
+ while( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
+ // id
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ i = atoi(data);
+ if( i < HM_SKILLBASE || i >= HM_SKILLBASE + MAX_HOMUNSKILL )
+ continue;// invalid guild skill
+ homun_pt->hskill[i].id = (unsigned short)i;
+ // lv
+ Sql_GetData(sql_handle, 1, &data, NULL);
+ homun_pt->hskill[i].lv = (unsigned short)atoi(data);
+ }
+ Sql_FreeResult(sql_handle);
+
+ if( save_log )
ShowInfo("Homunculus loaded (%d - %s).\n", homun_pt->hom_id, homun_pt->name);
return mapif_info_homunculus(fd, RFIFOL(fd,2), homun_pt);
}
int inter_delete_homunculus(int hom_id)
{
- sprintf(tmp_sql, "DELETE FROM `homunculus` WHERE `homun_id` = '%u'", hom_id);
- if(mysql_query(&mysql_handle, tmp_sql))
- {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- }
-
- sprintf(tmp_sql, "DELETE FROM `skill_homunculus` WHERE `homun_id` = '%u'", hom_id);
- if(mysql_query(&mysql_handle, tmp_sql))
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `homunculus` WHERE `homun_id` = '%u'", hom_id) ||
+ SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `skill_homunculus` WHERE `homun_id` = '%u'", hom_id) )
{
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ Sql_ShowDebug(sql_handle);
return 0;
}
return 1;
diff --git a/src/char_sql/int_homun.h b/src/char_sql/int_homun.h
index fa49c659f..d990b2219 100644
--- a/src/char_sql/int_homun.h
+++ b/src/char_sql/int_homun.h
@@ -4,6 +4,8 @@
#ifndef _INT_HOMUN_SQL_H_
#define _INT_HOMUN_SQL_H_
+struct s_homunculus;
+
int inter_homunculus_sql_init(void);
void inter_homunculus_sql_final(void);
int mapif_save_homunculus(struct s_homunculus *hd);
diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c
index c1c09e9a4..f6d783b3b 100644
--- a/src/char_sql/int_party.c
+++ b/src/char_sql/int_party.c
@@ -1,18 +1,22 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
#include "../common/cbasetypes.h"
+#include "../common/mmo.h"
#include "../common/db.h"
#include "../common/malloc.h"
#include "../common/strlib.h"
#include "../common/socket.h"
#include "../common/showmsg.h"
-
+#include "../common/mapindex.h"
+#include "../common/sql.h"
#include "char.h"
+#include "inter.h"
+#include "int_party.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#ifndef TXT_SQL_CONVERT
struct party_data {
@@ -103,108 +107,88 @@ static void int_party_calc_state(struct party_data *p)
int inter_party_tosql(struct party *p, int flag, int index)
{
// 'party' ('party_id','name','exp','item','leader_id','leader_char')
- char t_name[NAME_LENGTH*2]; //Required for jstrescapecpy [Skotlex]
+ char esc_name[NAME_LENGTH*2+1];// escaped party name
int party_id;
- if (p == NULL || p->party_id == 0)
+
+ if( p == NULL || p->party_id == 0 )
return 0;
party_id = p->party_id;
#ifdef NOISY
ShowInfo("Save party request ("CL_BOLD"%d"CL_RESET" - %s).\n", party_id, p->name);
#endif
- jstrescapecpy(t_name, p->name);
+ Sql_EscapeStringLen(sql_handle, esc_name, p->name, strnlen(p->name, NAME_LENGTH));
#ifndef TXT_SQL_CONVERT
- if (flag&PS_BREAK) { //Break the party
+ if( flag & PS_BREAK )
+ {// Break the party
// we'll skip name-checking and just reset everyone with the same party id [celest]
- sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `party_id`='%d'", party_db, party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id) )
+ Sql_ShowDebug(sql_handle);
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `party_id`='%d'", party_db, party_id) )
+ Sql_ShowDebug(sql_handle);
//Remove from memory
idb_remove(party_db_, party_id);
return 1;
}
#endif //TXT_SQL_CONVERT
- if(flag&PS_CREATE) { //Create party
+ if( flag & PS_CREATE )
+ {// Create party
#ifndef TXT_SQL_CONVERT
- sprintf(tmp_sql, "INSERT INTO `%s` "
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` "
"(`name`, `exp`, `item`, `leader_id`, `leader_char`) "
"VALUES ('%s', '%d', '%d', '%d', '%d')",
- party_db, t_name, p->exp, p->item, p->member[index].account_id, p->member[index].char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ party_db, esc_name, p->exp, p->item, p->member[index].account_id, p->member[index].char_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
- if(mysql_field_count(&mysql_handle) == 0 &&
- mysql_insert_id(&mysql_handle) != 0)
- party_id = p->party_id = (int)mysql_insert_id(&mysql_handle);
- else //Failed to retrieve ID??
- return 0;
+ party_id = p->party_id = (int)Sql_LastInsertId(sql_handle);
#else
//During conversion, you want to specify the id, and allow overwriting
//(in case someone is re-running the process.
- sprintf(tmp_sql, "REPLACE INTO `%s` "
+
+ if( SQL_ERROR == Sql_Query(sql_handle, "REPLACE INTO `%s` "
"(`party_id`, `name`, `exp`, `item`, `leader_id`, `leader_char`) "
"VALUES ('%d', '%s', '%d', '%d', '%d', '%d')",
- party_db, p->party_id, t_name, p->exp, p->item, p->member[index].account_id, p->member[index].char_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ party_db, p->party_id, esc_name, p->exp, p->item, p->member[index].account_id, p->member[index].char_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
#endif
}
#ifndef TXT_SQL_CONVERT
- if (flag&PS_BASIC) {
- //Update party info.
- sprintf(tmp_sql, "UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d' WHERE `party_id`='%d'",
- party_db, t_name, p->exp, p->item, party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( flag & PS_BASIC )
+ {// Update party info.
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d' WHERE `party_id`='%d'",
+ party_db, esc_name, p->exp, p->item, party_id) )
+ Sql_ShowDebug(sql_handle);
}
- if (flag&PS_LEADER) {
- //Update leader
- sprintf(tmp_sql, "UPDATE `%s` SET `leader_id`='%d', `leader_char`='%d' WHERE `party_id`='%d'",
- party_db, p->member[index].account_id, p->member[index].char_id, party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( flag & PS_LEADER )
+ {// Update leader
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `leader_id`='%d', `leader_char`='%d' WHERE `party_id`='%d'",
+ party_db, p->member[index].account_id, p->member[index].char_id, party_id) )
+ Sql_ShowDebug(sql_handle);
}
- if (flag&PS_ADDMEMBER) {
- //Add one party member.
- sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='%d' WHERE `account_id`='%d' AND `char_id`='%d'",
- char_db, party_id, p->member[index].account_id, p->member[index].char_id);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( flag & PS_ADDMEMBER )
+ {// Add one party member.
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `party_id`='%d' WHERE `account_id`='%d' AND `char_id`='%d'",
+ char_db, party_id, p->member[index].account_id, p->member[index].char_id) )
+ Sql_ShowDebug(sql_handle);
}
- if (flag&PS_DELMEMBER) {
- //Remove one party member.
- sprintf (tmp_sql, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `char_id`='%d'",
- char_db, party_id, p->member[index].account_id, p->member[index].char_id);
- if (mysql_query (&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( flag & PS_DELMEMBER )
+ {// Remove one party member.
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `char_id`='%d'",
+ char_db, party_id, p->member[index].account_id, p->member[index].char_id) )
+ Sql_ShowDebug(sql_handle);
}
#endif //TXT_SQL_CONVERT
- if (save_log)
+ if( save_log )
ShowInfo("Party Saved (%d - %s)\n", party_id, p->name);
return 1;
}
@@ -212,74 +196,69 @@ int inter_party_tosql(struct party *p, int flag, int index)
// Read party from mysql
struct party_data *inter_party_fromsql(int party_id)
{
- int leader_id = 0, leader_char = 0;
- struct party_data *p;
+ int leader_id = 0;
+ int leader_char = 0;
+ struct party_data* p;
+ struct party_member* m;
+ char* data;
+ size_t len;
+ int i;
+
#ifdef NOISY
ShowInfo("Load party request ("CL_BOLD"%d"CL_RESET")\n", party_id);
#endif
- if (party_id <=0)
+ if( party_id <= 0 )
return NULL;
//Load from memory
- if ((p = idb_get(party_db_, party_id)) != NULL)
+ p = idb_get(party_db_, party_id);
+ if( p != NULL )
return p;
-
+
p = party_pt;
memset(p, 0, sizeof(struct party_data));
- sprintf(tmp_sql, "SELECT `party_id`, `name`,`exp`,`item`, `leader_id`, `leader_char` FROM `%s` WHERE `party_id`='%d'",
- party_db, party_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `party_id`, `name`,`exp`,`item`, `leader_id`, `leader_char` FROM `%s` WHERE `party_id`='%d'", party_db, party_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return NULL;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if (!sql_res)
+ if( SQL_SUCCESS != Sql_NextRow(sql_handle) )
return NULL;
- sql_row = mysql_fetch_row(sql_res);
- if (!sql_row) {
- mysql_free_result(sql_res);
- return NULL;
- }
+
p->party.party_id = party_id;
- strncpy(p->party.name, sql_row[1], NAME_LENGTH);
- p->party.exp = atoi(sql_row[2])?1:0;
- p->party.item = atoi(sql_row[3]);
- leader_id = atoi(sql_row[4]);
- leader_char = atoi(sql_row[5]);
- mysql_free_result(sql_res);
+ Sql_GetData(sql_handle, 1, &data, &len); memcpy(p->party.name, data, min(len, NAME_LENGTH));
+ Sql_GetData(sql_handle, 2, &data, NULL); p->party.exp = (atoi(data) ? 1 : 0);
+ Sql_GetData(sql_handle, 3, &data, NULL); p->party.item = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); leader_id = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); leader_char = atoi(data);
+ Sql_FreeResult(sql_handle);
// Load members
- sprintf(tmp_sql,"SELECT `account_id`,`char_id`,`name`,`base_level`,`last_map`,`online`,`class` FROM `%s` WHERE `party_id`='%d'",
- char_db, party_id); // TBR
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`,`char_id`,`name`,`base_level`,`last_map`,`online`,`class` FROM `%s` WHERE `party_id`='%d'", char_db, party_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return NULL;
}
- sql_res = mysql_store_result(&mysql_handle);
- if (sql_res) {
- int i;
- for (i = 0; i<MAX_PARTY && (sql_row = mysql_fetch_row(sql_res)); i++) {
- struct party_member *m = &p->party.member[i];
- m->account_id = atoi(sql_row[0]);
- m->char_id = atoi(sql_row[1]);
- m->leader = (m->account_id == leader_id && m->char_id == leader_char)?1:0;
- memcpy(m->name, sql_row[2], NAME_LENGTH);
- m->lv = atoi(sql_row[3]);
- m->map = mapindex_name2id(sql_row[4]);
- m->online = atoi(sql_row[5])?1:0;
- m->class_ = atoi(sql_row[6]);
- }
- mysql_free_result(sql_res);
- }
-
- if (save_log)
- ShowInfo("Party loaded (%d - %s).\n",party_id, p->party.name);
+ for( i = 0; i < MAX_PARTY && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ m = &p->party.member[i];
+ Sql_GetData(sql_handle, 0, &data, NULL); m->account_id = atoi(data);
+ Sql_GetData(sql_handle, 1, &data, NULL); m->char_id = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, &len); memcpy(m->name, data, min(len, NAME_LENGTH));
+ Sql_GetData(sql_handle, 3, &data, NULL); m->lv = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); m->map = mapindex_name2id(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); m->online = (atoi(data) ? 1 : 0);
+ Sql_GetData(sql_handle, 6, &data, NULL); m->class_ = atoi(data);
+ m->leader = (m->account_id == leader_id && m->char_id == leader_char ? 1 : 0);
+ }
+ Sql_FreeResult(sql_handle);
+
+ if( save_log )
+ ShowInfo("Party loaded (%d - %s).\n", party_id, p->party.name);
//Add party to memory.
- p = aCalloc(1, sizeof(struct party_data));
+ CREATE(p, struct party_data, 1);
memcpy(p, party_pt, sizeof(struct party_data));
//init state
int_party_calc_state(p);
@@ -299,13 +278,9 @@ int inter_party_sql_init(void)
/* Uncomment the following if you want to do a party_db cleanup (remove parties with no members) on startup.[Skotlex]
ShowStatus("cleaning party table...\n");
- sprintf (tmp_sql,
- "DELETE FROM `%s` USING `%s` LEFT JOIN `%s` ON `%s`.leader_id =`%s`.account_id AND `%s`.leader_char = `%s`.char_id WHERE `%s`.account_id IS NULL",
- party_db, party_db, char_db, party_db, char_db, party_db, char_db, char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` USING `%s` LEFT JOIN `%s` ON `%s`.leader_id =`%s`.account_id AND `%s`.leader_char = `%s`.char_id WHERE `%s`.account_id IS NULL",
+ party_db, party_db, char_db, party_db, char_db, party_db, char_db, char_db) )
+ Sql_ShowDebug(sql_handle);
*/
return 0;
}
@@ -318,27 +293,23 @@ void inter_party_sql_final(void)
}
// Search for the party according to its name
-struct party_data* search_partyname(char *str)
+struct party_data* search_partyname(char* str)
{
- char t_name[NAME_LENGTH*2];
- int party_id;
-
- sprintf(tmp_sql,"SELECT `party_id` FROM `%s` WHERE `name`='%s'",party_db, jstrescapecpy(t_name,str));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res==NULL || mysql_num_rows(sql_res)<=0)
+ char esc_name[NAME_LENGTH*2+1];
+ char* data;
+ struct party_data* p = NULL;
+
+ Sql_EscapeStringLen(sql_handle, esc_name, str, strnlen(str, NAME_LENGTH));
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `party_id` FROM `%s` WHERE `name`='%s'", party_db, esc_name) )
+ Sql_ShowDebug(sql_handle);
+ else if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
{
- if (sql_res) mysql_free_result(sql_res);
- return NULL;
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ p = inter_party_fromsql(atoi(data));
}
- sql_row = mysql_fetch_row(sql_res);
- party_id = sql_row?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
+ Sql_FreeResult(sql_handle);
- return inter_party_fromsql(party_id);
+ return p;
}
// Returns whether this party can keep having exp share or not.
@@ -627,12 +598,10 @@ int mapif_parse_PartyLeave(int fd, int party_id, int account_id, int char_id)
int i,j=-1;
p = inter_party_fromsql(party_id);
- if (!p) { //Party does not exists?
- sprintf(tmp_sql, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( p == NULL )
+ {// Party does not exists?
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d'", char_db, party_id) )
+ Sql_ShowDebug(sql_handle);
return 0;
}
@@ -809,26 +778,27 @@ int inter_party_leave(int party_id,int account_id, int char_id)
return mapif_parse_PartyLeave(-1,party_id,account_id, char_id);
}
-int inter_party_CharOnline(int char_id, int party_id) {
- struct party_data *p;
- int i;
-
- if (party_id == -1) {
- //Get party_id from the database
- sprintf (tmp_sql , "SELECT party_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+int inter_party_CharOnline(int char_id, int party_id)
+{
+ struct party_data* p;
+ int i;
+
+ if( party_id == -1 )
+ {// Get party_id from the database
+ char* data;
+
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT party_id FROM `%s` WHERE char_id='%d'", char_db, char_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if(sql_res == NULL)
+ if( SQL_SUCCESS != Sql_NextRow(sql_handle) )
return 0; //Eh? No party?
-
- sql_row = mysql_fetch_row(sql_res);
- party_id = sql_row?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
+
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ party_id = atoi(data);
+ Sql_FreeResult(sql_handle);
}
if (party_id == 0)
return 0; //No party...
@@ -859,22 +829,22 @@ int inter_party_CharOffline(int char_id, int party_id) {
struct party_data *p=NULL;
int i;
- if (party_id == -1) {
- //Get guild_id from the database
- sprintf (tmp_sql , "SELECT party_id FROM `%s` WHERE char_id='%d'",char_db,char_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( party_id == -1 )
+ {// Get guild_id from the database
+ char* data;
+
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT party_id FROM `%s` WHERE char_id='%d'", char_db, char_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if(sql_res == NULL)
+ if( SQL_SUCCESS != Sql_NextRow(sql_handle) )
return 0; //Eh? No party?
-
- sql_row = mysql_fetch_row(sql_res);
- party_id = sql_row?atoi(sql_row[0]):0;
- mysql_free_result(sql_res);
+
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ party_id = atoi(data);
+ Sql_FreeResult(sql_handle);
}
if (party_id == 0)
return 0; //No party...
diff --git a/src/char_sql/int_party.h b/src/char_sql/int_party.h
index c244ab59e..d7965c33b 100644
--- a/src/char_sql/int_party.h
+++ b/src/char_sql/int_party.h
@@ -18,6 +18,8 @@
//Specify that this party must be deleted.
#define PS_BREAK 0x20
+struct party;
+
int inter_party_parse_frommap(int fd);
int inter_party_sql_init(void);
void inter_party_sql_final(void);
diff --git a/src/char_sql/int_pet.c b/src/char_sql/int_pet.c
index 6352412ce..3ce7c4559 100644
--- a/src/char_sql/int_pet.c
+++ b/src/char_sql/int_pet.c
@@ -1,53 +1,52 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "char.h"
+#include "../common/mmo.h"
#include "../common/malloc.h"
+#include "../common/socket.h"
#include "../common/strlib.h"
#include "../common/showmsg.h"
+#include "../common/utils.h"
+#include "../common/sql.h"
+#include "char.h"
+#include "inter.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
struct s_pet *pet_pt;
//---------------------------------------------------------
-int inter_pet_tosql(int pet_id, struct s_pet *p) {
+int inter_pet_tosql(int pet_id, struct s_pet* p)
+{
//`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`)
- char t_name[NAME_LENGTH*2];
-
- jstrescapecpy(t_name, p->name);
-
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
- if (pet_id == -1) //New pet.
- sprintf(tmp_sql,"INSERT INTO `%s` "
+ char esc_name[NAME_LENGTH*2+1];// escaped pet name
+
+ Sql_EscapeStringLen(sql_handle, esc_name, p->name, strnlen(p->name, NAME_LENGTH));
+ p->hungry = cap_value(p->hungry, 0, 100);
+ p->intimate = cap_value(p->intimate, 0, 1000);
+
+ if( pet_id == -1 )
+ {// New pet.
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` "
"(`class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) "
"VALUES ('%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
- pet_db, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id,
- p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate);
-
- else //Update pet.
- sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'",
- pet_db, p->class_, t_name, p->account_id, p->char_id, p->level, p->egg_id,
- p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate, p->pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- return 0;
- } else if (pet_id == -1) { //New pet inserted.
- if(mysql_field_count(&mysql_handle) == 0 &&
- mysql_insert_id(&mysql_handle) != 0) {
- p->pet_id = pet_id = (int)mysql_insert_id(&mysql_handle);
- } else {
- ShowError("inter_pet_tosql: Failed to retrieve new pet_id for '%s'. Pet creation aborted.\n", p->name);
+ pet_db, p->class_, esc_name, p->account_id, p->char_id, p->level, p->egg_id,
+ p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate) )
+ {
+ Sql_ShowDebug(sql_handle);
+ return 0;
+ }
+ p->pet_id = (int)Sql_LastInsertId(sql_handle);
+ }
+ else
+ {// Update pet.
+ if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'",
+ pet_db, p->class_, esc_name, p->account_id, p->char_id, p->level, p->egg_id,
+ p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate, p->pet_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
}
@@ -57,7 +56,10 @@ int inter_pet_tosql(int pet_id, struct s_pet *p) {
return 1;
}
#ifndef TXT_SQL_CONVERT
-int inter_pet_fromsql(int pet_id, struct s_pet *p){
+int inter_pet_fromsql(int pet_id, struct s_pet* p)
+{
+ char* data;
+ size_t len;
#ifdef NOISY
ShowInfo("Loading pet (%d)...\n",pet_id);
@@ -66,42 +68,35 @@ int inter_pet_fromsql(int pet_id, struct s_pet *p){
//`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`)
- sprintf(tmp_sql,"SELECT `pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate` FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate` FROM `%s` WHERE `pet_id`='%d'", pet_db, pet_id) )
+ {
+ Sql_ShowDebug(sql_handle);
return 0;
}
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
+ if( SQL_SUCCESS == Sql_NextRow(sql_handle) )
+ {
p->pet_id = pet_id;
- p->class_ = atoi(sql_row[1]);
- strncpy(p->name, sql_row[2], NAME_LENGTH);
- p->account_id = atoi(sql_row[3]);
- p->char_id = atoi(sql_row[4]);
- p->level = atoi(sql_row[5]);
- p->egg_id = atoi(sql_row[6]);
- p->equip = atoi(sql_row[7]);
- p->intimate = atoi(sql_row[8]);
- p->hungry = atoi(sql_row[9]);
- p->rename_flag = atoi(sql_row[10]);
- p->incuvate = atoi(sql_row[11]);
+ Sql_GetData(sql_handle, 1, &data, NULL); p->class_ = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, &len); memcpy(p->name, data, min(len, NAME_LENGTH));
+ Sql_GetData(sql_handle, 3, &data, NULL); p->account_id = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); p->char_id = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); p->level = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); p->egg_id = atoi(data);
+ Sql_GetData(sql_handle, 7, &data, NULL); p->equip = atoi(data);
+ Sql_GetData(sql_handle, 8, &data, NULL); p->intimate = atoi(data);
+ Sql_GetData(sql_handle, 9, &data, NULL); p->hungry = atoi(data);
+ Sql_GetData(sql_handle, 10, &data, NULL); p->rename_flag = atoi(data);
+ Sql_GetData(sql_handle, 11, &data, NULL); p->incuvate = atoi(data);
+
+ Sql_FreeResult(sql_handle);
+
+ p->hungry = cap_value(p->hungry, 0, 100);
+ p->intimate = cap_value(p->intimate, 0, 1000);
+
+ if( save_log )
+ ShowInfo("Pet loaded (%d - %s).\n", pet_id, p->name);
}
- if(p->hungry < 0)
- p->hungry = 0;
- else if(p->hungry > 100)
- p->hungry = 100;
- if(p->intimate < 0)
- p->intimate = 0;
- else if(p->intimate > 1000)
- p->intimate = 1000;
-
- mysql_free_result(sql_res);
-
- if (save_log)
- ShowInfo("Pet loaded (%d - %s).\n", pet_id, p->name);
return 0;
}
//----------------------------------------------
@@ -119,11 +114,8 @@ void inter_pet_sql_final(void){
int inter_pet_delete(int pet_id){
ShowInfo("delete pet request: %d...\n",pet_id);
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `pet_id`='%d'", pet_db, pet_id) )
+ Sql_ShowDebug(sql_handle);
return 0;
}
//------------------------------------------------------
diff --git a/src/char_sql/int_pet.h b/src/char_sql/int_pet.h
index 5c1955857..733468c77 100644
--- a/src/char_sql/int_pet.h
+++ b/src/char_sql/int_pet.h
@@ -4,6 +4,8 @@
#ifndef _INT_PET_SQL_H_
#define _INT_PET_SQL_H_
+struct s_pet;
+
int inter_pet_init(void);
void inter_pet_sql_final(void);
int inter_pet_save(void);
diff --git a/src/char_sql/int_storage.c b/src/char_sql/int_storage.c
index a52e5b530..b13f37200 100644
--- a/src/char_sql/int_storage.c
+++ b/src/char_sql/int_storage.c
@@ -1,17 +1,19 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-// original code from athena
-// SQL conversion by Jioh L. Jung
+#include "../common/mmo.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+#include "../common/socket.h"
+#include "../common/strlib.h" // StringBuf
+#include "../common/sql.h"
+#include "char.h"
+#include "inter.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
-#include "char.h"
-#include "itemdb.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
#define STORAGE_MEMINC 16
@@ -19,166 +21,130 @@
// reset by inter_config_read()
struct storage *storage_pt=NULL;
struct guild_storage *guild_storage_pt=NULL;
-
#endif //TXT_SQL_CONVERT
-// storage data -> DB conversion
-int storage_tosql(int account_id,struct storage *p){
- int i,j;
-// int eqcount=1;
-// int noteqcount=1;
- int count=0;
- struct itemtmp mapitem[MAX_STORAGE];
- for(i=0;i<MAX_STORAGE;i++){
- if(p->storage_[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->storage_[i].id;
- mapitem[count].nameid=p->storage_[i].nameid;
- mapitem[count].amount = p->storage_[i].amount;
- mapitem[count].equip = p->storage_[i].equip;
- mapitem[count].identify = p->storage_[i].identify;
- mapitem[count].refine = p->storage_[i].refine;
- mapitem[count].attribute = p->storage_[i].attribute;
- for(j=0; j<MAX_SLOTS; j++)
- mapitem[count].card[j] = p->storage_[i].card[j];
- count++;
- }
- }
- memitemdata_to_sql(mapitem, count, account_id,TABLE_STORAGE);
-
- //printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
+/// Save guild_storage data to sql
+int storage_tosql(int account_id,struct storage* p)
+{
+ memitemdata_to_sql(p->storage_, MAX_STORAGE, account_id, TABLE_STORAGE);
+ //ShowInfo ("storage save to DB - account: %d\n", account_id);
return 0;
}
-#ifndef TXT_SQL_CONVERT
-// DB -> storage data conversion
-int storage_fromsql(int account_id, struct storage *p){
- int i=0,j;
- char * str_p = tmp_sql;
+#ifndef TXT_SQL_CONVERT
+/// Load guild_storage data to mem
+int storage_fromsql(int account_id, struct storage* p)
+{
+ StringBuf buf;
+ struct item* item;
+ char* data;
+ int i;
+ int j;
- memset(p,0,sizeof(struct storage)); //clean up memory
+ memset(p, 0, sizeof(struct storage)); //clean up memory
p->storage_amount = 0;
p->account_id = account_id;
// storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
- str_p += sprintf(str_p,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`");
-
- for (j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
- str_p += sprintf(str_p," FROM `%s` WHERE `account_id`='%d' ORDER BY `nameid`", storage_db, account_id);
-
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
-
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res)) && i<MAX_STORAGE) { //start to fetch
- p->storage_[i].id= atoi(sql_row[0]);
- p->storage_[i].nameid= atoi(sql_row[1]);
- p->storage_[i].amount= atoi(sql_row[2]);
- p->storage_[i].equip= atoi(sql_row[3]);
- p->storage_[i].identify= atoi(sql_row[4]);
- p->storage_[i].refine= atoi(sql_row[5]);
- p->storage_[i].attribute= atoi(sql_row[6]);
- for (j=0; j<MAX_SLOTS; j++)
- p->storage_[i].card[j]= atoi(sql_row[7+j]);
- i++;
+ StringBuf_Init(&buf);
+ StringBuf_AppendStr(&buf, "SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`");
+ for( j = 0; j < MAX_SLOTS; ++j )
+ StringBuf_Printf(&buf, ",`card%d`", j);
+ StringBuf_Printf(&buf, " FROM `%s` WHERE `account_id`='%d' ORDER BY `nameid`", storage_db, account_id);
+
+ if( SQL_ERROR == Sql_Query(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+
+ StringBuf_Destroy(&buf);
+
+ for( i = 0; i < MAX_STORAGE && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ item = &p->storage_[i];
+ Sql_GetData(sql_handle, 0, &data, NULL); item->id = atoi(data);
+ Sql_GetData(sql_handle, 1, &data, NULL); item->nameid = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); item->amount = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); item->equip = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); item->identify = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); item->refine = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); item->attribute = atoi(data);
+ for( j = 0; j < MAX_SLOTS; ++j )
+ {
+ Sql_GetData(sql_handle, 7+j, &data, NULL); item->card[j] = atoi(data);
}
- p->storage_amount = i;
- mysql_free_result(sql_res);
}
+ p->storage_amount = i;
+ Sql_FreeResult(sql_handle);
- ShowInfo ("storage load complete from DB - id: %d (total: %d)\n", account_id, p->storage_amount);
+ ShowInfo("storage load complete from DB - id: %d (total: %d)\n", account_id, p->storage_amount);
return 1;
}
#endif //TXT_SQL_CONVERT
-// Save guild_storage data to sql
-int guild_storage_tosql(int guild_id, struct guild_storage *p){
- int i,j;
-// int eqcount=1;
-// int noteqcount=1;
- int count=0;
- struct itemtmp mapitem[MAX_GUILD_STORAGE];
- for(i=0;i<MAX_GUILD_STORAGE;i++){
- if(p->storage_[i].nameid>0){
- mapitem[count].flag=0;
- mapitem[count].id = p->storage_[i].id;
- mapitem[count].nameid=p->storage_[i].nameid;
- mapitem[count].amount = p->storage_[i].amount;
- mapitem[count].equip = p->storage_[i].equip;
- mapitem[count].identify = p->storage_[i].identify;
- mapitem[count].refine = p->storage_[i].refine;
- mapitem[count].attribute = p->storage_[i].attribute;
- for (j=0; j<MAX_SLOTS; j++)
- mapitem[count].card[j] = p->storage_[i].card[j];
- count++;
- }
- }
- memitemdata_to_sql(mapitem, count, guild_id,TABLE_GUILD_STORAGE);
-
- ShowInfo ("guild storage save to DB - id: %d (total: %d)\n", guild_id,i);
+/// Save guild_storage data to sql
+int guild_storage_tosql(int guild_id, struct guild_storage* p)
+{
+ memitemdata_to_sql(p->storage_, MAX_GUILD_STORAGE, guild_id, TABLE_GUILD_STORAGE);
+ ShowInfo ("guild storage save to DB - guild: %d\n", guild_id);
return 0;
}
+
#ifndef TXT_SQL_CONVERT
-// Load guild_storage data to mem
-int guild_storage_fromsql(int guild_id, struct guild_storage *p){
- int i=0,j;
- struct guild_storage *gs=guild_storage_pt;
- char * str_p = tmp_sql;
- p=gs;
-
- memset(p,0,sizeof(struct guild_storage)); //clean up memory
+/// Load guild_storage data to mem
+int guild_storage_fromsql(int guild_id, struct guild_storage* p)
+{
+ StringBuf buf;
+ struct item* item;
+ char* data;
+ int i;
+ int j;
+
+ memset(p, 0, sizeof(struct guild_storage)); //clean up memory
p->storage_amount = 0;
p->guild_id = guild_id;
// storage {`guild_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
- str_p += sprintf(str_p,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`");
-
- for (j=0; j<MAX_SLOTS; j++)
- str_p += sprintf(str_p, ", `card%d`", j);
-
- str_p += sprintf(str_p," FROM `%s` WHERE `guild_id`='%d' ORDER BY `nameid`", guild_storage_db, guild_id);
-
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
-
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res)) && i < MAX_GUILD_STORAGE) { //start to fetch
- p->storage_[i].id= atoi(sql_row[0]);
- p->storage_[i].nameid= atoi(sql_row[1]);
- p->storage_[i].amount= atoi(sql_row[2]);
- p->storage_[i].equip= atoi(sql_row[3]);
- p->storage_[i].identify= atoi(sql_row[4]);
- p->storage_[i].refine= atoi(sql_row[5]);
- p->storage_[i].attribute= atoi(sql_row[6]);
- for (j=0; j<MAX_SLOTS; j++)
- p->storage_[i].card[j] = atoi(sql_row[7+j]);
- i++;
+ StringBuf_Init(&buf);
+ StringBuf_AppendStr(&buf, "SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`");
+ for( j = 0; j < MAX_SLOTS; ++j )
+ StringBuf_Printf(&buf, ",`card%d`", j);
+ StringBuf_Printf(&buf, " FROM `%s` WHERE `guild_id`='%d' ORDER BY `nameid`", guild_storage_db, guild_id);
+
+ if( SQL_ERROR == Sql_Query(sql_handle, StringBuf_Value(&buf)) )
+ Sql_ShowDebug(sql_handle);
+
+ StringBuf_Destroy(&buf);
+
+ for( i = 0; i < MAX_GUILD_STORAGE && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ item = &p->storage_[i];
+ Sql_GetData(sql_handle, 0, &data, NULL); item->id = atoi(data);
+ Sql_GetData(sql_handle, 1, &data, NULL); item->nameid = atoi(data);
+ Sql_GetData(sql_handle, 2, &data, NULL); item->amount = atoi(data);
+ Sql_GetData(sql_handle, 3, &data, NULL); item->equip = atoi(data);
+ Sql_GetData(sql_handle, 4, &data, NULL); item->identify = atoi(data);
+ Sql_GetData(sql_handle, 5, &data, NULL); item->refine = atoi(data);
+ Sql_GetData(sql_handle, 6, &data, NULL); item->attribute = atoi(data);
+ for( j = 0; j < MAX_SLOTS; ++j )
+ {
+ Sql_GetData(sql_handle, 7+j, &data, NULL); item->card[j] = atoi(data);
}
- p->storage_amount = i;
- mysql_free_result(sql_res);
}
- ShowInfo ("guild storage load complete from DB - id: %d (total: %d)\n", guild_id, p->storage_amount);
+ p->storage_amount = i;
+ Sql_FreeResult(sql_handle);
+
+ ShowInfo("guild storage load complete from DB - id: %d (total: %d)\n", guild_id, p->storage_amount);
return 0;
}
//---------------------------------------------------------
// storage data initialize
-int inter_storage_sql_init(void){
+int inter_storage_sql_init(void)
+{
//memory alloc
ShowDebug("interserver storage memory initialize....(%d byte)\n",sizeof(struct storage));
storage_pt = (struct storage*)aCalloc(sizeof(struct storage), 1);
guild_storage_pt = (struct guild_storage*)aCalloc(sizeof(struct guild_storage), 1);
-// memset(storage_pt,0,sizeof(struct storage)); //Calloc sets stuff to 0 already. [Skotlex]
-// memset(guild_storage_pt,0,sizeof(struct guild_storage));
return 1;
}
@@ -192,20 +158,14 @@ void inter_storage_sql_final(void)
// q?f[^?
int inter_storage_delete(int account_id)
{
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id`='%d'",storage_db, account_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `account_id`='%d'", storage_db, account_id) )
+ Sql_ShowDebug(sql_handle);
return 0;
}
int inter_guild_storage_delete(int guild_id)
{
- sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `guild_id`='%d'", guild_storage_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
return 0;
}
@@ -213,7 +173,8 @@ int inter_guild_storage_delete(int guild_id)
// packet from map server
// recive packet about storage data
-int mapif_load_storage(int fd,int account_id){
+int mapif_load_storage(int fd,int account_id)
+{
//load from DB
WFIFOHEAD(fd, sizeof(struct storage)+8);
storage_fromsql(account_id, storage_pt);
@@ -225,7 +186,8 @@ int mapif_load_storage(int fd,int account_id){
return 0;
}
// send ack to map server which is "storage data save ok."
-int mapif_save_storage_ack(int fd,int account_id){
+int mapif_save_storage_ack(int fd,int account_id)
+{
WFIFOHEAD(fd, 7);
WFIFOW(fd,0)=0x3811;
WFIFOL(fd,2)=account_id;
@@ -236,40 +198,29 @@ int mapif_save_storage_ack(int fd,int account_id){
int mapif_load_guild_storage(int fd,int account_id,int guild_id)
{
- int guild_exist=1;
- WFIFOHEAD(fd, sizeof(struct guild_storage)+12);
- WFIFOW(fd,0)=0x3818;
-
-#if 0 // innodb guilds should render this check unnecessary [Aru]
- // Check if guild exists, I may write a function for this later, coz I use it several times.
- //printf("- Check if guild %d exists\n",g->guild_id);
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- guild_exist = atoi (sql_row[0]);
- //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
- }
- mysql_free_result(sql_res) ; //resource free
-#endif
- if(guild_exist==1) {
- guild_storage_fromsql(guild_id,guild_storage_pt);
- WFIFOW(fd,2)=sizeof(struct guild_storage)+12;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=guild_id;
- memcpy(WFIFOP(fd,12),guild_storage_pt,sizeof(struct guild_storage));
- }
- else {
- WFIFOW(fd,2)=12;
- WFIFOL(fd,4)=account_id;
- WFIFOL(fd,8)=0;
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id` FROM `%s` WHERE `guild_id`='%d'", guild_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
+ else if( Sql_NumRows(sql_handle) > 0 )
+ {// guild exists
+ guild_storage_fromsql(guild_id, guild_storage_pt);
+
+ WFIFOHEAD(fd, sizeof(struct guild_storage)+12);
+ WFIFOW(fd,0) = 0x3818;
+ WFIFOW(fd,2) = sizeof(struct guild_storage)+12;
+ WFIFOL(fd,4) = account_id;
+ WFIFOL(fd,8) = guild_id;
+ memcpy(WFIFOP(fd,12), guild_storage_pt, sizeof(struct guild_storage));
+ WFIFOSET(fd, WFIFOW(fd,2));
+ return 0;
}
- WFIFOSET(fd,WFIFOW(fd,2));
-
+ // guild does not exist
+ Sql_FreeResult(sql_handle);
+ WFIFOHEAD(fd, 12);
+ WFIFOW(fd,0) = 0x3818;
+ WFIFOW(fd,2) = 12;
+ WFIFOL(fd,4) = account_id;
+ WFIFOL(fd,8) = 0;
+ WFIFOSET(fd, 12);
return 0;
}
int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail)
@@ -287,13 +238,15 @@ int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail)
// packet from map server
// recive request about storage data
-int mapif_parse_LoadStorage(int fd){
+int mapif_parse_LoadStorage(int fd)
+{
RFIFOHEAD(fd);
mapif_load_storage(fd,RFIFOL(fd,2));
return 0;
}
// storage data recive and save
-int mapif_parse_SaveStorage(int fd){
+int mapif_parse_SaveStorage(int fd)
+{
int account_id;
int len;
RFIFOHEAD(fd);
@@ -318,45 +271,38 @@ int mapif_parse_LoadGuildStorage(int fd)
int mapif_parse_SaveGuildStorage(int fd)
{
- int guild_exist=1;
int guild_id;
int len;
+
RFIFOHEAD(fd);
- guild_id=RFIFOL(fd,8);
- len=RFIFOW(fd,2);
- if(sizeof(struct guild_storage)!=len-12){
- ShowError("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
+ guild_id = RFIFOL(fd,8);
+ len = RFIFOW(fd,2);
+
+ if( sizeof(struct guild_storage) != len - 12 )
+ {
+ ShowError("inter storage: data size error %d != %d\n", sizeof(struct guild_storage), len - 12);
}
- else {
-#if 0 // Again, innodb key checks make the check pointless
- // Check if guild exists, I may write a function for this later, coz I use it several times.
- //printf("- Check if guild %d exists\n",g->guild_id);
- sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle) ;
- if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
- sql_row = mysql_fetch_row(sql_res);
- guild_exist = atoi (sql_row[0]);
- //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
+ else
+ {
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `guild_id` FROM `%s` WHERE `guild_id`='%d'", guild_db, guild_id) )
+ Sql_ShowDebug(sql_handle);
+ else if( Sql_NumRows(sql_handle) > 0 )
+ {// guild exists
+ Sql_FreeResult(sql_handle);
+ memcpy(guild_storage_pt, RFIFOP(fd,12), sizeof(struct guild_storage));
+ guild_storage_tosql(guild_id, guild_storage_pt);
+ mapif_save_guild_storage_ack(fd, RFIFOL(fd,4), guild_id, 0);
+ return 0;
}
- mysql_free_result(sql_res) ; //resource free
-#endif
- if(guild_exist==1) {
- memcpy(guild_storage_pt,RFIFOP(fd,12),sizeof(struct guild_storage));
- guild_storage_tosql(guild_id,guild_storage_pt);
- mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0);
- }
- else
- mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1);
+ Sql_FreeResult(sql_handle);
}
+ mapif_save_guild_storage_ack(fd, RFIFOL(fd,4), guild_id, 1);
return 0;
}
-int inter_storage_parse_frommap(int fd){
+int inter_storage_parse_frommap(int fd)
+{
RFIFOHEAD(fd);
switch(RFIFOW(fd,0)){
case 0x3010: mapif_parse_LoadStorage(fd); break;
diff --git a/src/char_sql/int_storage.h b/src/char_sql/int_storage.h
index dd71ef9ed..7075e36ad 100644
--- a/src/char_sql/int_storage.h
+++ b/src/char_sql/int_storage.h
@@ -4,6 +4,9 @@
#ifndef _INT_STORAGE_SQL_H_
#define _INT_STORAGE_SQL_H_
+struct storage;
+struct guild_storage;
+
int inter_storage_sql_init(void);
void inter_storage_sql_final(void);
int inter_storage_delete(int account_id);
diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c
index fbff7b7fb..201605bd6 100644
--- a/src/char_sql/inter.c
+++ b/src/char_sql/inter.c
@@ -1,34 +1,31 @@
// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "char.h"
+#include "../common/mmo.h"
+#include "../common/db.h"
#include "../common/malloc.h"
#include "../common/strlib.h"
#include "../common/showmsg.h"
+#include "../common/socket.h"
+#include "../common/timer.h"
+#include "char.h"
#include "inter.h"
#include "int_party.h"
#include "int_guild.h"
#include "int_storage.h"
#include "int_pet.h"
-#include "int_homun.h" //albator
+#include "int_homun.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
#define WISDATA_TTL (60*1000) // Wisデータの生存時間(60秒)
#define WISDELLIST_MAX 256 // Wisデータ削除リストの要素数
-MYSQL mysql_handle;
-MYSQL_RES* sql_res ;
-MYSQL_ROW sql_row ;
-int sql_fields, sql_cnt;
-char tmp_sql[65535];
-
-MYSQL lmysql_handle;
-MYSQL_RES* lsql_res ;
-MYSQL_ROW lsql_row ;
+Sql* sql_handle = NULL;
+Sql* lsql_handle = NULL;
int char_server_port = 3306;
char char_server_ip[32] = "127.0.0.1";
@@ -89,50 +86,59 @@ int inter_sql_test (void);
#endif //TXT_SQL_CONVERT
//--------------------------------------------------------
// Save registry to sql
-int inter_accreg_tosql(int account_id, int char_id, struct accreg *reg, int type){
+int inter_accreg_tosql(int account_id, int char_id, struct accreg* reg, int type)
+{
+ struct global_reg* r;
+ SqlStmt* stmt;
+ int i;
- int j;
- char temp_str[64]; //Needs be twice the source to ensure it fits [Skotlex]
- char temp_str2[512];
- if (account_id<=0) return 0;
- reg->account_id=account_id;
+ if( account_id <= 0 )
+ return 0;
+ reg->account_id = account_id;
reg->char_id = char_id;
- switch (type) {
- case 3: //Char Reg
- //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id);
- break;
- case 2: //Account Reg
- //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, account_id);
- break;
- case 1: //Account2 Reg
- ShowError("inter_accreg_tosql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
- return 0;
- default:
- ShowError("inter_accreg_tosql: Invalid type %d\n", type);
- return 0;
-
- }
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
+ switch( type )
+ {
+ case 3: //Char Reg
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'", reg_db, char_id) )
+ Sql_ShowDebug(sql_handle);
+ account_id = 0;
+ break;
+ case 2: //Account Reg
+ if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'", reg_db, account_id) )
+ Sql_ShowDebug(sql_handle);
+ char_id = 0;
+ break;
+ case 1: //Account2 Reg
+ ShowError("inter_accreg_tosql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
+ return 0;
+ default:
+ ShowError("inter_accreg_tosql: Invalid type %d\n", type);
+ return 0;
}
- if (reg->reg_num<=0) return 0;
-
- for(j=0;j<reg->reg_num;j++){
- if(reg->reg[j].str != NULL){
- sprintf(tmp_sql,"INSERT INTO `%s` (`type`, `account_id`, `char_id`, `str`, `value`) VALUES ('%d','%d','%d','%s','%s')",
- reg_db, type, type!=3?reg->account_id:0, type==3?reg->char_id:0,
- jstrescapecpy(temp_str,reg->reg[j].str), jstrescapecpy(temp_str2,reg->reg[j].value));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( reg->reg_num <= 0 )
+ return 0;
+
+ stmt = SqlStmt_Malloc(sql_handle);
+ if( SQL_ERROR == SqlStmt_Prepare(stmt, "INSERT INTO `%s` (`type`, `account_id`, `char_id`, `str`, `value`) VALUES ('%d','%d','%d',?,?)", reg_db, type, account_id, char_id) )
+ SqlStmt_ShowDebug(stmt);
+ for( i = 0; i < reg->reg_num; ++i )
+ {
+ r = &reg->reg[i];
+ if( r->str[0] != '\0' && r->value != '\0' )
+ {
+ // str
+ SqlStmt_BindParam(stmt, 0, SQLDT_STRING, r->str, strnlen(r->str, sizeof(r->str)));
+ // value
+ SqlStmt_BindParam(stmt, 1, SQLDT_STRING, r->value, strnlen(r->value, sizeof(r->value)));
+
+ if( SQL_ERROR == SqlStmt_Execute(stmt) )
+ SqlStmt_ShowDebug(stmt);
}
}
+ SqlStmt_Free(stmt);
return 1;
}
#ifndef TXT_SQL_CONVERT
@@ -140,38 +146,48 @@ int inter_accreg_tosql(int account_id, int char_id, struct accreg *reg, int type
// Load account_reg from sql (type=2)
int inter_accreg_fromsql(int account_id,int char_id, struct accreg *reg, int type)
{
- int j=0;
- if (reg==NULL) return 0;
+ struct global_reg* r;
+ char* data;
+ size_t len;
+ int i;
+
+ if( reg == NULL)
+ return 0;
+
memset(reg, 0, sizeof(struct accreg));
- reg->account_id=account_id;
- reg->char_id=char_id;
+ reg->account_id = account_id;
+ reg->char_id = char_id;
//`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`)
- switch (type) {
+ switch( type )
+ {
case 3: //char reg
- sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, reg->char_id);
- break;
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'", reg_db, char_id) )
+ Sql_ShowDebug(sql_handle);
+ break;
case 2: //account reg
- sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, reg->account_id);
- break;
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'", reg_db, account_id) )
+ Sql_ShowDebug(sql_handle);
+ break;
case 1: //account2 reg
ShowError("inter_accreg_fromsql: Char server shouldn't handle type 1 registry values (##). That is the login server's work!\n");
return 0;
+ default:
+ ShowError("inter_accreg_fromsql: Invalid type %d\n", type);
+ return 0;
}
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
-
- if (sql_res) {
- for(j=0;(sql_row = mysql_fetch_row(sql_res));j++){
- strcpy(reg->reg[j].str, sql_row[0]);
- strcpy(reg->reg[j].value, sql_row[1]);
- }
- mysql_free_result(sql_res);
+ for( i = 0; i < MAX_REG_NUM && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
+ {
+ r = &reg->reg[i];
+ // str
+ Sql_GetData(sql_handle, 0, &data, &len);
+ memcpy(r->str, data, min(len, sizeof(r->str)));
+ // value
+ Sql_GetData(sql_handle, 1, &data, &len);
+ memcpy(r->value, data, min(len, sizeof(r->value)));
}
- reg->reg_num=j;
+ reg->reg_num = i;
+ Sql_FreeResult(sql_handle);
return 1;
}
@@ -277,18 +293,17 @@ static int inter_config_read(const char* cfgName)
int inter_log(char* fmt, ...)
{
char str[255];
- char temp_str[510]; //Needs be twice as long as str[] //Skotlex
+ char esc_str[sizeof(str)*2+1];// escaped str
va_list ap;
+
va_start(ap,fmt);
+ vsnprintf(str, sizeof(str), fmt, ap);
+ va_end(ap);
- vsprintf(str,fmt,ap);
- sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `log`) VALUES (NOW(), '%s')",interlog_db, jstrescapecpy(temp_str,str));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ Sql_EscapeStringLen(sql_handle, esc_str, str, strnlen(str, sizeof(str)));
+ if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`time`, `log`) VALUES (NOW(), '%s')", interlog_db, esc_str) )
+ Sql_ShowDebug(sql_handle);
- va_end(ap);
return 0;
}
@@ -298,30 +313,23 @@ int inter_log(char* fmt, ...)
int inter_sql_ping(int tid, unsigned int tick, int id, int data)
{
ShowInfo("Pinging SQL server to keep connection alive...\n");
- mysql_ping(&mysql_handle);
- if(char_gm_read)
- mysql_ping(&lmysql_handle);
+ Sql_Ping(sql_handle);
+ if( char_gm_read )
+ Sql_Ping(lsql_handle);
return 0;
}
int sql_ping_init(void)
{
- int connection_timeout, connection_ping_interval;
+ uint32 connection_timeout, connection_ping_interval;
// set a default value first
connection_timeout = 28800; // 8 hours
// ask the mysql server for the timeout value
- if (!mysql_query(&mysql_handle, "SHOW VARIABLES LIKE 'wait_timeout'")
- && (sql_res = mysql_store_result(&mysql_handle)) != NULL) {
- sql_row = mysql_fetch_row(sql_res);
- if (sql_row)
- connection_timeout = atoi(sql_row[1]);
- if (connection_timeout < 60)
- connection_timeout = 60;
- mysql_free_result(sql_res);
- }
+ if( SQL_SUCCESS == Sql_GetTimeout(sql_handle, &connection_timeout) && connection_timeout < 60 )
+ connection_timeout = 60;
// establish keepalive
connection_ping_interval = connection_timeout - 30; // 30-second reserve
@@ -342,13 +350,13 @@ int inter_init_sql(const char *file)
inter_config_read(file);
//DB connection initialized
- mysql_init(&mysql_handle);
+ sql_handle = Sql_Malloc();
ShowInfo("Connect Character DB server.... (Character Server)\n");
- if(!mysql_real_connect(&mysql_handle, char_server_ip, char_server_id, char_server_pw,
- char_server_db ,char_server_port, (char *)NULL, 0)) {
- //pointer check
- ShowFatalError("%s\n",mysql_error(&mysql_handle));
- exit(1);
+ if( SQL_ERROR == Sql_Connect(sql_handle, char_server_id, char_server_pw, char_server_ip, (uint16)char_server_port, char_server_db) )
+ {
+ Sql_ShowDebug(sql_handle);
+ Sql_Free(sql_handle);
+ exit(1);
}
#ifndef TXT_SQL_CONVERT
else if (inter_sql_test()) {
@@ -356,30 +364,27 @@ int inter_init_sql(const char *file)
}
if(char_gm_read) {
- mysql_init(&lmysql_handle);
+ lsql_handle = Sql_Malloc();
ShowInfo("Connect Character DB server.... (login server)\n");
- if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw,
- login_server_db ,login_server_port, (char *)NULL, 0)) {
- //pointer check
- ShowFatalError("%s\n",mysql_error(&lmysql_handle));
- exit(1);
- }else {
+ if( SQL_ERROR == Sql_Connect(lsql_handle, login_server_id, login_server_pw, login_server_ip, (uint16)login_server_port, login_server_db) )
+ {
+ Sql_ShowDebug(lsql_handle);
+ Sql_Free(lsql_handle);
+ Sql_Free(sql_handle);
+ exit(1);
+ }
+ else
+ {
ShowStatus ("Connect Success! (Login Server)\n");
}
}
#endif //TXT_SQL_CONVERT
- if(strlen(default_codepage) > 0 ) {
- sprintf( tmp_sql, "SET NAMES %s", default_codepage );
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( *default_codepage ) {
+ if( SQL_ERROR == Sql_SetEncoding(sql_handle, default_codepage) )
+ Sql_ShowDebug(sql_handle);
#ifndef TXT_SQL_CONVERT
- if(char_gm_read)
- if (mysql_query(&lmysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&lmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
+ if( char_gm_read && SQL_ERROR == Sql_SetEncoding(lsql_handle, default_codepage) )
+ Sql_ShowDebug(lsql_handle);
#endif //TXT_SQL_CONVERT
}
@@ -405,32 +410,30 @@ int inter_sql_test (void)
"fame", // version 1491
};
char buf[1024] = "";
+ char* p;
+ size_t len;
int i;
- sprintf(tmp_sql, "EXPLAIN `%s`",char_db);
- if (mysql_query(&mysql_handle, tmp_sql)) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
- // store DB fields
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res))) {
- strcat (buf, sql_row[0]);
- strcat (buf, " ");
- }
- }
+ if( SQL_ERROR == Sql_GetColumnNames(sql_handle, char_db, buf, sizeof(buf), '\n') )
+ Sql_ShowDebug(sql_handle);
// check DB strings
- for (i = 0; i < (int)(sizeof(fields) / sizeof(fields[0])); i++) {
- if(!strstr(buf, fields[i])) {
+ for( i = 0; i < ARRAYLENGTH(fields); ++i )
+ {
+ len = strlen(fields[i]);
+ p = strstr(buf, fields[i]);
+ while( p != NULL && p[len] != '\n' )
+ p = strstr(p, fields[i]);
+ if( p == NULL )
+ {
ShowSQL ("Field `%s` not be found in `%s`. Consider updating your database!\n", fields[i], char_db);
+ if( lsql_handle )
+ Sql_Free(lsql_handle);
+ Sql_Free(sql_handle);
exit(1);
}
}
- mysql_free_result(sql_res);
-
return 1;
}
@@ -636,7 +639,11 @@ int mapif_parse_WisRequest(int fd)
{
struct WisData* wd;
static int wisid = 0;
- char name[NAME_LENGTH], t_name[NAME_LENGTH*2]; //Needs space to allocate names with escaped chars [Skotlex]
+ char name[NAME_LENGTH];
+ char esc_name[NAME_LENGTH*2+1];// escaped name
+ char* data;
+ size_t len;
+
if ( fd <= 0 ) {return 0;} // check if we have a valid fd
@@ -649,35 +656,37 @@ int mapif_parse_WisRequest(int fd)
}
memcpy(name, RFIFOP(fd,28), NAME_LENGTH); //Received name may be too large and not contain \0! [Skotlex]
name[NAME_LENGTH-1]= '\0';
-
- sprintf (tmp_sql, "SELECT `name` FROM `%s` WHERE `name`='%s'",
- char_db, jstrescapecpy(t_name, name));
- if(mysql_query(&mysql_handle, tmp_sql) ) {
- ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- sql_res = mysql_store_result(&mysql_handle);
+
+ Sql_EscapeStringLen(sql_handle, esc_name, name, strnlen(name, NAME_LENGTH));
+ if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `name` FROM `%s` WHERE `name`='%s'", char_db, esc_name) )
+ Sql_ShowDebug(sql_handle);
// search if character exists before to ask all map-servers
- if (!(sql_row = mysql_fetch_row(sql_res))) {
+ if( SQL_SUCCESS != Sql_NextRow(sql_handle) )
+ {
unsigned char buf[27];
WBUFW(buf, 0) = 0x3802;
memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), NAME_LENGTH);
WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
mapif_send(fd, buf, 27);
- // Character exists. So, ask all map-servers
- } else {
+ }
+ else
+ {// Character exists. So, ask all map-servers
// to be sure of the correct name, rewrite it
+ Sql_GetData(sql_handle, 0, &data, &len);
memset(name, 0, NAME_LENGTH);
- strncpy(name, sql_row[0], NAME_LENGTH);
+ memcpy(name, data, min(len, NAME_LENGTH));
// if source is destination, don't ask other servers.
- if (strcmp((char*)RFIFOP(fd,4),name) == 0) {
- unsigned char buf[27];
+ if( strncmp((const char*)RFIFOP(fd,4), name, NAME_LENGTH) == 0 )
+ {
+ uint8 buf[27];
WBUFW(buf, 0) = 0x3802;
memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), NAME_LENGTH);
WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target
mapif_send(fd, buf, 27);
- } else {
+ }
+ else
+ {
CREATE(wd, struct WisData, 1);
@@ -695,12 +704,8 @@ int mapif_parse_WisRequest(int fd)
mapif_wis_message(wd);
}
}
-
- //Freeing ... O.o
- if(sql_res){
- mysql_free_result(sql_res);
- }
-
+
+ Sql_FreeResult(sql_handle);
return 0;
}
diff --git a/src/char_sql/inter.h b/src/char_sql/inter.h
index 98b0fc49d..c79290c80 100644
--- a/src/char_sql/inter.h
+++ b/src/char_sql/inter.h
@@ -4,9 +4,8 @@
#ifndef _INTER_SQL_H_
#define _INTER_SQL_H_
-#ifndef _CBASETYPES_H_
-#include "../common/cbasetypes.h"
-#endif
+struct accreg;
+#include "../common/sql.h"
int inter_init_sql(const char *file);
void inter_final(void);
@@ -25,21 +24,8 @@ int inter_log(char *fmt,...);
extern unsigned int party_share_level;
extern char inter_log_filename[1024];
-#ifdef WIN32
-#include <winsock2.h>
-#endif
-//add include for DBMS(mysql)
-#include <mysql.h>
-
-extern MYSQL mysql_handle;
-extern char tmp_sql[65535];
-extern MYSQL_RES* sql_res ;
-extern MYSQL_ROW sql_row ;
-extern int sql_cnt;
-
-extern MYSQL lmysql_handle;
-extern MYSQL_RES* lsql_res ;
-extern MYSQL_ROW lsql_row ;
+extern Sql* sql_handle;
+extern Sql* lsql_handle;
extern int char_server_port;
extern char char_server_ip[32];
diff --git a/src/char_sql/itemdb.c b/src/char_sql/itemdb.c
deleted file mode 100644
index b03d76bfe..000000000
--- a/src/char_sql/itemdb.c
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "itemdb.h"
-#include "db.h"
-#include "inter.h"
-#include "char.h"
-#include "utils.h"
-#include "../common/malloc.h"
-#include "../common/showmsg.h"
-
-#define MAX_RANDITEM 2000
-
-// ** ITEMDB_OVERRIDE_NAME_VERBOSE **
-// 定義すると、itemdb.txtとgrfで名前が異なる場合、表示します.
-//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1
-
-char item_db_db[256]="item_db"; // added to specify item_db sql table [Valaris]
-char item_db2_db[256]="item_db2";
-
-static struct dbt* item_db;
-
-static void* create_item(DBKey key, va_list args) {
- struct item_data *id;
- int nameid = key.i;
- CREATE(id, struct item_data, 1);
- id->nameid = nameid;
- id->type = IT_ETC;
- return id;
-}
-/*==========================================
- * DBの検索
- *------------------------------------------*/
-struct item_data* itemdb_search(int nameid)
-{
- return idb_ensure(item_db,nameid,create_item);
-}
-
-/*==========================================
- *
- *------------------------------------------*/
-int itemdb_isequip(int nameid)
-{
- int type=itemdb_type(nameid);
- if(type==IT_HEALING || type==IT_USABLE || type==IT_ETC || type==IT_CARD || type==IT_AMMO)
- return 0;
- return 1;
-}
-/*==========================================
- *
- *------------------------------------------*/
-int itemdb_isequip2(struct item_data *data)
-{
- if(data) {
- int type=data->type;
- if(type==IT_HEALING || type==IT_USABLE || type==IT_ETC || type==IT_CARD || type==IT_AMMO)
- return 0;
- else
- return 1;
- }
- return 0;
-}
-
-
-
-/*==========================================
- * アイテムデータベースの読み込み
- *------------------------------------------*/
-static int itemdb_readdb(void)
-{
- FILE *fp;
- char line[1024];
- int ln=0,lines=0;
- int nameid,j;
- char *str[32],*p,*np;
- struct item_data *id;
- int i=0;
- char *filename[]={ "item_db.txt","item_db2.txt" };
-
- for(i=0;i<2;i++){
- sprintf(line, "%s/%s", db_path, filename[i]);
- fp=fopen(line,"r");
- if(fp==NULL){
- if(i>0)
- continue;
- ShowFatalError("can't read %s\n",line);
- exit(1);
- }
-
- lines=0;
- while(fgets(line, sizeof(line), fp))
- {
- lines++;
- if(line[0]=='/' && line[1]=='/')
- continue;
- memset(str,0,sizeof(str));
- for(j=0,np=p=line;j<4 && p;j++){
- str[j]=p;
- p=strchr(p,',');
- if(p){ *p++=0; np=p; }
- }
- if(str[0]==NULL)
- continue;
-
- nameid=atoi(str[0]);
- if(nameid<=0)
- continue;
- if (j < 4)
- { //Crash-fix on broken item lines. [Skotlex]
- ShowWarning("Reading %s: Insufficient fields for item with id %d, skipping.\n", filename[i], nameid);
- continue;
- }
- ln++;
-
- //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Job Upper,Gender,Loc,wLV,eLV,refineable,View
- id=itemdb_search(nameid);
- strncpy(id->name, str[1], ITEM_NAME_LENGTH-1);
- strncpy(id->jname, str[2], ITEM_NAME_LENGTH-1);
- id->type=atoi(str[3]);
- if (id->type == IT_DELAYCONSUME)
- id->type = IT_USABLE;
- }
- fclose(fp);
- if (ln > 0) {
- ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n",ln,filename[i]);
- }
- ln=0; // reset to 0
- }
- return 0;
-}
-
-static int itemdb_read_sqldb(void) // sql item_db read, shortened version of map-server item_db read [Valaris]
-{
- unsigned short nameid;
- struct item_data *id;
- char *item_db_name[] = { item_db_db, item_db2_db };
- long unsigned int ln = 0;
- int i;
-
- // ----------
-
- for (i = 0; i < 2; i++) {
- sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_name[i]);
-
- // Execute the query; if the query execution succeeded...
- if (mysql_query(&mysql_handle, tmp_sql) == 0) {
- sql_res = mysql_store_result(&mysql_handle);
-
- // If the storage of the query result succeeded...
- if (sql_res) {
- // Parse each row in the query result into sql_row
- while ((sql_row = mysql_fetch_row(sql_res)))
- { /*Table structure is:
- 00 id
- 01 name_english
- 02 name_japanese
- 03 type
- ...
- */
- nameid = atoi(sql_row[0]);
-
- // If the identifier is not within the valid range, process the next row
- if (nameid == 0)
- continue;
-
- ln++;
-
- // ----------
- id=itemdb_search(nameid);
-
- strncpy(id->name, sql_row[1], ITEM_NAME_LENGTH-1);
- strncpy(id->jname, sql_row[2], ITEM_NAME_LENGTH-1);
-
- id->type = atoi(sql_row[3]);
- if (id->type == IT_DELAYCONSUME)
- id->type = IT_USABLE;
- }
- ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, item_db_name[i]);
- ln = 0;
- } else {
- ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
-
- // Free the query result
- mysql_free_result(sql_res);
- } else {
- ShowSQL("DB error (%s) - %s\n",item_db_name[i], mysql_error(&mysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
- }
- }
-
- return 0;
-}
-
-/*==========================================
- *
- *------------------------------------------*/
-void do_final_itemdb(void)
-{
- if(item_db){
- item_db->destroy(item_db,NULL);
- item_db=NULL;
- }
-}
-int do_init_itemdb(void)
-{
- item_db = db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
-
- if (db_use_sqldbs) // it db_use_sqldbs in inter config are yes, will read from item_db for char server display [Valaris]
- itemdb_read_sqldb();
- else
- itemdb_readdb();
- return 0;
-}
diff --git a/src/char_sql/itemdb.h b/src/char_sql/itemdb.h
deleted file mode 100644
index 4fbd59f96..000000000
--- a/src/char_sql/itemdb.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
-// For more information, see LICENCE in the main folder
-
-#ifndef _ITEMDB_H_
-#define _ITEMDB_H_
-
-#include "mmo.h"
-
-//FIXME: Maybe it would be better to move this enum to mmo.h,
-//instead of having it twice on the map server and here? [Skotlex]
-enum {
- IT_HEALING = 0,
- IT_UNKNOWN, //1
- IT_USABLE, //2
- IT_ETC, //3
- IT_WEAPON, //4
- IT_ARMOR, //5
- IT_CARD, //6
- IT_PETEGG, //7
- IT_PETARMOR,//8
- IT_UNKNOWN2,//9
- IT_AMMO, //10
- IT_DELAYCONSUME,//11
- IT_MAX
-} item_types;
-
-struct item_data {
- int nameid;
- char name[ITEM_NAME_LENGTH],jname[ITEM_NAME_LENGTH];
- int type;
-};
-
-extern char item_db_db[256];
-extern char item_db2_db[256];
-struct item_data* itemdb_search(int nameid);
-#define itemdb_type(n) itemdb_search(n)->type
-
-int itemdb_isequip(int);
-int itemdb_isequip2(struct item_data *);
-
-void do_final_itemdb(void);
-int do_init_itemdb(void);
-
-#endif /* _ITEMDB_H_ */