Changeset 1167:8160e1eba359
- Timestamp:
-
02/25/09 05:52:25
(3 years ago)
- Author:
- niam
- Branch:
- libdodo
- Message:
-
header cleanup in cgi::* and data::base::*
-
Files:
-
- 1 added
- 1 deleted
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
|
r1166
|
r1167
|
|
| 33 | 33 | #include <libdodo/directives.h> |
| 34 | 34 | |
| 35 | | #include <libdodo/types.h> |
| 36 | 35 | #include <libdodo/cgiExchange.h> |
| 37 | 36 | #include <libdodo/ioStdio.h> |
-
|
r1160
|
r1167
|
|
| 33 | 33 | #include <libdodo/directives.h> |
| 34 | 34 | |
| 35 | | #include <libdodo/types.h> |
| 36 | 35 | #include <libdodo/cgiServer.h> |
| 37 | | #include <libdodo/cgiBasicExchange.h> |
| 38 | 36 | |
| 39 | 37 | namespace dodo |
-
|
r1166
|
r1167
|
|
| 33 | 33 | #include <libdodo/directives.h> |
| 34 | 34 | |
| 35 | | #include <string.h> |
| 36 | | #include <stdlib.h> |
| | 35 | #include <libdodo/types.h> |
| 37 | 36 | |
| 38 | 37 | #include <libdodo/cgi.h> |
| 39 | | #include <libdodo/cgiDialogueEx.h> |
| 40 | | #include <libdodo/toolsMisc.h> |
| 41 | | #include <libdodo/toolsCode.h> |
| 42 | | #include <libdodo/types.h> |
| 43 | | #include <libdodo/toolsString.h> |
| 44 | 38 | #include <libdodo/cgiExchange.h> |
| 45 | | #include <libdodo/ioStdio.h> |
| 46 | 39 | |
| 47 | 40 | namespace dodo |
-
|
r1166
|
r1167
|
|
| 33 | 33 | #include <libdodo/directives.h> |
| 34 | 34 | |
| 35 | | #include <libdodo/types.h> |
| 36 | 35 | #include <libdodo/ioChannel.h> |
| 37 | 36 | |
-
|
r1166
|
r1167
|
|
| 35 | 35 | #ifdef FASTCGI_EXT |
| 36 | 36 | |
| 37 | | #include <fcgiapp.h> |
| 38 | | |
| | 37 | #include <libdodo/cgiExchange.h> |
| 39 | 38 | #include <libdodo/types.h> |
| 40 | | #include <libdodo/cgiFastExchangeEx.h> |
| 41 | | #include <libdodo/cgiExchange.h> |
| 42 | | #include <libdodo/ioChannel.h> |
| 43 | 39 | |
| 44 | 40 | namespace dodo |
| … |
… |
|
| 48 | 44 | namespace fast |
| 49 | 45 | { |
| | 46 | /** |
| | 47 | * @struct __request |
| | 48 | * @brief defines fast CGI request interface |
| | 49 | */ |
| | 50 | struct __request; |
| | 51 | |
| 50 | 52 | /** |
| 51 | 53 | * @class exchange |
| … |
… |
|
| 69 | 71 | * @param protection defines type of IO protection[see channelProtectionTypeEnum] |
| 70 | 72 | */ |
| 71 | | exchange(FCGX_Request *request, |
| 72 | | short protection = io::CHANNEL_PROTECTION_PROCESS); |
| | 73 | exchange(const __request &req, |
| | 74 | short protection = io::CHANNEL_PROTECTION_PROCESS); |
| 73 | 75 | |
| 74 | 76 | /** |
| … |
… |
|
| 129 | 131 | private: |
| 130 | 132 | |
| 131 | | FCGX_Request *request; ///< fast CGI descriptor |
| | 133 | __request *request; ///< fast CGI descriptor |
| 132 | 134 | }; |
| 133 | 135 | }; |
-
|
r1166
|
r1167
|
|
| 35 | 35 | #ifdef FASTCGI_EXT |
| 36 | 36 | |
| 37 | | #ifdef PTHREAD_EXT |
| | 37 | #include <libdodo/pcSyncThreadSection.h> |
| 38 | 38 | |
| 39 | | #include <pthread.h> |
| 40 | | |
| 41 | | #endif |
| 42 | | |
| 43 | | #include <fcgiapp.h> |
| 44 | | |
| | 39 | #include <libdodo/cgiServer.h> |
| 45 | 40 | #include <libdodo/types.h> |
| 46 | | #include <libdodo/cgiServer.h> |
| 47 | | #include <libdodo/cgiFastServerEx.h> |
| 48 | | #include <libdodo/cgiFastExchange.h> |
| 49 | | #include <libdodo/ioChannel.h> |
| 50 | 41 | |
| 51 | 42 | namespace dodo |
| … |
… |
|
| 71 | 62 | public: |
| 72 | 63 | |
| 73 | | #ifdef PTHREAD_EXT |
| 74 | | |
| 75 | 64 | /** |
| 76 | 65 | * constructor |
| … |
… |
|
| 84 | 73 | bool threading = true, |
| 85 | 74 | unsigned int threadsNum = 10); |
| 86 | | |
| 87 | | #else |
| 88 | | |
| 89 | | /** |
| 90 | | * constructor |
| 91 | | * @param limit defines limit of incoming requests |
| 92 | | * @note if limit is exhausted `listen` will return |
| 93 | | * if limit is 0 `listen` never returns |
| 94 | | */ |
| 95 | | server(unsigned long limit = 0); |
| 96 | | |
| 97 | | #endif |
| 98 | 75 | |
| 99 | 76 | /** |
| … |
… |
|
| 115 | 92 | private: |
| 116 | 93 | |
| 117 | | #ifdef PTHREAD_EXT |
| 118 | 94 | |
| 119 | 95 | bool threading; ///< true use threading |
| … |
… |
|
| 125 | 101 | * @param data defines the data that will be passed to the thread |
| 126 | 102 | */ |
| 127 | | static void *stackThread(void *data); |
| | 103 | static void *fastCGIThread(void *data); |
| 128 | 104 | |
| 129 | | static pthread_mutex_t acceptM; ///< accept request mutex |
| 130 | | static pthread_mutex_t requestsM; ///< request conter mutex |
| 131 | | |
| 132 | | #endif |
| | 105 | static pc::sync::thread::section acceptLock; ///< accept request mutex |
| | 106 | static pc::sync::thread::section requestLock; ///< accept request mutex |
| 133 | 107 | |
| 134 | 108 | static serverHandler handler; ///< function to be called on new request |
| 135 | 109 | |
| 136 | | static unsigned long limit; ///< limit of requests to serve; if 0 server forever[0 by default] |
| 137 | | static unsigned long requests; ///< counter of requests |
| | 110 | unsigned long limit; ///< limit of requests to serve; if 0 server forever[0 by default] |
| 138 | 111 | }; |
| 139 | 112 | }; |
-
|
r1160
|
r1167
|
|
| 33 | 33 | #include <libdodo/directives.h> |
| 34 | 34 | |
| 35 | | #include <libdodo/types.h> |
| 36 | 35 | #include <libdodo/cgiExchange.h> |
| 37 | 36 | |
-
|
r1164
|
r1167
|
|
| 34 | 34 | |
| 35 | 35 | #include <libdodo/types.h> |
| 36 | | #include <libdodo/toolsMisc.h> |
| 37 | | #include <libdodo/toolsString.h> |
| | 36 | #include <libdodo/xexec.h> |
| 38 | 37 | #include <libdodo/dataBaseConnector.h> |
| 39 | 38 | |
| … |
… |
|
| 49 | 48 | */ |
| 50 | 49 | class __xexecDataBaseAccumulatorCollectedData |
| 51 | | |
| 52 | 50 | #ifndef DATABASE_WO_XEXEC |
| 53 | | |
| 54 | 51 | : public __xexecCollectedData |
| 55 | | |
| 56 | 52 | #endif |
| 57 | 53 | { |
-
|
r1160
|
r1167
|
|
| 35 | 35 | #ifdef MYSQL_EXT |
| 36 | 36 | |
| 37 | | #include <mysql.h> |
| 38 | | #include <errmsg.h> |
| 39 | | #include <sys/socket.h> |
| 40 | | |
| 41 | | #include <libdodo/toolsMisc.h> |
| 42 | | #include <libdodo/dataBaseMysqlEx.h> |
| | 37 | #include <libdodo/types.h> |
| 43 | 38 | #include <libdodo/dataBaseSqlConstructor.h> |
| 44 | | #include <libdodo/xexec.h> |
| 45 | 39 | |
| 46 | 40 | namespace dodo |
| … |
… |
|
| 50 | 44 | namespace base |
| 51 | 45 | { |
| | 46 | /** |
| | 47 | * @struct __mysqlHandle |
| | 48 | * @brief defines internal handlers for MySQL DBMS interaction |
| | 49 | */ |
| | 50 | struct __mysqlHandle; |
| | 51 | |
| 52 | 52 | /** |
| 53 | 53 | * @struct __mysqlSslOptions |
| … |
… |
|
| 187 | 187 | bool empty; ///< true id mysqlRes is empty |
| 188 | 188 | |
| 189 | | MYSQL *mysqlHandle; ///< DB handle |
| 190 | | MYSQL_RES *mysqlResult; ///< handle to result |
| | 189 | __mysqlHandle *handle; ///< DB handle |
| 191 | 190 | |
| 192 | 191 | unsigned long type; ///< connection type |
-
|
r1160
|
r1167
|
|
| 35 | 35 | #ifdef POSTGRESQL_EXT |
| 36 | 36 | |
| 37 | | #include <libpq-fe.h> |
| 38 | | #include <stdlib.h> |
| 39 | | |
| 40 | | #include <libdodo/toolsMisc.h> |
| 41 | | #include <libdodo/dataBasePostgresqlEx.h> |
| | 37 | #include <libdodo/types.h> |
| 42 | 38 | #include <libdodo/dataBaseSqlConstructor.h> |
| 43 | | #include <libdodo/xexec.h> |
| 44 | 39 | |
| 45 | 40 | namespace dodo |
| … |
… |
|
| 49 | 44 | namespace base |
| 50 | 45 | { |
| | 46 | /** |
| | 47 | * @struct __postgresqlHandle |
| | 48 | * @brief defines internal handlers for MySQL DBMS interaction |
| | 49 | */ |
| | 50 | struct __postgresqlHandle; |
| | 51 | |
| 51 | 52 | /** |
| 52 | 53 | * @class postgresql |
| … |
… |
|
| 239 | 240 | bool empty; ///< true id pgResult is empty |
| 240 | 241 | |
| 241 | | PGconn *pgHandle; ///< DB handle |
| 242 | | PGresult *pgResult; ///< handlde to result |
| | 242 | __postgresqlHandle *handle; ///< DB handle |
| 243 | 243 | }; |
| 244 | 244 | }; |
-
|
r1160
|
r1167
|
|
| 33 | 33 | #include <libdodo/directives.h> |
| 34 | 34 | |
| 35 | | #include <libdodo/toolsMisc.h> |
| 36 | | #include <libdodo/dataBaseSqlConstructorEx.h> |
| 37 | 35 | #include <libdodo/types.h> |
| 38 | 36 | #include <libdodo/dataBaseAccumulator.h> |
-
|
r1160
|
r1167
|
|
| 35 | 35 | #ifdef SQLITE3_EXT |
| 36 | 36 | |
| 37 | | #include <sqlite3.h> |
| 38 | | |
| 39 | | #include <libdodo/toolsMisc.h> |
| 40 | | #include <libdodo/dataBaseSqliteEx.h> |
| 41 | 37 | #include <libdodo/dataBaseSqlConstructor.h> |
| 42 | | #include <libdodo/xexec.h> |
| 43 | 38 | |
| 44 | 39 | namespace dodo |
| … |
… |
|
| 48 | 43 | namespace base |
| 49 | 44 | { |
| | 45 | /** |
| | 46 | * @struct __mysqlHandle |
| | 47 | * @brief defines internal handlers for MySQL DBMS interaction |
| | 48 | */ |
| | 49 | struct __sqliteHandle; |
| | 50 | |
| 50 | 51 | /** |
| 51 | 52 | * @class sqlite |
| … |
… |
|
| 166 | 167 | private: |
| 167 | 168 | |
| 168 | | sqlite3 *sqliteHandle; ///< DB handle |
| 169 | | sqlite3_stmt *sqliteResult; ///< handlde to result |
| | 169 | __sqliteHandle *handle; ///< DB handle |
| 170 | 170 | |
| 171 | 171 | bool empty; ///< true if liteStmt is empty |
-
|
r1160
|
r1167
|
|
| 29 | 29 | |
| 30 | 30 | #include <libdodo/cgi.h> |
| | 31 | |
| | 32 | #include <libdodo/directives.h> |
| | 33 | |
| | 34 | #include <libdodo/types.h> |
| 31 | 35 | |
| 32 | 36 | using namespace dodo::cgi; |
-
|
r1166
|
r1167
|
|
| 30 | 30 | #include <libdodo/cgiBasicExchange.h> |
| 31 | 31 | |
| | 32 | #include <libdodo/directives.h> |
| | 33 | |
| | 34 | #include <libdodo/cgiExchange.h> |
| | 35 | #include <libdodo/ioStdio.h> |
| | 36 | |
| 32 | 37 | using namespace dodo::cgi::basic; |
| 33 | 38 | |
| … |
… |
|
| 43 | 48 | { |
| 44 | 49 | #ifndef IO_WO_XEXEC |
| 45 | | |
| 46 | 50 | collectedData.setExecObject(XEXEC_OBJECT_CGIBASICEXCHANGE); |
| 47 | | |
| 48 | 51 | #endif |
| 49 | 52 | } |
-
|
r1162
|
r1167
|
|
| 30 | 30 | #include <libdodo/cgiBasicServer.h> |
| 31 | 31 | |
| | 32 | #include <libdodo/directives.h> |
| | 33 | |
| | 34 | #include <libdodo/cgiBasicExchange.h> |
| | 35 | |
| 32 | 36 | using namespace dodo::cgi::basic; |
| 33 | 37 | |
-
|
r1166
|
r1167
|
|
| 28 | 28 | */ |
| 29 | 29 | |
| | 30 | #include <string.h> |
| | 31 | #include <stdlib.h> |
| | 32 | |
| 30 | 33 | #include <libdodo/cgiDialogue.h> |
| | 34 | |
| | 35 | #include <libdodo/directives.h> |
| | 36 | |
| | 37 | #include <libdodo/types.h> |
| | 38 | |
| | 39 | #include <libdodo/cgi.h> |
| | 40 | #include <libdodo/cgiExchange.h> |
| | 41 | #include <libdodo/cgiDialogueEx.h> |
| | 42 | |
| 31 | 43 | |
| 32 | 44 | using namespace dodo::cgi; |
-
|
r1166
|
r1167
|
|
| 30 | 30 | #include <libdodo/cgiExchange.h> |
| 31 | 31 | |
| | 32 | #include <libdodo/directives.h> |
| | 33 | |
| | 34 | #include <libdodo/ioChannel.h> |
| | 35 | |
| 32 | 36 | using namespace dodo::cgi; |
| 33 | 37 | |
-
|
r1166
|
r1167
|
|
| 28 | 28 | */ |
| 29 | 29 | |
| 30 | | #include <libdodo/cgiFastExchange.h> |
| | 30 | #include <libdodo/directives.h> |
| 31 | 31 | |
| 32 | 32 | #ifdef FASTCGI_EXT |
| | 33 | |
| | 34 | #include <fcgiapp.h> |
| | 35 | |
| | 36 | #include "cgiFastExchange.inline" |
| | 37 | |
| | 38 | #include <libdodo/cgiFastExchange.h> |
| | 39 | #include <libdodo/cgiFastExchangeEx.h> |
| | 40 | #include <libdodo/types.h> |
| | 41 | #include <libdodo/cgiExchange.h> |
| | 42 | #include <libdodo/ioChannel.h> |
| 33 | 43 | |
| 34 | 44 | using namespace dodo::cgi::fast; |
| 35 | 45 | |
| 36 | 46 | exchange::exchange(exchange &cf) : dodo::cgi::exchange(cf.protection), |
| 37 | | channel(cf.protection) |
| | 47 | channel(cf.protection), |
| | 48 | request(new __request) |
| 38 | 49 | { |
| 39 | 50 | } |
| … |
… |
|
| 41 | 52 | //------------------------------------------------------------------- |
| 42 | 53 | |
| 43 | | exchange::exchange(FCGX_Request *a_request, |
| 44 | | short protection) : request(a_request), |
| 45 | | dodo::cgi::exchange(protection), |
| 46 | | channel(protection) |
| | 54 | exchange::exchange(const __request &req, |
| | 55 | short protection) : dodo::cgi::exchange(protection), |
| | 56 | channel(protection) |
| 47 | 57 | { |
| | 58 | request->request = req.request; |
| | 59 | |
| 48 | 60 | #ifndef IO_WO_XEXEC |
| 49 | | |
| 50 | 61 | collectedData.setExecObject(XEXEC_OBJECT_CGIFASTEXCHANGE); |
| 51 | | |
| 52 | 62 | #endif |
| 53 | 63 | } |
| … |
… |
|
| 57 | 67 | exchange::~exchange() |
| 58 | 68 | { |
| | 69 | delete request; |
| 59 | 70 | } |
| 60 | 71 | |
| … |
… |
|
| 64 | 75 | exchange::flush() |
| 65 | 76 | { |
| 66 | | if (FCGX_FFlush(request->out) == -1) |
| | 77 | if (FCGX_FFlush(request->request->out) == -1) |
| 67 | 78 | { |
| 68 | 79 | throw exception::basic(exception::ERRMODULE_CGIFASTEXCHANGE, FASTEXCHANGEEX_FLUSH, exception::ERRNO_LIBDODO, FASTEXCHANGEEX_FAILEDTOFLUSH, CGIFASTEXCHANGEEX_FAILEDTOFLUSH_STR, __LINE__, __FILE__); |
| … |
… |
|
| 75 | 86 | exchange::getenv(const char *buf) |
| 76 | 87 | { |
| 77 | | return FCGX_GetParam(buf, request->envp); |
| | 88 | return FCGX_GetParam(buf, request->request->envp); |
| 78 | 89 | } |
| 79 | 90 | |
| … |
… |
|
| 101 | 112 | memset(a_data, '\0', inSize); |
| 102 | 113 | |
| 103 | | FCGX_GetStr(a_data, inSize, request->in); |
| | 114 | FCGX_GetStr(a_data, inSize, request->request->in); |
| 104 | 115 | } |
| 105 | 116 | |
| … |
… |
|
| 109 | 120 | exchange::_write(const char *const buf) |
| 110 | 121 | { |
| 111 | | if (FCGX_PutStr(buf, outSize, request->out) == -1) |
| | 122 | if (FCGX_PutStr(buf, outSize, request->request->out) == -1) |
| 112 | 123 | { |
| 113 | 124 | throw exception::basic(exception::ERRMODULE_CGIFASTEXCHANGE, FASTEXCHANGEEX__WRITE, exception::ERRNO_LIBDODO, FASTEXCHANGEEX_FAILEDTOPRINTSTRING, CGIFASTEXCHANGEEX_FAILEDTOPRINTSTRING_STR, __LINE__, __FILE__); |
-
|
r1162
|
r1167
|
|
| 28 | 28 | */ |
| 29 | 29 | |
| | 30 | #include <libdodo/directives.h> |
| | 31 | |
| | 32 | #ifdef FASTCGI_EXT |
| | 33 | |
| | 34 | #include <fcgiapp.h> |
| | 35 | |
| | 36 | #include "cgiFastExchange.inline" |
| | 37 | |
| | 38 | #include <libdodo/types.h> |
| 30 | 39 | #include <libdodo/cgiFastServer.h> |
| 31 | | |
| 32 | | #ifdef FASTCGI_EXT |
| | 40 | #include <libdodo/cgiFastServerEx.h> |
| | 41 | #include <libdodo/cgiFastExchange.h> |
| | 42 | #include <libdodo/pcSyncThreadSection.h> |
| | 43 | #include <libdodo/pcSyncProtector.h> |
| 33 | 44 | |
| 34 | 45 | using namespace dodo::cgi::fast; |
| 35 | 46 | |
| 36 | | #ifdef PTHREAD_EXT |
| 37 | | |
| 38 | | pthread_mutex_t server::acceptM = PTHREAD_MUTEX_INITIALIZER; |
| 39 | | |
| 40 | | //------------------------------------------------------------------- |
| 41 | | |
| 42 | | pthread_mutex_t server::requestsM = PTHREAD_MUTEX_INITIALIZER; |
| 43 | | |
| 44 | | #endif |
| 45 | | |
| 46 | | //------------------------------------------------------------------- |
| 47 | | |
| 48 | | unsigned long server::limit = 0; |
| 49 | | |
| 50 | | //------------------------------------------------------------------- |
| 51 | | |
| 52 | | unsigned long server::requests = -1; |
| | 47 | dodo::pc::sync::thread::section server::acceptLock; |
| | 48 | |
| | 49 | //------------------------------------------------------------------- |
| | 50 | |
| | 51 | dodo::pc::sync::thread::section server::requestLock; |
| 53 | 52 | |
| 54 | 53 | //------------------------------------------------------------------- |
| 55 | 54 | |
| 56 | 55 | void |
| 57 | | dummyStackThread(dodo::cgi::exchange &data) |
| 58 | | { |
| 59 | | } |
| 60 | | |
| 61 | | //------------------------------------------------------------------- |
| 62 | | |
| 63 | | dodo::cgi::serverHandler server::handler = &dummyStackThread; |
| | 56 | dummyfastCGIThread(dodo::cgi::exchange &data) |
| | 57 | { |
| | 58 | } |
| | 59 | |
| | 60 | //------------------------------------------------------------------- |
| | 61 | |
| | 62 | dodo::cgi::serverHandler server::handler = &dummyfastCGIThread; |
| 64 | 63 | |
| 65 | 64 | //------------------------------------------------------------------- |
| … |
… |
|
| 70 | 69 | |
| 71 | 70 | //------------------------------------------------------------------- |
| 72 | | |
| 73 | | #ifdef PTHREAD_EXT |
| 74 | 71 | |
| 75 | 72 | server::server(unsigned long a_limit, |
| … |
… |
|
| 80 | 77 | limit = a_limit; |
| 81 | 78 | |
| 82 | | pthread_mutexattr_t attr; |
| 83 | | |
| 84 | | pthread_mutexattr_init(&attr); |
| 85 | | pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); |
| 86 | | |
| 87 | | pthread_mutex_init(&acceptM, &attr); |
| 88 | | pthread_mutex_init(&requestsM, &attr); |
| 89 | | |
| 90 | | pthread_mutexattr_destroy(&attr); |
| 91 | | |
| 92 | 79 | FCGX_Init(); |
| 93 | 80 | } |
| … |
… |
|
| 95 | 82 | //------------------------------------------------------------------- |
| 96 | 83 | |
| 97 | | #else |
| 98 | | |
| 99 | | server::server(unsigned long a_limit) |
| 100 | | { |
| 101 | | limit = a_limit; |
| 102 | | |
| 103 | | FCGX_Init(); |
| 104 | | } |
| 105 | | |
| 106 | | #endif |
| 107 | | |
| 108 | | //------------------------------------------------------------------- |
| 109 | | |
| 110 | 84 | server::~server() |
| 111 | 85 | { |
| … |
… |
|
| 115 | 89 | //------------------------------------------------------------------- |
| 116 | 90 | |
| 117 | | #ifdef PTHREAD_EXT |
| 118 | | |
| 119 | 91 | void * |
| 120 | | server::stackThread(void *data) |
| 121 | | { |
| 122 | | FCGX_Request request; |
| 123 | | FCGX_InitRequest(&request, 0, 0); |
| 124 | | |
| 125 | | exchange cfSTD(&request); |
| | 92 | server::fastCGIThread(void *data) |
| | 93 | { |
| | 94 | FCGX_Request req; |
| | 95 | __request request = {&req}; |
| | 96 | FCGX_InitRequest(request.request, 0, 0); |
| | 97 | |
| | 98 | exchange cfSTD(request); |
| | 99 | |
| | 100 | unsigned long limit = *(unsigned long *)data; |
| | 101 | unsigned long requests = 0; |
| 126 | 102 | |
| 127 | 103 | int res = 0; |
| … |
… |
|
| 131 | 107 | if (limit != 0) |
| 132 | 108 | { |
| 133 | | pthread_mutex_lock(&requestsM); |
| | 109 | pc::sync::protector rp(&requestLock); |
| 134 | 110 | |
| 135 | 111 | ++requests; |
| … |
… |
|
| 137 | 113 | if (requests >= limit) |
| 138 | 114 | { |
| 139 | | pthread_mutex_unlock(&requestsM); |
| 140 | | |
| 141 | 115 | break; |
| 142 | 116 | } |
| 143 | | |
| 144 | | pthread_mutex_lock(&requestsM); |
| 145 | | } |
| 146 | | |
| 147 | | pthread_mutex_lock(&acceptM); |
| 148 | | res = FCGX_Accept_r(&request); |
| 149 | | pthread_mutex_unlock(&acceptM); |
| | 117 | } |
| | 118 | |
| | 119 | acceptLock.acquire(); |
| | 120 | res = FCGX_Accept_r(request.request); |
| | 121 | acceptLock.release(); |
| 150 | 122 | |
| 151 | 123 | if (res == -1) |
| … |
… |
|
| 156 | 128 | handler(cfSTD); |
| 157 | 129 | |
| 158 | | FCGX_Finish_r(&request); |
| | 130 | FCGX_Finish_r(request.request); |
| 159 | 131 | } |
| 160 | 132 | |
| 161 | 133 | return NULL; |
| 162 | 134 | } |
| 163 | | |
| 164 | | #endif |
| 165 | 135 | |
| 166 | 136 | //------------------------------------------------------------------- |
| … |
… |
|
| 176 | 146 | handler = func; |
| 177 | 147 | |
| 178 | | requests = 0; |
| 179 | | |
| 180 | | #ifdef PTHREAD_EXT |
| 181 | 148 | if (threading) |
| 182 | 149 | { |
| … |
… |
|
| 187 | 154 | for (; i < threadsNum; ++i) |
| 188 | 155 | { |
| 189 | | pthread_create(&id[i], NULL, stackThread, NULL); |
| | 156 | pthread_create(&id[i], NULL, fastCGIThread, &limit); |
| 190 | 157 | } |
| 191 | 158 | |
| … |
… |
|
| 198 | 165 | } |
| 199 | 166 | else |
| 200 | | #endif |
| 201 | | { |
| 202 | | FCGX_Request request; |
| 203 | | FCGX_InitRequest(&request, 0, 0); |
| 204 | | |
| 205 | | exchange cfSTD(&request); |
| | 167 | { |
| | 168 | unsigned long requests = 0; |
| | 169 | |
| | 170 | FCGX_Request req; |
| | 171 | __request request = {&req}; |
| | 172 | FCGX_InitRequest(request.request, 0, 0); |
| | 173 | |
| | 174 | exchange cfSTD(request); |
| 206 | 175 | |
| 207 | 176 | while (true) |
| … |
… |
|
| 217 | 186 | } |
| 218 | 187 | |
| 219 | | if (FCGX_Accept_r(&request) == -1) |
| | 188 | if (FCGX_Accept_r(request.request) == -1) |
| 220 | 189 | { |
| 221 | 190 | throw exception::basic(exception::ERRMODULE_CGIFASTSERVER, SERVEREX_LISTEN, exception::ERRNO_LIBDODO, SERVEREX_ACCEPTFAILED, CGIFASTSERVEREX_ACCEPTFAILED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 224 | 193 | handler(cfSTD); |
| 225 | 194 | |
| 226 | | FCGX_Finish_r(&request); |
| | 195 | FCGX_Finish_r(request.request); |
| 227 | 196 | } |
| 228 | 197 | } |
-
|
r1162
|
r1167
|
|
| 28 | 28 | */ |
| 29 | 29 | |
| | 30 | #include <libdodo/directives.h> |
| | 31 | |
| | 32 | #include <libdodo/types.h> |
| 30 | 33 | #include <libdodo/dataBaseAccumulator.h> |
| | 34 | #include <libdodo/toolsString.h> |
| | 35 | #include <libdodo/xexec.h> |
| 31 | 36 | |
| 32 | 37 | using namespace dodo::data::base; |
| … |
… |
|
| 47 | 52 | , |
| 48 | 53 | collectedData(this, XEXEC_OBJECT_XEXEC) |
| 49 | | |
| 50 | 54 | #endif |
| 51 | 55 | { |
-
|
r1160
|
r1167
|
|
| 28 | 28 | */ |
| 29 | 29 | |
| | 30 | #include <libdodo/directives.h> |
| | 31 | |
| | 32 | #include <libdodo/types.h> |
| 30 | 33 | #include <libdodo/dataBaseConnector.h> |
| 31 | 34 | |
-
|
r1162
|
r1167
|
|
| 28 | 28 | */ |
| 29 | 29 | |
| | 30 | #include <libdodo/directives.h> |
| | 31 | |
| | 32 | #ifdef MYSQL_EXT |
| | 33 | |
| | 34 | #include <mysql.h> |
| | 35 | |
| | 36 | namespace dodo |
| | 37 | { |
| | 38 | namespace data |
| | 39 | { |
| | 40 | namespace base |
| | 41 | { |
| | 42 | struct __mysqlHandle |
| | 43 | { |
| | 44 | MYSQL *handle; ///< DB handle |
| | 45 | MYSQL_RES *result; ///< handle to result |
| | 46 | }; |
| | 47 | }; |
| | 48 | }; |
| | 49 | }; |
| | 50 | |
| | 51 | #include <errmsg.h> |
| | 52 | |
| 30 | 53 | #include <libdodo/dataBaseMysql.h> |
| 31 | | |
| 32 | | #ifdef MYSQL_EXT |
| | 54 | #include <libdodo/dataBaseMysqlEx.h> |
| 33 | 55 | |
| 34 | 56 | using namespace dodo::data::base; |
| … |
… |
|
| 36 | 58 | mysql::mysql() : empty(true), |
| 37 | 59 | type(CLIENT_MULTI_STATEMENTS), |
| 38 | | mysqlHandle(NULL) |
| 39 | | |
| 40 | | { |
| 41 | | #ifndef DATABASE_WO_XEXEC |
| 42 | | |
| | 60 | handle(new __mysqlHandle) |
| | 61 | |
| | 62 | { |
| | 63 | #ifndef DATABASE_WO_XEXEC |
| 43 | 64 | collectedData.setExecObject(XEXEC_OBJECT_DATABASEMYSQL); |
| 44 | | |
| 45 | | #endif |
| 46 | | |
| 47 | | mysqlHandle = mysql_init(NULL); |
| | 65 | #endif |
| | 66 | |
| | 67 | handle->handle = mysql_init(NULL); |
| 48 | 68 | } |
| 49 | 69 | |
| … |
… |
|
| 52 | 72 | mysql::mysql(const __connectionInfo &info) : empty(true), |
| 53 | 73 | type(CLIENT_MULTI_STATEMENTS), |
| 54 | | mysqlHandle(NULL) |
| 55 | | |
| 56 | | { |
| 57 | | #ifndef DATABASE_WO_XEXEC |
| 58 | | |
| | 74 | handle(new __mysqlHandle) |
| | 75 | |
| | 76 | { |
| | 77 | #ifndef DATABASE_WO_XEXEC |
| 59 | 78 | collectedData.setExecObject(XEXEC_OBJECT_DATABASEMYSQL); |
| 60 | | |
| 61 | 79 | #endif |
| 62 | 80 | |
| 63 | 81 | collectedData.dbInfo = info; |
| 64 | 82 | |
| 65 | | mysqlHandle = mysql_init(NULL); |
| 66 | | |
| 67 | | if (!mysql_real_connect(mysqlHandle, |
| | 83 | handle->handle = mysql_init(NULL); |
| | 84 | |
| | 85 | if (!mysql_real_connect(handle->handle, |
| 68 | 86 | collectedData.dbInfo.host.size() == 0 ? NULL : collectedData.dbInfo.host.c_str(), |
| 69 | 87 | collectedData.dbInfo.user.size() == 0 ? NULL : collectedData.dbInfo.user.c_str(), |
| … |
… |
|
| 74 | 92 | type)) |
| 75 | 93 | { |
| 76 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_MYSQL, exception::ERRNO_MYSQL, mysql_errno(mysqlHandle), mysql_error(mysqlHandle), __LINE__, __FILE__); |
| | 94 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_MYSQL, exception::ERRNO_MYSQL, mysql_errno(handle->handle), mysql_error(handle->handle), __LINE__, __FILE__); |
| 77 | 95 | } |
| 78 | 96 | |
| 79 | 97 | #ifndef MYSQL_NO_OPT_RECONNECT |
| 80 | | |
| 81 | 98 | if (reconnect) |
| 82 | 99 | { |
| 83 | 100 | my_bool rc = 1; |
| 84 | 101 | |
| 85 | | mysql_options(mysqlHandle, MYSQL_OPT_RECONNECT, &rc); |
| 86 | | } |
| 87 | | |
| | 102 | mysql_options(handle->handle, MYSQL_OPT_RECONNECT, &rc); |
| | 103 | } |
| 88 | 104 | #endif |
| 89 | 105 | } |
| … |
… |
|
| 99 | 115 | mysql::~mysql() |
| 100 | 116 | { |
| 101 | | if (mysqlHandle != NULL) |
| | 117 | if (handle->handle != NULL) |
| 102 | 118 | { |
| 103 | 119 | if (!empty) |
| 104 | 120 | { |
| 105 | | mysql_free_result(mysqlResult); |
| 106 | | } |
| 107 | | |
| 108 | | mysql_close(mysqlHandle); |
| 109 | | } |
| | 121 | mysql_free_result(handle->result); |
| | 122 | } |
| | 123 | |
| | 124 | mysql_close(handle->handle); |
| | 125 | } |
| | 126 | |
| | 127 | delete handle; |
| 110 | 128 | } |
| 111 | 129 | |
| … |
… |
|
| 116 | 134 | const __mysqlSslOptions &options) |
| 117 | 135 | { |
| 118 | | if (mysqlHandle == NULL) |
| | 136 | if (handle->handle == NULL) |
| 119 | 137 | { |
| 120 | 138 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 123 | 141 | type = a_type; |
| 124 | 142 | |
| 125 | | if (mysql_ssl_set(mysqlHandle, |
| | 143 | if (mysql_ssl_set(handle->handle, |
| 126 | 144 | options.key.size() == 0 ? NULL : options.key.c_str(), |
| 127 | 145 | options.cert.size() == 0 ? NULL : options.cert.c_str(), |
| … |
… |
|
| 146 | 164 | #endif |
| 147 | 165 | |
| 148 | | if (mysqlHandle != NULL) |
| | 166 | if (handle->handle != NULL) |
| 149 | 167 | { |
| 150 | 168 | if (!empty) |
| 151 | 169 | { |
| 152 | 170 | empty = true; |
| 153 | | mysql_free_result(mysqlResult); |
| 154 | | } |
| 155 | | |
| 156 | | mysql_close(mysqlHandle); |
| 157 | | |
| 158 | | mysqlHandle = NULL; |
| 159 | | } |
| 160 | | |
| 161 | | mysqlHandle = mysql_init(NULL); |
| 162 | | |
| 163 | | if (!mysql_real_connect(mysqlHandle, |
| | 171 | mysql_free_result(handle->result); |
| | 172 | } |
| | 173 | |
| | 174 | mysql_close(handle->handle); |
| | 175 | |
| | 176 | handle->handle = NULL; |
| | 177 | } |
| | 178 | |
| | 179 | handle->handle = mysql_init(NULL); |
| | 180 | |
| | 181 | if (!mysql_real_connect(handle->handle, |
| 164 | 182 | collectedData.dbInfo.host.size() == 0 ? NULL : collectedData.dbInfo.host.c_str(), |
| 165 | 183 | collectedData.dbInfo.user.size() == 0 ? NULL : collectedData.dbInfo.user.c_str(), |
| … |
… |
|
| 170 | 188 | type)) |
| 171 | 189 | { |
| 172 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_CONNECT, exception::ERRNO_MYSQL, mysql_errno(mysqlHandle), mysql_error(mysqlHandle), __LINE__, __FILE__); |
| | 190 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_CONNECT, exception::ERRNO_MYSQL, mysql_errno(handle->handle), mysql_error(handle->handle), __LINE__, __FILE__); |
| 173 | 191 | } |
| 174 | 192 | |
| 175 | 193 | #ifndef MYSQL_NO_OPT_RECONNECT |
| 176 | | |
| 177 | 194 | if (reconnect) |
| 178 | 195 | { |
| 179 | 196 | my_bool rc = 1; |
| 180 | 197 | |
| 181 | | mysql_options(mysqlHandle, MYSQL_OPT_RECONNECT, &rc); |
| 182 | | } |
| 183 | | |
| | 198 | mysql_options(handle->handle, MYSQL_OPT_RECONNECT, &rc); |
| | 199 | } |
| 184 | 200 | #endif |
| 185 | 201 | |
| … |
… |
|
| 194 | 210 | mysql::disconnect() |
| 195 | 211 | { |
| 196 | | if (mysqlHandle != NULL) |
| | 212 | if (handle->handle != NULL) |
| 197 | 213 | { |
| 198 | 214 | #ifndef DATABASE_WO_XEXEC |
| … |
… |
|
| 204 | 220 | { |
| 205 | 221 | empty = true; |
| 206 | | mysql_free_result(mysqlResult); |
| 207 | | } |
| 208 | | |
| 209 | | mysql_close(mysqlHandle); |
| | 222 | mysql_free_result(handle->result); |
| | 223 | } |
| | 224 | |
| | 225 | mysql_close(handle->handle); |
| 210 | 226 | |
| 211 | 227 | #ifndef DATABASE_WO_XEXEC |
| … |
… |
|
| 213 | 229 | #endif |
| 214 | 230 | |
| 215 | | mysqlHandle = NULL; |
| | 231 | handle->handle = NULL; |
| 216 | 232 | } |
| 217 | 233 | } |
| … |
… |
|
| 222 | 238 | mysql::fetchRows() const |
| 223 | 239 | { |
| 224 | | if (mysqlHandle == NULL) |
| | 240 | if (handle->handle == NULL) |
| 225 | 241 | { |
| 226 | 242 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 239 | 255 | } |
| 240 | 256 | |
| 241 | | mysql_data_seek(mysqlResult, 0); |
| 242 | | |
| 243 | | unsigned int numFields = mysql_num_fields(mysqlResult); |
| | 257 | mysql_data_seek(handle->result, 0); |
| | 258 | |
| | 259 | unsigned int numFields = mysql_num_fields(handle->result); |
| 244 | 260 | |
| 245 | 261 | #ifndef USE_DEQUE |
| 246 | | rows.reserve(mysql_num_rows(mysqlResult)); |
| | 262 | rows.reserve(mysql_num_rows(handle->result)); |
| 247 | 263 | #endif |
| 248 | 264 | |
| … |
… |
|
| 257 | 273 | #endif |
| 258 | 274 | |
| 259 | | while ((mysqlRow = mysql_fetch_row(mysqlResult)) != NULL) |
| 260 | | { |
| 261 | | length = mysql_fetch_lengths(mysqlResult); |
| | 275 | while ((mysqlRow = mysql_fetch_row(handle->result)) != NULL) |
| | 276 | { |
| | 277 | length = mysql_fetch_lengths(handle->result); |
| 262 | 278 | |
| 263 | 279 | rowsPart.clear(); |
| … |
… |
|
| 290 | 306 | mysql::fetchFields() const |
| 291 | 307 | { |
| 292 | | if (mysqlHandle == NULL) |
| | 308 | if (handle->handle == NULL) |
| 293 | 309 | { |
| 294 | 310 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 307 | 323 | } |
| 308 | 324 | |
| 309 | | mysql_field_seek(mysqlResult, 0); |
| 310 | | |
| 311 | | unsigned int numFields = mysql_num_fields(mysqlResult); |
| 312 | | MYSQL_FIELD *mysqlFields = mysql_fetch_fields(mysqlResult); |
| | 325 | mysql_field_seek(handle->result, 0); |
| | 326 | |
| | 327 | unsigned int numFields = mysql_num_fields(handle->result); |
| | 328 | MYSQL_FIELD *mysqlFields = mysql_fetch_fields(handle->result); |
| 313 | 329 | |
| 314 | 330 | #ifndef USE_DEQUE |
| … |
… |
|
| 341 | 357 | mysql::rowsCount() const |
| 342 | 358 | { |
| 343 | | if (mysqlHandle == NULL) |
| | 359 | if (handle->handle == NULL) |
| 344 | 360 | { |
| 345 | 361 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 352 | 368 | else |
| 353 | 369 | { |
| 354 | | return mysql_num_rows(mysqlResult); |
| | 370 | return mysql_num_rows(handle->result); |
| 355 | 371 | } |
| 356 | 372 | } |
| … |
… |
|
| 361 | 377 | mysql::fieldsCount() const |
| 362 | 378 | { |
| 363 | | if (mysqlHandle == NULL) |
| | 379 | if (handle->handle == NULL) |
| 364 | 380 | { |
| 365 | 381 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 372 | 388 | else |
| 373 | 389 | { |
| 374 | | return mysql_num_fields(mysqlResult); |
| | 390 | return mysql_num_fields(handle->result); |
| 375 | 391 | } |
| 376 | 392 | } |
| … |
… |
|
| 381 | 397 | mysql::affectedRowsCount() const |
| 382 | 398 | { |
| 383 | | if (mysqlHandle == NULL) |
| | 399 | if (handle->handle == NULL) |
| 384 | 400 | { |
| 385 | 401 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 392 | 408 | else |
| 393 | 409 | { |
| 394 | | return mysql_affected_rows(mysqlHandle); |
| | 410 | return mysql_affected_rows(handle->handle); |
| 395 | 411 | } |
| 396 | 412 | } |
| … |
… |
|
| 401 | 417 | mysql::getFieldsTypes(const dodoString &table) |
| 402 | 418 | { |
| 403 | | if (mysqlHandle == NULL) |
| | 419 | if (handle->handle == NULL) |
| 404 | 420 | { |
| 405 | 421 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 417 | 433 | request = "describe " + table; |
| 418 | 434 | |
| 419 | | if (mysql_real_query(mysqlHandle, request.c_str(), request.size()) != 0) |
| 420 | | { |
| 421 | | int mysqlErrno = mysql_errno(mysqlHandle); |
| | 435 | if (mysql_real_query(handle->handle, request.c_str(), request.size()) != 0) |
| | 436 | { |
| | 437 | int mysqlErrno = mysql_errno(handle->handle); |
| 422 | 438 | if (reconnect && (mysqlErrno == CR_SERVER_GONE_ERROR || mysqlErrno == CR_SERVER_LOST)) |
| 423 | 439 | { |
| 424 | 440 | connect(collectedData.dbInfo); |
| 425 | | if (mysql_real_query(mysqlHandle, request.c_str(), request.size()) != 0) |
| 426 | | { |
| 427 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_MYSQL, mysqlErrno, mysql_error(mysqlHandle), __LINE__, __FILE__, request); |
| | 441 | if (mysql_real_query(handle->handle, request.c_str(), request.size()) != 0) |
| | 442 | { |
| | 443 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_MYSQL, mysqlErrno, mysql_error(handle->handle), __LINE__, __FILE__, request); |
| 428 | 444 | } |
| 429 | 445 | } |
| 430 | 446 | else |
| 431 | 447 | { |
| 432 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_MYSQL, mysqlErrno, mysql_error(mysqlHandle), __LINE__, __FILE__, request); |
| 433 | | } |
| 434 | | } |
| 435 | | |
| 436 | | mysqlResult = mysql_store_result(mysqlHandle); |
| 437 | | if (mysqlResult == NULL) |
| 438 | | { |
| 439 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_MYSQL, mysql_errno(mysqlHandle), mysql_error(mysqlHandle), __LINE__, __FILE__); |
| | 448 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_MYSQL, mysqlErrno, mysql_error(handle->handle), __LINE__, __FILE__, request); |
| | 449 | } |
| | 450 | } |
| | 451 | |
| | 452 | handle->result = mysql_store_result(handle->handle); |
| | 453 | if (handle->result == NULL) |
| | 454 | { |
| | 455 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_MYSQL, mysql_errno(handle->handle), mysql_error(handle->handle), __LINE__, __FILE__); |
| 440 | 456 | } |
| 441 | 457 | |
| … |
… |
|
| 446 | 462 | dodoMap<dodoString, short, dodoMapICaseStringCompare>::iterator field, fieldsEnd = types->second.end(); |
| 447 | 463 | |
| 448 | | while ((mysqlRow = mysql_fetch_row(mysqlResult)) != NULL) |
| | 464 | while ((mysqlRow = mysql_fetch_row(handle->result)) != NULL) |
| 449 | 465 | { |
| 450 | 466 | field = types->second.find(mysqlRow[0]); |
| … |
… |
|
| 498 | 514 | } |
| 499 | 515 | |
| 500 | | mysql_free_result(mysqlResult); |
| | 516 | mysql_free_result(handle->result); |
| 501 | 517 | |
| 502 | 518 | empty = true; |
| … |
… |
|
| 509 | 525 | bool result) |
| 510 | 526 | { |
| 511 | | if (mysqlHandle == NULL) |
| | 527 | if (handle->handle == NULL) |
| 512 | 528 | { |
| 513 | 529 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 529 | 545 | } |
| 530 | 546 | |
| 531 | | if (mysql_real_query(mysqlHandle, request.c_str(), request.size()) != 0) |
| 532 | | { |
| 533 | | int mysqlErrno = mysql_errno(mysqlHandle); |
| | 547 | if (mysql_real_query(handle->handle, request.c_str(), request.size()) != 0) |
| | 548 | { |
| | 549 | int mysqlErrno = mysql_errno(handle->handle); |
| 534 | 550 | if (reconnect && (mysqlErrno == CR_SERVER_GONE_ERROR || mysqlErrno == CR_SERVER_LOST)) |
| 535 | 551 | { |
| 536 | 552 | connect(collectedData.dbInfo); |
| 537 | | if (mysql_real_query(mysqlHandle, request.c_str(), request.size()) != 0) |
| 538 | | { |
| 539 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_EXEC, exception::ERRNO_MYSQL, mysqlErrno, mysql_error(mysqlHandle), __LINE__, __FILE__, request); |
| | 553 | if (mysql_real_query(handle->handle, request.c_str(), request.size()) != 0) |
| | 554 | { |
| | 555 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_EXEC, exception::ERRNO_MYSQL, mysqlErrno, mysql_error(handle->handle), __LINE__, __FILE__, request); |
| 540 | 556 | } |
| 541 | 557 | } |
| 542 | 558 | else |
| 543 | 559 | { |
| 544 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_EXEC, exception::ERRNO_MYSQL, mysqlErrno, mysql_error(mysqlHandle), __LINE__, __FILE__, request); |
| | 560 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_EXEC, exception::ERRNO_MYSQL, mysqlErrno, mysql_error(handle->handle), __LINE__, __FILE__, request); |
| 545 | 561 | } |
| 546 | 562 | } |
| … |
… |
|
| 550 | 566 | if (!empty) |
| 551 | 567 | { |
| 552 | | mysql_free_result(mysqlResult); |
| | 568 | mysql_free_result(handle->result); |
| 553 | 569 | empty = true; |
| 554 | 570 | } |
| 555 | 571 | |
| 556 | | mysqlResult = mysql_store_result(mysqlHandle); |
| 557 | | if (mysqlResult == NULL) |
| 558 | | { |
| 559 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_EXEC, exception::ERRNO_MYSQL, mysql_errno(mysqlHandle), mysql_error(mysqlHandle), __LINE__, __FILE__); |
| | 572 | handle->result = mysql_store_result(handle->handle); |
| | 573 | if (handle->result == NULL) |
| | 574 | { |
| | 575 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_EXEC, exception::ERRNO_MYSQL, mysql_errno(handle->handle), mysql_error(handle->handle), __LINE__, __FILE__); |
| 560 | 576 | } |
| 561 | 577 | |
| … |
… |
|
| 576 | 592 | mysql::setCharset(const dodoString &charset) |
| 577 | 593 | { |
| 578 | | if (mysqlHandle == NULL) |
| 579 | | { |
| 580 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| 581 | | } |
| 582 | | |
| 583 | | mysql_options(mysqlHandle, MYSQL_SET_CHARSET_NAME, charset.c_str()); |
| | 594 | if (handle->handle == NULL) |
| | 595 | { |
| | 596 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| | 597 | } |
| | 598 | |
| | 599 | mysql_options(handle->handle, MYSQL_SET_CHARSET_NAME, charset.c_str()); |
| 584 | 600 | } |
| 585 | 601 | |
| … |
… |
|
| 589 | 605 | mysql::setConnectTimeout(unsigned int time) |
| 590 | 606 | { |
| 591 | | if (mysqlHandle == NULL) |
| 592 | | { |
| 593 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| 594 | | } |
| 595 | | |
| 596 | | mysql_options(mysqlHandle, MYSQL_OPT_CONNECT_TIMEOUT, (char *)&time); |
| | 607 | if (handle->handle == NULL) |
| | 608 | { |
| | 609 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| | 610 | } |
| | 611 | |
| | 612 | mysql_options(handle->handle, MYSQL_OPT_CONNECT_TIMEOUT, (char *)&time); |
| 597 | 613 | } |
| 598 | 614 | |
| … |
… |
|
| 602 | 618 | mysql::getCharset() const |
| 603 | 619 | { |
| 604 | | if (mysqlHandle == NULL) |
| 605 | | { |
| 606 | | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| 607 | | } |
| 608 | | |
| 609 | | return mysql_character_set_name(mysqlHandle); |
| | 620 | if (handle->handle == NULL) |
| | 621 | { |
| | 622 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| | 623 | } |
| | 624 | |
| | 625 | return mysql_character_set_name(handle->handle); |
| 610 | 626 | } |
| 611 | 627 | |
| … |
… |
|
| 615 | 631 | mysql::fetchFieldsToRows() const |
| 616 | 632 | { |
| 617 | | if (mysqlHandle == NULL) |
| | 633 | if (handle->handle == NULL) |
| 618 | 634 | { |
| 619 | 635 | throw exception::basic(exception::ERRMODULE_DATABASEMYSQL, MYSQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, MYSQLEX_NOTOPENED, DATABASEMYSQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 627 | 643 | } |
| 628 | 644 | |
| 629 | | mysql_data_seek(mysqlResult, 0); |
| 630 | | mysql_field_seek(mysqlResult, 0); |
| 631 | | |
| 632 | | unsigned int numFields = mysql_num_fields(mysqlResult); |
| 633 | | MYSQL_FIELD *mysqlFields = mysql_fetch_fields(mysqlResult); |
| | 645 | mysql_data_seek(handle->result, 0); |
| | 646 | mysql_field_seek(handle->result, 0); |
| | 647 | |
| | 648 | unsigned int numFields = mysql_num_fields(handle->result); |
| | 649 | MYSQL_FIELD *mysqlFields = mysql_fetch_fields(handle->result); |
| 634 | 650 | |
| 635 | 651 | #ifndef USE_DEQUE |
| 636 | | rowsFields.reserve(mysql_num_rows(mysqlResult)); |
| | 652 | rowsFields.reserve(mysql_num_rows(handle->result)); |
| 637 | 653 | #endif |
| 638 | 654 | |
| … |
… |
|
| 644 | 660 | MYSQL_ROW mysqlRow; |
| 645 | 661 | |
| 646 | | while ((mysqlRow = mysql_fetch_row(mysqlResult)) != NULL) |
| 647 | | { |
| 648 | | length = mysql_fetch_lengths(mysqlResult); |
| | 662 | while ((mysqlRow = mysql_fetch_row(handle->result)) != NULL) |
| | 663 | { |
| | 664 | length = mysql_fetch_lengths(handle->result); |
| 649 | 665 | |
| 650 | 666 | for (j = 0; j < numFields; ++j) |
-
|
r1166
|
r1167
|
|
| 28 | 28 | */ |
| 29 | 29 | |
| | 30 | #include <libdodo/directives.h> |
| | 31 | |
| | 32 | #ifdef POSTGRESQL_EXT |
| | 33 | |
| | 34 | #include <libpq-fe.h> |
| | 35 | #include <stdlib.h> |
| | 36 | |
| | 37 | namespace dodo |
| | 38 | { |
| | 39 | namespace data |
| | 40 | { |
| | 41 | namespace base |
| | 42 | { |
| | 43 | struct __postgresqlHandle |
| | 44 | { |
| | 45 | |
| | 46 | PGconn *handle; ///< DB handle |
| | 47 | PGresult *result; ///< handlde to result |
| | 48 | }; |
| | 49 | }; |
| | 50 | }; |
| | 51 | }; |
| | 52 | |
| | 53 | #include <libdodo/toolsString.h> |
| | 54 | #include <libdodo/toolsMisc.h> |
| 30 | 55 | #include <libdodo/dataBasePostgresql.h> |
| 31 | | |
| 32 | | #ifdef POSTGRESQL_EXT |
| | 56 | #include <libdodo/dataBasePostgresqlEx.h> |
| | 57 | #include <libdodo/xexec.h> |
| 33 | 58 | |
| 34 | 59 | using namespace dodo::data::base; |
| … |
… |
|
| 84 | 109 | |
| 85 | 110 | postgresql::postgresql() : empty(true), |
| 86 | | pgHandle(NULL) |
| 87 | | { |
| 88 | | #ifndef DATABASE_WO_XEXEC |
| 89 | | |
| | 111 | handle(new __postgresqlHandle) |
| | 112 | { |
| | 113 | handle->handle = NULL; |
| | 114 | |
| | 115 | #ifndef DATABASE_WO_XEXEC |
| 90 | 116 | collectedData.setExecObject(XEXEC_OBJECT_DATABASEPOSTGRESQL); |
| 91 | | |
| 92 | 117 | #endif |
| 93 | 118 | } |
| … |
… |
|
| 96 | 121 | |
| 97 | 122 | postgresql::postgresql(const __connectionInfo &info) : empty(true), |
| 98 | | pgHandle(NULL) |
| 99 | | { |
| 100 | | #ifndef DATABASE_WO_XEXEC |
| 101 | | |
| | 123 | handle(new __postgresqlHandle) |
| | 124 | { |
| | 125 | #ifndef DATABASE_WO_XEXEC |
| 102 | 126 | collectedData.setExecObject(XEXEC_OBJECT_DATABASEPOSTGRESQL); |
| 103 | | |
| 104 | 127 | #endif |
| 105 | 128 | |
| 106 | 129 | collectedData.dbInfo = info; |
| 107 | 130 | |
| 108 | | pgHandle = PQsetdbLogin( |
| | 131 | handle->handle = PQsetdbLogin( |
| 109 | 132 | collectedData.dbInfo.host.size() == 0 ? NULL : collectedData.dbInfo.host.c_str(), |
| 110 | 133 | tools::string::uiToString(collectedData.dbInfo.port).c_str(), |
| … |
… |
|
| 115 | 138 | collectedData.dbInfo.password.size() == 0 ? NULL : collectedData.dbInfo.password.c_str()); |
| 116 | 139 | |
| 117 | | int status = PQstatus(pgHandle); |
| | 140 | int status = PQstatus(handle->handle); |
| 118 | 141 | |
| 119 | 142 | if (status != CONNECTION_OK) |
| 120 | 143 | { |
| 121 | | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_POSTGRESQL, exception::ERRNO_MYSQL, status, PQerrorMessage(pgHandle), __LINE__, __FILE__); |
| | 144 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_POSTGRESQL, exception::ERRNO_MYSQL, status, PQerrorMessage(handle->handle), __LINE__, __FILE__); |
| 122 | 145 | } |
| 123 | 146 | } |
| … |
… |
|
| 133 | 156 | postgresql::~postgresql() |
| 134 | 157 | { |
| 135 | | if (pgHandle != NULL) |
| | 158 | if (handle->handle != NULL) |
| 136 | 159 | { |
| 137 | 160 | if (!empty) |
| 138 | 161 | { |
| 139 | | PQclear(pgResult); |
| | 162 | PQclear(handle->result); |
| 140 | 163 | } |
| 141 | 164 | |
| 142 | | PQfinish(pgHandle); |
| 143 | | } |
| | 165 | PQfinish(handle->handle); |
| | 166 | } |
| | 167 | |
| | 168 | delete handle; |
| 144 | 169 | } |
| 145 | 170 | |
| … |
… |
|
| 156 | 181 | #endif |
| 157 | 182 | |
| 158 | | if (pgHandle != NULL) |
| | 183 | if (handle->handle != NULL) |
| 159 | 184 | { |
| 160 | 185 | if (!empty) |
| 161 | 186 | { |
| 162 | | PQclear(pgResult); |
| | 187 | PQclear(handle->result); |
| 163 | 188 | empty = true; |
| 164 | 189 | } |
| 165 | 190 | |
| 166 | | PQfinish(pgHandle); |
| 167 | | |
| 168 | | pgHandle = NULL; |
| 169 | | } |
| 170 | | |
| 171 | | pgHandle = PQsetdbLogin( |
| | 191 | PQfinish(handle->handle); |
| | 192 | |
| | 193 | handle->handle = NULL; |
| | 194 | } |
| | 195 | |
| | 196 | handle->handle = PQsetdbLogin( |
| 172 | 197 | collectedData.dbInfo.host.size() == 0 ? NULL : collectedData.dbInfo.host.c_str(), |
| 173 | 198 | tools::string::uiToString(collectedData.dbInfo.port).c_str(), |
| … |
… |
|
| 178 | 203 | collectedData.dbInfo.password.size() == 0 ? NULL : collectedData.dbInfo.password.c_str()); |
| 179 | 204 | |
| 180 | | int status = PQstatus(pgHandle); |
| | 205 | int status = PQstatus(handle->handle); |
| 181 | 206 | |
| 182 | 207 | if (status != CONNECTION_OK) |
| 183 | 208 | { |
| 184 | | pgHandle = NULL; |
| 185 | | |
| 186 | | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_CONNECT, exception::ERRNO_MYSQL, status, PQerrorMessage(pgHandle), __LINE__, __FILE__); |
| | 209 | handle->handle = NULL; |
| | 210 | |
| | 211 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_CONNECT, exception::ERRNO_MYSQL, status, PQerrorMessage(handle->handle), __LINE__, __FILE__); |
| 187 | 212 | } |
| 188 | 213 | |
| … |
… |
|
| 197 | 222 | postgresql::disconnect() |
| 198 | 223 | { |
| 199 | | if (pgHandle != NULL) |
| | 224 | if (handle->handle != NULL) |
| 200 | 225 | { |
| 201 | 226 | #ifndef DATABASE_WO_XEXEC |
| … |
… |
|
| 206 | 231 | if (!empty) |
| 207 | 232 | { |
| 208 | | PQclear(pgResult); |
| | 233 | PQclear(handle->result); |
| 209 | 234 | empty = true; |
| 210 | 235 | } |
| 211 | 236 | |
| 212 | | PQfinish(pgHandle); |
| | 237 | PQfinish(handle->handle); |
| 213 | 238 | |
| 214 | 239 | #ifndef DATABASE_WO_XEXEC |
| … |
… |
|
| 216 | 241 | #endif |
| 217 | 242 | |
| 218 | | pgHandle = NULL; |
| | 243 | handle->handle = NULL; |
| 219 | 244 | } |
| 220 | 245 | } |
| … |
… |
|
| 225 | 250 | postgresql::fetchRows() const |
| 226 | 251 | { |
| 227 | | if (pgHandle == NULL) |
| | 252 | if (handle->handle == NULL) |
| 228 | 253 | { |
| 229 | 254 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, POSTGRESQLEX_NOTOPENED, DATABASEPOSTGRESQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 242 | 267 | } |
| 243 | 268 | |
| 244 | | int rowsNum = PQntuples(pgResult); |
| 245 | | int fieldsNum = PQnfields(pgResult); |
| | 269 | int rowsNum = PQntuples(handle->result); |
| | 270 | int fieldsNum = PQnfields(handle->result); |
| 246 | 271 | |
| 247 | 272 | #ifndef USE_DEQUE |
| … |
… |
|
| 262 | 287 | for (j = 0; j < fieldsNum; ++j) |
| 263 | 288 | { |
| 264 | | if (PQgetisnull(pgResult, i, j) == 1) |
| | 289 | if (PQgetisnull(handle->result, i, j) == 1) |
| 265 | 290 | { |
| 266 | 291 | rowsPart.push_back(statements[SQLCONSTRUCTOR_STATEMENT_NULL]); |
| … |
… |
|
| 268 | 293 | else |
| 269 | 294 | { |
| 270 | | rowsPart.push_back(dodoString(PQgetvalue(pgResult, i, j), PQgetlength(pgResult, i, j))); |
| | 295 | rowsPart.push_back(dodoString(PQgetvalue(handle->result, i, j), PQgetlength(handle->result, i, j))); |
| 271 | 296 | } |
| 272 | 297 | } |
| … |
… |
|
| 287 | 312 | postgresql::fetchFields() const |
| 288 | 313 | { |
| 289 | | if (pgHandle == NULL) |
| | 314 | if (handle->handle == NULL) |
| 290 | 315 | { |
| 291 | 316 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, POSTGRESQLEX_NOTOPENED, DATABASEPOSTGRESQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 304 | 329 | } |
| 305 | 330 | |
| 306 | | int fieldsNum = PQnfields(pgResult); |
| | 331 | int fieldsNum = PQnfields(handle->result); |
| 307 | 332 | |
| 308 | 333 | #ifndef USE_DEQUE |
| … |
… |
|
| 312 | 337 | for (int i(0); i < fieldsNum; ++i) |
| 313 | 338 | { |
| 314 | | fields.push_back(PQfname(pgResult, i)); |
| | 339 | fields.push_back(PQfname(handle->result, i)); |
| 315 | 340 | } |
| 316 | 341 | |
| … |
… |
|
| 335 | 360 | postgresql::rowsCount() const |
| 336 | 361 | { |
| 337 | | if (pgHandle == NULL) |
| | 362 | if (handle->handle == NULL) |
| 338 | 363 | { |
| 339 | 364 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, POSTGRESQLEX_NOTOPENED, DATABASEPOSTGRESQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 346 | 371 | else |
| 347 | 372 | { |
| 348 | | return PQntuples(pgResult); |
| | 373 | return PQntuples(handle->result); |
| 349 | 374 | } |
| 350 | 375 | } |
| … |
… |
|
| 355 | 380 | postgresql::fieldsCount() const |
| 356 | 381 | { |
| 357 | | if (pgHandle == NULL) |
| | 382 | if (handle->handle == NULL) |
| 358 | 383 | { |
| 359 | 384 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, POSTGRESQLEX_NOTOPENED, DATABASEPOSTGRESQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 366 | 391 | else |
| 367 | 392 | { |
| 368 | | return PQnfields(pgResult); |
| | 393 | return PQnfields(handle->result); |
| 369 | 394 | } |
| 370 | 395 | } |
| … |
… |
|
| 375 | 400 | postgresql::affectedRowsCount() const |
| 376 | 401 | { |
| 377 | | if (pgHandle == NULL) |
| | 402 | if (handle->handle == NULL) |
| 378 | 403 | { |
| 379 | 404 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, POSTGRESQLEX_NOTOPENED, DATABASEPOSTGRESQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 386 | 411 | else |
| 387 | 412 | { |
| 388 | | return atoi(PQcmdTuples(pgResult)); |
| | 413 | return atoi(PQcmdTuples(handle->result)); |
| 389 | 414 | } |
| 390 | 415 | } |
| … |
… |
|
| 395 | 420 | postgresql::getFieldsTypes(const dodoString &table) |
| 396 | 421 | { |
| 397 | | if (pgHandle == NULL) |
| | 422 | if (handle->handle == NULL) |
| 398 | 423 | { |
| 399 | 424 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, POSTGRESQLEX_NOTOPENED, DATABASEPOSTGRESQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 413 | 438 | if (!empty) |
| 414 | 439 | { |
| 415 | | PQclear(pgResult); |
| | 440 | PQclear(handle->result); |
| 416 | 441 | empty = true; |
| 417 | 442 | } |
| 418 | 443 | |
| 419 | | pgResult = PQexecParams(pgHandle, request.c_str(), 0, NULL, NULL, NULL, NULL, 1); |
| 420 | | if (pgResult == NULL) |
| 421 | | { |
| 422 | | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_MYSQL, PGRES_FATAL_ERROR, PQerrorMessage(pgHandle), __LINE__, __FILE__, request); |
| 423 | | } |
| 424 | | |
| 425 | | int status = PQresultStatus(pgResult); |
| | 444 | handle->result = PQexecParams(handle->handle, request.c_str(), 0, NULL, NULL, NULL, NULL, 1); |
| | 445 | if (handle->result == NULL) |
| | 446 | { |
| | 447 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_MYSQL, PGRES_FATAL_ERROR, PQerrorMessage(handle->handle), __LINE__, __FILE__, request); |
| | 448 | } |
| | 449 | |
| | 450 | int status = PQresultStatus(handle->result); |
| 426 | 451 | |
| 427 | 452 | switch (status) |
| … |
… |
|
| 432 | 457 | case PGRES_FATAL_ERROR: |
| 433 | 458 | |
| 434 | | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_MYSQL, status, PQerrorMessage(pgHandle), __LINE__, __FILE__); |
| | 459 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_MYSQL, status, PQerrorMessage(handle->handle), __LINE__, __FILE__); |
| 435 | 460 | } |
| 436 | 461 | |
| 437 | 462 | empty = false; |
| 438 | 463 | |
| 439 | | int rowsNum = PQntuples(pgResult); |
| | 464 | int rowsNum = PQntuples(handle->result); |
| 440 | 465 | |
| 441 | 466 | const char *columnType, *columnName; |
| … |
… |
|
| 447 | 472 | for (int i(0); i < rowsNum; ++i) |
| 448 | 473 | { |
| 449 | | columnName = PQgetvalue(pgResult, i, 0); |
| 450 | | columnType = PQgetvalue(pgResult, i, 1); |
| | 474 | columnName = PQgetvalue(handle->result, i, 0); |
| | 475 | columnType = PQgetvalue(handle->result, i, 1); |
| 451 | 476 | |
| 452 | 477 | field = types->second.find(columnName); |
| … |
… |
|
| 504 | 529 | if (!empty) |
| 505 | 530 | { |
| 506 | | PQclear(pgResult); |
| | 531 | PQclear(handle->result); |
| 507 | 532 | empty = true; |
| 508 | 533 | } |
| … |
… |
|
| 515 | 540 | bool result) |
| 516 | 541 | { |
| 517 | | if (pgHandle == NULL) |
| | 542 | if (handle->handle == NULL) |
| 518 | 543 | { |
| 519 | 544 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, POSTGRESQLEX_NOTOPENED, DATABASEPOSTGRESQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 539 | 564 | if (!empty) |
| 540 | 565 | { |
| 541 | | PQclear(pgResult); |
| | 566 | PQclear(handle->result); |
| 542 | 567 | empty = true; |
| 543 | 568 | } |
| … |
… |
|
| 559 | 584 | } |
| 560 | 585 | |
| 561 | | pgResult = PQexecParams(pgHandle, request.c_str(), size, NULL, values, lengths, formats, 0); |
| | 586 | handle->result = PQexecParams(handle->handle, request.c_str(), size, NULL, values, lengths, formats, 0); |
| 562 | 587 | |
| 563 | 588 | blobs.clear(); |
| … |
… |
|
| 565 | 590 | else |
| 566 | 591 | { |
| 567 | | pgResult = PQexecParams(pgHandle, request.c_str(), 0, NULL, NULL, NULL, NULL, 1); |
| 568 | | } |
| 569 | | |
| 570 | | if (pgResult == NULL) |
| 571 | | { |
| 572 | | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_EXEC, exception::ERRNO_MYSQL, PGRES_FATAL_ERROR, PQerrorMessage(pgHandle), __LINE__, __FILE__); |
| 573 | | } |
| 574 | | |
| 575 | | status = PQresultStatus(pgResult); |
| | 592 | handle->result = PQexecParams(handle->handle, request.c_str(), 0, NULL, NULL, NULL, NULL, 1); |
| | 593 | } |
| | 594 | |
| | 595 | if (handle->result == NULL) |
| | 596 | { |
| | 597 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_EXEC, exception::ERRNO_MYSQL, PGRES_FATAL_ERROR, PQerrorMessage(handle->handle), __LINE__, __FILE__); |
| | 598 | } |
| | 599 | |
| | 600 | status = PQresultStatus(handle->result); |
| 576 | 601 | switch (status) |
| 577 | 602 | { |
| … |
… |
|
| 581 | 606 | case PGRES_FATAL_ERROR: |
| 582 | 607 | |
| 583 | | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_EXEC, exception::ERRNO_MYSQL, status, PQerrorMessage(pgHandle), __LINE__, __FILE__); |
| | 608 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_EXEC, exception::ERRNO_MYSQL, status, PQerrorMessage(handle->handle), __LINE__, __FILE__); |
| 584 | 609 | } |
| 585 | 610 | |
| … |
… |
|
| 926 | 951 | } |
| 927 | 952 | |
| 928 | | int rowsNum = PQntuples(pgResult); |
| 929 | | int fieldsNum = PQnfields(pgResult); |
| | 953 | int rowsNum = PQntuples(handle->result); |
| | 954 | int fieldsNum = PQnfields(handle->result); |
| 930 | 955 | |
| 931 | 956 | #ifndef USE_DEQUE |
| … |
… |
|
| 942 | 967 | for (j = 0; j < fieldsNum; ++j) |
| 943 | 968 | { |
| 944 | | if (PQgetisnull(pgResult, i, j) == 1) |
| 945 | | { |
| 946 | | rowFieldsPart.insert(make_pair(PQfname(pgResult, j), statements[SQLCONSTRUCTOR_STATEMENT_NULL])); |
| | 969 | if (PQgetisnull(handle->result, i, j) == 1) |
| | 970 | { |
| | 971 | rowFieldsPart.insert(make_pair(PQfname(handle->result, j), statements[SQLCONSTRUCTOR_STATEMENT_NULL])); |
| 947 | 972 | } |
| 948 | 973 | else |
| 949 | 974 | { |
| 950 | | rowFieldsPart.insert(make_pair(PQfname(pgResult, j), dodoString(PQgetvalue(pgResult, i, j), PQgetlength(pgResult, i, j)))); |
| | 975 | rowFieldsPart.insert(make_pair(PQfname(handle->result, j), dodoString(PQgetvalue(handle->result, i, j), PQgetlength(handle->result, i, j)))); |
| 951 | 976 | } |
| 952 | 977 | } |
| … |
… |
|
| 963 | 988 | postgresql::setCharset(const dodoString &charset) |
| 964 | 989 | { |
| 965 | | if (pgHandle == NULL) |
| | 990 | if (handle->handle == NULL) |
| 966 | 991 | { |
| 967 | 992 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, POSTGRESQLEX_NOTOPENED, DATABASEPOSTGRESQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| 968 | 993 | } |
| 969 | 994 | |
| 970 | | int status = PQsetClientEncoding(pgHandle, charset.c_str()); |
| | 995 | int status = PQsetClientEncoding(handle->handle, charset.c_str()); |
| 971 | 996 | if (status == -1) |
| 972 | 997 | { |
| 973 | | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_SETCHARSET, exception::ERRNO_MYSQL, status, PQerrorMessage(pgHandle), __LINE__, __FILE__); |
| | 998 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_SETCHARSET, exception::ERRNO_MYSQL, status, PQerrorMessage(handle->handle), __LINE__, __FILE__); |
| 974 | 999 | } |
| 975 | 1000 | } |
| … |
… |
|
| 980 | 1005 | postgresql::getCharset() const |
| 981 | 1006 | { |
| 982 | | if (pgHandle == NULL) |
| | 1007 | if (handle->handle == NULL) |
| 983 | 1008 | { |
| 984 | 1009 | throw exception::basic(exception::ERRMODULE_DATABASEPOSTGRESQL, POSTGRESQLEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, POSTGRESQLEX_NOTOPENED, DATABASEPOSTGRESQLEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 986 | 1011 | |
| 987 | 1012 | #ifdef POSTGRESQL_NO_ENCODINGTOCHAR |
| 988 | | |
| 989 | | int encoding = PQclientEncoding(pgHandle); |
| | 1013 | int encoding = PQclientEncoding(handle->handle); |
| 990 | 1014 | |
| 991 | 1015 | if (encoding >= 0 && encoding < _PG_LAST_ENCODING_) |
| … |
… |
|
| 995 | 1019 | |
| 996 | 1020 | return __dodostring__; |
| 997 | | |
| 998 | 1021 | #else |
| 999 | | |
| 1000 | | return pg_encoding_to_char(PQclientEncoding(pgHandle)); |
| 1001 | | |
| 1002 | | #endif |
| 1003 | | } |
| 1004 | | |
| 1005 | | #endif |
| 1006 | | |
| 1007 | | //------------------------------------------------------------------- |
| | 1022 | return pg_encoding_to_char(PQclientEncoding(handle->handle)); |
| | 1023 | #endif |
| | 1024 | } |
| | 1025 | |
| | 1026 | #endif |
| | 1027 | |
| | 1028 | //------------------------------------------------------------------- |
-
|
r1166
|
r1167
|
|
| 28 | 28 | */ |
| 29 | 29 | |
| | 30 | #include <libdodo/directives.h> |
| | 31 | |
| | 32 | #include <libdodo/types.h> |
| | 33 | #include <libdodo/toolsMisc.h> |
| 30 | 34 | #include <libdodo/dataBaseSqlConstructor.h> |
| | 35 | #include <libdodo/dataBaseSqlConstructorEx.h> |
| | 36 | #include <libdodo/dataBaseAccumulator.h> |
| 31 | 37 | |
| 32 | 38 | using namespace dodo::data::base::sql; |
-
|
r1166
|
r1167
|
|
| 28 | 28 | */ |
| 29 | 29 | |
| | 30 | #include <libdodo/directives.h> |
| | 31 | |
| | 32 | #ifdef SQLITE3_EXT |
| | 33 | |
| | 34 | #include <sqlite3.h> |
| | 35 | |
| | 36 | namespace dodo |
| | 37 | { |
| | 38 | namespace data |
| | 39 | { |
| | 40 | namespace base |
| | 41 | { |
| | 42 | struct __sqliteHandle |
| | 43 | { |
| | 44 | sqlite3 *handle; ///< DB handle |
| | 45 | sqlite3_stmt *result; ///< handlde to result |
| | 46 | }; |
| | 47 | }; |
| | 48 | }; |
| | 49 | }; |
| | 50 | |
| 30 | 51 | #include <libdodo/dataBaseSqlite.h> |
| 31 | | |
| 32 | | #ifdef SQLITE3_EXT |
| | 52 | #include <libdodo/toolsMisc.h> |
| | 53 | #include <libdodo/dataBaseSqliteEx.h> |
| | 54 | #include <libdodo/xexec.h> |
| 33 | 55 | |
| 34 | 56 | using namespace dodo::data::base; |
| 35 | 57 | |
| 36 | 58 | sqlite::sqlite() : empty(true), |
| 37 | | sqliteHandle(NULL) |
| 38 | | { |
| | 59 | handle(new __sqliteHandle) |
| | 60 | { |
| | 61 | handle->handle = NULL; |
| | 62 | |
| 39 | 63 | #ifndef DATABASE_WO_XEXEC |
| 40 | | |
| 41 | 64 | collectedData.setExecObject(XEXEC_OBJECT_DATABASESQLITE); |
| 42 | | |
| 43 | 65 | #endif |
| 44 | 66 | } |
| … |
… |
|
| 47 | 69 | |
| 48 | 70 | sqlite::sqlite(const __connectionInfo &info) : empty(true), |
| 49 | | sqliteHandle(NULL) |
| 50 | | { |
| | 71 | handle(new __sqliteHandle) |
| | 72 | { |
| | 73 | handle->handle = NULL; |
| | 74 | |
| 51 | 75 | #ifndef DATABASE_WO_XEXEC |
| 52 | | |
| 53 | 76 | collectedData.setExecObject(XEXEC_OBJECT_DATABASESQLITE); |
| 54 | | |
| 55 | 77 | #endif |
| 56 | 78 | |
| 57 | 79 | collectedData.dbInfo = info; |
| 58 | 80 | |
| 59 | | if (sqlite3_open(collectedData.dbInfo.path.c_str(), &sqliteHandle) != SQLITE_OK) |
| 60 | | { |
| 61 | | sqlite3_close(sqliteHandle); |
| 62 | | |
| 63 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_SQLITE, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 81 | if (sqlite3_open(collectedData.dbInfo.path.c_str(), &handle->handle) != SQLITE_OK) |
| | 82 | { |
| | 83 | sqlite3_close(handle->handle); |
| | 84 | |
| | 85 | delete handle; |
| | 86 | |
| | 87 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_SQLITE, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 64 | 88 | } |
| 65 | 89 | } |
| … |
… |
|
| 75 | 99 | sqlite::~sqlite() |
| 76 | 100 | { |
| 77 | | if (sqliteHandle != NULL) |
| | 101 | if (handle->handle != NULL) |
| 78 | 102 | { |
| 79 | 103 | if (!empty) |
| 80 | 104 | { |
| 81 | | sqlite3_finalize(sqliteResult); |
| 82 | | } |
| 83 | | |
| 84 | | sqlite3_close(sqliteHandle); |
| 85 | | } |
| | 105 | sqlite3_finalize(handle->result); |
| | 106 | } |
| | 107 | |
| | 108 | sqlite3_close(handle->handle); |
| | 109 | } |
| | 110 | |
| | 111 | delete handle; |
| 86 | 112 | } |
| 87 | 113 | |
| … |
… |
|
| 98 | 124 | #endif |
| 99 | 125 | |
| 100 | | if (sqliteHandle != NULL) |
| | 126 | if (handle->handle != NULL) |
| 101 | 127 | { |
| 102 | 128 | if (!empty) |
| 103 | 129 | { |
| 104 | 130 | empty = true; |
| 105 | | sqlite3_finalize(sqliteResult); |
| 106 | | } |
| 107 | | |
| 108 | | if (sqlite3_close(sqliteHandle) != SQLITE_OK) |
| 109 | | { |
| 110 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_CONNECT, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| 111 | | } |
| 112 | | |
| 113 | | sqliteHandle = NULL; |
| 114 | | } |
| 115 | | |
| 116 | | if (sqlite3_open(collectedData.dbInfo.path.c_str(), &sqliteHandle) != SQLITE_OK) |
| 117 | | { |
| 118 | | sqlite3_close(sqliteHandle); |
| 119 | | |
| 120 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_CONNECT, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 131 | sqlite3_finalize(handle->result); |
| | 132 | } |
| | 133 | |
| | 134 | if (sqlite3_close(handle->handle) != SQLITE_OK) |
| | 135 | { |
| | 136 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_CONNECT, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| | 137 | } |
| | 138 | |
| | 139 | handle->handle = NULL; |
| | 140 | } |
| | 141 | |
| | 142 | if (sqlite3_open(collectedData.dbInfo.path.c_str(), &handle->handle) != SQLITE_OK) |
| | 143 | { |
| | 144 | sqlite3_close(handle->handle); |
| | 145 | |
| | 146 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_CONNECT, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 121 | 147 | } |
| 122 | 148 | |
| … |
… |
|
| 131 | 157 | sqlite::disconnect() |
| 132 | 158 | { |
| 133 | | if (sqliteHandle != NULL) |
| | 159 | if (handle->handle != NULL) |
| 134 | 160 | { |
| 135 | 161 | #ifndef DATABASE_WO_XEXEC |
| … |
… |
|
| 141 | 167 | { |
| 142 | 168 | empty = true; |
| 143 | | sqlite3_finalize(sqliteResult); |
| 144 | | } |
| 145 | | |
| 146 | | if (sqlite3_close(sqliteHandle) != SQLITE_OK) |
| 147 | | { |
| 148 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_DISCONNECT, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 169 | sqlite3_finalize(handle->result); |
| | 170 | } |
| | 171 | |
| | 172 | if (sqlite3_close(handle->handle) != SQLITE_OK) |
| | 173 | { |
| | 174 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_DISCONNECT, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 149 | 175 | } |
| 150 | 176 | |
| … |
… |
|
| 153 | 179 | #endif |
| 154 | 180 | |
| 155 | | sqliteHandle = NULL; |
| | 181 | handle->handle = NULL; |
| 156 | 182 | } |
| 157 | 183 | } |
| … |
… |
|
| 162 | 188 | sqlite::fetchRows() const |
| 163 | 189 | { |
| 164 | | if (sqliteHandle == NULL) |
| | 190 | if (handle->handle == NULL) |
| 165 | 191 | { |
| 166 | 192 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, SQLITEEX_NOTOPENED, DATABASESQLITEEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 179 | 205 | } |
| 180 | 206 | |
| 181 | | sqlite3_reset(sqliteResult); |
| 182 | | |
| 183 | | unsigned int numFields = sqlite3_column_count(sqliteResult); |
| | 207 | sqlite3_reset(handle->result); |
| | 208 | |
| | 209 | unsigned int numFields = sqlite3_column_count(handle->result); |
| 184 | 210 | |
| 185 | 211 | bool iterate = true; |
| … |
… |
|
| 187 | 213 | |
| 188 | 214 | #ifndef USE_DEQUE |
| 189 | | rows.reserve(sqlite3_data_count(sqliteResult)); |
| | 215 | rows.reserve(sqlite3_data_count(handle->result)); |
| 190 | 216 | #endif |
| 191 | 217 | |
| … |
… |
|
| 194 | 220 | while (iterate) |
| 195 | 221 | { |
| 196 | | switch (sqlite3_step(sqliteResult)) |
| | 222 | switch (sqlite3_step(handle->result)) |
| 197 | 223 | { |
| 198 | 224 | case SQLITE_BUSY: |
| … |
… |
|
| 208 | 234 | case SQLITE_ERROR: |
| 209 | 235 | |
| 210 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_FETCHROWS, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 236 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_FETCHROWS, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 211 | 237 | |
| 212 | 238 | case SQLITE_ROW: |
| … |
… |
|
| 220 | 246 | for (i = 0; i < numFields; ++i) |
| 221 | 247 | { |
| 222 | | switch (sqlite3_column_type(sqliteResult, i)) |
| | 248 | switch (sqlite3_column_type(handle->result, i)) |
| 223 | 249 | { |
| 224 | 250 | case SQLITE_INTEGER: |
| 225 | 251 | |
| 226 | | rowsPart.push_back(tools::string::iToString(sqlite3_column_int(sqliteResult, i))); |
| | 252 | rowsPart.push_back(tools::string::iToString(sqlite3_column_int(handle->result, i))); |
| 227 | 253 | |
| 228 | 254 | break; |
| … |
… |
|
| 230 | 256 | case SQLITE_FLOAT: |
| 231 | 257 | |
| 232 | | rowsPart.push_back(tools::string::dToString(sqlite3_column_double(sqliteResult, i))); |
| | 258 | rowsPart.push_back(tools::string::dToString(sqlite3_column_double(handle->result, i))); |
| 233 | 259 | |
| 234 | 260 | break; |
| … |
… |
|
| 236 | 262 | case SQLITE_TEXT: |
| 237 | 263 | |
| 238 | | rowsPart.push_back(dodoString((const char *)sqlite3_column_text(sqliteResult, i), sqlite3_column_bytes(sqliteResult, i))); |
| | 264 | rowsPart.push_back(dodoString((const char *)sqlite3_column_text(handle->result, i), sqlite3_column_bytes(handle->result, i))); |
| 239 | 265 | |
| 240 | 266 | break; |
| … |
… |
|
| 242 | 268 | case SQLITE_BLOB: |
| 243 | 269 | |
| 244 | | rowsPart.push_back(dodoString((const char *)sqlite3_column_blob(sqliteResult, i), sqlite3_column_bytes(sqliteResult, i))); |
| | 270 | rowsPart.push_back(dodoString((const char *)sqlite3_column_blob(handle->result, i), sqlite3_column_bytes(handle->result, i))); |
| 245 | 271 | |
| 246 | 272 | break; |
| … |
… |
|
| 273 | 299 | sqlite::fetchFields() const |
| 274 | 300 | { |
| 275 | | if (sqliteHandle == NULL) |
| | 301 | if (handle->handle == NULL) |
| 276 | 302 | { |
| 277 | 303 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, SQLITEEX_NOTOPENED, DATABASESQLITEEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 290 | 316 | } |
| 291 | 317 | |
| 292 | | unsigned int numFields = sqlite3_column_count(sqliteResult); |
| | 318 | unsigned int numFields = sqlite3_column_count(handle->result); |
| 293 | 319 | |
| 294 | 320 | #ifndef USE_DEQUE |
| … |
… |
|
| 298 | 324 | for (unsigned int i(0); i < numFields; ++i) |
| 299 | 325 | { |
| 300 | | fields.push_back(sqlite3_column_name(sqliteResult, i)); |
| | 326 | fields.push_back(sqlite3_column_name(handle->result, i)); |
| 301 | 327 | } |
| 302 | 328 | |
| … |
… |
|
| 321 | 347 | sqlite::rowsCount() const |
| 322 | 348 | { |
| 323 | | if (sqliteHandle == NULL) |
| | 349 | if (handle->handle == NULL) |
| 324 | 350 | { |
| 325 | 351 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, SQLITEEX_NOTOPENED, DATABASESQLITEEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 328 | 354 | if (show) |
| 329 | 355 | { |
| 330 | | sqlite3_reset(sqliteResult); |
| | 356 | sqlite3_reset(handle->result); |
| 331 | 357 | |
| 332 | 358 | unsigned int numRows = 0; |
| … |
… |
|
| 336 | 362 | while (iterate) |
| 337 | 363 | { |
| 338 | | result = sqlite3_step(sqliteResult); |
| | 364 | result = sqlite3_step(handle->result); |
| 339 | 365 | switch (result) |
| 340 | 366 | { |
| … |
… |
|
| 351 | 377 | case SQLITE_ERROR: |
| 352 | 378 | |
| 353 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_FETCHROWS, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 379 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_FETCHROWS, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 354 | 380 | |
| 355 | 381 | case SQLITE_ROW: |
| … |
… |
|
| 374 | 400 | sqlite::fieldsCount() const |
| 375 | 401 | { |
| 376 | | if (sqliteHandle == NULL) |
| | 402 | if (handle->handle == NULL) |
| 377 | 403 | { |
| 378 | 404 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, SQLITEEX_NOTOPENED, DATABASESQLITEEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 381 | 407 | if (show) |
| 382 | 408 | { |
| 383 | | return sqlite3_column_count(sqliteResult); |
| | 409 | return sqlite3_column_count(handle->result); |
| 384 | 410 | } |
| 385 | 411 | else |
| … |
… |
|
| 394 | 420 | sqlite::affectedRowsCount() const |
| 395 | 421 | { |
| 396 | | if (sqliteHandle == NULL) |
| | 422 | if (handle->handle == NULL) |
| 397 | 423 | { |
| 398 | 424 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, SQLITEEX_NOTOPENED, DATABASESQLITEEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 401 | 427 | if (!show) |
| 402 | 428 | { |
| 403 | | return sqlite3_changes(sqliteHandle); |
| | 429 | return sqlite3_changes(handle->handle); |
| 404 | 430 | } |
| 405 | 431 | else |
| … |
… |
|
| 414 | 440 | sqlite::getFieldsTypes(const dodoString &table) |
| 415 | 441 | { |
| 416 | | if (sqliteHandle == NULL) |
| | 442 | if (handle->handle == NULL) |
| 417 | 443 | { |
| 418 | 444 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, SQLITEEX_NOTOPENED, DATABASESQLITEEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 429 | 455 | |
| 430 | 456 | #ifdef SQLITE_ENABLE_COLUMN_METADATA |
| 431 | | |
| 432 | 457 | request = "select * from " + table + " limit 1"; |
| 433 | 458 | |
| 434 | 459 | if (!empty) |
| 435 | 460 | { |
| 436 | | sqlite3_finalize(sqliteResult); |
| | 461 | sqlite3_finalize(handle->result); |
| 437 | 462 | empty = true; |
| 438 | 463 | } |
| 439 | 464 | |
| 440 | | if (sqlite3_prepare(sqliteHandle, request.c_str(), request.size(), &sqliteResult, NULL) != SQLITE_OK) |
| 441 | | { |
| 442 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__, request); |
| 443 | | } |
| 444 | | |
| 445 | | if (sqliteResult == NULL) |
| 446 | | { |
| 447 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 465 | if (sqlite3_prepare(handle->handle, request.c_str(), request.size(), &handle->result, NULL) != SQLITE_OK) |
| | 466 | { |
| | 467 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__, request); |
| | 468 | } |
| | 469 | |
| | 470 | if (handle->result == NULL) |
| | 471 | { |
| | 472 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 448 | 473 | } |
| 449 | 474 | |
| 450 | 475 | empty = false; |
| 451 | 476 | |
| 452 | | unsigned int numFields = sqlite3_column_count(sqliteResult); |
| | 477 | unsigned int numFields = sqlite3_column_count(handle->result); |
| 453 | 478 | |
| 454 | 479 | const char *columnType, *columnName; |
| … |
… |
|
| 458 | 483 | for (unsigned int i(0); i < numFields; ++i) |
| 459 | 484 | { |
| 460 | | columnName = sqlite3_column_name(sqliteResult, i); |
| 461 | | |
| 462 | | if (sqlite3_table_column_metadata(sqliteHandle, |
| | 485 | columnName = sqlite3_column_name(handle->result, i); |
| | 486 | |
| | 487 | if (sqlite3_table_column_metadata(handle->handle, |
| 463 | 488 | NULL, |
| 464 | 489 | table.c_str(), |
| … |
… |
|
| 472 | 497 | if (!empty) |
| 473 | 498 | { |
| 474 | | sqlite3_finalize(sqliteResult); |
| | 499 | sqlite3_finalize(handle->result); |
| 475 | 500 | empty = true; |
| 476 | 501 | } |
| 477 | 502 | |
| 478 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__, request); |
| | 503 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__, request); |
| 479 | 504 | } |
| 480 | 505 | |
| … |
… |
|
| 531 | 556 | if (!empty) |
| 532 | 557 | { |
| 533 | | sqlite3_finalize(sqliteResult); |
| | 558 | sqlite3_finalize(handle->result); |
| 534 | 559 | empty = true; |
| 535 | 560 | } |
| 536 | | |
| 537 | 561 | #else |
| 538 | | |
| 539 | 562 | request = "pragma table_info(" + table + ")"; |
| 540 | 563 | |
| 541 | 564 | if (!empty) |
| 542 | 565 | { |
| 543 | | sqlite3_finalize(sqliteResult); |
| | 566 | sqlite3_finalize(handle->result); |
| 544 | 567 | empty = true; |
| 545 | 568 | } |
| 546 | 569 | |
| 547 | | if (sqlite3_prepare(sqliteHandle, request.c_str(), request.size(), &sqliteResult, NULL) != SQLITE_OK) |
| 548 | | { |
| 549 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__, request); |
| 550 | | } |
| 551 | | |
| 552 | | if (sqliteResult == NULL) |
| 553 | | { |
| 554 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 570 | if (sqlite3_prepare(handle->handle, request.c_str(), request.size(), &handle->result, NULL) != SQLITE_OK) |
| | 571 | { |
| | 572 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__, request); |
| | 573 | } |
| | 574 | |
| | 575 | if (handle->result == NULL) |
| | 576 | { |
| | 577 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 555 | 578 | } |
| 556 | 579 | |
| … |
… |
|
| 565 | 588 | while (iterate) |
| 566 | 589 | { |
| 567 | | switch (sqlite3_step(sqliteResult)) |
| | 590 | switch (sqlite3_step(handle->result)) |
| 568 | 591 | { |
| 569 | 592 | case SQLITE_BUSY: |
| … |
… |
|
| 579 | 602 | case SQLITE_ERROR: |
| 580 | 603 | |
| 581 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 604 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 582 | 605 | |
| 583 | 606 | case SQLITE_ROW: |
| 584 | 607 | |
| 585 | | columnName = (const char *)sqlite3_column_text(sqliteResult, 1); |
| 586 | | columnType = (const char *)sqlite3_column_text(sqliteResult, 2); |
| | 608 | columnName = (const char *)sqlite3_column_text(handle->result, 1); |
| | 609 | columnType = (const char *)sqlite3_column_text(handle->result, 2); |
| 587 | 610 | |
| 588 | 611 | field = types->second.find(columnName); |
| … |
… |
|
| 641 | 664 | if (!empty) |
| 642 | 665 | { |
| 643 | | sqlite3_finalize(sqliteResult); |
| | 666 | sqlite3_finalize(handle->result); |
| 644 | 667 | empty = true; |
| 645 | 668 | } |
| 646 | | |
| 647 | 669 | #endif |
| 648 | 670 | |
| … |
… |
|
| 656 | 678 | bool result) |
| 657 | 679 | { |
| 658 | | if (sqliteHandle == NULL) |
| | 680 | if (handle->handle == NULL) |
| 659 | 681 | { |
| 660 | 682 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, SQLITEEX_NOTOPENED, DATABASESQLITEEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 678 | 700 | if (!empty) |
| 679 | 701 | { |
| 680 | | sqlite3_finalize(sqliteResult); |
| | 702 | sqlite3_finalize(handle->result); |
| 681 | 703 | empty = true; |
| 682 | 704 | } |
| 683 | 705 | |
| 684 | | if (sqlite3_prepare(sqliteHandle, request.c_str(), request.size(), &sqliteResult, NULL) != SQLITE_OK) |
| 685 | | { |
| 686 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_EXEC, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__, request); |
| | 706 | if (sqlite3_prepare(handle->handle, request.c_str(), request.size(), &handle->result, NULL) != SQLITE_OK) |
| | 707 | { |
| | 708 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_EXEC, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__, request); |
| 687 | 709 | } |
| 688 | 710 | |
| … |
… |
|
| 690 | 712 | for (; i != j; ++i) |
| 691 | 713 | { |
| 692 | | if (sqlite3_bind_blob(sqliteResult, i->reference, i->value->c_str(), i->value->size(), SQLITE_TRANSIENT) != SQLITE_OK) |
| | 714 | if (sqlite3_bind_blob(handle->result, i->reference, i->value->c_str(), i->value->size(), SQLITE_TRANSIENT) != SQLITE_OK) |
| 693 | 715 | { |
| 694 | 716 | blobs.clear(); |
| 695 | 717 | |
| 696 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_EXEC, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 718 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_EXEC, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 697 | 719 | } |
| 698 | 720 | } |
| … |
… |
|
| 700 | 722 | blobs.clear(); |
| 701 | 723 | |
| 702 | | if (sqliteResult == NULL) |
| 703 | | { |
| 704 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_EXEC, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 724 | if (handle->result == NULL) |
| | 725 | { |
| | 726 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_EXEC, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 705 | 727 | } |
| 706 | 728 | |
| … |
… |
|
| 709 | 731 | if (!show) |
| 710 | 732 | { |
| 711 | | if (sqlite3_step(sqliteResult) != SQLITE_DONE) |
| 712 | | { |
| 713 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_EXEC, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 733 | if (sqlite3_step(handle->result) != SQLITE_DONE) |
| | 734 | { |
| | 735 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_EXEC, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 714 | 736 | } |
| 715 | 737 | } |
| … |
… |
|
| 1048 | 1070 | sqlite::fetchFieldsToRows() const |
| 1049 | 1071 | { |
| 1050 | | if (sqliteHandle == NULL) |
| | 1072 | if (handle->handle == NULL) |
| 1051 | 1073 | { |
| 1052 | 1074 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_GETFIELDSTYPES, exception::ERRNO_LIBDODO, SQLITEEX_NOTOPENED, DATABASESQLITEEX_NOTOPENED_STR, __LINE__, __FILE__); |
| … |
… |
|
| 1060 | 1082 | } |
| 1061 | 1083 | |
| 1062 | | sqlite3_reset(sqliteResult); |
| 1063 | | |
| 1064 | | unsigned int numFields = sqlite3_column_count(sqliteResult); |
| | 1084 | sqlite3_reset(handle->result); |
| | 1085 | |
| | 1086 | unsigned int numFields = sqlite3_column_count(handle->result); |
| 1065 | 1087 | |
| 1066 | 1088 | bool iterate = true; |
| … |
… |
|
| 1071 | 1093 | |
| 1072 | 1094 | #ifndef USE_DEQUE |
| 1073 | | rowsFields.reserve(sqlite3_data_count(sqliteResult)); |
| | 1095 | rowsFields.reserve(sqlite3_data_count(handle->result)); |
| 1074 | 1096 | #endif |
| 1075 | 1097 | |
| 1076 | 1098 | while (iterate) |
| 1077 | 1099 | { |
| 1078 | | switch (sqlite3_step(sqliteResult)) |
| | 1100 | switch (sqlite3_step(handle->result)) |
| 1079 | 1101 | { |
| 1080 | 1102 | case SQLITE_BUSY: |
| … |
… |
|
| 1090 | 1112 | case SQLITE_ERROR: |
| 1091 | 1113 | |
| 1092 | | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_FETCHFIELDSTOROWS, exception::ERRNO_SQLITE, sqlite3_errcode(sqliteHandle), sqlite3_errmsg(sqliteHandle), __LINE__, __FILE__); |
| | 1114 | throw exception::basic(exception::ERRMODULE_DATABASESQLITE, SQLITEEX_FETCHFIELDSTOROWS, exception::ERRNO_SQLITE, sqlite3_errcode(handle->handle), sqlite3_errmsg(handle->handle), __LINE__, __FILE__); |
| 1093 | 1115 | |
| 1094 | 1116 | case SQLITE_ROW: |
| … |
… |
|
| 1098 | 1120 | for (i = 0; i < numFields; ++i) |
| 1099 | 1121 | { |
| 1100 | | switch (sqlite3_column_type(sqliteResult, i)) |
| | 1122 | switch (sqlite3_column_type(handle->result, i)) |
| 1101 | 1123 | { |
| 1102 | 1124 | case SQLITE_INTEGER: |
| 1103 | 1125 | |
| 1104 | | rowFieldsPart.insert(make_pair(sqlite3_column_name(sqliteResult, i), tools::string::iToString(sqlite3_column_int(sqliteResult, i)))); |
| | 1126 | rowFieldsPart.insert(make_pair(sqlite3_column_name(handle->result, i), tools::string::iToString(sqlite3_column_int(handle->result, i)))); |
| 1105 | 1127 | |
| 1106 | 1128 | break; |
| … |
… |
|
| 1108 | 1130 | case SQLITE_FLOAT: |
| 1109 | 1131 | |
| 1110 | | rowFieldsPart.insert(make_pair(sqlite3_column_name(sqliteResult, i), tools::string::dToString(sqlite3_column_double(sqliteResult, i)))); |
| | 1132 | rowFieldsPart.insert(make_pair(sqlite3_column_name(handle->result, i), tools::string::dToString(sqlite3_column_double(handle->result, i)))); |
| 1111 | 1133 | |
| 1112 | 1134 | break; |
| … |
… |
|
| 1114 | 1136 | case SQLITE_TEXT: |
| 1115 | 1137 | |
| 1116 | | rowFieldsPart.insert(make_pair(sqlite3_column_name(sqliteResult, i), dodoString((const char *)sqlite3_column_text(sqliteResult, i), sqlite3_column_bytes(sqliteResult, i)))); |
| | 1138 | rowFieldsPart.insert(make_pair(sqlite3_column_name(handle->result, i), dodoString((const char *)sqlite3_column_text(handle->result, i), sqlite3_column_bytes(handle->result, i)))); |
| 1117 | 1139 | |
| 1118 | 1140 | break; |
| … |
… |
|
| 1120 | 1142 | case SQLITE_BLOB: |
| 1121 | 1143 | |
| 1122 | | rowFieldsPart.insert(make_pair(sqlite3_column_name(sqliteResult, i), dodoString((const char *)sqlite3_column_blob(sqliteResult, i), sqlite3_column_bytes(sqliteResult, i)))); |
| | 1144 | rowFieldsPart.insert(make_pair(sqlite3_column_name(handle->result, i), dodoString((const char *)sqlite3_column_blob(handle->result, i), sqlite3_column_bytes(handle->result, i)))); |
| 1123 | 1145 | |
| 1124 | 1146 | break; |
| … |
… |
|
| 1127 | 1149 | default: |
| 1128 | 1150 | |
| 1129 | | rowFieldsPart.insert(make_pair(dodoString(sqlite3_column_name(sqliteResult, i)), statements[SQLCONSTRUCTOR_STATEMENT_NULL])); |
| | 1151 | rowFieldsPart.insert(make_pair(dodoString(sqlite3_column_name(handle->result, i)), statements[SQLCONSTRUCTOR_STATEMENT_NULL])); |
| 1130 | 1152 | |
| 1131 | 1153 | break; |
-
|
r1166
|
r1167
|
|
| 32 | 32 | using namespace dodo::pc::sync; |
| 33 | 33 | |
| 34 | | protector::protector(section *a_keeper) : keeper(a_keeper) |
| | 34 | protector::protector(section *keeper) : keeper(keeper) |
| 35 | 35 | { |
| 36 | 36 | if (keeper != NULL) |
-