summaryrefslogtreecommitdiff
path: root/src/map/mob.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/mob.c')
-rw-r--r--src/map/mob.c112
1 files changed, 73 insertions, 39 deletions
diff --git a/src/map/mob.c b/src/map/mob.c
index 86d60a152..b5c83413c 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -9,6 +9,7 @@
#include "../common/showmsg.h"
#include "../common/ers.h"
#include "../common/strlib.h"
+#include "../common/utils.h"
#include "map.h"
#include "clif.h"
@@ -3210,7 +3211,10 @@ static unsigned int mob_drop_adjust(int rate, int rate_adjust, unsigned short ra
return cap_value(rate,rate_min,rate_max);
}
-int mob_parse_dbrow(char** str)
+/*==========================================
+ * processes one mobdb entry
+ *------------------------------------------*/
+static bool mob_parse_dbrow(char** str)
{
struct mob_db *db;
struct status_data *status;
@@ -3220,15 +3224,15 @@ int mob_parse_dbrow(char** str)
class_ = str[0] ? atoi(str[0]) : 0;
if (class_ == 0)
- return 0; //Leave blank lines alone... [Skotlex]
+ return false; //Leave blank lines alone... [Skotlex]
if (class_ <= 1000 || class_ > MAX_MOB_DB) {
ShowWarning("Mob with ID: %d not loaded. ID must be in range [%d-%d]\n", class_, 1000, MAX_MOB_DB);
- return 0;
+ return false;
}
if (pcdb_checkid(class_)) {
ShowWarning("Mob with ID: %d not loaded. That ID is reserved for player classes.\n");
- return 0;
+ return false;
}
if (mob_db_data[class_] == NULL)
@@ -3432,7 +3436,7 @@ int mob_parse_dbrow(char** str)
}
}
- return 1;
+ return true;
}
/*==========================================
@@ -3440,83 +3444,113 @@ int mob_parse_dbrow(char** str)
*------------------------------------------*/
static int mob_readdb(void)
{
- FILE *fp;
- char line[1024];
- char *filename[]={ "mob_db.txt","mob_db2.txt" };
- int i, fi;
- unsigned int ln = 0;
+ char* filename[] = { "mob_db.txt", "mob_db2.txt" };
+ int fi;
- for(fi = 0; fi < 2; fi++) {
- sprintf(line, "%s/%s", db_path, filename[fi]);
- fp = fopen(line, "r");
+ for(fi = 0; fi < 2; fi++)
+ {
+ uint32 lines = 0, count = 0;
+ char line[1024];
+ char path[256];
+ FILE* fp;
+
+ sprintf(path, "%s/%s", db_path, filename[fi]);
+ fp = fopen(path, "r");
if(fp == NULL) {
if(fi > 0)
continue;
return -1;
}
+ // process rows one by one
while(fgets(line, sizeof(line), fp))
{
char *str[38+2*MAX_MOB_DROP], *p, *np;
+ int i;
+ lines++;
if(line[0] == '/' && line[1] == '/')
continue;
- for(i = 0, p = line; i < 38 + 2*MAX_MOB_DROP; i++) {
+ for(i = 0, p = line; i < 38 + 2*MAX_MOB_DROP; i++)
+ {
+ str[i] = p;
if((np = strchr(p, ',')) != NULL) {
- str[i] = p; *np = 0; p = np + 1;
- } else
- str[i] = p;
+ *np = '\0'; p = np + 1;
+ }
}
if(i < 38 + 2*MAX_MOB_DROP) {
- ShowWarning("mob_readdb: Insufficient columns for mob with ID: %d\n", str[0] ? atoi(str[0]) : 0);
+ ShowWarning("mob_readdb: Insufficient columns for mob with id: %d, skipping.\n", atoi(str[0]));
continue;
}
if (!mob_parse_dbrow(str))
continue;
- ln++; // counts the number of correctly parsed entries
+ count++;
}
+
fclose(fp);
- ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, filename[fi]);
- ln = 0;
+
+ ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, filename[fi]);
}
+
return 0;
}
#ifndef TXT_ONLY
/*==========================================
- * SQL reading
+ * mob_db table reading
*------------------------------------------*/
static int mob_read_sqldb(void)
{
- char *mob_db_name[] = { mob_db_db, mob_db2_db };
+ char* mob_db_name[] = { mob_db_db, mob_db2_db };
int fi;
- unsigned int ln = 0;
- for (fi = 0; fi < 2; fi++) {
- sprintf (tmp_sql, "SELECT * FROM `%s`", mob_db_name[fi]);
- if (mysql_query(&mmysql_handle, tmp_sql)) {
- ShowSQL("DB error (%s) - %s\n", mob_db_name[fi], mysql_error(&mmysql_handle));
- ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
+ for (fi = 0; fi < 2; fi++)
+ {
+ uint32 lines = 0, count = 0;
+
+ // retrieve all rows from the mob database
+ if( SQL_ERROR == Sql_Query(mmysql_handle, "SELECT * FROM `%s`", mob_db_name[fi]) )
+ {
+ Sql_ShowDebug(mmysql_handle);
continue;
}
- sql_res = mysql_store_result(&mmysql_handle);
- if (sql_res) {
- while((sql_row = mysql_fetch_row(sql_res))){
-
- if (!mob_parse_dbrow(sql_row))
- continue;
+
+ // process rows one by one
+ while( SQL_SUCCESS == Sql_NextRow(mmysql_handle) )
+ {
+ // wrap the result into a TXT-compatible format
+ char line[1024];
+ char* str[38+2*MAX_MOB_DROP];
+ char* p;
+ int i;
+
+ lines++;
+ for(i = 0, p = line; i < 38 + 2*MAX_MOB_DROP; i++)
+ {
+ char* data;
+ size_t len;
+ Sql_GetData(mmysql_handle, i, &data, &len);
- ln++; // counts the number of correctly parsed entries
+ strcpy(p, data);
+ str[i] = p;
+ p+= len + 1;
}
- mysql_free_result(sql_res);
- ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", ln, mob_db_name[fi]);
- ln = 0;
+ if (!mob_parse_dbrow(str))
+ continue;
+
+ count++;
}
+
+ // free the query result
+ Sql_FreeResult(mmysql_handle);
+
+ ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, mob_db_name[fi]);
+ count = 0;
}
return 0;
}