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