Index: src/libchcore/TSQLiteSerializerRowData.h =================================================================== diff -u -N -r3933d378c75e0b245a6ccb91099eaeb2c5728209 -rffdee64cb0f2d472bb4102abe80ee12783e794c8 --- src/libchcore/TSQLiteSerializerRowData.h (.../TSQLiteSerializerRowData.h) (revision 3933d378c75e0b245a6ccb91099eaeb2c5728209) +++ src/libchcore/TSQLiteSerializerRowData.h (.../TSQLiteSerializerRowData.h) (revision ffdee64cb0f2d472bb4102abe80ee12783e794c8) @@ -31,61 +31,20 @@ BEGIN_CHCORE_NAMESPACE -class LIBCHCORE_API TRowID -{ -public: - TRowID(const TSQLiteColumnsDefinition& rColumnDefinition); - ~TRowID(); - - void Clear(); - - void SetAddedBit(bool bAdded); - void SetColumnBit(size_t stIndex, bool bColumnExists); - - bool HasAny() const; - - bool operator==(const TRowID rSrc) const; - bool operator<(const TRowID rSrc) const; - -private: -#pragma warning(push) -#pragma warning(disable: 4251) - boost::dynamic_bitset<> m_bitset; -#pragma warning(pop) -}; - class LIBCHCORE_API TSQLiteSerializerRowData : public ISerializerRowData { private: - enum ENullType - { - eNull - }; + static const unsigned long long AddedBit = 1; - typedef boost::variant< - ENullType, - bool, - short, - unsigned short, - int, - unsigned int, - long, - unsigned long, - long long, - unsigned long long, - double, - TString, - TSmartPath - > InternalVariant; - private: - TSQLiteSerializerRowData& operator=(const TSQLiteSerializerRowData& rSrc); + TSQLiteSerializerRowData(size_t stRowID, TSQLiteColumnsDefinition& rColumnDefinition, bool bAdded, unsigned long long* pPoolMemory, size_t stPoolMemorySizeInBytes); public: - TSQLiteSerializerRowData(size_t stRowID, TSQLiteColumnsDefinition& rColumnDefinition, bool bAdded); TSQLiteSerializerRowData(const TSQLiteSerializerRowData& rSrc); virtual ~TSQLiteSerializerRowData(); + TSQLiteSerializerRowData& operator=(const TSQLiteSerializerRowData& rSrc); + virtual ISerializerRowData& SetValue(size_t stColIndex, bool bValue); virtual ISerializerRowData& SetValue(size_t stColIndex, short iValue); virtual ISerializerRowData& SetValue(size_t stColIndex, unsigned short uiValue); @@ -113,25 +72,32 @@ virtual ISerializerRowData& SetValue(const TString& strColumnName, const TSmartPath& pathValue); TString GetQuery(const TString& strContainerName) const; - TRowID GetChangeIdentification() const; + unsigned long long GetChangeIdentification() const; void BindParamsAndExec(sqlite::TSQLiteStatement& tStatement); +private: + const unsigned long long& GetDataForColumn(size_t stColIndex) const; + unsigned long long GetDataHeader() const; + unsigned long long& ModifyColumnData(size_t stColIndex); + void FreeColumnData(size_t stColumnID); + void FreeAllColumnData(); + void MarkAsAdded(); + bool IsAdded() const; -private: - ISerializerRowData& SetValue(size_t stColIndex, const InternalVariant& rData); + bool HasAnyData() const; + void MarkColumnUsage(size_t stIndex, bool bUsed); + bool HasData(size_t stColumnIndex) const; + void BindParams(sqlite::TSQLiteStatement &tStatement, int& iSQLiteColumnNumber, size_t bSkipColumn = (size_t)-1); + private: - size_t m_stRowID; - bool m_bAdded; -#pragma warning(push) -#pragma warning(disable: 4251) + unsigned long long* m_pPoolMemory; + TSQLiteColumnsDefinition& m_rColumns; - typedef std::vector VecVariants; // column id -> variant data - VecVariants m_vValues; -#pragma warning(pop) + friend class TSQLiteSerializerContainer; }; typedef boost::shared_ptr TSQLiteSerializerRowDataPtr;