Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dbcsql #442

Open
wants to merge 28 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
dd7f026
Load DBC from databases WiP
cyberium Mar 4, 2021
df604c0
"Templatize" SQLStorage class.
cyberium Mar 4, 2021
7f605f2
Reneame SQLStorage::GetRecordCount to GetNumRows
cyberium Mar 4, 2021
3388c8e
Templatize SQLHashStorage and SQLMultiStorage
cyberium Mar 4, 2021
abb5a20
Improve SqlStorageBase iterator class
cyberium Mar 5, 2021
70bb5a1
Change sCreatureStorage and sGOStorage loop format
cyberium Mar 5, 2021
b3e9bbb
Convert more SQLStorages loop
cyberium Mar 5, 2021
d80a6d6
Should fix template build
cyberium Mar 5, 2021
5c6b4fa
Fix PlayerBot build
cyberium Mar 6, 2021
90b7002
Use sDBCAreaTable store.
cyberium Mar 8, 2021
5fe6b3a
Implement sql storage n and d format
cyberium Mar 9, 2021
4fa514e
Adjust SQLStorage format and constructor
cyberium Mar 9, 2021
c0042e6
Convert some more loop of sDBCAreaTable
cyberium Mar 9, 2021
ae932f4
sDBCAreaTrigger
cyberium Mar 9, 2021
43db956
sDBCAuctionHouse
cyberium Mar 9, 2021
5899480
sDBCBankBagSlotPrices
cyberium Mar 9, 2021
92156aa
sDBCBattlemasterList
cyberium Mar 9, 2021
58f61e4
sDBCCharStartOutfit
cyberium Mar 9, 2021
7f60374
sDBCCharTitles
cyberium Mar 9, 2021
0aaaf81
sDBCChatChannels
cyberium Mar 9, 2021
685c42a
fix build
cyberium Mar 9, 2021
773afe0
sDBCChrClasses
cyberium Mar 9, 2021
f58ff97
Batch of dbc store convertion from file to db
cyberium Mar 9, 2021
84ba747
Some fixes to make it run again.
cyberium Mar 9, 2021
413b280
More loop convertion
cyberium Mar 9, 2021
0f8dc64
Moving code and removing DBCStore code
cyberium Mar 10, 2021
946a969
Just some allignements
cyberium Mar 10, 2021
cc47b14
Store renaming
cyberium Mar 10, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Implement sql storage n and d format
Now we are able to define the index in the format and it can not be the first column.
This is needed for AreaTable. However we might need to double check why its done that way for that table.

Rremoved the need to define the name of the column as an index because code can find it using the provided format.

Added the support for table that have no index like gtcombatratings.
  • Loading branch information
cyberium committed Mar 12, 2021
commit 5fe6b3a90beefa92ad315c450503c9bf82a40d46
1 change: 1 addition & 0 deletions src/shared/Database/SQLStorage.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ class SQLStorage : public SQLStorageBase<ST>

public:
SQLStorage(const char* fmt, const char* _entry_field, const char* sqlname);
SQLStorage(const char* fmt, const char* sqlname);

SQLStorage(const char* src_fmt, const char* dst_fmt, const char* _entry_field, const char* sqlname);

Expand Down
122 changes: 106 additions & 16 deletions src/shared/Database/SQLStorageImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "ProgressBar.h"
#include "Log.h"
#include "DBCFileLoader.h"
#include <string>

