1 /* Copyright (C) 2000-2015 Lavtech.com corp. All rights reserved. 2 3 This program is free software; you can redistribute it and/or modify 4 it under the terms of the GNU General Public License as published by 5 the Free Software Foundation; either version 2 of the License, or 6 (at your option) any later version. 7 8 This program is distributed in the hope that it will be useful, 9 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 GNU General Public License for more details. 12 13 You should have received a copy of the GNU General Public License 14 along with this program; if not, write to the Free Software 15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 */ 17 18 #ifndef UDM_SQLDBMS_H 19 #define UDM_SQLDBMS_H 20 21 22 /* SQL Data types */ 23 typedef enum 24 { 25 UDM_SQLTYPE_UNKNOWN= 0, 26 UDM_SQLTYPE_LONGVARBINARY= 1, 27 UDM_SQLTYPE_LONGVARCHAR= 2, 28 UDM_SQLTYPE_VARCHAR= 3, 29 UDM_SQLTYPE_INT32= 4 30 } udm_sqltype_t; 31 32 const char *UdmSQLTypeToStr(udm_sqltype_t type); 33 34 #define UDM_SQL_NULL_DATA (-1) 35 #define UDM_SQL_DATA_AT_EXEC (-2) 36 #define UDM_SQL_NTS (-3) 37 38 #define UDM_SQL_HAVE_GROUPBY 1 39 #define UDM_SQL_HAVE_TRUNCATE 2 40 #define UDM_SQL_HAVE_SUBSELECT 4 41 #define UDM_SQL_HAVE_LIMIT 8 42 #define UDM_SQL_HAVE_TOP 16 /* SELECT TOP 10 FROM t1 */ 43 #define UDM_SQL_HAVE_BIND_BINARY 32 /* Bind BINARY/VARBINARY/BLOB */ 44 #define UDM_SQL_HAVE_0xHEX 64 /* INSERT INTO t1 VALUES (0xAABBCC) */ 45 #define UDM_SQL_HAVE_STDHEX 128 /* INSERT INTO t1 VALUES (X'AABBCC') */ 46 #define UDM_SQL_HAVE_ROWNUM 256 /* ROWNUM to limit result size */ 47 #define UDM_SQL_HAVE_GOOD_COMMIT 512 /* failing query doesn't stop trasaction */ 48 #define UDM_SQL_IGNORE_ERROR 1024 49 #define UDM_SQL_DEBUG_QUERY 2048 50 #define UDM_SQL_HAVE_FIRST_SKIP 4096 /* SELECT FIRST 10 * FROM t1 */ 51 #define UDM_SQL_HAVE_TRANSACT 8192 /* If transactions are supported */ 52 #define UDM_SQL_HAVE_RENAME 0x00004000 /* If can rename tables */ 53 #define UDM_SQL_HAVE_CREATE_LIKE 0x00008000 /* If can CREATE TABLE LIKE */ 54 #define UDM_SQL_HAVE_DROP_IF_EXISTS 0x00010000 /* If can DROP TABLE IF EXISTS */ 55 #define UDM_SQL_HAVE_BLOB_AS_HEX 0x00200000 /* INSERT INTO t1 (blob1) VALUES ('AABBCC') */ 56 #define UDM_SQL_HAVE_BIND_TEXT 0x00400000 /* Bind CHAR/VARCHAR/TEXT */ 57 58 #define UDM_SQL_HAVE_BIND (UDM_SQL_HAVE_BIND_BINARY|UDM_SQL_HAVE_BIND_TEXT) 59 60 #define UDM_SQL_MAX_BIND_PARAM 64 61 62 struct udm_sql_st; 63 64 typedef struct 65 { 66 char *sqlname; 67 int sqltype; 68 int sqllen; 69 } UDM_SQLFIELD; 70 71 72 typedef struct 73 { 74 size_t nRows; 75 size_t nCols; 76 size_t curRow; 77 UDM_SQLFIELD *Fields; 78 UDM_STR *Items; 79 void *specific; 80 struct udm_sql_st *db; 81 } UDM_SQLRES; 82 83 84 udm_rc_t UdmSQLResFreeGeneric(UDM_SQLRES *res); 85 86 typedef struct udm_sql_res_list_st 87 { 88 size_t nitems; 89 UDM_SQLRES *Item; 90 } UDM_SQLRESLIST; 91 92 void UdmSQLResListInit(UDM_SQLRESLIST *List); 93 udm_rc_t UdmSQLResListAdd(UDM_SQLRESLIST *List, UDM_SQLRES *Res); 94 void UdmSQLResListFree(UDM_SQLRESLIST *List); 95 96 void DecodeHexStr (const char *src, UDM_STR *dst, size_t size); 97 98 /****************************************************************/ 99 100 /* Database type and driver type */ 101 typedef enum 102 { 103 UDM_DB_MYSQL= 2, 104 UDM_DB_PGSQL= 3, 105 UDM_DB_SOLID= 4, 106 UDM_DB_VIRT= 6, 107 UDM_DB_IBASE= 7, 108 UDM_DB_ORACLE8= 8, 109 UDM_DB_MSSQL= 10, 110 UDM_DB_SAPDB= 11, 111 UDM_DB_DB2= 12, 112 UDM_DB_SQLITE= 13, 113 UDM_DB_ACCESS= 14, 114 UDM_DB_MIMER= 15, 115 UDM_DB_CACHE= 16, 116 UDM_DB_SYBASE= 17, 117 UDM_DB_SQLITE3= 18, 118 UDM_DB_MONETDB= 19 119 } udm_sqldbtype_t; 120 121 122 typedef enum 123 { 124 UDM_DBAPI_ODBC= 1, 125 UDM_DBAPI_MYSQL= 2, 126 UDM_DBAPI_PGSQL= 3, 127 UDM_DBAPI_IBASE= 7, 128 UDM_DBAPI_ORACLE8= 8, 129 UDM_DBAPI_CTLIB= 10, 130 UDM_DBAPI_SQLITE= 13, 131 UDM_DBAPI_SQLITE3= 18 132 } udm_sqldbapi_t; 133 134 135 typedef struct udm_sqldb_handler_st 136 { 137 size_t (*EscStr)(struct udm_sql_st *db, char *to, const char *from, size_t len); 138 udm_rc_t (*Query)(struct udm_sql_st *db, UDM_SQLRES *R, const char *query); 139 udm_rc_t (*Connect)(struct udm_sql_st *db); 140 udm_rc_t (*Close)(struct udm_sql_st *db); 141 udm_rc_t (*Begin)(struct udm_sql_st *db); 142 udm_rc_t (*Commit)(struct udm_sql_st *db); 143 udm_rc_t (*Prepare)(struct udm_sql_st *db, const char *query); 144 udm_rc_t (*Bind)(struct udm_sql_st *db, int position, const void *data, int size, udm_sqltype_t type); 145 udm_rc_t (*Exec)(struct udm_sql_st *db); 146 udm_rc_t (*StmtFree)(struct udm_sql_st *db); 147 udm_rc_t (*FetchRow)(struct udm_sql_st *db, UDM_SQLRES *R, UDM_STR *); 148 udm_rc_t (*StoreResult)(struct udm_sql_st *db, UDM_SQLRES *R); 149 udm_rc_t (*FreeResult)(struct udm_sql_st *db, UDM_SQLRES *R); 150 udm_rc_t (*ExecDirect)(struct udm_sql_st *db, UDM_SQLRES *R, const char *q); 151 udm_rc_t (*RenameTable)(struct udm_sql_st *db, const char *from, const char *to); 152 udm_rc_t (*CopyStructure)(struct udm_sql_st *db, const char *from, const char *to); 153 udm_rc_t (*LockOrBegin)(struct udm_sql_st *db, const char *param); 154 udm_rc_t (*UnlockOrCommit)(struct udm_sql_st *db); 155 } UDM_SQLDB_HANDLER; 156 157 158 typedef struct udm_sql_st 159 { 160 UDM_SQLDB_HANDLER handler; 161 void *specific; 162 void *ps; /* for prepared statements */ 163 int errcode; 164 char errstr[2048]; 165 UDM_VARLIST Vars; 166 udm_sqldbtype_t DBType; 167 udm_sqldbapi_t DBDriver; 168 int version; /* vendor specific version */ 169 int DBSQL_IN; 170 int flags; 171 size_t res_limit; 172 udm_bool_t connected; 173 } UDM_SQL; 174 175 176 extern const UDM_SQLDB_HANDLER udm_sqldb_ctlib_handler; 177 extern const UDM_SQLDB_HANDLER udm_sqldb_mysql_handler; 178 extern const UDM_SQLDB_HANDLER udm_sqldb_pgsql_handler; 179 extern const UDM_SQLDB_HANDLER udm_sqldb_ibase_handler; 180 extern const UDM_SQLDB_HANDLER udm_sqldb_sqlite_handler; 181 extern const UDM_SQLDB_HANDLER udm_sqldb_sqlite3_handler; 182 extern const UDM_SQLDB_HANDLER udm_sqldb_odbc_handler; 183 extern const UDM_SQLDB_HANDLER udm_sqldb_oracle_handler; 184 185 /*********************************************************************/ 186 187 udm_rc_t UdmSQLEscDSTR(UDM_SQL *db, UDM_DSTR *dst, const char *src, size_t srclen); 188 189 size_t UdmSQLEscStrGeneric(UDM_SQL *db, char *to, const char *from, size_t len); 190 size_t UdmSQLEscStr(UDM_SQL *db, char *to, const char *from, size_t l); 191 char* UdmSQLEscStrAlloc(UDM_SQL *db, const char *src, size_t srclen); 192 char* UdmSQLEscStrSimple(UDM_SQL *db, char *to, const char *from, size_t l); 193 size_t UdmSQLBinEscStr(UDM_SQL *db, char *dst, size_t dstlen, const char *src, size_t srclen); 194 udm_rc_t UdmSQLTableTruncateOrDelete(UDM_SQL *db, const char *name); 195 udm_rc_t UdmSQLDropTableIfExists(UDM_SQL *db, const char *name); 196 udm_rc_t UdmSQLQueryOneRowInt(UDM_SQL *db, int *res, const char *qbuf); 197 198 udm_rc_t UdmSQLPrepareGeneric(UDM_SQL *db, const char *query); 199 udm_rc_t UdmSQLBindGeneric(UDM_SQL *db, int position, const void *data, int size, udm_sqltype_t type); 200 udm_rc_t UdmSQLExecGeneric(UDM_SQL *db); 201 udm_rc_t UdmSQLStmtFreeGeneric(UDM_SQL *db); 202 udm_rc_t UdmSQLLockOrBeginGeneric(UDM_SQL *, const char *param); 203 udm_rc_t UdmSQLUnlockOrCommitGeneric(UDM_SQL *); 204 205 #define UDM_SQL_TOP_BUF_SIZE 64 206 207 typedef struct udm_sql_top_st 208 { 209 char rownum[UDM_SQL_TOP_BUF_SIZE]; 210 char limit[UDM_SQL_TOP_BUF_SIZE]; 211 char top[UDM_SQL_TOP_BUF_SIZE]; 212 } UDM_SQL_TOP_CLAUSE; 213 void UdmSQLTopClause(UDM_SQL *db, size_t top_num, UDM_SQL_TOP_CLAUSE *Top); 214 215 const char *UdmSQLParamPlaceHolder(UDM_SQL *db, size_t i); 216 udm_sqltype_t UdmSQLLongVarCharBindType(UDM_SQL *db); 217 218 UDM_API(udm_rc_t) UdmSQLQuery(UDM_SQL *db, UDM_SQLRES *R, const char *query); 219 UDM_API(size_t) UdmSQLNumRows(UDM_SQLRES *res); 220 size_t UdmSQLNumCols(UDM_SQLRES *res); 221 void UdmSQLValueToConstStr(UDM_CONST_STR *str, UDM_SQLRES *res, size_t row, size_t col); 222 size_t UdmSQLLen(UDM_SQLRES * res,size_t i,size_t j); 223 UDM_API(const char *) UdmSQLValue(UDM_SQLRES * res,size_t i,size_t j); 224 UDM_API(udm_rc_t) UdmSQLFetchRowSimple(UDM_SQL *,UDM_SQLRES *res, UDM_STR *pstr); 225 UDM_API(udm_rc_t) UdmSQLStoreResultSimple(UDM_SQL *,UDM_SQLRES *res); 226 UDM_API(udm_rc_t) UdmSQLFreeResultSimple(UDM_SQL *,UDM_SQLRES *res); 227 UDM_API(void) UdmSQLFree(UDM_SQLRES*); 228 udm_rc_t UdmSQLClose(UDM_SQL *db); 229 230 udm_rc_t UdmSQLBegin(UDM_SQL *db); 231 udm_rc_t UdmSQLCommit(UDM_SQL *db); 232 udm_rc_t UdmSQLExecDirect(UDM_SQL *db, UDM_SQLRES *R, const char *query); 233 udm_rc_t UdmSQLPrepare(UDM_SQL *db, const char *query); 234 udm_rc_t UdmSQLExecute(UDM_SQL *db); 235 udm_rc_t UdmSQLStmtFree(UDM_SQL *db); 236 udm_rc_t UdmSQLBindParameter(UDM_SQL *db, int pos, const void *data, int size, udm_sqltype_t type); 237 udm_rc_t UdmSQLRenameTable(UDM_SQL *db, const char *from, const char *to); 238 udm_rc_t UdmSQLCopyStructure(UDM_SQL *db, const char *from, const char *to); 239 udm_rc_t UdmSQLLockOrBegin(UDM_SQL *db, const char *param); 240 udm_rc_t UdmSQLUnlockOrCommit(UDM_SQL *db); 241 242 #define UDM_SQLMON_DISPLAY_FIELDS 1 243 #define UDM_SQLMON_DONT_NEED_SEMICOLON 2 /* Execute immediately, for --exec */ 244 245 typedef enum 246 { 247 udm_sqlmon_mode_batch= 0, 248 udm_sqlmon_mode_interactive= 1 249 } udm_sqlmon_mode_t; 250 251 typedef enum 252 { 253 udm_sqlmon_column_flag_raw= 0, 254 udm_sqlmon_column_flag_binary= 1, 255 udm_sqlmon_column_flag_semibinary= 2 256 } udm_sqlmon_column_flag_t; 257 258 typedef struct udm_sqlmon_param_st 259 { 260 UDM_IOHANDLER iohandler; 261 int flags; 262 udm_sqlmon_column_flag_t colflags[10]; 263 size_t currdbnum; 264 size_t nqueries; 265 size_t ngood; 266 size_t nbad; 267 size_t lineno; 268 udm_sqlmon_mode_t mode; 269 void* user_data; 270 } UDM_SQLMON_PARAM; 271 272 UDM_API(udm_rc_t) UdmSQLMonitor(UDM_AGENT *A, UDM_ENV *E, UDM_SQLMON_PARAM *prm); 273 274 #endif 275