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