/// create a new account entry /// If acc->account_id is -1, the account id will be auto-generated, /// and its value will be written to acc->account_id if everything succeeds. static bool account_db_sql_create(AccountDB* self, struct mmo_account* acc) { AccountDB_SQL* db = (AccountDB_SQL*)self; Sql* sql_handle; // decide on the account id to assign int account_id; nullpo_ret(db); nullpo_ret(acc); sql_handle = db->accounts; if( acc->account_id != -1 ) {// caller specifies it manually account_id = acc->account_id; } else {// ask the database char* data; size_t len; if( SQL_SUCCESS != SQL->Query(sql_handle, "SELECT MAX(`account_id`)+1 FROM `%s`", db->account_db) ) { Sql_ShowDebug(sql_handle); return false; } if( SQL_SUCCESS != SQL->NextRow(sql_handle) ) { Sql_ShowDebug(sql_handle); SQL->FreeResult(sql_handle); return false; } SQL->GetData(sql_handle, 0, &data, &len); account_id = ( data != NULL ) ? atoi(data) : 0; SQL->FreeResult(sql_handle); if( account_id < START_ACCOUNT_NUM ) account_id = START_ACCOUNT_NUM; } // zero value is prohibited if( account_id == 0 ) return false; // absolute maximum if( account_id > END_ACCOUNT_NUM ) return false; // insert the data into the database acc->account_id = account_id; return mmo_auth_tosql(db, acc, true); }
/// update an existing account with the provided new data (both account and regs) static bool account_db_sql_save(AccountDB* self, const struct mmo_account* acc) { AccountDB_SQL* db = (AccountDB_SQL*)self; return mmo_auth_tosql(db, acc, false); }