- Fixed main.sql adding a key on char_id rather than account_id for the char table.

- Cleaned up character saving in char-sql, it no longer needs to query the database to see if the player exists on each char-save, instead it checks the received data against the online-players db. 
- Added an error message on the char-server when the received player data size does not matches with the expected size (should avoid the crash that happens on such a memcpy).


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@7160 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2006-06-14 14:18:30 +00:00
parent af566f8991
commit e74e095778
4 changed files with 27 additions and 21 deletions

View File

@ -4,6 +4,15 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2006/06/14 2006/06/14
* Fixed main.sql adding a key on char_id rather than account_id for the
char table. [Skotlex]
* Cleaned up character saving in char-sql, it no longer needs to query the
database to see if the player exists on each char-save, instead it checks
the received data against the online-players db. No such fix is required
for char-txt. [Skotlex]
* Added an error message on the char-server when the received player data
size does not matches with the expected size (should avoid the crash that
happens on such a memcpy). [Skotlex]
* [Improved]: * [Improved]:
- script_save_mapreg for MapregSQL Saving to display perfomance only in slow - script_save_mapreg for MapregSQL Saving to display perfomance only in slow
queries. [Lance] queries. [Lance]

View File

@ -78,7 +78,7 @@ CREATE TABLE `char` (
`child` int(11) unsigned NOT NULL default '0', `child` int(11) unsigned NOT NULL default '0',
`fame` int(11) unsigned NOT NULL default '0', `fame` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`char_id`), PRIMARY KEY (`char_id`),
KEY `char_id` (`char_id`), KEY `account_id` (`account_id`),
KEY `party_id` (`party_id`), KEY `party_id` (`party_id`),
KEY `guild_id` (`guild_id`) KEY `guild_id` (`guild_id`)
) TYPE=InnoDB AUTO_INCREMENT=150000; ) TYPE=InnoDB AUTO_INCREMENT=150000;

View File

@ -2690,9 +2690,8 @@ int parse_frommap(int fd) {
} }
if (i != char_num) if (i != char_num)
memcpy(&char_dat[i].status, RFIFOP(fd,13), sizeof(struct mmo_charstatus)); memcpy(&char_dat[i].status, RFIFOP(fd,13), sizeof(struct mmo_charstatus));
if (RFIFOB(fd,12)) { //Flag, set character offline. [Skotlex] if (RFIFOB(fd,12)) //Flag, set character offline. [Skotlex]
set_char_offline(RFIFOL(fd,8),RFIFOL(fd,4)); set_char_offline(RFIFOL(fd,8),RFIFOL(fd,4));
}
RFIFOSKIP(fd,RFIFOW(fd,2)); RFIFOSKIP(fd,RFIFOW(fd,2));
break; break;

View File

@ -2548,29 +2548,27 @@ int parse_frommap(int fd) {
if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
return 0; return 0;
{ {
int aid = RFIFOL(fd,4), cid = RFIFOL(fd,8); int aid = RFIFOL(fd,4), cid = RFIFOL(fd,8), size = RFIFOW(fd,2);
i = 0; struct online_char_data* character;
//check account if (size - 13 != sizeof(struct mmo_charstatus))
sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",char_db, aid, cid); // TBR {
if (mysql_query(&mysql_handle, tmp_sql)) { ShowError("parse_from_map (save-char): Size mismatch! %d != %d\n", size-13, sizeof(struct mmo_charstatus));
ShowSQL("DB error - %s\n",mysql_error(&mysql_handle)); RFIFOSKIP(fd,size);
ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); break;
} }
sql_res = mysql_store_result(&mysql_handle); //Check account
sql_row = sql_res?mysql_fetch_row(sql_res):NULL; if (
if (sql_row) i = atoi(sql_row[0]); (character = idb_get(online_char_db, aid)) != NULL &&
if (sql_res) mysql_free_result(sql_res); character->char_id == cid)
{
if (i == 1) {
memcpy(&char_dat[0], RFIFOP(fd,13), sizeof(struct mmo_charstatus)); memcpy(&char_dat[0], RFIFOP(fd,13), sizeof(struct mmo_charstatus));
mmo_char_tosql(cid, char_dat); mmo_char_tosql(cid, char_dat);
//save to DB
} else } else
ShowError("parse_from_map (save-char): Received data for non-existant character (%d:%d)!\n", aid, cid); ShowError("parse_from_map (save-char): Received data for non-existant/offline character (%d:%d)!\n", aid, cid);
if (RFIFOB(fd,12)) { //Flag? Set character offline after saving [Skotlex]
if (RFIFOB(fd,12)) //Flag? Set character offline after saving [Skotlex]
set_char_offline(cid, aid); set_char_offline(cid, aid);
} RFIFOSKIP(fd,size);
RFIFOSKIP(fd,RFIFOW(fd,2));
break; break;
} }
// req char selection // req char selection