瀏覽代碼

Add "Stat" table to asset database

Signed-off-by: Sven Hwang <[email protected]>
Sven Hwang 3 年之前
父節點
當前提交
4d2b200eff

+ 56 - 0
Code/Framework/AzToolsFramework/AzToolsFramework/AssetDatabase/AssetDatabaseConnection.cpp

@@ -42,6 +42,7 @@ namespace AzToolsFramework
                 "ScanFolders",
                 "SourceDependency",
                 "Sources",
+                "Stats",
                 "dbinfo"
             };
 
@@ -123,6 +124,11 @@ namespace AzToolsFramework
 
             static const auto s_queryFilesTable = MakeSqlQuery(QUERY_FILES_TABLE, QUERY_FILES_TABLE_STATEMENT, LOG_NAME);
 
+            static const char* QUERY_STATS_TABLE = "AzToolsFramework::AssetDatabase::QueryStatsTable";
+            static const char* QUERY_STATS_TABLE_STATEMENT = "SELECT * from Stats;";
+
+            static const auto s_queryStatsTable = MakeSqlQuery(QUERY_STATS_TABLE, QUERY_STATS_TABLE_STATEMENT, LOG_NAME);
+
             //////////////////////////////////////////////////////////////////////////
             //projection and combination queries
 
@@ -950,6 +956,16 @@ namespace AzToolsFramework
                     SqlParam<AZ::s64>(":scanfolderid"),
                     SqlParam<const char*>(":filename"));
 
+            static const char* QUERY_STAT_BY_STATNAME = "AzToolsFramework::AssetDatabase::QueryStatByStatName";
+            static const char* QUERY_STAT_BY_STATNAME_STATEMENT = "SELECT * FROM Stats WHERE "
+                                                                  "StatName = :statname;";
+
+            static const auto s_queryStatByStatName = MakeSqlQuery(
+                QUERY_STAT_BY_STATNAME,
+                QUERY_STAT_BY_STATNAME_STATEMENT,
+                LOG_NAME,
+                SqlParam<const char*>(":statname"));
+
             void PopulateJobInfo(AzToolsFramework::AssetSystem::JobInfo& jobinfo, JobDatabaseEntry& jobDatabaseEntry)
             {
                 jobinfo.m_platform = AZStd::move(jobDatabaseEntry.m_platform);
@@ -995,6 +1011,7 @@ namespace AzToolsFramework
             bool GetMissingProductDependencyResult(const char* callName, SQLite::Statement* statement, AssetDatabaseConnection::missingProductDependencyHandler handler);
             bool GetCombinedDependencyResult(const char* callName, SQLite::Statement* statement, AssetDatabaseConnection::combinedProductDependencyHandler handler);
             bool GetFileResult(const char* callName, SQLite::Statement* statement, AssetDatabaseConnection::fileHandler handler);
+            bool GetStatResult(const char* callName, SQLite::Statement* statement, AssetDatabaseConnection::statHandler handler);
         }
 
         //////////////////////////////////////////////////////////////////////////
@@ -1654,6 +1671,28 @@ namespace AzToolsFramework
                 ProductDatabaseEntry::GetColumns());
         }
 
+        //////////////////////////////////////////////////////////////////////////
+        // StatDatabaseEntry
+
+        AZStd::string StatDatabaseEntry::ToString() const
+        {
+            return AZStd::string::format(
+                "StatDatabaseEntry id: %" PRId64 " statname: %s statvalue: %" PRId64 " lastlogtime: %" PRId64,
+                aznumeric_cast<int64_t>(m_statID),
+                m_statName.c_str(),
+                aznumeric_cast<int64_t>(m_statValue),
+                aznumeric_cast<int64_t>(m_lastLogTime));
+        }
+
+        auto StatDatabaseEntry::GetColumns()
+        {
+            return MakeColumns(
+                MakeColumn("StatID", m_statID),
+                MakeColumn("StatName", m_statName),
+                MakeColumn("StatValue", m_statValue),
+                MakeColumn("LastLogTime", m_lastLogTime));
+        }
+
         //////////////////////////////////////////////////////////////////////////
         //AssetDatabaseConnection
         AssetDatabaseConnection::AssetDatabaseConnection()
@@ -1878,6 +1917,8 @@ namespace AzToolsFramework
             AddStatement(m_databaseConnection, s_queryFilesByScanfolderid);
             AddStatement(m_databaseConnection, s_queryFileByFileNameScanfolderid);
 
+            AddStatement(m_databaseConnection, s_queryStatByStatName);
+
             AddStatement(m_databaseConnection, s_queryBuilderInfoTable);
         }
 
@@ -1976,6 +2017,11 @@ namespace AzToolsFramework
             return s_queryFilesTable.BindAndQuery(*m_databaseConnection, handler, &GetFileResult);
         }
 
