comparison src/wxsqlite3.cpp @ 21:a2ad87cad48b

Enhanced the convenience of Cache dialog.
author pyon@macmini
date Wed, 17 Dec 2014 00:52:43 +0900
parents 0c0701a935f8
children
comparison
equal deleted inserted replaced
20:226774bf49fc 21:a2ad87cad48b
95 rcode s_##fname farguse;\ 95 rcode s_##fname farguse;\
96 }; 96 };
97 #include "wx/wxsqlite3dyn.h" 97 #include "wx/wxsqlite3dyn.h"
98 #undef DYNFUNC 98 #undef DYNFUNC
99 99
100 #else
101 // Define Windows specific SQLite API functions (not defined in sqlite3.h)
102 #if SQLITE_VERSION_NUMBER >= 3007014
103 #if defined(__WXMSW__)
104 #ifdef __cplusplus
105 extern "C" {
106 #endif
107 SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue);
108 #ifdef __cplusplus
109 }
110 #endif
111 #endif
112 #endif
100 #endif // wxUSE_DYNAMIC_SQLITE3_LOAD 113 #endif // wxUSE_DYNAMIC_SQLITE3_LOAD
101 114
102 // Error messages 115 // Error messages
103 116
104 #if wxCHECK_VERSION(2,9,0) 117 #if wxCHECK_VERSION(2,9,0)
135 148
136 const char* wxERRMSG_SHARED_CACHE = wxTRANSLATE("Setting SQLite shared cache mode failed"); 149 const char* wxERRMSG_SHARED_CACHE = wxTRANSLATE("Setting SQLite shared cache mode failed");
137 150
138 const char* wxERRMSG_INITIALIZE = wxTRANSLATE("Initialization of SQLite failed"); 151 const char* wxERRMSG_INITIALIZE = wxTRANSLATE("Initialization of SQLite failed");
139 const char* wxERRMSG_SHUTDOWN = wxTRANSLATE("Shutdown of SQLite failed"); 152 const char* wxERRMSG_SHUTDOWN = wxTRANSLATE("Shutdown of SQLite failed");
140 153 const char* wxERRMSG_TEMPDIR = wxTRANSLATE("Setting temporary directory failed");
141 const char* wxERRMSG_SOURCEDB_BUSY = wxTRANSLATE("Source database is busy"); 154
142 const char* wxERRMSG_DBOPEN_FAILED = wxTRANSLATE("Database open failed"); 155 const char* wxERRMSG_SOURCEDB_BUSY = wxTRANSLATE("Source database is busy");
143 const char* wxERRMSG_DBCLOSE_FAILED = wxTRANSLATE("Database close failed"); 156 const char* wxERRMSG_DBOPEN_FAILED = wxTRANSLATE("Database open failed");
157 const char* wxERRMSG_DBCLOSE_FAILED = wxTRANSLATE("Database close failed");
144 const char* wxERRMSG_DBASSIGN_FAILED = wxTRANSLATE("Database assignment failed"); 158 const char* wxERRMSG_DBASSIGN_FAILED = wxTRANSLATE("Database assignment failed");
145 const char* wxERRMSG_FINALIZE_FAILED = wxTRANSLATE("Finalize failed"); 159 const char* wxERRMSG_FINALIZE_FAILED = wxTRANSLATE("Finalize failed");
146 #else 160 #else
147 const wxChar* wxERRMSG_NODB = wxTRANSLATE("No Database opened"); 161 const wxChar* wxERRMSG_NODB = wxTRANSLATE("No Database opened");
148 const wxChar* wxERRMSG_NOSTMT = wxTRANSLATE("Statement not accessible"); 162 const wxChar* wxERRMSG_NOSTMT = wxTRANSLATE("Statement not accessible");
177 191
178 const wxChar* wxERRMSG_SHARED_CACHE = wxTRANSLATE("Setting SQLite shared cache mode failed"); 192 const wxChar* wxERRMSG_SHARED_CACHE = wxTRANSLATE("Setting SQLite shared cache mode failed");
179 193
180 const wxChar* wxERRMSG_INITIALIZE = wxTRANSLATE("Initialization of SQLite failed"); 194 const wxChar* wxERRMSG_INITIALIZE = wxTRANSLATE("Initialization of SQLite failed");
181 const wxChar* wxERRMSG_SHUTDOWN = wxTRANSLATE("Shutdown of SQLite failed"); 195 const wxChar* wxERRMSG_SHUTDOWN = wxTRANSLATE("Shutdown of SQLite failed");
196 const wxChar* wxERRMSG_TEMPDIR = wxTRANSLATE("Setting temporary directory failed");
182 197
183 const wxChar* wxERRMSG_SOURCEDB_BUSY = wxTRANSLATE("Source database is busy"); 198 const wxChar* wxERRMSG_SOURCEDB_BUSY = wxTRANSLATE("Source database is busy");
184 const wxChar* wxERRMSG_DBOPEN_FAILED = wxTRANSLATE("Database open failed"); 199 const wxChar* wxERRMSG_DBOPEN_FAILED = wxTRANSLATE("Database open failed");
185 const wxChar* wxERRMSG_DBCLOSE_FAILED = wxTRANSLATE("Database close failed"); 200 const wxChar* wxERRMSG_DBCLOSE_FAILED = wxTRANSLATE("Database close failed");
186 const wxChar* wxERRMSG_DBASSIGN_FAILED = wxTRANSLATE("Database assignment failed"); 201 const wxChar* wxERRMSG_DBASSIGN_FAILED = wxTRANSLATE("Database assignment failed");
187 const wxChar* wxERRMSG_FINALIZE_FAILED = wxTRANSLATE("Finalize failed"); 202 const wxChar* wxERRMSG_FINALIZE_FAILED = wxTRANSLATE("Finalize failed");
188 #endif 203 #endif
189 204
190 // Critical sections are used to make access to it thread safe if necessary. 205 // Critical sections are used to make access to it thread safe if necessary.
2204 #else 2219 #else
2205 return false; 2220 return false;
2206 #endif 2221 #endif
2207 } 2222 }
2208 2223
2224 int wxSQLite3Statement::Status(wxSQLite3StatementStatus opCode, bool resetFlag)
2225 {
2226 int count = 0;
2227 #if SQLITE_VERSION_NUMBER >= 3007000
2228 CheckStmt();
2229 count = sqlite3_stmt_status(m_stmt->m_stmt, (int) opCode, (resetFlag) ? 1 : 0 );
2230 #endif
2231 return count;
2232 }
2233
2209 void wxSQLite3Statement::CheckDatabase() 2234 void wxSQLite3Statement::CheckDatabase()
2210 { 2235 {
2211 if (m_db == NULL || m_db->m_db == NULL || !m_db->m_isValid) 2236 if (m_db == NULL || m_db->m_db == NULL || !m_db->m_isValid)
2212 { 2237 {
2213 throw wxSQLite3Exception(WXSQLITE_ERROR, wxERRMSG_NODB); 2238 throw wxSQLite3Exception(WXSQLITE_ERROR, wxERRMSG_NODB);
3501 #else 3526 #else
3502 return wxEmptyString; 3527 return wxEmptyString;
3503 #endif 3528 #endif
3504 } 3529 }
3505 3530
3506 bool wxSQLite3Database::CreateFunction(const wxString& funcName, int argCount, wxSQLite3ScalarFunction& function) 3531 bool wxSQLite3Database::CreateFunction(const wxString& funcName, int argCount, wxSQLite3ScalarFunction& function, bool isDeterministic)
3507 { 3532 {
3508 CheckDatabase(); 3533 CheckDatabase();
3509 wxCharBuffer strFuncName = funcName.ToUTF8(); 3534 wxCharBuffer strFuncName = funcName.ToUTF8();
3510 const char* localFuncName = strFuncName; 3535 const char* localFuncName = strFuncName;
3536 int flags = SQLITE_UTF8;
3537 #if SQLITE_VERSION_NUMBER >= 3008003
3538 if (isDeterministic)
3539 {
3540 flags |= SQLITE_DETERMINISTIC;
3541 }
3542 #endif
3511 int rc = sqlite3_create_function(m_db->m_db, localFuncName, argCount, 3543 int rc = sqlite3_create_function(m_db->m_db, localFuncName, argCount,
3512 SQLITE_UTF8, &function, 3544 flags, &function,
3513 (void (*)(sqlite3_context*,int,sqlite3_value**)) wxSQLite3FunctionContext::ExecScalarFunction, NULL, NULL); 3545 (void (*)(sqlite3_context*,int,sqlite3_value**)) wxSQLite3FunctionContext::ExecScalarFunction, NULL, NULL);
3514 return rc == SQLITE_OK; 3546 return rc == SQLITE_OK;
3515 } 3547 }
3516 3548
3517 bool wxSQLite3Database::CreateFunction(const wxString& funcName, int argCount, wxSQLite3AggregateFunction& function) 3549 bool wxSQLite3Database::CreateFunction(const wxString& funcName, int argCount, wxSQLite3AggregateFunction& function, bool isDeterministic)
3518 { 3550 {
3519 CheckDatabase(); 3551 CheckDatabase();
3520 wxCharBuffer strFuncName = funcName.ToUTF8(); 3552 wxCharBuffer strFuncName = funcName.ToUTF8();
3521 const char* localFuncName = strFuncName; 3553 const char* localFuncName = strFuncName;
3554 int flags = SQLITE_UTF8;
3555 #if SQLITE_VERSION_NUMBER >= 3008003
3556 if (isDeterministic)
3557 {
3558 flags |= SQLITE_DETERMINISTIC;
3559 }
3560 #endif
3522 int rc = sqlite3_create_function(m_db->m_db, localFuncName, argCount, 3561 int rc = sqlite3_create_function(m_db->m_db, localFuncName, argCount,
3523 SQLITE_UTF8, &function, 3562 flags, &function,
3524 NULL, 3563 NULL,
3525 (void (*)(sqlite3_context*,int,sqlite3_value**)) wxSQLite3FunctionContext::ExecAggregateStep, 3564 (void (*)(sqlite3_context*,int,sqlite3_value**)) wxSQLite3FunctionContext::ExecAggregateStep,
3526 (void (*)(sqlite3_context*)) wxSQLite3FunctionContext::ExecAggregateFinalize); 3565 (void (*)(sqlite3_context*)) wxSQLite3FunctionContext::ExecAggregateFinalize);
3527 return rc == SQLITE_OK; 3566 return rc == SQLITE_OK;
3528 } 3567 }
3914 } 3953 }
3915 #endif 3954 #endif
3916 } 3955 }
3917 3956
3918 /* static */ 3957 /* static */
3958 bool wxSQLite3Database::SetTemporaryDirectory(const wxString& tempDirectory)
3959 {
3960 bool ok = false;
3961 #if SQLITE_VERSION_NUMBER >= 3007014
3962 #if defined(__WXMSW__)
3963 DWORD SQLITE_WIN32_TEMP_DIRECTORY_TYPE = 2;
3964 #if wxUSE_UNICODE
3965 const wxChar* zValue = tempDirectory.wc_str();
3966 #else
3967 const wxWCharBuffer zValue = tempDirectory.wc_str(wxConvLocal);
3968 #endif
3969 int rc = sqlite3_win32_set_directory(SQLITE_WIN32_TEMP_DIRECTORY_TYPE, zValue);
3970 ok = (rc == SQLITE_OK);
3971 #if 0
3972 if (rc != SQLITE_OK)
3973 {
3974 throw wxSQLite3Exception(rc, wxERRMSG_TEMPDIR);
3975 }
3976 #endif
3977 #endif
3978 #endif
3979 return ok;
3980 }
3981
3982 /* static */
3919 bool wxSQLite3Database::Randomness(int n, wxMemoryBuffer& random) 3983 bool wxSQLite3Database::Randomness(int n, wxMemoryBuffer& random)
3920 { 3984 {
3921 bool ok = false; 3985 bool ok = false;
3922 #if SQLITE_VERSION_NUMBER >= 3005008 3986 #if SQLITE_VERSION_NUMBER >= 3005008
3923 if (n > 0) 3987 if (n > 0)
4230 wxT("SQLITE_DROP_TEMP_VIEW"), wxT("SQLITE_DROP_TRIGGER"), wxT("SQLITE_DROP_VIEW"), 4294 wxT("SQLITE_DROP_TEMP_VIEW"), wxT("SQLITE_DROP_TRIGGER"), wxT("SQLITE_DROP_VIEW"),
4231 wxT("SQLITE_INSERT"), wxT("SQLITE_PRAGMA"), wxT("SQLITE_READ"), 4295 wxT("SQLITE_INSERT"), wxT("SQLITE_PRAGMA"), wxT("SQLITE_READ"),
4232 wxT("SQLITE_SELECT"), wxT("SQLITE_TRANSACTION"), wxT("SQLITE_UPDATE"), 4296 wxT("SQLITE_SELECT"), wxT("SQLITE_TRANSACTION"), wxT("SQLITE_UPDATE"),
4233 wxT("SQLITE_ATTACH"), wxT("SQLITE_DETACH"), wxT("SQLITE_ALTER_TABLE"), 4297 wxT("SQLITE_ATTACH"), wxT("SQLITE_DETACH"), wxT("SQLITE_ALTER_TABLE"),
4234 wxT("SQLITE_REINDEX"), wxT("SQLITE_ANALYZE"), wxT("SQLITE_CREATE_VTABLE"), 4298 wxT("SQLITE_REINDEX"), wxT("SQLITE_ANALYZE"), wxT("SQLITE_CREATE_VTABLE"),
4235 wxT("SQLITE_DROP_VTABLE"), wxT("SQLITE_FUNCTION"), wxT("SQLITE_SAVEPOINT") 4299 wxT("SQLITE_DROP_VTABLE"), wxT("SQLITE_FUNCTION"), wxT("SQLITE_SAVEPOINT"),
4300 wxT("SQLITE_RECURSIVE")
4236 }; 4301 };
4237 4302
4238 4303
4239 /* static */ 4304 /* static */
4240 wxString wxSQLite3Authorizer::AuthorizationCodeToString(wxSQLite3Authorizer::wxAuthorizationCode type) 4305 wxString wxSQLite3Authorizer::AuthorizationCodeToString(wxSQLite3Authorizer::wxAuthorizationCode type)