summaryrefslogtreecommitdiff
path: root/src/map/mapreg_sql.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/mapreg_sql.c')
-rw-r--r--src/map/mapreg_sql.c311
1 files changed, 160 insertions, 151 deletions
diff --git a/src/map/mapreg_sql.c b/src/map/mapreg_sql.c
index 4fa943b2e..7782f7f02 100644
--- a/src/map/mapreg_sql.c
+++ b/src/map/mapreg_sql.c
@@ -13,8 +13,8 @@
#include <stdlib.h>
#include <string.h>
-static DBMap *mapreg_db = NULL; // int var_id -> int value
-static DBMap *mapregstr_db = NULL; // int var_id -> char* value
+static DBMap* mapreg_db = NULL; // int var_id -> int value
+static DBMap* mapregstr_db = NULL; // int var_id -> char* value
static char mapreg_table[32] = "mapreg";
static bool mapreg_dirty = false;
@@ -24,203 +24,212 @@ static bool mapreg_dirty = false;
/// Looks up the value of an integer variable using its uid.
int mapreg_readreg(int uid)
{
- return idb_iget(mapreg_db, uid);
+ return idb_iget(mapreg_db, uid);
}
/// Looks up the value of a string variable using its uid.
-char *mapreg_readregstr(int uid)
+char* mapreg_readregstr(int uid)
{
- return idb_get(mapregstr_db, uid);
+ return idb_get(mapregstr_db, uid);
}
/// Modifies the value of an integer variable.
bool mapreg_setreg(int uid, int val)
{
- int num = (uid & 0x00ffffff);
- int i = (uid & 0xff000000) >> 24;
- const char *name = get_str(num);
-
- if (val != 0) {
- if (idb_iput(mapreg_db,uid,val))
- mapreg_dirty = true; // already exists, delay write
- else if (name[1] != '@') {
- // write new variable to database
- char tmp_str[32*2+1];
- Sql_EscapeStringLen(mmysql_handle, tmp_str, name, strnlen(name, 32));
- if (SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `%s`(`varname`,`index`,`value`) VALUES ('%s','%d','%d')", mapreg_table, tmp_str, i, val))
- Sql_ShowDebug(mmysql_handle);
- }
- } else { // val == 0
- idb_remove(mapreg_db,uid);
-
- if (name[1] != '@') {
- // Remove from database because it is unused.
- if (SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `%s` WHERE `varname`='%s' AND `index`='%d'", mapreg_table, name, i))
- Sql_ShowDebug(mmysql_handle);
- }
- }
-
- return true;
+ int num = (uid & 0x00ffffff);
+ int i = (uid & 0xff000000) >> 24;
+ const char* name = get_str(num);
+
+ if( val != 0 )
+ {
+ if( idb_iput(mapreg_db,uid,val) )
+ mapreg_dirty = true; // already exists, delay write
+ else if(name[1] != '@')
+ {// write new variable to database
+ char tmp_str[32*2+1];
+ Sql_EscapeStringLen(mmysql_handle, tmp_str, name, strnlen(name, 32));
+ if( SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `%s`(`varname`,`index`,`value`) VALUES ('%s','%d','%d')", mapreg_table, tmp_str, i, val) )
+ Sql_ShowDebug(mmysql_handle);
+ }
+ }
+ else // val == 0
+ {
+ idb_remove(mapreg_db,uid);
+
+ if( name[1] != '@' )
+ {// Remove from database because it is unused.
+ if( SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `%s` WHERE `varname`='%s' AND `index`='%d'", mapreg_table, name, i) )
+ Sql_ShowDebug(mmysql_handle);
+ }
+ }
+
+ return true;
}
/// Modifies the value of a string variable.
-bool mapreg_setregstr(int uid, const char *str)
+bool mapreg_setregstr(int uid, const char* str)
{
- int num = (uid & 0x00ffffff);
- int i = (uid & 0xff000000) >> 24;
- const char *name = get_str(num);
-
- if (str == NULL || *str == 0) {
- if (name[1] != '@') {
- if (SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `%s` WHERE `varname`='%s' AND `index`='%d'", mapreg_table, name, i))
- Sql_ShowDebug(mmysql_handle);
- }
- idb_remove(mapregstr_db,uid);
- } else {
- if (idb_put(mapregstr_db,uid, aStrdup(str)))
- mapreg_dirty = true;
- else if (name[1] != '@') { //put returned null, so we must insert.
- // Someone is causing a database size infinite increase here without name[1] != '@' [Lance]
- char tmp_str[32*2+1];
- char tmp_str2[255*2+1];
- Sql_EscapeStringLen(mmysql_handle, tmp_str, name, strnlen(name, 32));
- Sql_EscapeStringLen(mmysql_handle, tmp_str2, str, strnlen(str, 255));
- if (SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `%s`(`varname`,`index`,`value`) VALUES ('%s','%d','%s')", mapreg_table, tmp_str, i, tmp_str2))
- Sql_ShowDebug(mmysql_handle);
- }
- }
-
- return true;
+ int num = (uid & 0x00ffffff);
+ int i = (uid & 0xff000000) >> 24;
+ const char* name = get_str(num);
+
+ if( str == NULL || *str == 0 )
+ {
+ if(name[1] != '@') {
+ if( SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `%s` WHERE `varname`='%s' AND `index`='%d'", mapreg_table, name, i) )
+ Sql_ShowDebug(mmysql_handle);
+ }
+ idb_remove(mapregstr_db,uid);
+ }
+ else
+ {
+ if (idb_put(mapregstr_db,uid, aStrdup(str)))
+ mapreg_dirty = true;
+ else if(name[1] != '@') { //put returned null, so we must insert.
+ // Someone is causing a database size infinite increase here without name[1] != '@' [Lance]
+ char tmp_str[32*2+1];
+ char tmp_str2[255*2+1];
+ Sql_EscapeStringLen(mmysql_handle, tmp_str, name, strnlen(name, 32));
+ Sql_EscapeStringLen(mmysql_handle, tmp_str2, str, strnlen(str, 255));
+ if( SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `%s`(`varname`,`index`,`value`) VALUES ('%s','%d','%s')", mapreg_table, tmp_str, i, tmp_str2) )
+ Sql_ShowDebug(mmysql_handle);
+ }
+ }
+
+ return true;
}
/// Loads permanent variables from database
static void script_load_mapreg(void)
{
- /*
- 0 1 2
- +-------------------------+
- | varname | index | value |
- +-------------------------+
- */
- SqlStmt *stmt = SqlStmt_Malloc(mmysql_handle);
- char varname[32+1];
- int index;
- char value[255+1];
- uint32 length;
-
- if (SQL_ERROR == SqlStmt_Prepare(stmt, "SELECT `varname`, `index`, `value` FROM `%s`", mapreg_table)
- || SQL_ERROR == SqlStmt_Execute(stmt)
- ) {
- SqlStmt_ShowDebug(stmt);
- SqlStmt_Free(stmt);
- return;
- }
-
- SqlStmt_BindColumn(stmt, 0, SQLDT_STRING, &varname[0], sizeof(varname), &length, NULL);
- SqlStmt_BindColumn(stmt, 1, SQLDT_INT, &index, 0, NULL, NULL);
- SqlStmt_BindColumn(stmt, 2, SQLDT_STRING, &value[0], sizeof(value), NULL, NULL);
-
- while (SQL_SUCCESS == SqlStmt_NextRow(stmt)) {
- int s = add_str(varname);
- int i = index;
-
- if (varname[length-1] == '$')
- idb_put(mapregstr_db, (i<<24)|s, aStrdup(value));
- else
- idb_iput(mapreg_db, (i<<24)|s, atoi(value));
- }
-
- SqlStmt_Free(stmt);
-
- mapreg_dirty = false;
+ /*
+ 0 1 2
+ +-------------------------+
+ | varname | index | value |
+ +-------------------------+
+ */
+ SqlStmt* stmt = SqlStmt_Malloc(mmysql_handle);
+ char varname[32+1];
+ int index;
+ char value[255+1];
+ uint32 length;
+
+ if ( SQL_ERROR == SqlStmt_Prepare(stmt, "SELECT `varname`, `index`, `value` FROM `%s`", mapreg_table)
+ || SQL_ERROR == SqlStmt_Execute(stmt)
+ ) {
+ SqlStmt_ShowDebug(stmt);
+ SqlStmt_Free(stmt);
+ return;
+ }
+
+ SqlStmt_BindColumn(stmt, 0, SQLDT_STRING, &varname[0], sizeof(varname), &length, NULL);
+ SqlStmt_BindColumn(stmt, 1, SQLDT_INT, &index, 0, NULL, NULL);
+ SqlStmt_BindColumn(stmt, 2, SQLDT_STRING, &value[0], sizeof(value), NULL, NULL);
+
+ while ( SQL_SUCCESS == SqlStmt_NextRow(stmt) )
+ {
+ int s = add_str(varname);
+ int i = index;
+
+ if( varname[length-1] == '$' )
+ idb_put(mapregstr_db, (i<<24)|s, aStrdup(value));
+ else
+ idb_iput(mapreg_db, (i<<24)|s, atoi(value));
+ }
+
+ SqlStmt_Free(stmt);
+
+ mapreg_dirty = false;
}
/// Saves permanent variables to database
static void script_save_mapreg(void)
{
- DBIterator *iter;
- DBData *data;
- DBKey key;
-
- iter = db_iterator(mapreg_db);
- for (data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key)) {
- int num = (key.i & 0x00ffffff);
- int i = (key.i & 0xff000000) >> 24;
- const char *name = get_str(num);
-
- if (name[1] == '@')
- continue;
-
- if (SQL_ERROR == Sql_Query(mmysql_handle, "UPDATE `%s` SET `value`='%d' WHERE `varname`='%s' AND `index`='%d'", mapreg_table, db_data2i(data), name, i))
- Sql_ShowDebug(mmysql_handle);
- }
- dbi_destroy(iter);
-
- iter = db_iterator(mapregstr_db);
- for (data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key)) {
- int num = (key.i & 0x00ffffff);
- int i = (key.i & 0xff000000) >> 24;
- const char *name = get_str(num);
- char tmp_str2[2*255+1];
-
- if (name[1] == '@')
- continue;
-
- Sql_EscapeStringLen(mmysql_handle, tmp_str2, db_data2ptr(data), safestrnlen(db_data2ptr(data), 255));
- if (SQL_ERROR == Sql_Query(mmysql_handle, "UPDATE `%s` SET `value`='%s' WHERE `varname`='%s' AND `index`='%d'", mapreg_table, tmp_str2, name, i))
- Sql_ShowDebug(mmysql_handle);
- }
- dbi_destroy(iter);
-
- mapreg_dirty = false;
+ DBIterator* iter;
+ DBData *data;
+ DBKey key;
+
+ iter = db_iterator(mapreg_db);
+ for( data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key) )
+ {
+ int num = (key.i & 0x00ffffff);
+ int i = (key.i & 0xff000000) >> 24;
+ const char* name = get_str(num);
+
+ if( name[1] == '@' )
+ continue;
+
+ if( SQL_ERROR == Sql_Query(mmysql_handle, "UPDATE `%s` SET `value`='%d' WHERE `varname`='%s' AND `index`='%d'", mapreg_table, db_data2i(data), name, i) )
+ Sql_ShowDebug(mmysql_handle);
+ }
+ dbi_destroy(iter);
+
+ iter = db_iterator(mapregstr_db);
+ for( data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key) )
+ {
+ int num = (key.i & 0x00ffffff);
+ int i = (key.i & 0xff000000) >> 24;
+ const char* name = get_str(num);
+ char tmp_str2[2*255+1];
+
+ if( name[1] == '@' )
+ continue;
+
+ Sql_EscapeStringLen(mmysql_handle, tmp_str2, db_data2ptr(data), safestrnlen(db_data2ptr(data), 255));
+ if( SQL_ERROR == Sql_Query(mmysql_handle, "UPDATE `%s` SET `value`='%s' WHERE `varname`='%s' AND `index`='%d'", mapreg_table, tmp_str2, name, i) )
+ Sql_ShowDebug(mmysql_handle);
+ }
+ dbi_destroy(iter);
+
+ mapreg_dirty = false;
}
static int script_autosave_mapreg(int tid, unsigned int tick, int id, intptr_t data)
{
- if (mapreg_dirty)
- script_save_mapreg();
+ if( mapreg_dirty )
+ script_save_mapreg();
- return 0;
+ return 0;
}
void mapreg_reload(void)
{
- if (mapreg_dirty)
- script_save_mapreg();
+ if( mapreg_dirty )
+ script_save_mapreg();
- db_clear(mapreg_db);
- db_clear(mapregstr_db);
+ db_clear(mapreg_db);
+ db_clear(mapregstr_db);
- script_load_mapreg();
+ script_load_mapreg();
}
void mapreg_final(void)
{
- if (mapreg_dirty)
- script_save_mapreg();
+ if( mapreg_dirty )
+ script_save_mapreg();
- db_destroy(mapreg_db);
- db_destroy(mapregstr_db);
+ db_destroy(mapreg_db);
+ db_destroy(mapregstr_db);
}
void mapreg_init(void)
{
- mapreg_db = idb_alloc(DB_OPT_BASE);
- mapregstr_db = idb_alloc(DB_OPT_RELEASE_DATA);
+ mapreg_db = idb_alloc(DB_OPT_BASE);
+ mapregstr_db = idb_alloc(DB_OPT_RELEASE_DATA);
- script_load_mapreg();
+ script_load_mapreg();
- add_timer_func_list(script_autosave_mapreg, "script_autosave_mapreg");
- add_timer_interval(gettick() + MAPREG_AUTOSAVE_INTERVAL, script_autosave_mapreg, 0, 0, MAPREG_AUTOSAVE_INTERVAL);
+ add_timer_func_list(script_autosave_mapreg, "script_autosave_mapreg");
+ add_timer_interval(gettick() + MAPREG_AUTOSAVE_INTERVAL, script_autosave_mapreg, 0, 0, MAPREG_AUTOSAVE_INTERVAL);
}
-bool mapreg_config_read(const char *w1, const char *w2)
+bool mapreg_config_read(const char* w1, const char* w2)
{
- if (!strcmpi(w1, "mapreg_db"))
- safestrncpy(mapreg_table, w2, sizeof(mapreg_table));
- else
- return false;
+ if(!strcmpi(w1, "mapreg_db"))
+ safestrncpy(mapreg_table, w2, sizeof(mapreg_table));
+ else
+ return false;
- return true;
+ return true;
}