+        bool AssetDatabaseConnection::QueryStatsTable(statHandler handler)
+        {
+            return s_queryStatsTable.BindAndQuery(*m_databaseConnection, handler, &GetStatResult);
+        }
+
         bool AssetDatabaseConnection::QueryScanFolderByScanFolderID(AZ::s64 scanfolderid, scanFolderHandler handler)
         {
             return s_queryScanfolderByScanfolderid.BindAndQuery(*m_databaseConnection, handler, &GetScanFolderResult, scanfolderid);
@@ -2641,6 +2687,11 @@ namespace AzToolsFramework
             return s_queryFileByFileNameScanfolderid.BindAndQuery(*m_databaseConnection, handler, &GetFileResult, scanFolderID, fileName);
         }
 
+        bool AssetDatabaseConnection::QueryStatByStatName(const char* statName, statHandler handler)
+        {
+            return s_queryStatByStatName.BindAndQuery(*m_databaseConnection, handler, &GetStatResult, statName);
+        }
+
         void AssetDatabaseConnection::SetQueryLogging(bool enableLogging)
         {
             if (enableLogging)
@@ -2939,6 +2990,11 @@ namespace AzToolsFramework
                 return GetResult(callName, statement, handler);
             }
 
+            bool GetStatResult(const char* callName, SQLite::Statement* statement, AssetDatabaseConnection::statHandler handler)
+            {
+                return GetResult(callName, statement, handler);
+            }
+
             bool GetJobResultSimple(const char* name, Statement* statement, AssetDatabaseConnection::jobHandler handler)
             {
                 return GetJobResult(name, statement, handler);

+ 31 - 0
Code/Framework/AzToolsFramework/AzToolsFramework/AssetDatabase/AssetDatabaseConnection.h

@@ -68,6 +68,7 @@ namespace AzToolsFramework
             AddedSourceIndexForSourceDependencyTable,
             AddedSourceDependencySubIdsAndProductHashes,
             AddedFlagsColumnToProductTable,
+            AddedStatsTable,
             //Add all new versions before this
             DatabaseVersionCount,
             LatestVersion = DatabaseVersionCount - 1
@@ -409,6 +410,30 @@ namespace AzToolsFramework
 
         typedef AZStd::vector<SourceAndScanFolderDatabaseEntry> SourceAndScanFolderDatabaseEntryContainer;
 
+        //////////////////////////////////////////////////////////////////////////
+        // StatDatabaseEntry
+        class StatDatabaseEntry
+        {
+        public:
+            StatDatabaseEntry() = default;
+
+            StatDatabaseEntry(const StatDatabaseEntry& other) = default;
+            StatDatabaseEntry(StatDatabaseEntry&& other) = default;
+
+            StatDatabaseEntry& operator=(StatDatabaseEntry&& other) = default;
+            StatDatabaseEntry& operator=(const StatDatabaseEntry& other) = default;
+
+            AZStd::string ToString() const;
+            auto GetColumns();
+
+            AZ::s64 m_statID = InvalidEntryId;
+            AZStd::string m_statName;
+            AZ::s64 m_statValue = 0;
+            AZ::s64 m_lastLogTime = 0;
+        };
+
+        typedef AZStd::vector<StatDatabaseEntry> StatDatabaseEntryContainer;
+
         //////////////////////////////////////////////////////////////////////////
         //AssetDatabaseConnection
         //! The Connection class represents a read-only connection to the asset database specifically
@@ -471,6 +496,7 @@ namespace AzToolsFramework
             // note that AZStd::function cannot handle rvalue-refs at the time of writing this.
             using BuilderInfoHandler = std::function<bool(BuilderInfoEntry&&)>;
             using fileHandler = AZStd::function<bool(FileDatabaseEntry& entry)>;
+            using statHandler = AZStd::function<bool(StatDatabaseEntry& entry)>;
 
             //////////////////////////////////////////////////////////////////
             //Query entire table
@@ -483,6 +509,7 @@ namespace AzToolsFramework
             bool QueryProductDependenciesTable(combinedProductDependencyHandler handler);
             bool QueryBuilderInfoTable(const BuilderInfoHandler& handler);
             bool QueryFilesTable(fileHandler handler);
+            bool QueryStatsTable(statHandler handler);
 
             //////////////////////////////////////////////////////////////////////////
             //Queries
@@ -635,6 +662,10 @@ namespace AzToolsFramework
             bool QueryFilesLikeFileNameAndScanFolderID(const char* likeFileName, LikeType likeType, AZ::s64 scanfolderID, fileHandler handler);
             bool QueryFilesByScanFolderID(AZ::s64 scanFolderID, fileHandler handler);
             bool QueryFileByFileNameScanFolderID(const char* fileName, AZ::s64 scanFolderID, fileHandler handler);
+
+            //Stat
+            bool QueryStatByStatName(const char* statName, statHandler handler);
+
             //////////////////////////////////////////////////////////////////////////
 
             void SetQueryLogging(bool enableLogging);

+ 39 - 0
Code/Tools/AssetProcessor/native/AssetDatabase/AssetDatabase.cpp

@@ -166,6 +166,15 @@ namespace AssetProcessor
             "    FOREIGN KEY (ScanFolderPK) REFERENCES "
             "       ScanFolders(ScanFolderID) ON DELETE CASCADE);";
 
+        static const char* CREATE_STATS_TABLE = "AssetProcessor::CreateStatsTable";
+        static const char* CREATE_STATS_TABLE_STATEMENT =
+            "CREATE TABLE IF NOT EXISTS Stats( "
+            "    StatID         INTEGER PRIMARY KEY AUTOINCREMENT, "
+            "    StatName       TEXT NOT NULL collate nocase, "
+            "    StatValue      INTEGER NOT NULL, "
+            "    LastLogTime    INTEGER NOT NULL "
+            ");";
+
         //////////////////////////////////////////////////////////////////////////
         //indices
         static const char* CREATEINDEX_DEPENDSONSOURCE_SOURCEDEPENDENCY = "AssetProcesser::CreateIndexDependsOnSource_SourceDependency";
@@ -1094,6 +1103,15 @@ namespace AssetProcessor
             }
         }
 
