Skip to content

Commit

Permalink
[JSON]Rework way AudioLibrary GetArtists, GetAlbums and GetSongs are …
Browse files Browse the repository at this point in the history
…implemented to be many times faster. Minor patch bump despite a significant speed improvement and fix of several bugs
  • Loading branch information
DaveTBlake committed Jul 12, 2018
1 parent c060bc7 commit e174d29
Show file tree
Hide file tree
Showing 6 changed files with 2,008 additions and 202 deletions.
76 changes: 76 additions & 0 deletions xbmc/dbwrappers/Database.cpp
Expand Up @@ -150,6 +150,82 @@ bool CDatabase::ExistsSubQuery::BuildSQL(std::string & strSQL)
return true;
}

CDatabase::DatasetLayout::DatasetLayout(size_t totalfields)
{
m_fields.resize(totalfields, DatasetFieldInfo(false, false, -1));
}

void CDatabase::DatasetLayout::SetField(int fieldNo, const std::string &strField, bool bOutput /*= false*/)
{
if (fieldNo >= 0 && fieldNo < static_cast<int>(m_fields.size()))
{
m_fields[fieldNo].strField = strField;
m_fields[fieldNo].fetch = true;
m_fields[fieldNo].output = bOutput;
}
}

void CDatabase::DatasetLayout::AdjustRecordNumbers(int offset)
{
int recno = 0;
for (auto& field : m_fields)
{
if (field.fetch)
{
field.recno = recno + offset;
++recno;
}
}
}

bool CDatabase::DatasetLayout::GetFetch(int fieldno)
{
if (fieldno >= 0 && fieldno < static_cast<int>(m_fields.size()))
return m_fields[fieldno].fetch;
return false;
}

bool CDatabase::DatasetLayout::GetOutput(int fieldno)
{
if (fieldno >= 0 && fieldno < static_cast<int>(m_fields.size()))
return m_fields[fieldno].output;
return false;
}

int CDatabase::DatasetLayout::GetRecNo(int fieldno)
{
if (fieldno >= 0 && fieldno < static_cast<int>(m_fields.size()))
return m_fields[fieldno].recno;
return -1;
}

const std::string CDatabase::DatasetLayout::GetFields()
{
std::string strSQL;
for (const auto& field : m_fields)
{
if (!field.strField.empty() && field.fetch)
{
if (strSQL.empty())
strSQL = field.strField;
else
strSQL += ", " + field.strField;
}
}

return strSQL;
}

bool CDatabase::DatasetLayout::HasFilterFields()
{
for (const auto& field : m_fields)
{
if (field.fetch)
return true;
}
return false;
}

CDatabase::CDatabase() :
m_profileManager(CServiceBroker::GetProfileManager())
{
Expand Down
30 changes: 30 additions & 0 deletions xbmc/dbwrappers/Database.h
Expand Up @@ -58,6 +58,36 @@ class CDatabase
std::string limit;
};


typedef struct DatasetFieldInfo {
DatasetFieldInfo(bool fetch, bool output, int recno)
: fetch(fetch),
output(output),
recno(recno)
{ }

bool fetch;
bool output;
int recno;
std::string strField;
} DatasetFieldInfo;

class DatasetLayout
{
public:
DatasetLayout(size_t totalfields);
void SetField(int fieldNo, const std::string &strField, bool bOutput = false);
void AdjustRecordNumbers(int offset);
bool GetFetch(int fieldno);
bool GetOutput(int fieldno);
int GetRecNo(int fieldno);
const std::string GetFields();
bool HasFilterFields();

private:
std::vector<DatasetFieldInfo> m_fields;
};

class ExistsSubQuery
{
public:
Expand Down

0 comments on commit e174d29

Please sign in to comment.