datoriginalfilesdatabase.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "datoriginalfilesdatabase.h"
  2. #include <QSqlError>
  3. #include <string>
  4. DatOriginalFilesDatabase::DatOriginalFilesDatabase(QString database_path) {
  5. orig_files_db = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE", database_path));
  6. _add_file_prepared_query = new QSqlQuery(*orig_files_db);
  7. orig_files_db->setDatabaseName(database_path);
  8. orig_files_db->open();
  9. orig_files_db->exec(_create_database_query);
  10. orig_files_db->exec("PRAGMA synchronous = OFF");
  11. orig_files_db->exec("PRAGMA count_changes = OFF");
  12. orig_files_db->exec("PRAGMA journal_mode = MEMORY");
  13. orig_files_db->exec("PRAGMA temp_store = MEMORY");
  14. orig_files_db->exec("PRAGMA encoding = \"UTF-8\";");
  15. _add_file_prepared_query->prepare(_add_file_query);
  16. }
  17. DatOriginalFilesDatabase::~DatOriginalFilesDatabase() {
  18. const QString connection_name = orig_files_db->connectionName();
  19. closeDatabase();
  20. delete _add_file_prepared_query;
  21. delete orig_files_db;
  22. QSqlDatabase::removeDatabase(connection_name);
  23. }
  24. void DatOriginalFilesDatabase::addFile(int file_id, int dat_id, int version, int iteration, const LOTRO_DAT::SubfileData &data) {
  25. std::stringstream options_stream;
  26. options_stream << data.options;
  27. const QString options = QString::fromStdString(options_stream.str());
  28. _add_file_prepared_query->bindValue(":file_id", file_id);
  29. _add_file_prepared_query->bindValue(":dat_id", dat_id);
  30. _add_file_prepared_query->bindValue(":version", version);
  31. _add_file_prepared_query->bindValue(":iteration", iteration);
  32. _add_file_prepared_query->bindValue(":options", options);
  33. _add_file_prepared_query->bindValue(":binary_data", QByteArray(reinterpret_cast<char*>(data.binary_data.data()), data.binary_data.size()));
  34. _add_file_prepared_query->bindValue(":text_data", QString::fromStdU16String(data.text_data));
  35. if (!_add_file_prepared_query->exec()) {
  36. qWarning() << _add_file_prepared_query->lastError();
  37. }
  38. }
  39. bool DatOriginalFilesDatabase::getFile(int file_id, int &dat_id, int &version, int &iteration, LOTRO_DAT::SubfileData &data) {
  40. QSqlQuery get_file_query(*orig_files_db);
  41. get_file_query.exec(_get_file_query.arg(file_id));
  42. if (!get_file_query.next()) {
  43. return false;
  44. }
  45. dat_id = get_file_query.value(1).toInt();
  46. version = get_file_query.value(2).toInt();
  47. iteration = get_file_query.value(3).toInt();
  48. const QString options = QString::fromUtf8(get_file_query.value(4).toByteArray());
  49. data.options = YAML::Load(options.toStdString());
  50. const QByteArray binary_data = get_file_query.value(5).toByteArray();
  51. data.binary_data = LOTRO_DAT::BinaryData(binary_data.data(), binary_data.size());
  52. data.text_data = QString::fromUtf8(get_file_query.value(6).toByteArray()).toStdU16String();
  53. return true;
  54. }
  55. bool DatOriginalFilesDatabase::fileExists(int file_id) {
  56. QSqlQuery get_file_query(*orig_files_db);
  57. get_file_query.exec(_get_file_query.arg(file_id));
  58. return get_file_query.next();
  59. }
  60. size_t DatOriginalFilesDatabase::getRowsCount()
  61. {
  62. QSqlQuery count_all_rows_query(*orig_files_db);
  63. count_all_rows_query.exec(_count_all_rows_query);
  64. count_all_rows_query.next();
  65. return count_all_rows_query.value(0).toInt();
  66. }
  67. void DatOriginalFilesDatabase::removeDatabase() {
  68. orig_files_db->close();
  69. QFile::remove(orig_files_db->databaseName());
  70. }
  71. void DatOriginalFilesDatabase::closeDatabase() {
  72. orig_files_db->commit();
  73. orig_files_db->close();
  74. }
  75. void DatOriginalFilesDatabase::performOperationOnAllFiles(const DatOriginalFilesDatabase::FileOperation &operation)
  76. {
  77. QSqlQuery get_all_rows_query(*orig_files_db);
  78. get_all_rows_query.exec(_get_all_files_query);
  79. while (get_all_rows_query.next()) {
  80. int file_id = get_all_rows_query.value(0).toInt();
  81. int dat_id = get_all_rows_query.value(1).toInt();
  82. int version = get_all_rows_query.value(2).toInt();
  83. int iteration = get_all_rows_query.value(3).toInt();
  84. LOTRO_DAT::SubfileData data;
  85. const QString options = QString::fromUtf8(get_all_rows_query.value(4).toByteArray());
  86. data.options = YAML::Load(options.toStdString());
  87. const QByteArray binary_data = get_all_rows_query.value(5).toByteArray();
  88. data.binary_data = LOTRO_DAT::BinaryData(binary_data.data(), binary_data.size());
  89. data.text_data = QString::fromUtf8(get_all_rows_query.value(6).toByteArray()).toStdU16String();
  90. operation(file_id, dat_id, version, iteration, data);
  91. }
  92. }