فهرست منبع

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@615 54d463be-8e91-2dee-dedb-b68131a5f0ec

davidsiaw 20 سال پیش
والد
کامیت
8e618ece65
2فایلهای تغییر یافته به همراه99 افزوده شده و 2 حذف شده
  1. 4 0
      Changelog.txt
  2. 95 2
      src/char_sql/char.c

+ 4 - 0
Changelog.txt

@@ -1,4 +1,8 @@
 Date	Added
+
+12/19
+	* Fixed some SQL queries crashing char server [davidsiaw]
+
 12/18
 	* Added several PID GM commands, thanks to Dino9021 [nsstrunks]
 	* Storage was merging items incorrectly [Mousejstr]

+ 95 - 2
src/char_sql/char.c

@@ -62,6 +62,7 @@ char guild_storage_db[256] = "guild_storage";
 char party_db[256] = "party";
 char pet_db[256] = "pet";
 char login_db[256] = "login";
+char friend_db[256] = "friends";
 
 char login_db_account_id[32] = "account_id";
 char login_db_level[32] = "level";
@@ -262,12 +263,35 @@ void read_gm_account(void) {
 	mysql_free_result(lsql_res);
 }
 
+// Insert friends list
+void insert_friends(int char_id_count){
+	int i;
+	char *tmp_p = tmp_sql;
+
+	tmp_p += sprintf(tmp_p, "REPLACE INTO `%s` (`id`, `account_id`",friend_db);
+
+	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_count);
+
+	for (i=0;i<20;i++)
+		tmp_p += sprintf(tmp_p, ", '0', ''");
+
+	tmp_p += sprintf(tmp_p, ")");
+
+	if (mysql_query(&mysql_handle, tmp_sql)) {
+		printf("DB server Error (insert `friend`)- %s\n", mysql_error(&mysql_handle));
+	}
+}
+
 //=====================================================================================================
 int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
 	int i=0,party_exist,guild_exist;
 	int eqcount=1;
 	int noteqcount=1;
-	char temp_str[32];
+	char temp_str[1024];
+	char *tmp_p = tmp_sql;
 
 	struct itemtemp mapitem;
 	if (char_id!=p->char_id) return 0;
@@ -482,6 +506,23 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
 			}
 		}
 	}
+
+	// Friends list 
+	// account_id, friend_id0, name0, ...
+	
+	tmp_p += sprintf(tmp_p, "REPLACE INTO `%s` (`id`, `account_id`",friend_db);
+
+	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);
+
+	for (i=0;i<20;i++)
+		tmp_p += sprintf(tmp_p, ", '%d', '%s'", p->friend_id[i], p->friend_name[i]);
+
+	tmp_p += sprintf(tmp_p, ")");
+	mysql_query(&mysql_handle, tmp_sql);
+
 	printf("saving char is done.\n");
 	save_flag = 0;
 
@@ -723,6 +764,7 @@ int memitemdata_to_sql(struct itemtemp mapitem, int eqcount, int noteqcount, int
 //=====================================================================================================
 int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){
 	int i, n;
+	char *tmp_p = tmp_sql;
 
 	memset(p, 0, sizeof(struct mmo_charstatus));
 
@@ -912,11 +954,57 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){
 	}
 	p->global_reg_num=i;
 
+	//Friends List Load
+
+	for(i=0;i<20;i++) {
+		p->friend_id[i] = 0;
+		sprintf(p->friend_name[i], "");
+	}
+
+	tmp_p += sprintf(tmp_p, "SELECT `id`, `account_id`");
+
+	for(i=0;i<20;i++)
+		tmp_p += sprintf(tmp_p, ", `friend_id%d`, `name%d`", i, i);
+
+	tmp_p += sprintf(tmp_p, " FROM `%s` WHERE `account_id`='%d' ", friend_db, char_id);
+
+	if (mysql_query(&mysql_handle, tmp_sql)) {
+		printf("DB server Error (select `friends list`)- %s\n", mysql_error(&mysql_handle));
+	}
+
+	sql_res = mysql_store_result(&mysql_handle);
+	sql_row = mysql_fetch_row(sql_res);
+
+	i=mysql_num_rows(sql_res);
+
+	printf("mysql: %d\n",i);
+	
+	// Create an entry for the character if it doesnt already have one
+	if(!i) {
+
+		insert_friends(char_id);
+
+	} else {
+
+		if (sql_res) {
+			for(i=0;i<20;i++) {
+				//printf("\nLOL\n");
+				p->friend_id[i] = atoi(sql_row[i*2 +2]);
+				sprintf(p->friend_name[i], "%s", sql_row[i*2 +3]);
+			}
+			mysql_free_result(sql_res);
+		}
+	}
+
+	printf("friends ");
+
+	//-- end friends list load --
+
 	if (online) {
 		set_char_online(char_id,p->account_id);
 	}
 
-	printf("global_reg]\n");	//ok. all data load successfuly!
+	printf("character data loaded]\n");	//ok. all data load successfuly!
 
 	//printf("char cloade");
 
@@ -980,6 +1068,7 @@ int make_new_char_sql(int fd, unsigned char *dat) {
 	struct char_session_data *sd;
 	char t_name[100];
 	int i;
+
 	//aphostropy error check! - fixed!
 	jstrescapecpy(t_name, dat);
 	printf("making new char -");
@@ -1092,6 +1181,10 @@ int make_new_char_sql(int fd, unsigned char *dat) {
 	if (mysql_query(&mysql_handle, tmp_sql)) {
 		printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle));
 	}
+
+	// Insert friends list
+	insert_friends(char_id_count);
+
 	printf("making new char success - id:(\033[1;32m%d\033[0m\tname:\033[1;32%s\033[0m\n", char_id_count, t_name);
 	return char_id_count;
 }