+        if (foundVersion == DatabaseVersion::AddedFlagsColumnToProductTable)
+        {
+            if (m_databaseConnection->ExecuteOneOffStatement(CREATE_STATS_TABLE))
+            {
+                foundVersion = DatabaseVersion::AddedStatsTable;
+                AZ_TracePrintf(AssetProcessor::ConsoleChannel, "Upgraded Asset Database to version %i (AddedStatsTable)\n", foundVersion)
+            }
+        }
+
         if (foundVersion == CurrentDatabaseVersion())
         {
             dropAllTables = false;
@@ -1315,6 +1333,12 @@ namespace AssetProcessor
         m_databaseConnection->AddStatement(INSERT_COLUMN_FILE_HASH, INSERT_COLUMN_FILE_HASH_STATEMENT);
         m_databaseConnection->AddStatement(INSERT_COLUMN_LAST_SCAN, INSERT_COLUMN_LAST_SCAN_STATEMENT);
         m_databaseConnection->AddStatement(INSERT_COLUMN_SCAN_TIME_SECONDS_SINCE_EPOCH, INSERT_COLUMN_SCAN_TIME_SECONDS_SINCE_EPOCH_STATEMENT);
+
+        // ---------------------------------------------------------------------------------------------
+        //                  Stats table
+        // ---------------------------------------------------------------------------------------------
+        m_databaseConnection->AddStatement(CREATE_STATS_TABLE, CREATE_STATS_TABLE_STATEMENT);
+
         // ---------------------------------------------------------------------------------------------
         //                   Indices
         // ---------------------------------------------------------------------------------------------
@@ -3279,6 +3303,21 @@ namespace AssetProcessor
         return s_DeleteFileQuery.BindAndStep(*m_databaseConnection, fileID);
     }
 
+    bool AssetDatabaseConnection::GetStatByStatName(QString statName, StatDatabaseEntryContainer& container)
+    {
+        bool found = false;
+        bool succeeded = QueryStatByStatName(
+            statName.toUtf8().constData(),
+            [&](StatDatabaseEntry& stat)
+            {
+                found = true;
+                container.push_back();
+                container.back() = AZStd::move(stat);
+                return true; // return true to continue iterating over additional results, we are populating a container
+            });
+        return found && succeeded;
+    }
+
     bool AssetDatabaseConnection::SetBuilderInfoTable(AzToolsFramework::AssetDatabase::BuilderInfoEntryContainer& newEntries)
     {
         ScopedTransaction transaction(m_databaseConnection);

+ 3 - 0
Code/Tools/AssetProcessor/native/AssetDatabase/AssetDatabase.h

@@ -224,6 +224,9 @@ namespace AssetProcessor
         // updates the modtime and hash for a file if it exists.  Only returns true if the row existed and was successfully updated
         bool UpdateFileModTimeAndHashByFileNameAndScanFolderId(QString fileName, AZ::s64 scanFolderId, AZ::u64 modTime, AZ::u64 hash);
         bool RemoveFile(AZ::s64 sourceID);
+
+        //Stats
+        bool GetStatByStatName(QString statName, AzToolsFramework::AssetDatabase::StatDatabaseEntryContainer& container);
     protected:
         void SetDatabaseVersion(AzToolsFramework::AssetDatabase::DatabaseVersion ver);
         void ExecuteCreateStatements();