//
// original code from athena
// SQL conversion by Jioh L. Jung
//
#include "char.h"
#include "itemdb.h"
#include <string.h>
#include <stdlib.h>
#define STORAGE_MEMINC 16
// reset by inter_config_read()
struct storage *storage_pt = NULL;
struct guild_storage *guild_storage_pt = NULL;
// storage data -> DB conversion
int storage_tosql (int account_id, struct storage *p)
{
int i;
int eqcount = 1;
int noteqcount = 1;
struct itemtemp mapitem;
for (i = 0; i < MAX_STORAGE; i++)
{
if (p->storage[i].nameid > 0)
{
if (itemdb_isequip (p->storage[i].nameid) == 1)
{
mapitem.equip[eqcount].flag = 0;
mapitem.equip[eqcount].id = p->storage[i].id;
mapitem.equip[eqcount].nameid = p->storage[i].nameid;
mapitem.equip[eqcount].amount = p->storage[i].amount;
mapitem.equip[eqcount].equip = p->storage[i].equip;
mapitem.equip[eqcount].identify = p->storage[i].identify;
mapitem.equip[eqcount].refine = p->storage[i].refine;
mapitem.equip[eqcount].attribute = p->storage[i].attribute;
mapitem.equip[eqcount].card[0] = p->storage[i].card[0];
mapitem.equip[eqcount].card[1] = p->storage[i].card[1];
mapitem.equip[eqcount].card[2] = p->storage[i].card[2];
mapitem.equip[eqcount].card[3] = p->storage[i].card[3];
mapitem.equip[eqcount].broken = p->storage[i].broken;
eqcount++;
}
else if (itemdb_isequip (p->storage[i].nameid) == 0)
{
mapitem.notequip[noteqcount].flag = 0;
mapitem.notequip[noteqcount].id = p->storage[i].id;
mapitem.notequip[noteqcount].nameid = p->storage[i].nameid;
mapitem.notequip[noteqcount].amount = p->storage[i].amount;
mapitem.notequip[noteqcount].equip = p->storage[i].equip;
mapitem.notequip[noteqcount].identify =
p->storage[i].identify;
mapitem.notequip[noteqcount].refine = p->storage[i].refine;
mapitem.notequip[noteqcount].attribute =
p->storage[i].attribute;
mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0];
mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1];
mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2];
mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3];
mapitem.notequip[noteqcount].broken = p->storage[i].broken;
noteqcount++;
}
}
}
memitemdata_to_sql (mapitem, eqcount, noteqcount, account_id,
TABLE_STORAGE);
//printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
return 0;
}
// DB -> storage data conversion
int storage_fromsql (int account_id, struct storage *p)
{
int i = 0;
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`}
sprintf (tmp_sql,
"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken` FROM `%s` WHERE `account_id`='%d'",
storage_db, account_id);
if (mysql_query (&mysql_handle, tmp_sql))
{
printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
}
sql_res = mysql_store_result (&mysql_handle);
if (sql_res)
{
while ((sql_row = mysql_fetch_row (sql_res)))
{ //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]);
p->storage[i].card[0] = atoi (sql_row[7]);
p->storage[i].card[1] = atoi (sql_row[8]);
p->storage[i].card[2] = atoi (sql_row[9]);
p->storage[i].card[3] = atoi (sql_row[10]);
p->storage[i].broken = atoi (sql_row[11]);
p->storage_amount = ++i;
}
mysql_free_result (sql_res);
}
printf ("storage load complete from DB - id: %d (total: %d)\n",
account_id, p->storage_amount);
return 1;
}
// Save guild_storage data to sql
int guild_storage_tosql (int guild_id, struct guild_storage *p)
{
int i;
int eqcount = 1;
int noteqcount = 1;
struct itemtemp mapitem;
for (i = 0; i < MAX_GUILD_STORAGE; i++)
{
if (p->storage[i].nameid > 0)
{
if (itemdb_isequip (p->storage[i].nameid) == 1)
{
mapitem.equip[eqcount].flag = 0;
mapitem.equip[eqcount].id = p->storage[i].id;
mapitem.equip[eqcount].nameid = p->storage[i].nameid;
mapitem.equip[eqcount].amount = p->storage[i].amount;
mapitem.equip[eqcount].equip = p->storage[i].equip;
mapitem.equip[eqcount].identify = p->storage[i].identify;
mapitem.equip[eqcount].refine = p->storage[i].refine;
mapitem.equip[eqcount].attribute = p->storage[i].attribute;
mapitem.equip[eqcount].card[0] = p->storage[i].card[0];
mapitem.equip[eqcount].card[1] = p->storage[i].card[1];
mapitem.equip[eqcount].card[2] = p->storage[i].card[2];
mapitem.equip[eqcount].card[3] = p->storage[i].card[3];
mapitem.equip[eqcount].broken = p->storage[i].broken;
eqcount++;
}
else if (itemdb_isequip (p->storage[i].nameid) == 0)
{
mapitem.notequip[noteqcount].flag = 0;
mapitem.notequip[noteqcount].id = p->storage[i].id;
mapitem.notequip[noteqcount].nameid = p->storage[i].nameid;
mapitem.notequip[noteqcount].amount = p->storage[i].amount;
mapitem.notequip[noteqcount].equip = p->storage[i].equip;
mapitem.notequip[noteqcount].identify =
p->storage[i].identify;
mapitem.notequip[noteqcount].refine = p->storage[i].refine;
mapitem.notequip[noteqcount].attribute =
p->storage[i].attribute;
mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0];
mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1];
mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2];
mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3];
mapitem.notequip[noteqcount].broken = p->storage[i].broken;
noteqcount++;
}
}
}
memitemdata_to_sql (mapitem, eqcount, noteqcount, guild_id,
TABLE_GUILD_STORAGE);
printf ("guild storage save to DB - id: %d (total: %d)\n", guild_id, i);
return 0;
}
// Load guild_storage data to mem
int guild_storage_fromsql (int guild_id, struct guild_storage *p)
{
int i = 0;
struct guild_storage *gs = guild_storage_pt;
p = gs;
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`}
sprintf (tmp_sql,
"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken` FROM `%s` WHERE `guild_id`='%d'",
guild_storage_db, guild_id);
if (mysql_query (&mysql_handle, tmp_sql))
{
printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
}
sql_res = mysql_store_result (&mysql_handle);
if (sql_res)
{
while ((sql_row = mysql_fetch_row (sql_res)))
{ //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]);
p->storage[i].card[0] = atoi (sql_row[7]);
p->storage[i].card[1] = atoi (sql_row[8]);
p->storage[i].card[2] = atoi (sql_row[9]);
p->storage[i].card[3] = atoi (sql_row[10]);
p->storage[i].broken = atoi (sql_row[11]);
p->storage_amount = ++i;
}
mysql_free_result (sql_res);
}
printf ("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 ()
{
//memory alloc
printf ("interserver storage memory initialize....(%d byte)\n",
sizeof (struct storage));
storage_pt = calloc (sizeof (struct storage), 1);
guild_storage_pt = calloc (sizeof (struct guild_storage), 1);
memset (storage_pt, 0, sizeof (struct storage));
memset (guild_storage_pt, 0, sizeof (struct guild_storage));
return 1;
}
// �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))
{
printf ("DB server Error (delete `storage`)- %s\n",
mysql_error (&mysql_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))
{
printf ("DB server Error (delete `guild_storage`)- %s\n",
mysql_error (&mysql_handle));
}
return 0;
}
//---------------------------------------------------------
// packet from map server
// recive packet about storage data
int mapif_load_storage (int fd, int account_id)
{
//load from DB
storage_fromsql (account_id, storage_pt);
WFIFOW (fd, 0) = 0x3810;
WFIFOW (fd, 2) = sizeof (struct storage) + 8;
WFIFOL (fd, 4) = account_id;
memcpy (WFIFOP (fd, 8), storage_pt, sizeof (struct storage));
WFIFOSET (fd, WFIFOW (fd, 2));
return 0;
}
// send ack to map server which is "storage data save ok."
int mapif_save_storage_ack (int fd, int account_id)
{
WFIFOW (fd, 0) = 0x3811;
WFIFOL (fd, 2) = account_id;
WFIFOB (fd, 6) = 0;
WFIFOSET (fd, 7);
return 0;
}
int mapif_load_guild_storage (int fd, int account_id, int guild_id)
{
int guild_exist = 0;
WFIFOW (fd, 0) = 0x3818;
// 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))
{
printf ("DB server Error (delete `guild`)- %s\n",
mysql_error (&mysql_handle));
}
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
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;
}
WFIFOSET (fd, WFIFOW (fd, 2));
return 0;
}
int mapif_save_guild_storage_ack (int fd, int account_id, int guild_id,
int fail)
{
WFIFOW (fd, 0) = 0x3819;
WFIFOL (fd, 2) = account_id;
WFIFOL (fd, 6) = guild_id;
WFIFOB (fd, 10) = fail;
WFIFOSET (fd, 11);
return 0;
}
//---------------------------------------------------------
// packet from map server
// recive request about storage data
int mapif_parse_LoadStorage (int fd)
{
mapif_load_storage (fd, RFIFOL (fd, 2));
return 0;
}
// storage data recive and save
int mapif_parse_SaveStorage (int fd)
{
int account_id = RFIFOL (fd, 4);
int len = RFIFOW (fd, 2);
if (sizeof (struct storage) != len - 8)
{
printf ("inter storage: data size error %d %d\n",
sizeof (struct storage), len - 8);
}
else
{
memcpy (&storage_pt[0], RFIFOP (fd, 8), sizeof (struct storage));
storage_tosql (account_id, storage_pt);
mapif_save_storage_ack (fd, account_id);
}
return 0;
}
int mapif_parse_LoadGuildStorage (int fd)
{
mapif_load_guild_storage (fd, RFIFOL (fd, 2), RFIFOL (fd, 6));
return 0;
}
int mapif_parse_SaveGuildStorage (int fd)
{
int guild_exist = 0;
int guild_id = RFIFOL (fd, 8);
int len = RFIFOW (fd, 2);
if (sizeof (struct guild_storage) != len - 12)
{
printf ("inter storage: data size error %d %d\n",
sizeof (struct guild_storage), len - 12);
}
else
{
// 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))
{
printf ("DB server Error (delete `guild`)- %s\n",
mysql_error (&mysql_handle));
}
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
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);
}
return 0;
}
int inter_storage_parse_frommap (int fd)
{
switch (RFIFOW (fd, 0))
{
case 0x3010:
mapif_parse_LoadStorage (fd);
break;
case 0x3011:
mapif_parse_SaveStorage (fd);
break;
case 0x3018:
mapif_parse_LoadGuildStorage (fd);
break;
case 0x3019:
mapif_parse_SaveGuildStorage (fd);
break;
default:
return 0;
}
return 1;
}