int_storage.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. //
  2. // original code from athena
  3. // SQL conversion by Jioh L. Jung
  4. //
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include "char.h"
  8. #include "itemdb.h"
  9. #define STORAGE_MEMINC 16
  10. // reset by inter_config_read()
  11. struct storage *storage_pt=NULL;
  12. struct guild_storage *guild_storage_pt=NULL;
  13. #define mysql_query(_x, _y) debug_mysql_query(__FILE__, __LINE__, _x, _y)
  14. // storage data -> DB conversion
  15. int storage_tosql(int account_id,struct storage *p){
  16. int i;
  17. int eqcount=1;
  18. int noteqcount=1;
  19. struct itemtemp mapitem;
  20. for(i=0;i<MAX_STORAGE;i++){
  21. if(p->storage[i].nameid>0){
  22. if(itemdb_isequip(p->storage[i].nameid)==1){
  23. mapitem.equip[eqcount].flag=0;
  24. mapitem.equip[eqcount].id = p->storage[i].id;
  25. mapitem.equip[eqcount].nameid=p->storage[i].nameid;
  26. mapitem.equip[eqcount].amount = p->storage[i].amount;
  27. mapitem.equip[eqcount].equip = p->storage[i].equip;
  28. mapitem.equip[eqcount].identify = p->storage[i].identify;
  29. mapitem.equip[eqcount].refine = p->storage[i].refine;
  30. mapitem.equip[eqcount].attribute = p->storage[i].attribute;
  31. mapitem.equip[eqcount].card[0] = p->storage[i].card[0];
  32. mapitem.equip[eqcount].card[1] = p->storage[i].card[1];
  33. mapitem.equip[eqcount].card[2] = p->storage[i].card[2];
  34. mapitem.equip[eqcount].card[3] = p->storage[i].card[3];
  35. eqcount++;
  36. }
  37. else if(itemdb_isequip(p->storage[i].nameid)==0){
  38. mapitem.notequip[noteqcount].flag=0;
  39. mapitem.notequip[noteqcount].id = p->storage[i].id;
  40. mapitem.notequip[noteqcount].nameid=p->storage[i].nameid;
  41. mapitem.notequip[noteqcount].amount = p->storage[i].amount;
  42. mapitem.notequip[noteqcount].equip = p->storage[i].equip;
  43. mapitem.notequip[noteqcount].identify = p->storage[i].identify;
  44. mapitem.notequip[noteqcount].refine = p->storage[i].refine;
  45. mapitem.notequip[noteqcount].attribute = p->storage[i].attribute;
  46. mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0];
  47. mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1];
  48. mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2];
  49. mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3];
  50. noteqcount++;
  51. }
  52. }
  53. }
  54. memitemdata_to_sql(mapitem, eqcount, noteqcount, account_id,TABLE_STORAGE);
  55. //printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j);
  56. return 0;
  57. }
  58. // DB -> storage data conversion
  59. int storage_fromsql(int account_id, struct storage *p){
  60. int i=0;
  61. memset(p,0,sizeof(struct storage)); //clean up memory
  62. p->storage_amount = 0;
  63. p->account_id = account_id;
  64. // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
  65. sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3` FROM `%s` WHERE `account_id`='%d'",storage_db, account_id);
  66. if(mysql_query(&mysql_handle, tmp_sql) ) {
  67. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  68. }
  69. sql_res = mysql_store_result(&mysql_handle) ;
  70. if (sql_res) {
  71. while((sql_row = mysql_fetch_row(sql_res))) { //start to fetch
  72. p->storage[i].id= atoi(sql_row[0]);
  73. p->storage[i].nameid= atoi(sql_row[1]);
  74. p->storage[i].amount= atoi(sql_row[2]);
  75. p->storage[i].equip= atoi(sql_row[3]);
  76. p->storage[i].identify= atoi(sql_row[4]);
  77. p->storage[i].refine= atoi(sql_row[5]);
  78. p->storage[i].attribute= atoi(sql_row[6]);
  79. p->storage[i].card[0]= atoi(sql_row[7]);
  80. p->storage[i].card[1]= atoi(sql_row[8]);
  81. p->storage[i].card[2]= atoi(sql_row[9]);
  82. p->storage[i].card[3]= atoi(sql_row[10]);
  83. p->storage_amount = ++i;
  84. }
  85. mysql_free_result(sql_res);
  86. }
  87. printf ("storage load complete from DB - id: %d (total: %d)\n", account_id, p->storage_amount);
  88. return 1;
  89. }
  90. // Save guild_storage data to sql
  91. int guild_storage_tosql(int guild_id, struct guild_storage *p){
  92. int i;
  93. int eqcount=1;
  94. int noteqcount=1;
  95. struct itemtemp mapitem;
  96. for(i=0;i<MAX_GUILD_STORAGE;i++){
  97. if(p->storage[i].nameid>0){
  98. if(itemdb_isequip(p->storage[i].nameid)==1){
  99. mapitem.equip[eqcount].flag=0;
  100. mapitem.equip[eqcount].id = p->storage[i].id;
  101. mapitem.equip[eqcount].nameid=p->storage[i].nameid;
  102. mapitem.equip[eqcount].amount = p->storage[i].amount;
  103. mapitem.equip[eqcount].equip = p->storage[i].equip;
  104. mapitem.equip[eqcount].identify = p->storage[i].identify;
  105. mapitem.equip[eqcount].refine = p->storage[i].refine;
  106. mapitem.equip[eqcount].attribute = p->storage[i].attribute;
  107. mapitem.equip[eqcount].card[0] = p->storage[i].card[0];
  108. mapitem.equip[eqcount].card[1] = p->storage[i].card[1];
  109. mapitem.equip[eqcount].card[2] = p->storage[i].card[2];
  110. mapitem.equip[eqcount].card[3] = p->storage[i].card[3];
  111. eqcount++;
  112. }
  113. else if(itemdb_isequip(p->storage[i].nameid)==0){
  114. mapitem.notequip[noteqcount].flag=0;
  115. mapitem.notequip[noteqcount].id = p->storage[i].id;
  116. mapitem.notequip[noteqcount].nameid=p->storage[i].nameid;
  117. mapitem.notequip[noteqcount].amount = p->storage[i].amount;
  118. mapitem.notequip[noteqcount].equip = p->storage[i].equip;
  119. mapitem.notequip[noteqcount].identify = p->storage[i].identify;
  120. mapitem.notequip[noteqcount].refine = p->storage[i].refine;
  121. mapitem.notequip[noteqcount].attribute = p->storage[i].attribute;
  122. mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0];
  123. mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1];
  124. mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2];
  125. mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3];
  126. noteqcount++;
  127. }
  128. }
  129. }
  130. memitemdata_to_sql(mapitem, eqcount, noteqcount, guild_id,TABLE_GUILD_STORAGE);
  131. printf ("guild storage save to DB - id: %d (total: %d)\n", guild_id,i);
  132. return 0;
  133. }
  134. // Load guild_storage data to mem
  135. int guild_storage_fromsql(int guild_id, struct guild_storage *p){
  136. int i=0;
  137. struct guild_storage *gs=guild_storage_pt;
  138. p=gs;
  139. memset(p,0,sizeof(struct guild_storage)); //clean up memory
  140. p->storage_amount = 0;
  141. p->guild_id = guild_id;
  142. // storage {`guild_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`}
  143. sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3` FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id);
  144. if(mysql_query(&mysql_handle, tmp_sql) ) {
  145. printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
  146. }
  147. sql_res = mysql_store_result(&mysql_handle) ;
  148. if (sql_res) {
  149. while((sql_row = mysql_fetch_row(sql_res))) { //start to fetch
  150. p->storage[i].id= atoi(sql_row[0]);
  151. p->storage[i].nameid= atoi(sql_row[1]);
  152. p->storage[i].amount= atoi(sql_row[2]);
  153. p->storage[i].equip= atoi(sql_row[3]);
  154. p->storage[i].identify= atoi(sql_row[4]);
  155. p->storage[i].refine= atoi(sql_row[5]);
  156. p->storage[i].attribute= atoi(sql_row[6]);
  157. p->storage[i].card[0]= atoi(sql_row[7]);
  158. p->storage[i].card[1]= atoi(sql_row[8]);
  159. p->storage[i].card[2]= atoi(sql_row[9]);
  160. p->storage[i].card[3]= atoi(sql_row[10]);
  161. p->storage_amount = ++i;
  162. }
  163. mysql_free_result(sql_res);
  164. }
  165. printf ("guild storage load complete from DB - id: %d (total: %d)\n", guild_id, p->storage_amount);
  166. return 0;
  167. }
  168. //---------------------------------------------------------
  169. // storage data initialize
  170. int inter_storage_sql_init(){
  171. //memory alloc
  172. printf("interserver storage memory initialize....(%d byte)\n",sizeof(struct storage));
  173. storage_pt=calloc(sizeof(struct storage), 1);
  174. guild_storage_pt=calloc(sizeof(struct guild_storage), 1);
  175. memset(storage_pt,0,sizeof(struct storage));
  176. memset(guild_storage_pt,0,sizeof(struct guild_storage));
  177. return 1;
  178. }
  179. // ‘qŒÉƒf�[ƒ^�í�œ
  180. int inter_storage_delete(int account_id)
  181. {
  182. sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id`='%d'",storage_db, account_id);
  183. if(mysql_query(&mysql_handle, tmp_sql) ) {
  184. printf("DB server Error (delete `storage`)- %s\n", mysql_error(&mysql_handle) );
  185. }
  186. return 0;
  187. }
  188. int inter_guild_storage_delete(int guild_id)
  189. {
  190. sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id);
  191. if(mysql_query(&mysql_handle, tmp_sql) ) {
  192. printf("DB server Error (delete `guild_storage`)- %s\n", mysql_error(&mysql_handle) );
  193. }
  194. return 0;
  195. }
  196. //---------------------------------------------------------
  197. // packet from map server
  198. // recive packet about storage data
  199. int mapif_load_storage(int fd,int account_id){
  200. //load from DB
  201. storage_fromsql(account_id, storage_pt);
  202. WFIFOW(fd,0)=0x3810;
  203. WFIFOW(fd,2)=sizeof(struct storage)+8;
  204. WFIFOL(fd,4)=account_id;
  205. memcpy(WFIFOP(fd,8),storage_pt,sizeof(struct storage));
  206. WFIFOSET(fd,WFIFOW(fd,2));
  207. return 0;
  208. }
  209. // send ack to map server which is "storage data save ok."
  210. int mapif_save_storage_ack(int fd,int account_id){
  211. WFIFOW(fd,0)=0x3811;
  212. WFIFOL(fd,2)=account_id;
  213. WFIFOB(fd,6)=0;
  214. WFIFOSET(fd,7);
  215. return 0;
  216. }
  217. int mapif_load_guild_storage(int fd,int account_id,int guild_id)
  218. {
  219. int guild_exist=0;
  220. WFIFOW(fd,0)=0x3818;
  221. // Check if guild exists, I may write a function for this later, coz I use it several times.
  222. //printf("- Check if guild %d exists\n",g->guild_id);
  223. sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
  224. if(mysql_query(&mysql_handle, tmp_sql) ) {
  225. printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
  226. }
  227. sql_res = mysql_store_result(&mysql_handle) ;
  228. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  229. sql_row = mysql_fetch_row(sql_res);
  230. guild_exist = atoi (sql_row[0]);
  231. //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
  232. }
  233. mysql_free_result(sql_res) ; //resource free
  234. if(guild_exist==1) {
  235. guild_storage_fromsql(guild_id,guild_storage_pt);
  236. WFIFOW(fd,2)=sizeof(struct guild_storage)+12;
  237. WFIFOL(fd,4)=account_id;
  238. WFIFOL(fd,8)=guild_id;
  239. memcpy(WFIFOP(fd,12),guild_storage_pt,sizeof(struct guild_storage));
  240. }
  241. else {
  242. WFIFOW(fd,2)=12;
  243. WFIFOL(fd,4)=account_id;
  244. WFIFOL(fd,8)=0;
  245. }
  246. WFIFOSET(fd,WFIFOW(fd,2));
  247. return 0;
  248. }
  249. int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail)
  250. {
  251. WFIFOW(fd,0)=0x3819;
  252. WFIFOL(fd,2)=account_id;
  253. WFIFOL(fd,6)=guild_id;
  254. WFIFOB(fd,10)=fail;
  255. WFIFOSET(fd,11);
  256. return 0;
  257. }
  258. //---------------------------------------------------------
  259. // packet from map server
  260. // recive request about storage data
  261. int mapif_parse_LoadStorage(int fd){
  262. mapif_load_storage(fd,RFIFOL(fd,2));
  263. return 0;
  264. }
  265. // storage data recive and save
  266. int mapif_parse_SaveStorage(int fd){
  267. int account_id=RFIFOL(fd,4);
  268. int len=RFIFOW(fd,2);
  269. if(sizeof(struct storage)!=len-8){
  270. printf("inter storage: data size error %d %d\n",sizeof(struct storage),len-8);
  271. }else{
  272. memcpy(&storage_pt[0],RFIFOP(fd,8),sizeof(struct storage));
  273. storage_tosql(account_id, storage_pt);
  274. mapif_save_storage_ack(fd,account_id);
  275. }
  276. return 0;
  277. }
  278. int mapif_parse_LoadGuildStorage(int fd)
  279. {
  280. mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6));
  281. return 0;
  282. }
  283. int mapif_parse_SaveGuildStorage(int fd)
  284. {
  285. int guild_exist=0;
  286. int guild_id=RFIFOL(fd,8);
  287. int len=RFIFOW(fd,2);
  288. if(sizeof(struct guild_storage)!=len-12){
  289. printf("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
  290. }
  291. else {
  292. // Check if guild exists, I may write a function for this later, coz I use it several times.
  293. //printf("- Check if guild %d exists\n",g->guild_id);
  294. sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id);
  295. if(mysql_query(&mysql_handle, tmp_sql) ) {
  296. printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) );
  297. }
  298. sql_res = mysql_store_result(&mysql_handle) ;
  299. if (sql_res!=NULL && mysql_num_rows(sql_res)>0) {
  300. sql_row = mysql_fetch_row(sql_res);
  301. guild_exist = atoi (sql_row[0]);
  302. //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
  303. }
  304. mysql_free_result(sql_res) ; //resource free
  305. if(guild_exist==1) {
  306. memcpy(guild_storage_pt,RFIFOP(fd,12),sizeof(struct guild_storage));
  307. guild_storage_tosql(guild_id,guild_storage_pt);
  308. mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0);
  309. }
  310. else
  311. mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1);
  312. }
  313. return 0;
  314. }
  315. int inter_storage_parse_frommap(int fd){
  316. switch(RFIFOW(fd,0)){
  317. case 0x3010: mapif_parse_LoadStorage(fd); break;
  318. case 0x3011: mapif_parse_SaveStorage(fd); break;
  319. case 0x3018: mapif_parse_LoadGuildStorage(fd); break;
  320. case 0x3019: mapif_parse_SaveGuildStorage(fd); break;
  321. default:
  322. return 0;
  323. }
  324. return 1;
  325. }