Files
Orbis-Suite-3.0/Playstation/OrbisLibAPI/AppDatabase.cpp
T

181 lines
3.7 KiB
C++

#include "Common.h"
#include "AppDatabase.h"
#include "sqlite3.h"
sqlite3* AppDatabase::OpenDatabase()
{
sqlite3* db;
auto res = sqlite3_open("/system_data/priv/mms/app.db", &db);
if (res != SQLITE_OK)
{
klog("OpenDatabase(): Failed because %s\n", sqlite3_errmsg(db));
return nullptr;
}
else
{
return db;
}
}
const char* GetText(sqlite3_stmt* stmt, int column)
{
auto res = sqlite3_column_text(stmt, column);
if (res != 0)
{
return (const char*)res;
}
return "";
}
bool AppDatabase::GetApps(std::vector<AppInfo> &Apps)
{
int res;
auto db = OpenDatabase();
if (db == nullptr)
{
return false;
}
// Get the current user id.
int ForegroundAccountId;
sceUserServiceGetForegroundUser(&ForegroundAccountId);
// build statement.
char query[0x200];
snprintf(query, sizeof(query), "SELECT * FROM tbl_appbrowse_0%i", ForegroundAccountId);
// Prepare statement.
sqlite3_stmt* stmt;
res = sqlite3_prepare(db, query, -1, &stmt, NULL);
if (res != SQLITE_OK)
{
klog("sqlite3_prepare(): Failed because %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return false;
}
// Execute step until all rows are read.
while ((res = sqlite3_step(stmt)) == SQLITE_ROW)
{
AppInfo info;
strcpy(info.TitleId, GetText(stmt, 0));
strcpy(info.ContentId, GetText(stmt, 1));
strcpy(info.TitleName, GetText(stmt, 2));
strcpy(info.MetaDataPath, GetText(stmt, 3));
strcpy(info.LastAccessTime, GetText(stmt, 4));
info.Visible = sqlite3_column_int(stmt, 8);
info.SortPriority = sqlite3_column_int(stmt, 9);
info.DispLocation = sqlite3_column_int(stmt, 12);
info.CanRemove = sqlite3_column_int(stmt, 13) == 1;
strcpy(info.Category, GetText(stmt, 14));
info.ContentSize = sqlite3_column_int(stmt, 22);
strcpy(info.InstallDate, GetText(stmt, 23));
strcpy(info.UICategory, GetText(stmt, 25));
Apps.push_back(info);
}
if (res != SQLITE_DONE) {
printf("GetApps(): Res %d Error: %s\n", res, sqlite3_errmsg(db));
}
// Release resources.
sqlite3_finalize(stmt);
sqlite3_close(db);
return true;
}
bool AppDatabase::GetAppInfoString(const char* TitleId, char* Out, size_t OutSize, const char* Key)
{
int res;
auto db = OpenDatabase();
if (db == nullptr)
{
return false;
}
// build statement.
char query[0x200];
snprintf(query, sizeof(query), "SELECT * FROM tbl_appinfo WHERE titleId='%s' AND key='%s'", TitleId, Key);
// Prepare statement.
sqlite3_stmt* stmt;
res = sqlite3_prepare(db, query, -1, &stmt, NULL);
if (res != SQLITE_OK)
{
klog("sqlite3_prepare(): Failed because %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return false;
}
res = sqlite3_step(stmt);
if (res == SQLITE_ROW)
{
strlcpy(Out, GetText(stmt, 2), OutSize);
// Release resources.
sqlite3_finalize(stmt);
sqlite3_close(db);
return true;
}
if (res != SQLITE_DONE) {
printf("GetApps(): Res %d Error: %s\n", res, sqlite3_errmsg(db));
}
// Release resources.
sqlite3_finalize(stmt);
sqlite3_close(db);
return false;
}
bool AppDatabase::SetVisibility(const char* TitleId, VisibilityType Visibility)
{
int res;
auto db = OpenDatabase();
if (db == nullptr)
{
return false;
}
// Get the current user id.
int ForegroundAccountId;
sceUserServiceGetForegroundUser(&ForegroundAccountId);
// build statement.
char query[0x200];
snprintf(query, sizeof(query), "UPDATE tbl_appbrowse_0%i SET visible=%i WHERE titleId='%s'", ForegroundAccountId, Visibility, TitleId);
// Execute Statement.
res = sqlite3_exec(db, query, nullptr, nullptr, nullptr);
if (res != SQLITE_OK)
{
klog("sqlite3_exec(): Failed because %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return false;
}
// Release resources.
sqlite3_close(db);
return true;
}
AppDatabase::AppDatabase()
{
}
AppDatabase::~AppDatabase()
{
}