template<class DerivedLoader, class StorageClass>
template<class S, class D> // S source-type, D destination-type
Expand Down Expand Up @@ -129,6 +130,7 @@ void SQLStorageLoaderBase<DerivedLoader, StorageClass>::storeValue(V value, Stor
offset += sizeof(char);
break;
case FT_INT:
case FT_IND:
subclass->convert(x, value, *((uint32*)(&p[offset])));
offset += sizeof(uint32);
break;
Expand Down Expand Up @@ -156,7 +158,6 @@ void SQLStorageLoaderBase<DerivedLoader, StorageClass>::storeValue(V value, Stor
subclass->default_fill(x, value, *((uint64*)(&p[offset])));
offset += sizeof(uint64);
break;
case FT_IND:
case FT_SORT:
assert(false && "SQL storage not have sort field types");
break;
Expand All @@ -181,6 +182,7 @@ void SQLStorageLoaderBase<DerivedLoader, StorageClass>::storeValue(char const* v
offset += sizeof(char);
break;
case FT_INT:
case FT_IND:
subclass->convert_from_str(x, value, *((uint32*)(&p[offset])));
offset += sizeof(uint32);
break;
Expand All @@ -200,7 +202,6 @@ void SQLStorageLoaderBase<DerivedLoader, StorageClass>::storeValue(char const* v
subclass->convert_from_str(x, value, *((uint64*)(&p[offset])));
offset += sizeof(uint64);
break;
case FT_IND:
case FT_SORT:
assert(false && "SQL storage not have sort field types");
break;
Expand All @@ -213,30 +214,103 @@ void SQLStorageLoaderBase<DerivedLoader, StorageClass>::storeValue(char const* v
template<class DerivedLoader, class StorageClass>
void SQLStorageLoaderBase<DerivedLoader, StorageClass>::Load(StorageClass& store, bool error_at_empty /*= true*/)
{
Field* fields = nullptr;
QueryResult* result = WorldDatabase.PQuery("SELECT MAX(%s) FROM %s", store.EntryFieldName(), store.GetTableName());
QueryResult* result = WorldDatabase.PQuery("SHOW COLUMNS FROM %s", store.GetTableName());
if (!result)
{
sLog.outError("Error loading %s table (not exist?)\n", store.GetTableName());
Log::WaitBeforeContinueIfNeed();
exit(1); // Stop server at loading non exited table or not accessable table
}

uint32 maxRecordId = (*result)[0].GetUInt32() + 1;
std::vector<std::string> colNameList;
colNameList.reserve(result->GetRowCount());
do
{
Field* fields = result->Fetch();
colNameList.push_back(fields[0].GetString());
} while (result->NextRow());

delete result;

int32 indexPos = -1;
std::string indexName = store.EntryFieldName();
if (indexName.empty())
{
for (int32 i = 0; i < int32(store.GetDstFieldCount()); ++i)
{
auto format = store.GetSrcFormat(i);
if (format == FT_IND || format == FT_SORT)
{
indexPos = i;
break;
}
}

if (indexPos >= 0)
{
if (indexPos >= colNameList.size())
{
sLog.outError("Error loading %s table, provided index position is greater than column number\n", store.GetTableName());
Log::WaitBeforeContinueIfNeed();
exit(1);
}
indexName = colNameList[indexPos];
}
}
else
{
std::transform(indexName.begin(), indexName.end(), indexName.begin(), [](char c) { return std::tolower(c); });
for (uint32 i = 0; i < colNameList.size(); ++i)
{
std::string colName = colNameList[i];
std::transform(colName.begin(), colName.end(), colName.begin(), [](char c) { return std::tolower(c); });
if (indexName == colName)
{
indexName = colNameList[i];
indexPos = i;
break;
}
}

if (indexPos < 0)
{
sLog.outError("Error loading %s table (Entry field is not found in column name list)\n", store.GetTableName());
Log::WaitBeforeContinueIfNeed();
exit(1);
}
}

Field* fields = nullptr;
uint32 maxRecordId = 0;
uint32 recordCount = 0;
uint32 recordsize = 0;
delete result;

result = WorldDatabase.PQuery("SELECT COUNT(*) FROM %s", store.GetTableName());
if (result)
{
fields = result->Fetch();
recordCount = fields[0].GetUInt32();
recordCount = result[0][0].GetUInt32();
delete result;
}

result = WorldDatabase.PQuery("SELECT * FROM %s", store.GetTableName());
if (indexPos < 0)
{
maxRecordId = recordCount;
}
else
{
result = WorldDatabase.PQuery("SELECT MAX(%s) FROM %s", indexName.c_str(), store.GetTableName());
if (!result)
{
sLog.outError("Error loading %s table (not exist?)\n", store.GetTableName());
Log::WaitBeforeContinueIfNeed();
exit(1); // Stop server at loading non exited table or not accessable table
}

maxRecordId = (*result)[0].GetUInt32() + 1;
delete result;
}

result = WorldDatabase.PQuery("SELECT * FROM %s", store.GetTableName());
if (!result)
{
if (error_at_empty)
Expand All @@ -245,6 +319,7 @@ void SQLStorageLoaderBase<DerivedLoader, StorageClass>::Load(StorageClass& store
sLog.outString("%s table is empty!\n", store.GetTableName());

recordCount = 0;
maxRecordId = 0;
return;
}

Expand All @@ -268,6 +343,7 @@ void SQLStorageLoaderBase<DerivedLoader, StorageClass>::Load(StorageClass& store
case FT_BYTE:
recordsize += sizeof(char); break;
case FT_INT:
case FT_IND:
recordsize += sizeof(uint32); break;
case FT_FLOAT:
recordsize += sizeof(float); break;
Expand All @@ -283,9 +359,7 @@ void SQLStorageLoaderBase<DerivedLoader, StorageClass>::Load(StorageClass& store
recordsize += sizeof(char*); break;
case FT_64BITINT:
recordsize += sizeof(uint64); break;
case FT_IND:
case FT_SORT:
assert(false && "SQL storage not have sort field types");
break;
default:
assert(false && "unknown format character");
Expand All @@ -296,13 +370,20 @@ void SQLStorageLoaderBase<DerivedLoader, StorageClass>::Load(StorageClass& store
// Prepare data storage and lookup storage
store.prepareToLoad(maxRecordId, recordCount, recordsize);

uint32 generatedId = 0;
BarGoLink bar(recordCount);
do
{
fields = result->Fetch();
bar.step();

char* record = store.createRecord(fields[0].GetUInt32());
uint32 id = 0;
if (indexPos < 0)
id = generatedId++;
else
id = fields[indexPos].GetUInt32();

char* record = store.createRecord(id);
offset = 0;

// dependend on dest-size
Expand Down Expand Up @@ -330,17 +411,20 @@ void SQLStorageLoaderBase<DerivedLoader, StorageClass>::Load(StorageClass& store
{
case FT_LOGIC: storeValue((bool)(fields[y].GetUInt32() > 0), store, record, x, offset); ++x; break;
case FT_BYTE: storeValue((char)fields[y].GetUInt8(), store, record, x, offset); ++x; break;
case FT_IND:
case FT_INT: storeValue((uint32)fields[y].GetUInt32(), store, record, x, offset); ++x; break;
case FT_FLOAT: storeValue((float)fields[y].GetFloat(), store, record, x, offset); ++x; break;
case FT_STRING: storeValue((char const*)fields[y].GetString(), store, record, x, offset); ++x; break;
case FT_64BITINT: storeValue(fields[y].GetUInt64(), store, record, x, offset); ++x; break;
case FT_SORT:
++x;
break;

case FT_NA:
case FT_NA_BYTE:
case FT_NA_FLOAT:
// Do Not increase x
break;
case FT_IND:
case FT_SORT:
case FT_NA_POINTER:
assert(false && "SQL storage not have sort or pointer field types");
break;
Expand Down Expand Up @@ -378,6 +462,13 @@ void SQLStorage<ST>::Load(bool error_at_empty /*= true*/)
loader.Load(*this, error_at_empty);
}

template<typename ST>
SQLStorage<ST>::SQLStorage(const char* fmt, const char* sqlname)
{
SQLStorage<ST>::Initialize(sqlname, "",fmt, fmt);
m_Index = nullptr;
}

template<typename ST>
SQLStorage<ST>::SQLStorage(const char* fmt, const char* _entry_field, const char* sqlname)
{
Expand Down Expand Up @@ -479,6 +570,7 @@ void SQLStorageBase<ST>::Free()
break;
}
case FT_NA:
case FT_IND:
case FT_INT:
offset += sizeof(uint32);
break;
Expand All @@ -497,9 +589,7 @@ void SQLStorageBase<ST>::Free()
case FT_64BITINT:
offset += sizeof(uint64);
break;
case FT_IND:
case FT_SORT:
assert(false && "SQL storage not have sort field types");
break;
default:
assert(false && "unknown format character");
Expand Down