#include "datoriginalfilesdatabase.h" #include #include DatOriginalFilesDatabase::DatOriginalFilesDatabase(QString database_path) { orig_files_db = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE", database_path)); _add_file_prepared_query = new QSqlQuery(*orig_files_db); orig_files_db->setDatabaseName(database_path); orig_files_db->open(); orig_files_db->exec(_create_database_query); orig_files_db->exec("PRAGMA synchronous = OFF"); orig_files_db->exec("PRAGMA count_changes = OFF"); orig_files_db->exec("PRAGMA journal_mode = MEMORY"); orig_files_db->exec("PRAGMA temp_store = MEMORY"); orig_files_db->exec("PRAGMA encoding = \"UTF-8\";"); _add_file_prepared_query->prepare(_add_file_query); } DatOriginalFilesDatabase::~DatOriginalFilesDatabase() { const QString connection_name = orig_files_db->connectionName(); closeDatabase(); delete _add_file_prepared_query; delete orig_files_db; QSqlDatabase::removeDatabase(connection_name); } void DatOriginalFilesDatabase::addFile(int file_id, int dat_id, int version, int iteration, const LOTRO_DAT::SubfileData &data) { std::stringstream options_stream; options_stream << data.options; const QString options = QString::fromStdString(options_stream.str()); _add_file_prepared_query->bindValue(":file_id", file_id); _add_file_prepared_query->bindValue(":dat_id", dat_id); _add_file_prepared_query->bindValue(":version", version); _add_file_prepared_query->bindValue(":iteration", iteration); _add_file_prepared_query->bindValue(":options", options); _add_file_prepared_query->bindValue(":binary_data", QByteArray(reinterpret_cast(data.binary_data.data()), data.binary_data.size())); _add_file_prepared_query->bindValue(":text_data", QString::fromStdU16String(data.text_data)); if (!_add_file_prepared_query->exec()) { qWarning() << _add_file_prepared_query->lastError(); } } bool DatOriginalFilesDatabase::getFile(int file_id, int &dat_id, int &version, int &iteration, LOTRO_DAT::SubfileData &data) { QSqlQuery get_file_query(*orig_files_db); get_file_query.exec(_get_file_query.arg(file_id)); if (!get_file_query.next()) { return false; } dat_id = get_file_query.value(1).toInt(); version = get_file_query.value(2).toInt(); iteration = get_file_query.value(3).toInt(); const QString options = QString::fromUtf8(get_file_query.value(4).toByteArray()); data.options = YAML::Load(options.toStdString()); const QByteArray binary_data = get_file_query.value(5).toByteArray(); data.binary_data = LOTRO_DAT::BinaryData(binary_data.data(), binary_data.size()); data.text_data = QString::fromUtf8(get_file_query.value(6).toByteArray()).toStdU16String(); return true; } bool DatOriginalFilesDatabase::fileExists(int file_id) { QSqlQuery get_file_query(*orig_files_db); get_file_query.exec(_get_file_query.arg(file_id)); return get_file_query.next(); } size_t DatOriginalFilesDatabase::getRowsCount() { QSqlQuery count_all_rows_query(*orig_files_db); count_all_rows_query.exec(_count_all_rows_query); count_all_rows_query.next(); return count_all_rows_query.value(0).toInt(); } void DatOriginalFilesDatabase::removeDatabase() { orig_files_db->close(); QFile::remove(orig_files_db->databaseName()); } void DatOriginalFilesDatabase::closeDatabase() { orig_files_db->commit(); orig_files_db->close(); } void DatOriginalFilesDatabase::performOperationOnAllFiles(const DatOriginalFilesDatabase::FileOperation &operation) { QSqlQuery get_all_rows_query(*orig_files_db); get_all_rows_query.exec(_get_all_files_query); while (get_all_rows_query.next()) { int file_id = get_all_rows_query.value(0).toInt(); int dat_id = get_all_rows_query.value(1).toInt(); int version = get_all_rows_query.value(2).toInt(); int iteration = get_all_rows_query.value(3).toInt(); LOTRO_DAT::SubfileData data; const QString options = QString::fromUtf8(get_all_rows_query.value(4).toByteArray()); data.options = YAML::Load(options.toStdString()); const QByteArray binary_data = get_all_rows_query.value(5).toByteArray(); data.binary_data = LOTRO_DAT::BinaryData(binary_data.data(), binary_data.size()); data.text_data = QString::fromUtf8(get_all_rows_query.value(6).toByteArray()).toStdU16String(); operation(file_id, dat_id, version, iteration, data); } }