@@ -15,31 +15,20 @@ DataManager::DataManager() : _datas(32768), _strings(32768) {
1515bool DataManager::ReadDB (sqlite3* pDB) {
1616 sqlite3_stmt* pStmt = nullptr ;
1717 const char * sql = " select * from datas,texts where datas.id=texts.id" ;
18- if (sqlite3_prepare_v2 (pDB, sql, -1 , &pStmt, 0 ) != SQLITE_OK )
18+ if (sqlite3_prepare_v2 (pDB, sql, -1 , &pStmt, nullptr ) != SQLITE_OK )
1919 return Error (pDB, pStmt);
2020 wchar_t strBuffer[4096 ];
2121 int step = 0 ;
2222 do {
23- CardDataC cd;
24- CardString cs;
2523 step = sqlite3_step (pStmt);
2624 if (step == SQLITE_ROW ) {
27- cd.code = sqlite3_column_int (pStmt, 0 );
25+ uint32_t code = sqlite3_column_int (pStmt, 0 );
26+ auto & cd = _datas[code];
27+ cd.code = code;
2828 cd.ot = sqlite3_column_int (pStmt, 1 );
2929 cd.alias = sqlite3_column_int (pStmt, 2 );
3030 uint64_t setcode = static_cast <uint64_t >(sqlite3_column_int64 (pStmt, 3 ));
31- if (setcode) {
32- auto it = extra_setcode.find (cd.code );
33- if (it != extra_setcode.end ()) {
34- int len = it->second .size ();
35- if (len > SIZE_SETCODE )
36- len = SIZE_SETCODE ;
37- if (len)
38- std::memcpy (cd.setcode , it->second .data (), len * sizeof (uint16_t ));
39- }
40- else
41- cd.set_setcode (setcode);
42- }
31+ write_setcode (cd.setcode , setcode);
4332 cd.type = static_cast <decltype (cd.type )>(sqlite3_column_int64 (pStmt, 4 ));
4433 cd.attack = sqlite3_column_int (pStmt, 5 );
4534 cd.defense = sqlite3_column_int (pStmt, 6 );
@@ -56,7 +45,7 @@ bool DataManager::ReadDB(sqlite3* pDB) {
5645 cd.race = static_cast <decltype (cd.race )>(sqlite3_column_int64 (pStmt, 8 ));
5746 cd.attribute = static_cast <decltype (cd.attribute )>(sqlite3_column_int64 (pStmt, 9 ));
5847 cd.category = static_cast <decltype (cd.category )>(sqlite3_column_int64 (pStmt, 10 ));
59- _datas[cd. code ] = cd ;
48+ auto & cs = _strings[code] ;
6049 if (const char * text = (const char *)sqlite3_column_text (pStmt, 12 )) {
6150 BufferIO::DecodeUTF8 (text, strBuffer);
6251 cs.name = strBuffer;
@@ -72,12 +61,21 @@ bool DataManager::ReadDB(sqlite3* pDB) {
7261 cs.desc [i] = strBuffer;
7362 }
7463 }
75- _strings[cd.code ] = cs;
7664 }
7765 else if (step != SQLITE_DONE )
7866 return Error (pDB, pStmt);
7967 } while (step == SQLITE_ROW );
8068 sqlite3_finalize (pStmt);
69+ for (const auto & entry : extra_setcode) {
70+ const auto & code = entry.first ;
71+ const auto & list = entry.second ;
72+ if (list.size () > SIZE_SETCODE || list.empty ())
73+ continue ;
74+ auto it = _datas.find (code);
75+ if (it == _datas.end ())
76+ continue ;
77+ std::memcpy (it->second .setcode , list.data (), list.size () * sizeof (uint16_t ));
78+ }
8179 return true ;
8280}
8381bool DataManager::LoadDB (const wchar_t * wfile) {
@@ -172,10 +170,10 @@ bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) {
172170 sqlite3_finalize (pStmt);
173171 return false ;
174172}
175- code_pointer DataManager::GetCodePointer (unsigned int code) const {
173+ code_pointer DataManager::GetCodePointer (uint32_t code) const {
176174 return _datas.find (code);
177175}
178- string_pointer DataManager::GetStringPointer (unsigned int code) const {
176+ string_pointer DataManager::GetStringPointer (uint32_t code) const {
179177 return _strings.find (code);
180178}
181179code_pointer DataManager::datas_begin () const {
@@ -190,16 +188,16 @@ string_pointer DataManager::strings_begin() const {
190188string_pointer DataManager::strings_end () const {
191189 return _strings.cend ();
192190}
193- bool DataManager::GetData (unsigned int code, CardData* pData) const {
191+ bool DataManager::GetData (uint32_t code, CardData* pData) const {
194192 auto cdit = _datas.find (code);
195193 if (cdit == _datas.end ())
196194 return false ;
197195 if (pData) {
198- * pData = cdit->second ;
196+ std::memcpy ( pData, & cdit->second , sizeof (CardData)) ;
199197 }
200198 return true ;
201199}
202- bool DataManager::GetString (unsigned int code, CardString* pStr) const {
200+ bool DataManager::GetString (uint32_t code, CardString* pStr) const {
203201 auto csit = _strings.find (code);
204202 if (csit == _strings.end ()) {
205203 pStr->name = unknown_string;
@@ -209,23 +207,23 @@ bool DataManager::GetString(unsigned int code, CardString* pStr) const {
209207 *pStr = csit->second ;
210208 return true ;
211209}
212- const wchar_t * DataManager::GetName (unsigned int code) const {
210+ const wchar_t * DataManager::GetName (uint32_t code) const {
213211 auto csit = _strings.find (code);
214212 if (csit == _strings.end ())
215213 return unknown_string;
216214 if (!csit->second .name .empty ())
217215 return csit->second .name .c_str ();
218216 return unknown_string;
219217}
220- const wchar_t * DataManager::GetText (unsigned int code) const {
218+ const wchar_t * DataManager::GetText (uint32_t code) const {
221219 auto csit = _strings.find (code);
222220 if (csit == _strings.end ())
223221 return unknown_string;
224222 if (!csit->second .text .empty ())
225223 return csit->second .text .c_str ();
226224 return unknown_string;
227225}
228- const wchar_t * DataManager::GetDesc (unsigned int strCode) const {
226+ const wchar_t * DataManager::GetDesc (uint32_t strCode) const {
229227 if (strCode < (MIN_CARD_ID << 4 ))
230228 return GetSysString (strCode);
231229 unsigned int code = (strCode >> 4 ) & 0x0fffffff ;
0 commit comments