Bladeren bron

Added exporting sigle file to database

Ivan Arkhipov 5 jaren geleden
bovenliggende
commit
5e8cceb201
2 gewijzigde bestanden met toevoegingen van 44 en 1 verwijderingen
  1. 2 0
      include/DatSubsystems/DatExporter.h
  2. 42 1
      src/DatSubsystems/DatExporter.cpp

+ 2 - 0
include/DatSubsystems/DatExporter.h

@@ -36,6 +36,8 @@ namespace LOTRO_DAT {
 
         DatOperationResult<int> ExtractAllFilesByType(const FILE_TYPE &type, Database *db);
 
+        DatOperationResult<> ExtractFileById(long long file_id, Database *db);
+
     private:
         DatOperationResult<> WriteStringToFile(const std::u16string &str, const std::string &path);
 

+ 42 - 1
src/DatSubsystems/DatExporter.cpp

@@ -151,6 +151,48 @@ namespace LOTRO_DAT {
     }
 
 
+
+    /*!
+     * \author Ivan Arkhipov
+     * \date 21.10.2018
+     * Извлечение в базу данных файла с заданным id
+     * \param[in] file_id ID файла
+     * \param[in] db Указатель на объект базы данных
+     */
+
+    DatOperationResult<> DatExporter::ExtractFileById(long long file_id, Database *db) {
+        if (!db)
+            return DatOperationResult<>(ERROR, "EXTRACTFILEBYIDTODB: database is nullptr");
+
+        dat->GetStatusModule().SetStatus(DatStatus::E_EXTRACTING);
+        dat->GetStatusModule().SetPercentage(50);
+        LOG(INFO) << "Extracting file with id = " << file_id << "to database...";
+
+        auto operation_GetFile = dat->GetFileSystem().GetFile(file_id);
+        if (operation_GetFile.result == ERROR) {
+            dat->GetStatusModule().ClearAll();
+            return DatOperationResult<>(ERROR, "EXTRACTFILEBYIDTODB: File not found! id = " + std::to_string(file_id));
+        }
+        std::shared_ptr<SubFile> file = operation_GetFile.value;
+
+        auto operation_GetFileData = dat->GetFileSystem().GetFileData(*file, 8);
+        if (operation_GetFileData.result == ERROR) {
+            dat->GetStatusModule().ClearAll();
+            return DatOperationResult<>(ERROR, "EXTRACTFILEBYIDTODB: Can't get data for id = " + std::to_string(file_id));
+        }
+
+        SubfileData export_data = file->PrepareForExport(operation_GetFileData.value);
+
+        bool result = db->PushFile(export_data);
+
+        dat->GetStatusModule().ClearAll();
+        if (!result)
+            return DatOperationResult<>(ERROR, "EXTRACTFILEBYIDTODB: Cannot export file" + std::to_string(file_id));
+
+        LOG(INFO) << "Successfully exported file " << file_id << " to database";
+        return DatOperationResult<>(SUCCESS);
+    }
+
     /*!
      * \author Gi1dor
      * \date 05.07.2018
@@ -171,5 +213,4 @@ namespace LOTRO_DAT {
 
         return DatOperationResult<>();
     }
-
 };