Index: ext/sqlite3/sqlite3.vcproj
===================================================================
diff -u -N -rcaa075123222d2b7ae40270c006f021218d96a72 -r3397fd021739bea537248415a7b4fc2712dd2320
--- ext/sqlite3/sqlite3.vcproj (.../sqlite3.vcproj) (revision caa075123222d2b7ae40270c006f021218d96a72)
+++ ext/sqlite3/sqlite3.vcproj (.../sqlite3.vcproj) (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -321,8 +321,8 @@
@@ -394,8 +394,8 @@
@@ -468,8 +468,8 @@
TSQLiteDatabasePtr;
+}
+
+END_CHCORE_NAMESPACE
+
+#endif
Index: src/libchcore/TSQLiteException.cpp
===================================================================
diff -u -N
--- src/libchcore/TSQLiteException.cpp (revision 0)
+++ src/libchcore/TSQLiteException.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -0,0 +1,39 @@
+// ============================================================================
+// Copyright (C) 2001-2013 by Jozef Starosczyk
+// ixen@copyhandler.com
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Library General Public License
+// (version 2) as published by the Free Software Foundation;
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// ============================================================================
+#include "stdafx.h"
+#include "TSQLiteException.h"
+
+BEGIN_CHCORE_NAMESPACE
+
+namespace sqlite
+{
+ TSQLiteException::TSQLiteException(EGeneralErrors eErrorCode, int iSQLiteError, const wchar_t* pszMsg, const wchar_t* pszFile, size_t stLineNumber, const wchar_t* pszFunction) :
+ TBaseException(eErrorCode, pszMsg, pszFile, stLineNumber, pszFunction),
+ m_iSQLiteError(iSQLiteError)
+ {
+ }
+
+ TSQLiteException::TSQLiteException(EGeneralErrors eErrorCode, int iSQLiteError, const char* pszMsg, const wchar_t* pszFile, size_t stLineNumber, const wchar_t* pszFunction) :
+ TBaseException(eErrorCode, pszMsg, pszFile, stLineNumber, pszFunction),
+ m_iSQLiteError(iSQLiteError)
+ {
+ }
+}
+
+END_CHCORE_NAMESPACE
Index: src/libchcore/TSQLiteException.h
===================================================================
diff -u -N
--- src/libchcore/TSQLiteException.h (revision 0)
+++ src/libchcore/TSQLiteException.h (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -0,0 +1,45 @@
+// ============================================================================
+// Copyright (C) 2001-2013 by Jozef Starosczyk
+// ixen@copyhandler.com
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Library General Public License
+// (version 2) as published by the Free Software Foundation;
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// ============================================================================
+#ifndef __TSQLITEEXCEPTION_H__
+#define __TSQLITEEXCEPTION_H__
+
+#include "libchcore.h"
+#include "TBaseException.h"
+
+#define THROW_SQLITE_EXCEPTION(error_code, sqlite_error_code, err_msg)\
+ throw TSQLiteException(error_code, sqlite_error_code, err_msg, __FILEW__, __LINE__, __FUNCTIONW__)
+
+BEGIN_CHCORE_NAMESPACE
+
+namespace sqlite
+{
+ class TSQLiteException : public TBaseException
+ {
+ public:
+ TSQLiteException(EGeneralErrors eErrorCode, int iSQLiteError, const wchar_t* pszMsg, const wchar_t* pszFile, size_t stLineNumber, const wchar_t* pszFunction);
+ TSQLiteException(EGeneralErrors eErrorCode, int iSQLiteError, const char* pszMsg, const wchar_t* pszFile, size_t stLineNumber, const wchar_t* pszFunction);
+
+ private:
+ int m_iSQLiteError;
+ };
+}
+
+END_CHCORE_NAMESPACE
+
+#endif
Index: src/libchcore/TSQLiteStatement.cpp
===================================================================
diff -u -N
--- src/libchcore/TSQLiteStatement.cpp (revision 0)
+++ src/libchcore/TSQLiteStatement.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -0,0 +1,189 @@
+// ============================================================================
+// Copyright (C) 2001-2013 by Jozef Starosczyk
+// ixen@copyhandler.com
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Library General Public License
+// (version 2) as published by the Free Software Foundation;
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// ============================================================================
+#include "stdafx.h"
+#include "TSQLiteStatement.h"
+#include "sqlite3/sqlite3.h"
+#include "ErrorCodes.h"
+#include "TSQLiteException.h"
+
+BEGIN_CHCORE_NAMESPACE
+
+namespace sqlite
+{
+ TSQLiteStatement::TSQLiteStatement(const TSQLiteDatabasePtr& spDatabase) :
+ m_pStatement(NULL),
+ m_spDatabase(spDatabase),
+ m_bHasRow(false)
+ {
+ if(!m_spDatabase)
+ THROW_SQLITE_EXCEPTION(eErr_InvalidArgument, 0, _T("Invalid database provided"));
+ }
+
+ TSQLiteStatement::~TSQLiteStatement()
+ {
+ int iResult = sqlite3_finalize(m_pStatement);
+ _ASSERTE(iResult == SQLITE_OK);
+ }
+
+ void TSQLiteStatement::Close()
+ {
+ if(m_pStatement != NULL)
+ {
+ int iResult = sqlite3_finalize(m_pStatement);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteFinalizeError, iResult, _T("Cannot finalize statement"));
+ m_pStatement = NULL;
+ }
+ m_bHasRow = false;
+ }
+
+ void TSQLiteStatement::Prepare(PCWSTR pszQuery)
+ {
+ Close();
+
+ int iResult = sqlite3_prepare16_v2((sqlite3*)m_spDatabase->GetHandle(), pszQuery, -1, &m_pStatement, NULL);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLitePrepareError, iResult, (PCTSTR)sqlite3_errmsg16((sqlite3*)m_spDatabase->GetHandle()));
+ }
+
+ TSQLiteStatement::EStepResult TSQLiteStatement::Step()
+ {
+ m_bHasRow = false;
+
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+
+ int iResult = sqlite3_step(m_pStatement);
+ switch(iResult)
+ {
+ case SQLITE_ROW:
+ m_bHasRow = true;
+ return eStep_HasRow;
+ case SQLITE_OK:
+ case SQLITE_DONE:
+ Reset();
+ return eStep_Finished;
+ default:
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStepError, iResult, _T("Cannot perform step on the statement"));
+ }
+ }
+
+ void TSQLiteStatement::BindValue(int iColumn, double dValue)
+ {
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+
+ int iResult = sqlite3_bind_double(m_pStatement, iColumn, dValue);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot bind a parameter"));
+ }
+
+ void TSQLiteStatement::BindValue(int iColumn, int iValue)
+ {
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+
+ int iResult = sqlite3_bind_int(m_pStatement, iColumn, iValue);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot bind a parameter"));
+ }
+
+ void TSQLiteStatement::BindValue(int iColumn, long long llValue)
+ {
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+
+ int iResult = sqlite3_bind_int64(m_pStatement, iColumn, llValue);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot bind a parameter"));
+ }
+
+ void TSQLiteStatement::BindValue(int iColumn, PCTSTR pszText)
+ {
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+
+ int iResult = sqlite3_bind_text16(m_pStatement, iColumn, pszText, -1, SQLITE_TRANSIENT);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot bind a parameter"));
+ }
+
+ double TSQLiteStatement::GetDouble(int iCol)
+ {
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+ if(!m_bHasRow)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteNoRowAvailable, 0, _T("No row available"));
+
+ return sqlite3_column_double(m_pStatement, iCol);
+ }
+
+ int TSQLiteStatement::GetInt(int iCol)
+ {
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+ if(!m_bHasRow)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteNoRowAvailable, 0, _T("No row available"));
+
+ return sqlite3_column_int(m_pStatement, iCol);
+ }
+
+ long long TSQLiteStatement::GetInt64(int iCol)
+ {
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+ if(!m_bHasRow)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteNoRowAvailable, 0, _T("No row available"));
+
+ return sqlite3_column_int64(m_pStatement, iCol);
+ }
+
+ TString TSQLiteStatement::GetText(int iCol)
+ {
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+ if(!m_bHasRow)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteNoRowAvailable, 0, _T("No row available"));
+
+ return TString((const wchar_t*)sqlite3_column_text16(m_pStatement, iCol));
+ }
+
+ void TSQLiteStatement::ClearBindings()
+ {
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+
+ int iResult = sqlite3_clear_bindings(m_pStatement);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot clear bindings"));
+ }
+
+ void TSQLiteStatement::Reset()
+ {
+ if(!m_pStatement)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement"));
+
+ int iResult = sqlite3_reset(m_pStatement);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot reset statement"));
+ }
+
+}
+
+END_CHCORE_NAMESPACE
Index: src/libchcore/TSQLiteStatement.h
===================================================================
diff -u -N
--- src/libchcore/TSQLiteStatement.h (revision 0)
+++ src/libchcore/TSQLiteStatement.h (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -0,0 +1,77 @@
+// ============================================================================
+// Copyright (C) 2001-2013 by Jozef Starosczyk
+// ixen@copyhandler.com
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Library General Public License
+// (version 2) as published by the Free Software Foundation;
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// ============================================================================
+#ifndef __TSQLITESTATEMENT_H__
+#define __TSQLITESTATEMENT_H__
+
+#include "libchcore.h"
+#include "TSQLiteDatabase.h"
+#include "TString.h"
+
+struct sqlite3_stmt;
+
+BEGIN_CHCORE_NAMESPACE
+
+namespace sqlite
+{
+ typedef boost::shared_ptr SQLiteStatementHandle;
+
+ class TSQLiteStatement
+ {
+ public:
+ enum EStepResult
+ {
+ eStep_Finished,
+ eStep_HasRow
+ };
+
+ public:
+ TSQLiteStatement(const TSQLiteDatabasePtr& spDatabase);
+ ~TSQLiteStatement();
+
+ void Close();
+
+ void Prepare(PCTSTR pszQuery);
+
+ void BindValue(int iColumn, double dValue);
+ void BindValue(int iColumn, int iValue);
+ void BindValue(int iColumn, long long llValue);
+ void BindValue(int iColumn, PCTSTR pszText);
+
+ void ClearBindings();
+
+ EStepResult Step();
+ void Reset();
+
+ double GetDouble(int iCol);
+ int GetInt(int iCol);
+ long long GetInt64(int iCol);
+ TString GetText(int iCol);
+
+ private:
+ sqlite3_stmt* m_pStatement;
+ TSQLiteDatabasePtr m_spDatabase;
+ bool m_bHasRow;
+ };
+
+ typedef boost::shared_ptr TSQLiteStatementPtr;
+}
+
+END_CHCORE_NAMESPACE
+
+#endif
Index: src/libchcore/TSQLiteTransaction.cpp
===================================================================
diff -u -N
--- src/libchcore/TSQLiteTransaction.cpp (revision 0)
+++ src/libchcore/TSQLiteTransaction.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -0,0 +1,100 @@
+// ============================================================================
+// Copyright (C) 2001-2013 by Jozef Starosczyk
+// ixen@copyhandler.com
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Library General Public License
+// (version 2) as published by the Free Software Foundation;
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// ============================================================================
+#include "stdafx.h"
+#include "TSQLiteTransaction.h"
+#include "TSQLiteException.h"
+#include "ErrorCodes.h"
+#include "sqlite3/sqlite3.h"
+
+BEGIN_CHCORE_NAMESPACE
+
+namespace sqlite
+{
+ TSQLiteTransaction::TSQLiteTransaction(const TSQLiteDatabasePtr& spDatabase) :
+ m_spDatabase(spDatabase),
+ m_bTransactionStarted(false)
+ {
+ if(!m_spDatabase)
+ THROW_SQLITE_EXCEPTION(eErr_InvalidArgument, 0, _T("Invalid database provided"));
+ Begin();
+ }
+
+ TSQLiteTransaction::~TSQLiteTransaction()
+ {
+ // try to rollback the transaction; this is the last resort
+ if(m_bTransactionStarted && m_spDatabase->GetInTransaction())
+ {
+ int iResult = sqlite3_exec((sqlite3*)m_spDatabase->GetHandle(), "ROLLBACK TRANSACTION;", NULL, NULL, NULL);
+ _ASSERTE(iResult == SQLITE_OK);
+ m_spDatabase->SetInTransaction(false);
+ }
+ }
+
+ void TSQLiteTransaction::Begin()
+ {
+ if(m_spDatabase->GetInTransaction())
+ return;
+
+ if(m_bTransactionStarted)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotBeginTransaction, 0, _T("Transaction already started"));
+
+ int iResult = sqlite3_exec((sqlite3*)m_spDatabase->GetHandle(), "BEGIN TRANSACTION", NULL, NULL, NULL);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotBeginTransaction, iResult, _T("Cannot begin transaction"));
+
+ m_spDatabase->SetInTransaction(true);
+ m_bTransactionStarted = true;
+ }
+
+ void TSQLiteTransaction::Rollback()
+ {
+ // no transactions whatsoever (even on database)
+ if(!m_bTransactionStarted && !m_spDatabase->GetInTransaction())
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotRollbackTransaction, 0, _T("Transaction not started"));
+
+ // database has transaction started, but not by this object
+ if(!m_bTransactionStarted)
+ return;
+
+ int iResult = sqlite3_exec((sqlite3*)m_spDatabase->GetHandle(), "ROLLBACK TRANSACTION;", NULL, NULL, NULL);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotRollbackTransaction, iResult, _T("Cannot rollback transaction"));
+ m_spDatabase->SetInTransaction(false);
+ m_bTransactionStarted = false;
+ }
+
+ void TSQLiteTransaction::Commit()
+ {
+ // no transactions whatsoever (even on database)
+ if(!m_bTransactionStarted && !m_spDatabase->GetInTransaction())
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotRollbackTransaction, 0, _T("Transaction not started"));
+
+ // database has transaction started, but not by this object
+ if(!m_bTransactionStarted)
+ return;
+
+ int iResult = sqlite3_exec((sqlite3*)m_spDatabase->GetHandle(), "COMMIT TRANSACTION;", NULL, NULL, NULL);
+ if(iResult != SQLITE_OK)
+ THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotCommitTransaction, iResult, _T("Cannot commit transaction"));
+ m_spDatabase->SetInTransaction(false);
+ m_bTransactionStarted = false;
+ }
+}
+
+END_CHCORE_NAMESPACE
Index: src/libchcore/TSQLiteTransaction.h
===================================================================
diff -u -N
--- src/libchcore/TSQLiteTransaction.h (revision 0)
+++ src/libchcore/TSQLiteTransaction.h (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -0,0 +1,47 @@
+// ============================================================================
+// Copyright (C) 2001-2013 by Jozef Starosczyk
+// ixen@copyhandler.com
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Library General Public License
+// (version 2) as published by the Free Software Foundation;
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// ============================================================================
+#ifndef __TSQLITETRANSACTION_H__
+#define __TSQLITETRANSACTION_H__
+
+#include "libchcore.h"
+#include "TSQLiteDatabase.h"
+
+BEGIN_CHCORE_NAMESPACE
+
+namespace sqlite
+{
+ class TSQLiteTransaction
+ {
+ public:
+ TSQLiteTransaction(const TSQLiteDatabasePtr& spDatabase);
+ ~TSQLiteTransaction();
+
+ void Begin();
+ void Rollback();
+ void Commit();
+
+ private:
+ TSQLiteDatabasePtr m_spDatabase;
+ bool m_bTransactionStarted; // states if transaction was started by this object
+ };
+}
+
+END_CHCORE_NAMESPACE
+
+#endif
Index: src/libchcore/Tests/TestsTDataBufferManager.cpp
===================================================================
diff -u -N
--- src/libchcore/Tests/TestsTDataBufferManager.cpp (revision 0)
+++ src/libchcore/Tests/TestsTDataBufferManager.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -0,0 +1,312 @@
+#include "stdafx.h"
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include "../TDataBuffer.h"
+#include "../TCoreException.h"
+
+// fixtures
+class BasicBufferFixture : public ::testing::Test
+{
+protected:
+ virtual void SetUp()
+ {
+ size_t stMaxMemory = 1048034;
+
+ chcore::TDataBufferManager::CheckBufferConfig(stMaxMemory);
+ tBufferManager.Initialize(stMaxMemory);
+ }
+
+ chcore::TDataBufferManager tBufferManager;
+};
+
+class DetailedBufferFixture : public ::testing::Test
+{
+protected:
+ virtual void SetUp()
+ {
+ size_t stMaxMemory = 1048034;
+ size_t stPageSize = 262144;
+ size_t stBufferSize = 65536;
+
+ chcore::TDataBufferManager::CheckBufferConfig(stMaxMemory, stPageSize, stBufferSize);
+
+ tBufferManager.Initialize(stMaxMemory, stPageSize, stBufferSize);
+ }
+
+ chcore::TDataBufferManager tBufferManager;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// TSimpleDataBuffer
+
+TEST(TSimpleDataBuffer, GetBufferPtr)
+{
+ chcore::TSimpleDataBuffer tDataBuffer;
+ EXPECT_EQ(tDataBuffer.GetBufferPtr(), (LPVOID)NULL);
+}
+
+TEST(TSimpleDataBuffer, ReleaseBuffer)
+{
+ chcore::TSimpleDataBuffer tDataBuffer;
+ EXPECT_NO_FATAL_FAILURE(tDataBuffer.ReleaseBuffer());
+}
+
+
+TEST(TSimpleDataBuffer, GetSetDataSize)
+{
+ chcore::TSimpleDataBuffer tDataBuffer;
+ EXPECT_EQ(tDataBuffer.GetDataSize(), 0);
+ EXPECT_THROW(tDataBuffer.SetDataSize(4273), chcore::TCoreException);
+ EXPECT_EQ(tDataBuffer.GetDataSize(), 0);
+}
+
+
+TEST(TSimpleDataBuffer, CutDataFromBuffer)
+{
+ chcore::TSimpleDataBuffer tDataBuffer;
+
+ EXPECT_NO_FATAL_FAILURE(tDataBuffer.CutDataFromBuffer(7344));
+ EXPECT_NO_FATAL_FAILURE(tDataBuffer.CutDataFromBuffer(0));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// TDataBufferManager
+
+TEST(TDataBufferManager, CheckBufferConfigBase)
+{
+ // only max mem - default values
+ size_t stMaxMem(0);
+ EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem), false);
+ EXPECT_EQ(stMaxMem, chcore::TDataBufferManager::DefaultMaxMemory);
+
+ const size_t stTestSize = 103145;
+ stMaxMem = stTestSize;
+ EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem), false);
+ EXPECT_LE(stTestSize, stMaxMem);
+}
+
+TEST(TDataBufferManager, CheckBufferConfigExt)
+{
+ // detailed config - default values
+ size_t stMaxMem(0);
+ size_t stPageSize(0);
+ size_t stChunkSize(0);
+ EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem, stPageSize, stChunkSize), false);
+ EXPECT_EQ(stMaxMem, chcore::TDataBufferManager::DefaultMaxMemory);
+ EXPECT_EQ(stPageSize, chcore::TDataBufferManager::DefaultPageSize);
+ EXPECT_EQ(stChunkSize, chcore::TDataBufferManager::DefaultBufferSize);
+
+ const size_t stTestMaxSize = 1237645;
+ const size_t stTestPageSize = 34563;
+ const size_t stTestBufferSize = 120;
+ stMaxMem = stTestMaxSize;
+ stPageSize = stTestPageSize;
+ stChunkSize = stTestBufferSize;
+ EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem, stPageSize, stChunkSize), false);
+ EXPECT_LE(stTestMaxSize, stMaxMem);
+ EXPECT_LE(stTestPageSize, stPageSize);
+ EXPECT_LE(stTestBufferSize, stChunkSize);
+}
+
+TEST(TDataBufferManager, FailedInitializations)
+{
+ chcore::TDataBufferManager tBufferManager;
+
+ // failed initializations
+ EXPECT_THROW(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultMaxMemory - 1), chcore::TCoreException);
+ EXPECT_EQ(tBufferManager.IsInitialized(), false);
+
+ EXPECT_THROW(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultMaxMemory, chcore::TDataBufferManager::DefaultPageSize - 1,
+ chcore::TDataBufferManager::DefaultBufferSize), chcore::TCoreException);
+ EXPECT_EQ(tBufferManager.IsInitialized(), false);
+
+ // succeeded initialization
+ EXPECT_NO_FATAL_FAILURE(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultPageSize));
+ EXPECT_EQ(tBufferManager.IsInitialized(), true);
+ EXPECT_EQ(tBufferManager.GetMaxMemorySize(), chcore::TDataBufferManager::DefaultPageSize);
+}
+
+TEST_F(BasicBufferFixture, FailedResize)
+{
+ EXPECT_TRUE(tBufferManager.IsInitialized());
+
+ size_t stCurrentMaxSize = tBufferManager.GetMaxMemorySize();
+ size_t stCurrentPageSize = tBufferManager.GetPageSize();
+ size_t stCurrentBufferSize = tBufferManager.GetSimpleBufferSize();
+
+ // try to change to something useless, check if nothing breaks inside
+ EXPECT_THROW(tBufferManager.ChangeMaxMemorySize(0), chcore::TCoreException);
+ EXPECT_EQ(stCurrentMaxSize ,tBufferManager.GetMaxMemorySize());
+ EXPECT_EQ(stCurrentPageSize, tBufferManager.GetPageSize());
+ EXPECT_EQ(stCurrentBufferSize, tBufferManager.GetSimpleBufferSize());
+}
+
+TEST_F(BasicBufferFixture, ResizeToSameSizeWithSimpleBufferChecks)
+{
+ EXPECT_TRUE(tBufferManager.IsInitialized());
+ EXPECT_EQ((tBufferManager.GetMaxMemorySize() / tBufferManager.GetSimpleBufferSize()), tBufferManager.GetCountOfFreeBuffers());
+
+ size_t stCurrentMaxSize = tBufferManager.GetMaxMemorySize();
+
+ // try to change to something useless, check if nothing breaks inside
+ size_t stNewBufferSize = stCurrentMaxSize / 2;
+ tBufferManager.CheckResizeSize(stNewBufferSize); // can't assume that it will return true here, since we don't really know what's the buffer size now...
+
+ EXPECT_NO_FATAL_FAILURE(tBufferManager.ChangeMaxMemorySize(stNewBufferSize));
+ EXPECT_EQ(tBufferManager.GetMaxMemorySize(), stNewBufferSize);
+
+ EXPECT_TRUE(tBufferManager.HasFreeBuffer());
+ EXPECT_EQ((tBufferManager.GetMaxMemorySize() / tBufferManager.GetSimpleBufferSize()), tBufferManager.GetCountOfFreeBuffers());
+}
+
+TEST_F(DetailedBufferFixture, SmallBufferOperations)
+{
+ // get a single buffer, check internals
+ chcore::TSimpleDataBuffer tBuffer;
+ EXPECT_TRUE(tBufferManager.GetFreeBuffer(tBuffer));
+ EXPECT_EQ(tBuffer.GetDataSize(), 0);
+ EXPECT_EQ(tBuffer.GetBufferSize(), 65536);
+
+ // check whether there are still free buffers inside manager
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 3);
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 15);
+}
+
+TEST_F(DetailedBufferFixture, WithoutAdditionalAllocTest)
+{
+ // do this in separate scope to allow auto-release of buffers at the end
+ {
+ std::vector vBuffers;
+ // get first 4 buffers and check state
+ for(size_t stIndex = 0; stIndex < 4; ++stIndex)
+ {
+ chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer);
+
+ EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get()));
+ vBuffers.push_back(spBuf);
+ }
+
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0);
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 12);
+ EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 262144); // only one page should be allocated at the moment
+ EXPECT_FALSE(tBufferManager.HasFreeBufferNA());
+ EXPECT_TRUE(tBufferManager.HasFreeBuffer());
+ }
+
+ // check that everything was freed
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 4);
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 16);
+ EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 262144); // only one page should be allocated at the moment
+ EXPECT_TRUE(tBufferManager.HasFreeBuffer());
+ EXPECT_TRUE(tBufferManager.HasFreeBufferNA());
+}
+
+TEST_F(DetailedBufferFixture, FullBufferTest)
+{
+ // do this in separate scope to allow auto-release of buffers at the end
+ {
+ // retrieve all the buffers that are inside
+ std::vector vBuffers;
+ for(size_t stIndex = 0; stIndex < 16; ++stIndex)
+ {
+ chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer);
+
+ EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get()));
+ vBuffers.push_back(spBuf);
+ }
+
+ // ensure everything was taken
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0);
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 0);
+ EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment
+ EXPECT_FALSE(tBufferManager.HasFreeBufferNA());
+ EXPECT_FALSE(tBufferManager.HasFreeBuffer());
+
+ // try to get one more buffer
+ chcore::TSimpleDataBuffer tFailBuffer;
+ EXPECT_FALSE(tBufferManager.GetFreeBuffer(tFailBuffer));
+ }
+
+ // ensure everything was freed as expected
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 16);
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 16);
+ EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment
+ EXPECT_TRUE(tBufferManager.HasFreeBufferNA());
+ EXPECT_TRUE(tBufferManager.HasFreeBuffer());
+}
+
+TEST_F(DetailedBufferFixture, FullBufferWithResizeTest)
+{
+ // do this in separate scope to allow auto-release of buffers at the end
+ {
+ // get all buffers
+ std::vector vBuffers;
+ for(size_t stIndex = 0; stIndex < 16; ++stIndex)
+ {
+ chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer);
+
+ EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get()));
+ vBuffers.push_back(spBuf);
+ }
+
+ // now resize to quarter the size
+ size_t stNewSize = 262144;
+ tBufferManager.CheckResizeSize(stNewSize);
+ EXPECT_NO_FATAL_FAILURE(tBufferManager.ChangeMaxMemorySize(stNewSize));
+
+ // since all of the memory was already taken, there was no real freeing
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 0);
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0);
+ EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment
+ EXPECT_FALSE(tBufferManager.HasFreeBufferNA());
+ EXPECT_FALSE(tBufferManager.HasFreeBuffer());
+ EXPECT_EQ(tBufferManager.GetMaxMemorySize(), 256*1024); // only a single page is available
+
+ // get rid of the small buffers (except for one)
+ for(size_t stIndex = 0; stIndex < 15; ++stIndex)
+ {
+ vBuffers.erase(vBuffers.end() - 1);
+ }
+
+ // now only one page should be left
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 3);
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 3);
+ EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 256*1024); // only one page should be allocated at the moment
+ EXPECT_TRUE(tBufferManager.HasFreeBufferNA());
+ EXPECT_TRUE(tBufferManager.HasFreeBuffer());
+ EXPECT_EQ(tBufferManager.GetMaxMemorySize(), 256*1024);
+ }
+
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 4);
+ EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 4);
+ EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 256*1024); // only one page should be allocated at the moment
+ EXPECT_TRUE(tBufferManager.HasFreeBufferNA());
+ EXPECT_TRUE(tBufferManager.HasFreeBuffer());
+}
+
+/*
+static bool CheckBufferConfig(size_t& stMaxMemory, size_t& stPageSize, size_t& stBufferSize);
+static bool CheckBufferConfig(size_t& stMaxMemory);
+
+// initialization
+void Initialize(size_t stMaxMemory);
+void Initialize(size_t stMaxMemory, size_t stPageSize, size_t stBufferSize);
+bool IsInitialized() const;
+
+bool CheckResizeSize(size_t& stNewMaxSize);
+void ChangeMaxMemorySize(size_t stNewMaxSize);
+
+// current settings
+size_t GetMaxMemorySize() const { return m_stMaxMemory; }
+size_t GetPageSize() const { return m_stPageSize; }
+size_t GetSimpleBufferSize() const { return m_stBufferSize; }
+
+size_t GetRealAllocatedMemorySize() const;
+
+// buffer retrieval
+bool HasFreeBuffer() const; // checks if a buffer is available without allocating any new memory
+size_t GetCountOfFreeBuffers() const; // how many free buffers are there that can be used without allocating additional memory
+
+bool GetFreeBuffer(TSimpleDataBuffer& rSimpleBuffer);
+void ReleaseBuffer(TSimpleDataBuffer& rSimpleBuffer);
+*/
Index: src/libchcore/Tests/TDataBufferManagerTest.cpp
===================================================================
diff -u -N
--- src/libchcore/Tests/TDataBufferManagerTest.cpp (revision 548382442cbf7bed7f744b279ce3f66b54992724)
+++ src/libchcore/Tests/TDataBufferManagerTest.cpp (revision 0)
@@ -1,312 +0,0 @@
-#include "stdafx.h"
-#include "gtest/gtest.h"
-#include "gmock/gmock.h"
-#include "../TDataBuffer.h"
-#include "../TCoreException.h"
-
-// fixtures
-class BasicBufferFixture : public ::testing::Test
-{
-protected:
- virtual void SetUp()
- {
- size_t stMaxMemory = 1048034;
-
- chcore::TDataBufferManager::CheckBufferConfig(stMaxMemory);
- tBufferManager.Initialize(stMaxMemory);
- }
-
- chcore::TDataBufferManager tBufferManager;
-};
-
-class DetailedBufferFixture : public ::testing::Test
-{
-protected:
- virtual void SetUp()
- {
- size_t stMaxMemory = 1048034;
- size_t stPageSize = 262144;
- size_t stBufferSize = 65536;
-
- chcore::TDataBufferManager::CheckBufferConfig(stMaxMemory, stPageSize, stBufferSize);
-
- tBufferManager.Initialize(stMaxMemory, stPageSize, stBufferSize);
- }
-
- chcore::TDataBufferManager tBufferManager;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// TSimpleDataBuffer
-
-TEST(TSimpleDataBuffer, GetBufferPtr)
-{
- chcore::TSimpleDataBuffer tDataBuffer;
- EXPECT_EQ(tDataBuffer.GetBufferPtr(), (LPVOID)NULL);
-}
-
-TEST(TSimpleDataBuffer, ReleaseBuffer)
-{
- chcore::TSimpleDataBuffer tDataBuffer;
- EXPECT_NO_FATAL_FAILURE(tDataBuffer.ReleaseBuffer());
-}
-
-
-TEST(TSimpleDataBuffer, GetSetDataSize)
-{
- chcore::TSimpleDataBuffer tDataBuffer;
- EXPECT_EQ(tDataBuffer.GetDataSize(), 0);
- EXPECT_THROW(tDataBuffer.SetDataSize(4273), chcore::TCoreException);
- EXPECT_EQ(tDataBuffer.GetDataSize(), 0);
-}
-
-
-TEST(TSimpleDataBuffer, CutDataFromBuffer)
-{
- chcore::TSimpleDataBuffer tDataBuffer;
-
- EXPECT_NO_FATAL_FAILURE(tDataBuffer.CutDataFromBuffer(7344));
- EXPECT_NO_FATAL_FAILURE(tDataBuffer.CutDataFromBuffer(0));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// TDataBufferManager
-
-TEST(TDataBufferManager, CheckBufferConfigBase)
-{
- // only max mem - default values
- size_t stMaxMem(0);
- EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem), false);
- EXPECT_EQ(stMaxMem, chcore::TDataBufferManager::DefaultMaxMemory);
-
- const size_t stTestSize = 103145;
- stMaxMem = stTestSize;
- EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem), false);
- EXPECT_LE(stTestSize, stMaxMem);
-}
-
-TEST(TDataBufferManager, CheckBufferConfigExt)
-{
- // detailed config - default values
- size_t stMaxMem(0);
- size_t stPageSize(0);
- size_t stChunkSize(0);
- EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem, stPageSize, stChunkSize), false);
- EXPECT_EQ(stMaxMem, chcore::TDataBufferManager::DefaultMaxMemory);
- EXPECT_EQ(stPageSize, chcore::TDataBufferManager::DefaultPageSize);
- EXPECT_EQ(stChunkSize, chcore::TDataBufferManager::DefaultBufferSize);
-
- const size_t stTestMaxSize = 1237645;
- const size_t stTestPageSize = 34563;
- const size_t stTestBufferSize = 120;
- stMaxMem = stTestMaxSize;
- stPageSize = stTestPageSize;
- stChunkSize = stTestBufferSize;
- EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem, stPageSize, stChunkSize), false);
- EXPECT_LE(stTestMaxSize, stMaxMem);
- EXPECT_LE(stTestPageSize, stPageSize);
- EXPECT_LE(stTestBufferSize, stChunkSize);
-}
-
-TEST(TDataBufferManager, FailedInitializations)
-{
- chcore::TDataBufferManager tBufferManager;
-
- // failed initializations
- EXPECT_THROW(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultMaxMemory - 1), chcore::TCoreException);
- EXPECT_EQ(tBufferManager.IsInitialized(), false);
-
- EXPECT_THROW(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultMaxMemory, chcore::TDataBufferManager::DefaultPageSize - 1,
- chcore::TDataBufferManager::DefaultBufferSize), chcore::TCoreException);
- EXPECT_EQ(tBufferManager.IsInitialized(), false);
-
- // succeeded initialization
- EXPECT_NO_FATAL_FAILURE(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultPageSize));
- EXPECT_EQ(tBufferManager.IsInitialized(), true);
- EXPECT_EQ(tBufferManager.GetMaxMemorySize(), chcore::TDataBufferManager::DefaultPageSize);
-}
-
-TEST_F(BasicBufferFixture, FailedResize)
-{
- EXPECT_TRUE(tBufferManager.IsInitialized());
-
- size_t stCurrentMaxSize = tBufferManager.GetMaxMemorySize();
- size_t stCurrentPageSize = tBufferManager.GetPageSize();
- size_t stCurrentBufferSize = tBufferManager.GetSimpleBufferSize();
-
- // try to change to something useless, check if nothing breaks inside
- EXPECT_THROW(tBufferManager.ChangeMaxMemorySize(0), chcore::TCoreException);
- EXPECT_EQ(stCurrentMaxSize ,tBufferManager.GetMaxMemorySize());
- EXPECT_EQ(stCurrentPageSize, tBufferManager.GetPageSize());
- EXPECT_EQ(stCurrentBufferSize, tBufferManager.GetSimpleBufferSize());
-}
-
-TEST_F(BasicBufferFixture, ResizeToSameSizeWithSimpleBufferChecks)
-{
- EXPECT_TRUE(tBufferManager.IsInitialized());
- EXPECT_EQ((tBufferManager.GetMaxMemorySize() / tBufferManager.GetSimpleBufferSize()), tBufferManager.GetCountOfFreeBuffers());
-
- size_t stCurrentMaxSize = tBufferManager.GetMaxMemorySize();
-
- // try to change to something useless, check if nothing breaks inside
- size_t stNewBufferSize = stCurrentMaxSize / 2;
- tBufferManager.CheckResizeSize(stNewBufferSize); // can't assume that it will return true here, since we don't really know what's the buffer size now...
-
- EXPECT_NO_FATAL_FAILURE(tBufferManager.ChangeMaxMemorySize(stNewBufferSize));
- EXPECT_EQ(tBufferManager.GetMaxMemorySize(), stNewBufferSize);
-
- EXPECT_TRUE(tBufferManager.HasFreeBuffer());
- EXPECT_EQ((tBufferManager.GetMaxMemorySize() / tBufferManager.GetSimpleBufferSize()), tBufferManager.GetCountOfFreeBuffers());
-}
-
-TEST_F(DetailedBufferFixture, SmallBufferOperations)
-{
- // get a single buffer, check internals
- chcore::TSimpleDataBuffer tBuffer;
- EXPECT_TRUE(tBufferManager.GetFreeBuffer(tBuffer));
- EXPECT_EQ(tBuffer.GetDataSize(), 0);
- EXPECT_EQ(tBuffer.GetBufferSize(), 65536);
-
- // check whether there are still free buffers inside manager
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 3);
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 15);
-}
-
-TEST_F(DetailedBufferFixture, WithoutAdditionalAllocTest)
-{
- // do this in separate scope to allow auto-release of buffers at the end
- {
- std::vector vBuffers;
- // get first 4 buffers and check state
- for(size_t stIndex = 0; stIndex < 4; ++stIndex)
- {
- chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer);
-
- EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get()));
- vBuffers.push_back(spBuf);
- }
-
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0);
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 12);
- EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 262144); // only one page should be allocated at the moment
- EXPECT_FALSE(tBufferManager.HasFreeBufferNA());
- EXPECT_TRUE(tBufferManager.HasFreeBuffer());
- }
-
- // check that everything was freed
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 4);
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 16);
- EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 262144); // only one page should be allocated at the moment
- EXPECT_TRUE(tBufferManager.HasFreeBuffer());
- EXPECT_TRUE(tBufferManager.HasFreeBufferNA());
-}
-
-TEST_F(DetailedBufferFixture, FullBufferTest)
-{
- // do this in separate scope to allow auto-release of buffers at the end
- {
- // retrieve all the buffers that are inside
- std::vector vBuffers;
- for(size_t stIndex = 0; stIndex < 16; ++stIndex)
- {
- chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer);
-
- EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get()));
- vBuffers.push_back(spBuf);
- }
-
- // ensure everything was taken
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0);
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 0);
- EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment
- EXPECT_FALSE(tBufferManager.HasFreeBufferNA());
- EXPECT_FALSE(tBufferManager.HasFreeBuffer());
-
- // try to get one more buffer
- chcore::TSimpleDataBuffer tFailBuffer;
- EXPECT_FALSE(tBufferManager.GetFreeBuffer(tFailBuffer));
- }
-
- // ensure everything was freed as expected
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 16);
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 16);
- EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment
- EXPECT_TRUE(tBufferManager.HasFreeBufferNA());
- EXPECT_TRUE(tBufferManager.HasFreeBuffer());
-}
-
-TEST_F(DetailedBufferFixture, FullBufferWithResizeTest)
-{
- // do this in separate scope to allow auto-release of buffers at the end
- {
- // get all buffers
- std::vector vBuffers;
- for(size_t stIndex = 0; stIndex < 16; ++stIndex)
- {
- chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer);
-
- EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get()));
- vBuffers.push_back(spBuf);
- }
-
- // now resize to quarter the size
- size_t stNewSize = 262144;
- tBufferManager.CheckResizeSize(stNewSize);
- EXPECT_NO_FATAL_FAILURE(tBufferManager.ChangeMaxMemorySize(stNewSize));
-
- // since all of the memory was already taken, there was no real freeing
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 0);
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0);
- EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment
- EXPECT_FALSE(tBufferManager.HasFreeBufferNA());
- EXPECT_FALSE(tBufferManager.HasFreeBuffer());
- EXPECT_EQ(tBufferManager.GetMaxMemorySize(), 256*1024); // only a single page is available
-
- // get rid of the small buffers (except for one)
- for(size_t stIndex = 0; stIndex < 15; ++stIndex)
- {
- vBuffers.erase(vBuffers.end() - 1);
- }
-
- // now only one page should be left
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 3);
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 3);
- EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 256*1024); // only one page should be allocated at the moment
- EXPECT_TRUE(tBufferManager.HasFreeBufferNA());
- EXPECT_TRUE(tBufferManager.HasFreeBuffer());
- EXPECT_EQ(tBufferManager.GetMaxMemorySize(), 256*1024);
- }
-
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 4);
- EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 4);
- EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 256*1024); // only one page should be allocated at the moment
- EXPECT_TRUE(tBufferManager.HasFreeBufferNA());
- EXPECT_TRUE(tBufferManager.HasFreeBuffer());
-}
-
-/*
-static bool CheckBufferConfig(size_t& stMaxMemory, size_t& stPageSize, size_t& stBufferSize);
-static bool CheckBufferConfig(size_t& stMaxMemory);
-
-// initialization
-void Initialize(size_t stMaxMemory);
-void Initialize(size_t stMaxMemory, size_t stPageSize, size_t stBufferSize);
-bool IsInitialized() const;
-
-bool CheckResizeSize(size_t& stNewMaxSize);
-void ChangeMaxMemorySize(size_t stNewMaxSize);
-
-// current settings
-size_t GetMaxMemorySize() const { return m_stMaxMemory; }
-size_t GetPageSize() const { return m_stPageSize; }
-size_t GetSimpleBufferSize() const { return m_stBufferSize; }
-
-size_t GetRealAllocatedMemorySize() const;
-
-// buffer retrieval
-bool HasFreeBuffer() const; // checks if a buffer is available without allocating any new memory
-size_t GetCountOfFreeBuffers() const; // how many free buffers are there that can be used without allocating additional memory
-
-bool GetFreeBuffer(TSimpleDataBuffer& rSimpleBuffer);
-void ReleaseBuffer(TSimpleDataBuffer& rSimpleBuffer);
-*/
Index: src/libchcore/Tests/TestsTSQLiteDatabase.cpp
===================================================================
diff -u -N
--- src/libchcore/Tests/TestsTSQLiteDatabase.cpp (revision 0)
+++ src/libchcore/Tests/TestsTSQLiteDatabase.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -0,0 +1,13 @@
+#include "stdafx.h"
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include "../TSQLiteDatabase.h"
+
+using namespace chcore::sqlite;
+
+TEST(SQLiteDatabase, CreationWithVerification)
+{
+ TSQLiteDatabase db(_T(":memory:"));
+ EXPECT_TRUE(db.GetHandle() != NULL);
+ EXPECT_FALSE(db.GetInTransaction());
+}
Index: src/libchcore/Tests/TestsTSQLiteStatement.cpp
===================================================================
diff -u -N
--- src/libchcore/Tests/TestsTSQLiteStatement.cpp (revision 0)
+++ src/libchcore/Tests/TestsTSQLiteStatement.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -0,0 +1,108 @@
+#include "stdafx.h"
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include "../TSQLiteDatabase.h"
+#include "../TSQLiteStatement.h"
+#include "../TSQLiteException.h"
+
+using namespace chcore::sqlite;
+
+TEST(SQLiteStatement, CorrectPrepare)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+ TSQLiteStatement tStatement(spDB);
+
+ tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))"));
+ EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step());
+}
+
+TEST(SQLiteStatement, IncorrectPrepare)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+ TSQLiteStatement tStatement(spDB);
+
+ EXPECT_THROW(tStatement.Prepare(_T("CREATE incorrect TABLE test(col1 INTEGER, col2 VARCHAR(40))")), TSQLiteException);
+}
+
+TEST(SQLiteStatement, PreparedStep)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+ TSQLiteStatement tStatement(spDB);
+
+ tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))"));
+ EXPECT_EQ(tStatement.Step(), TSQLiteStatement::eStep_Finished);
+}
+
+TEST(SQLiteStatement, UnpreparedStep)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+ TSQLiteStatement tStatement(spDB);
+
+ EXPECT_THROW(tStatement.Step(), TSQLiteException);
+}
+
+TEST(SQLiteStatement, UnpreparedBind)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+ TSQLiteStatement tStatement(spDB);
+
+ // insert data
+ EXPECT_THROW(tStatement.BindValue(1, 54), TSQLiteException);
+}
+
+TEST(SQLiteStatement, InsertAndRetrieveData)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+ TSQLiteStatement tStatement(spDB);
+
+ // create schema
+ tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))"));
+ EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step());
+
+ // insert data
+ tStatement.Prepare(_T("INSERT INTO test(col1, col2) VALUES(?1, ?2)"));
+ tStatement.BindValue(1, 54);
+ tStatement.BindValue(2, _T("Some Value"));
+ EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step());
+
+ // retrieve data
+ tStatement.Prepare(_T("SELECT col2, col1 FROM test"));
+ EXPECT_EQ(TSQLiteStatement::eStep_HasRow, tStatement.Step());
+ EXPECT_EQ(54, tStatement.GetInt(1));
+ EXPECT_STREQ(_T("Some Value"), tStatement.GetText(0));
+}
+
+TEST(SQLiteStatement, ClearBindings)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+ TSQLiteStatement tStatement(spDB);
+
+ // create schema
+ tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))"));
+ EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step());
+
+ // insert data
+ tStatement.Prepare(_T("INSERT INTO test(col1, col2) VALUES(?1, ?2)"));
+
+ tStatement.BindValue(1, 54);
+ tStatement.BindValue(2, _T("Some Value"));
+ EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step());
+
+ tStatement.BindValue(1, 32);
+ tStatement.BindValue(2, _T("???"));
+ EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step());
+
+ // retrieve data
+ tStatement.Prepare(_T("SELECT col2, col1 FROM test ORDER BY col1"));
+ EXPECT_EQ(TSQLiteStatement::eStep_HasRow, tStatement.Step());
+
+ EXPECT_EQ(32, tStatement.GetInt(1));
+ EXPECT_STREQ(_T("???"), tStatement.GetText(0));
+
+ EXPECT_EQ(TSQLiteStatement::eStep_HasRow, tStatement.Step());
+
+ EXPECT_EQ(54, tStatement.GetInt(1));
+ EXPECT_STREQ(_T("Some Value"), tStatement.GetText(0));
+
+ EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step());
+}
Index: src/libchcore/Tests/TestsTSQLiteTransaction.cpp
===================================================================
diff -u -N
--- src/libchcore/Tests/TestsTSQLiteTransaction.cpp (revision 0)
+++ src/libchcore/Tests/TestsTSQLiteTransaction.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -0,0 +1,81 @@
+#include "stdafx.h"
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include "../TSQLiteTransaction.h"
+#include "../TSQLiteDatabase.h"
+#include "../TSQLiteStatement.h"
+#include "../TSQLiteException.h"
+
+using namespace chcore::sqlite;
+
+TEST(SQLiteTransaction, BeginTransactionWithDefaultRollback_Empty)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+
+ // separate scope for the transaction
+ {
+ TSQLiteTransaction tran(spDB);
+ EXPECT_TRUE(spDB->GetInTransaction());
+ }
+ EXPECT_FALSE(spDB->GetInTransaction());
+}
+
+TEST(SQLiteTransaction, BeginTransactionWithDefaultRollback_WithData)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+ TSQLiteStatement tStatement(spDB);
+
+ // separate scope for the transaction
+ {
+ TSQLiteTransaction tran(spDB);
+
+ tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))"));
+ tStatement.Step();
+
+ tStatement.Prepare(_T("INSERT INTO test(col1, col2) VALUES(?1, ?2)"));
+ tStatement.BindValue(1, 54);
+ tStatement.BindValue(2, _T("Some Value"));
+ tStatement.Step();
+ }
+
+ // rollback seem to revert the schema changes, so this statement can't be processed due to missing table
+ EXPECT_THROW(tStatement.Prepare(_T("SELECT count(*) FROM test")), TSQLiteException);
+}
+
+TEST(SQLiteTransaction, BeginTransactionWithCommit)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+
+ // separate scope for the transaction
+ TSQLiteTransaction tran(spDB);
+
+ tran.Commit();
+ EXPECT_FALSE(spDB->GetInTransaction());
+}
+
+TEST(SQLiteTransaction, BeginTransactionWithCommit_WithData)
+{
+ TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:")));
+ TSQLiteStatement tStatement(spDB);
+
+ // separate scope for the transaction
+ {
+ TSQLiteTransaction tran(spDB);
+
+ tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))"));
+ tStatement.Step();
+
+ tStatement.Prepare(_T("INSERT INTO test(col1, col2) VALUES(?1, ?2)"));
+ tStatement.BindValue(1, 54);
+ tStatement.BindValue(2, _T("Some Value"));
+ tStatement.Step();
+
+ tran.Commit();
+ }
+
+ // rollback seem to revert the schema changes, so this statement can't be processed due to missing table
+ tStatement.Prepare(_T("SELECT count(*) FROM test"));
+ tStatement.Step();
+
+ EXPECT_EQ(1, tStatement.GetInt(0));
+}
Index: src/libchcore/libchcore.vc90.vcproj
===================================================================
diff -u -N -ra5f396da5ed5ffb3fcd9fdf22afb5a7fd07e1ab8 -r3397fd021739bea537248415a7b4fc2712dd2320
--- src/libchcore/libchcore.vc90.vcproj (.../libchcore.vc90.vcproj) (revision a5f396da5ed5ffb3fcd9fdf22afb5a7fd07e1ab8)
+++ src/libchcore/libchcore.vc90.vcproj (.../libchcore.vc90.vcproj) (revision 3397fd021739bea537248415a7b4fc2712dd2320)
@@ -1,7 +1,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+