#ifndef FACEDATABASE_H #define FACEDATABASE_H #pragma once #include #include //#include "ARCFaceRT.h" #include "sqlite3.h" #include #include "ANSFRCommon.h" namespace ANSCENTER { // Structured embedding record for double-buffer reload struct FaceEmbeddingRecord { int faceId; // FACE.ID (unique per face) std::string userId; // FACE.USER (= USER.ID, as string) std::vector embedding; }; class FaceDatabase { public: FaceDatabase(); ~FaceDatabase(); bool Destroy(); bool Initialize(std::string path, int embeddingDim, std::string dataFolder); int InsertUser(std::string code, std::string userName); int UpdateUser(int UserId, std::string newUserCode, std::string newUserName); int InsertFace(int userId, std::string imgPath, float embedding[]); int DeleteFace(int id); int DeleteUser(int UserId); int GetFaceIdsByUser(int userId, std::vector& faceIds); int GetUserId(std::string code); int GetUser(int userId, std::string& code, std::string& userName); int GetUsers(std::vector& ids, std::vector& codes, std::vector& userNames); // Fix #12: Batch query — returns users with their face IDs in a single query int GetUsersWithFaceIds(std::vector& ids, std::vector& codes, std::vector& userNames, std::vector>& faceIdsByUser); int GetFaceById(int faceId, int& userId, std::string& imagePath); std::map GetUserDict(); int GetEmbeddings(ANSFRBase& recognizer); int GetEmbeddings(std::unique_ptr& recognizer); // Returns all face embedding records (FACE.ID + USER.ID + embedding) for double-buffer reload int GetAllEmbeddingRecords(std::vector& records); private: sqlite3* m_db; int m_embedding_dim; std::string _dataFolder; std::mutex _mutex; // Fix #10: Logger for database operations ANSCENTER::SPDLogger& _logger = ANSCENTER::SPDLogger::GetInstance("FaceDB"); int GetNumEmbeddings(); }; } #endif