//////////////////////////////////////////////////////////////////////////////// // CppSQLite3U is a C++ unicode wrapper around the SQLite3 embedded database library. // // Copyright (c) 2006 Tyushkov Nikolay. All Rights Reserved. http://softvoile.com // // // Based on beautiful wrapper written by Rob Groves // (https://secure.codeproject.com/database/CppSQLite.asp). // Very good wrapper, but without unicode support unfortunately. // So, I have reconstructed it for unicode. // // CppSQLite3 wrapper: // Copyright (c) 2004 Rob Groves. All Rights Reserved. rob.groves@btinternet.com // // Permission to use, copy, modify, and distribute this software and its // documentation for any purpose, without fee, and without a written // agreement, is hereby granted, provided that the above copyright notice, // this paragraph and the following two paragraphs appear in all copies, // modifications, and distributions. // // IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, // INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST // PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, // EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF // ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS". THE AUTHOR HAS NO OBLIGATION // TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. // // If you want to get some documentation look at // https://secure.codeproject.com/database/CppSQLite.asp // Note, not all features from CppSQLite3 were implemented in CppSQLite3U // // V1.0 11/06/2006 - Initial Public Version // // Noteses : // I have tested this wrapper only in unicode version, so I have no idea // about its work in ANSI configuration, I think it doesn't work without modification;) // // Home page : http://softvoile.com/development/CppSQLite3U/ // Please send all bug report and comment to mail2@softvoile.com // // //////////////////////////////////////////////////////////////////////////////// #pragma once #include "stdafx.h" #include "sqlite3.h" namespace OTSSQLITE { #define SQL_MAXSIZE 2048 #define CPPSQLITE_ERROR 1000 static const bool DONT_DELETE_MSG = false; CString DoubleQuotes(CString in); class CppSQLite3DB; class CppSQLite3Query; class CppSQLite3Statement; typedef std::shared_ptr CppSQLite3DBPtr; class CppSQLite3Exception { public: CppSQLite3Exception(const int a_nErrCode, LPTSTR a_sErrMess, bool a_bDeleteMsg = true); CppSQLite3Exception(const CppSQLite3Exception& ex); virtual ~CppSQLite3Exception(); const int GetErrorCode() { return m_nErrCode; } LPCTSTR GetErrorMessage() { return m_sErrMessage; } static LPCTSTR GetErrorCodeAsString(int a_nErrCode); private: int m_nErrCode; CString m_sErrMessage; }; class CppSQLite3Statement { public: CppSQLite3Statement(); CppSQLite3Statement(const CppSQLite3Statement& rStatement); CppSQLite3Statement(CppSQLite3DBPtr a_pDB, sqlite3_stmt* pVM); void setDB(CppSQLite3DBPtr a_pDB) { m_pDBPtr = a_pDB; } virtual ~CppSQLite3Statement(); CppSQLite3Statement& operator=(const CppSQLite3Statement& rStatement); int execDML(); CppSQLite3Query execQuery(); void bind(int nParam, LPCTSTR szValue); void bind(int nParam, const int nValue); void bind(int nParam, const double dwValue); void bind(int nParam, const unsigned char* blobValue, int nLen); void bindNull(int nParam); void reset(); void finalize(); private: void checkDB(); void checkVM(); CppSQLite3DBPtr m_pDBPtr; sqlite3_stmt* m_pVM; }; typedef std::shared_ptr CppSQLite3StatementPtr; class CppSQLite3Query { public: CppSQLite3Query(); CppSQLite3Query(const CppSQLite3Query& rQuery); CppSQLite3Query(CppSQLite3DBPtr a_pDB, sqlite3_stmt* pVM, bool bEof, bool bOwnVM=true); CppSQLite3Query& operator=(const CppSQLite3Query& rQuery); virtual ~CppSQLite3Query(); int numFields(); int fieldIndex(LPCTSTR szField); LPCTSTR fieldName(int nCol); LPCTSTR fieldDeclType(int nCol); int fieldDataType(int nCol); LPCTSTR fieldValue(int nField); LPCTSTR fieldValue(LPCTSTR szField); int getIntField(int nField, int nNullValue=0); int getIntField(LPCTSTR szField, int nNullValue=0); double getFloatField(int nField, double fNullValue=0.0); double getFloatField(LPCTSTR szField, double fNullValue=0.0); LPCTSTR getStringField(int nField, LPCTSTR szNullValue=_T("")); LPCTSTR getStringField(LPCTSTR szField, LPCTSTR szNullValue=_T("")); const unsigned char* getBlobField(int nField, int& nLen); const unsigned char* getBlobField(LPCTSTR szField, int& nLen); bool fieldIsNull(int nField); bool fieldIsNull(LPCTSTR szField); bool eof(); void nextRow(); void finalize(); private: void checkVM(); CppSQLite3DBPtr m_pDBPtr; sqlite3_stmt* m_pVM; bool m_bEof; int m_nCols; bool m_bOwnVM; }; typedef std::shared_ptr CppSQLite3QueryPtr; class CppSQLite3DB : public std::enable_shared_from_this { // Construction public: CppSQLite3DB(); // Operations public: virtual ~CppSQLite3DB(); void open(LPCTSTR szFile); bool isOpened(); void close(); bool tableExists(LPCTSTR szTable); int execDML(LPCTSTR szSQL); CppSQLite3QueryPtr execQuery(LPCTSTR szSQL); int execScalar(LPCTSTR szSQL); CString execScalarStr(LPCTSTR szSQL); CppSQLite3StatementPtr compileStatement(LPCTSTR szSQL); sqlite_int64 lastRowId(); void interrupt() { sqlite3_interrupt(m_pDB); } void setBusyTimeout(int nMillisecs); static const char* SQLiteVersion() { return SQLITE_VERSION; } private: CppSQLite3DB(const CppSQLite3DB& db); CppSQLite3DB& operator=(const CppSQLite3DB& db); sqlite3_stmt* compile(LPCTSTR szSQL); void checkDB(); public: sqlite3* m_pDB; int m_nBusyTimeoutMs; }; ///////////////////////////////////////////////////////////////////////////// // // TCHAR based sqlite3 function names for Unicode/MCBS builds. // #if defined(_UNICODE) || defined(UNICODE) //#pragma message(Reminder "Unicode Selected.") #define _sqlite3_aggregate_context sqlite3_aggregate_context #define _sqlite3_aggregate_count sqlite3_aggregate_count #define _sqlite3_bind_blob sqlite3_bind_blob #define _sqlite3_bind_double sqlite3_bind_double #define _sqlite3_bind_int sqlite3_bind_int #define _sqlite3_bind_int64 sqlite3_bind_int64 #define _sqlite3_bind_null sqlite3_bind_null #define _sqlite3_bind_parameter_count sqlite3_bind_parameter_count #define _sqlite3_bind_parameter_index sqlite3_bind_parameter_index #define _sqlite3_bind_parameter_name sqlite3_bind_parameter_name #define _sqlite3_bind_text sqlite3_bind_text16 #define _sqlite3_bind_text16 sqlite3_bind_text16 #define _sqlite3_busy_handler sqlite3_busy_handler #define _sqlite3_busy_timeout sqlite3_busy_timeout #define _sqlite3_changes sqlite3_changes #define _sqlite3_close sqlite3_close #define _sqlite3_collation_needed sqlite3_collation_needed16 #define _sqlite3_collation_needed16 sqlite3_collation_needed16 #define _sqlite3_column_blob sqlite3_column_blob #define _sqlite3_column_bytes sqlite3_column_bytes16 #define _sqlite3_column_bytes16 sqlite3_column_bytes16 #define _sqlite3_column_count sqlite3_column_count #define _sqlite3_column_decltype sqlite3_column_decltype16 #define _sqlite3_column_decltype16 sqlite3_column_decltype16 #define _sqlite3_column_double sqlite3_column_double #define _sqlite3_column_int sqlite3_column_int #define _sqlite3_column_int64 sqlite3_column_int64 #define _sqlite3_column_name sqlite3_column_name16 #define _sqlite3_column_name16 sqlite3_column_name16 #define _sqlite3_column_text sqlite3_column_text16 #define _sqlite3_column_text16 sqlite3_column_text16 #define _sqlite3_column_type sqlite3_column_type #define _sqlite3_commit_hook sqlite3_commit_hook #define _sqlite3_complete sqlite3_complete16 #define _sqlite3_complete16 sqlite3_complete16 #define _sqlite3_create_collation sqlite3_create_collation16 #define _sqlite3_create_collation16 sqlite3_create_collation16 #define _sqlite3_create_function sqlite3_create_function16 #define _sqlite3_create_function16 sqlite3_create_function16 #define _sqlite3_data_count sqlite3_data_count #define _sqlite3_errcode sqlite3_errcode #define _sqlite3_errmsg sqlite3_errmsg16 #define _sqlite3_errmsg16 sqlite3_errmsg16 #define _sqlite3_exec sqlite3_exec #define _sqlite3_finalize sqlite3_finalize #define _sqlite3_free sqlite3_free #define _sqlite3_free_table sqlite3_free_table #define _sqlite3_get_table sqlite3_get_table #define _sqlite3_interrupt sqlite3_interrupt #define _sqlite3_last_insert_rowid sqlite3_last_insert_rowid #define _sqlite3_libversion sqlite3_libversion #define _sqlite3_mprintf sqlite3_mprintf #define _sqlite3_open sqlite3_open16 #define _sqlite3_open16 sqlite3_open16 #define _sqlite3_prepare sqlite3_prepare16 #define _sqlite3_prepare16 sqlite3_prepare16 #define _sqlite3_progress_handler sqlite3_progress_handler #define _sqlite3_reset sqlite3_reset #define _sqlite3_result_blob sqlite3_result_blob #define _sqlite3_result_double sqlite3_result_double #define _sqlite3_result_error sqlite3_result_error16 #define _sqlite3_result_error16 sqlite3_result_error16 #define _sqlite3_result_int sqlite3_result_int #define _sqlite3_result_int64 sqlite3_result_int64 #define _sqlite3_result_null sqlite3_result_null #define _sqlite3_result_text sqlite3_result_text16 #define _sqlite3_result_text16 sqlite3_result_text16 #define _sqlite3_result_text16be sqlite3_result_text16be #define _sqlite3_result_text16le sqlite3_result_text16le #define _sqlite3_result_value sqlite3_result_value #define _sqlite3_set_authorizer sqlite3_set_authorizer #define _sqlite3_step sqlite3_step #define _sqlite3_total_changes sqlite3_total_changes #define _sqlite3_trace sqlite3_trace #define _sqlite3_user_data sqlite3_user_data #define _sqlite3_value_blob sqlite3_value_blob #define _sqlite3_value_bytes sqlite3_value_bytes16 #define _sqlite3_value_bytes16 sqlite3_value_bytes16 #define _sqlite3_value_double sqlite3_value_double #define _sqlite3_value_int sqlite3_value_int #define _sqlite3_value_int64 sqlite3_value_int64 #define _sqlite3_value_text sqlite3_value_text16 #define _sqlite3_value_text16 sqlite3_value_text16 #define _sqlite3_value_text16be sqlite3_value_text16be #define _sqlite3_value_text16le sqlite3_value_text16le #define _sqlite3_value_type sqlite3_value_type #define _sqlite3_vmprintf sqlite3_vmprintf #else //#pragma message(Reminder "MCBS Selected.") #define _sqlite3_aggregate_context sqlite3_aggregate_context #define _sqlite3_aggregate_count sqlite3_aggregate_count #define _sqlite3_bind_blob sqlite3_bind_blob #define _sqlite3_bind_double sqlite3_bind_double #define _sqlite3_bind_int sqlite3_bind_int #define _sqlite3_bind_int64 sqlite3_bind_int64 #define _sqlite3_bind_null sqlite3_bind_null #define _sqlite3_bind_parameter_count sqlite3_bind_parameter_count #define _sqlite3_bind_parameter_index sqlite3_bind_parameter_index #define _sqlite3_bind_parameter_name sqlite3_bind_parameter_name #define _sqlite3_bind_text sqlite3_bind_text #define _sqlite3_bind_text16 sqlite3_bind_text16 #define _sqlite3_busy_handler sqlite3_busy_handler #define _sqlite3_busy_timeout sqlite3_busy_timeout #define _sqlite3_changes sqlite3_changes #define _sqlite3_close sqlite3_close #define _sqlite3_collation_needed sqlite3_collation_needed #define _sqlite3_collation_needed16 sqlite3_collation_needed16 #define _sqlite3_column_blob sqlite3_column_blob #define _sqlite3_column_bytes sqlite3_column_bytes #define _sqlite3_column_bytes16 sqlite3_column_bytes16 #define _sqlite3_column_count sqlite3_column_count #define _sqlite3_column_decltype sqlite3_column_decltype #define _sqlite3_column_decltype16 sqlite3_column_decltype16 #define _sqlite3_column_double sqlite3_column_double #define _sqlite3_column_int sqlite3_column_int #define _sqlite3_column_int64 sqlite3_column_int64 #define _sqlite3_column_name sqlite3_column_name #define _sqlite3_column_name16 sqlite3_column_name16 #define _sqlite3_column_text sqlite3_column_text #define _sqlite3_column_text16 sqlite3_column_text16 #define _sqlite3_column_type sqlite3_column_type #define _sqlite3_commit_hook sqlite3_commit_hook #define _sqlite3_complete sqlite3_complete #define _sqlite3_complete16 sqlite3_complete16 #define _sqlite3_create_collation sqlite3_create_collation #define _sqlite3_create_collation16 sqlite3_create_collation16 #define _sqlite3_create_function sqlite3_create_function #define _sqlite3_create_function16 sqlite3_create_function16 #define _sqlite3_data_count sqlite3_data_count #define _sqlite3_errcode sqlite3_errcode #define _sqlite3_errmsg sqlite3_errmsg #define _sqlite3_errmsg16 sqlite3_errmsg16 #define _sqlite3_exec sqlite3_exec #define _sqlite3_finalize sqlite3_finalize #define _sqlite3_free sqlite3_free #define _sqlite3_free_table sqlite3_free_table #define _sqlite3_get_table sqlite3_get_table #define _sqlite3_interrupt sqlite3_interrupt #define _sqlite3_last_insert_rowid sqlite3_last_insert_rowid #define _sqlite3_libversion sqlite3_libversion #define _sqlite3_mprintf sqlite3_mprintf #define _sqlite3_open sqlite3_open #define _sqlite3_open16 sqlite3_open16 #define _sqlite3_prepare sqlite3_prepare #define _sqlite3_prepare16 sqlite3_prepare16 #define _sqlite3_progress_handler sqlite3_progress_handler #define _sqlite3_reset sqlite3_reset #define _sqlite3_result_blob sqlite3_result_blob #define _sqlite3_result_double sqlite3_result_double #define _sqlite3_result_error sqlite3_result_error #define _sqlite3_result_error16 sqlite3_result_error16 #define _sqlite3_result_int sqlite3_result_int #define _sqlite3_result_int64 sqlite3_result_int64 #define _sqlite3_result_null sqlite3_result_null #define _sqlite3_result_text sqlite3_result_text #define _sqlite3_result_text16 sqlite3_result_text16 #define _sqlite3_result_text16be sqlite3_result_text16be #define _sqlite3_result_text16le sqlite3_result_text16le #define _sqlite3_result_value sqlite3_result_value #define _sqlite3_set_authorizer sqlite3_set_authorizer #define _sqlite3_step sqlite3_step #define _sqlite3_total_changes sqlite3_total_changes #define _sqlite3_trace sqlite3_trace #define _sqlite3_user_data sqlite3_user_data #define _sqlite3_value_blob sqlite3_value_blob #define _sqlite3_value_bytes sqlite3_value_bytes #define _sqlite3_value_bytes16 sqlite3_value_bytes16 #define _sqlite3_value_double sqlite3_value_double #define _sqlite3_value_int sqlite3_value_int #define _sqlite3_value_int64 sqlite3_value_int64 #define _sqlite3_value_text sqlite3_value_text #define _sqlite3_value_text16 sqlite3_value_text16 #define _sqlite3_value_text16be sqlite3_value_text16be #define _sqlite3_value_text16le sqlite3_value_text16le #define _sqlite3_value_type sqlite3_value_type #define _sqlite3_vmprintf sqlite3_vmprintf #endif } // namespace Datastore