File: sqp.h

package info (click to toggle)
unixodbc 2.2.11-13
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 17,292 kB
  • ctags: 12,410
  • sloc: ansic: 116,624; cpp: 29,333; sh: 16,966; makefile: 2,961; lex: 241; yacc: 182; perl: 141; sed: 16; sql: 1
file content (311 lines) | stat: -rw-r--r-- 8,190 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
#ifndef _SQP_H
#define _SQP_H

#include <lst.h>

/* #define SQPDEBUG */

/***[ PARSED, SUPPORTED, SQL PARTS ]**********************************************/
typedef enum sqpStatementType
{
    sqpcreatetable,
    sqpdroptable,
    sqpselect,
    sqpdelete,
    sqpinsert,
    sqpupdate
} sqpStatementType;

typedef enum sqpOrder
{
    sqpnone,
    sqpasc,
    sqpdesc
} sqpOrder;

typedef struct tSQPTABLE
{
    char *pszOwner;
    char *pszTable;

} SQPTABLE, *HSQPTABLE;

typedef struct tSQPCOLUMN
{
    char    *pszTable;
    char    *pszColumn;

    int     nColumn;            /* index into row data for col value	*/

} SQPCOLUMN, *HSQPCOLUMN;

typedef struct tSQPCOMPARISON
{
    char *pszLValue;            /* must be a column name 				*/
    char *pszOperator;          /* > < >= <= = LIKE NOTLIKE				*/
    char *pszRValue;            /* must be a string (quotes removed)	*/
	char cEscape;				/* escape char for LIKE operator		*/

    int  nLColumn;              /* index into row data for col value	*/

} SQPCOMPARISON, *HSQPCOMPARISON;

typedef struct tSQPASSIGNMENT
{
    char *pszColumn;
    char *pszValue;         

    int  nColumn;               /* index into row data for col value	*/

} SQPASSIGNMENT, *HSQPASSIGNMENT;

typedef struct tSQPDATATYPE
{
    char *pszType;
    short nType;          
    int  nPrecision;            
    int  nScale;

} SQPDATATYPE, *HSQPDATATYPE;

typedef struct tSQPCOLUMNDEF
{
    char *          pszColumn;
    HSQPDATATYPE    hDataType;
    int             bNulls;

} SQPCOLUMNDEF, *HSQPCOLUMNDEF;

typedef struct tSQPPARAM
{
    char *pszValue;         

} SQPPARAM, *HSQPPARAM;

typedef enum sqpCondType
{
	sqpor,
	sqpand,
	sqpnot,
	sqppar,
	sqpcomp
} sqpCondType;

typedef struct tSQPCOND
{
	sqpCondType nType;
	struct tSQPCOND *hLCond;
	struct tSQPCOND *hRCond;
	HSQPCOMPARISON   hComp;

} SQPCOND, *HSQPCOND;

/***[ PARSED, SUPPORTED, SQL STATEMENTS ]**********************************************/
typedef struct tSQPCREATETABLE
{
    char        *pszTable;
    HLST        hColumnDefs;    /* list of HSQPCOLUMNDEF                */

} SQPCREATETABLE, *HSQPCREATETABLE;

typedef char SQPDROPTABLE;
typedef SQPDROPTABLE * HSQPDROPTABLE;

typedef struct tSQPSELECT
{
    HLST        hColumns;       /* list of HSQPCOLUMN                   */
    char        *pszTable;      
    HSQPCOND    hWhere;         /* tree of HSQPCOND                     */
    HLST        hOrderBy;       /* list of HSQPCOLUMN                   */
    sqpOrder    nOrderDirection;

} SQPSELECT, *HSQPSELECT;

typedef struct tSQPDELETE
{
    char        *pszTable;
    HSQPCOND    hWhere;         /* tree of HSQPCOND                     */
    char        *pszCursor;

} SQPDELETE, *HSQPDELETE;

typedef struct tSQPINSERT
{
    HLST        hColumns;       /* list of HSQPCOLUMN                   */
    char        *pszTable;
    HLST        hValues;       /* list of strings                        */

} SQPINSERT, *HSQPINSERT;

typedef struct tSQPUPDATE
{
    char        *pszTable;
    HLST        hAssignments;   /* list of HSQPASSIGNMENT               */
    HSQPCOND    hWhere;         /* tree of HSQPCOND                     */
    char        *pszCursor;

} SQPUPDATE, *HSQPUPDATE;

/***[ TOP LEVEL STRUCT ]**********************************************/
typedef struct tSQPPARSEDSQL
{
    sqpStatementType nType;
    union
    {
        HSQPCREATETABLE hCreateTable;
        HSQPDROPTABLE   hDropTable;
        HSQPSELECT      hSelect;
        HSQPDELETE      hDelete;
        HSQPINSERT      hInsert;
        HSQPUPDATE      hUpdate;
    } h;

} SQPPARSEDSQL, *HSQPPARSEDSQL;

/***********************
 * GLOBALS (yuck... gotta get rid of them):
 *
 * TEMPS USED WHEN LEX/YACC DO THEIR THING
 ***********************/
extern char             g_szError[1024];

extern HSQPPARSEDSQL    g_hParsedSQL;

extern char *           g_pszTable;
extern char *           g_pszType;
extern HLST             g_hColumns;
extern HSQPDATATYPE     g_hDataType;
extern HLST             g_hColumnDefs;
extern HLST             g_hValues;
extern HLST             g_hAssignments;
extern char *           g_pszCursor;
extern HLST             g_hOrderBy;
extern sqpOrder         g_nOrderDirection;
extern int              g_nNulls;

extern char *           g_pszSQLCursor;     /* yyparse position init to start of SQL string before yyparse	*/
extern char *           g_pszSQLLimit;      /* ptr to NULL terminator of SQL string (yyparse stops here)	*/
extern int              g_nLineNo;

extern HLST             g_hParams;
extern HSQPCOND         g_hConds;

/*********************************************************************************************
 * PUBLIC INTERFACE
 *********************************************************************************************/
#if defined(__cplusplus)
extern  "C" {
#endif

/***********************
 * sqpOpen
 *
 * Inits parser globals. Must call this before any other functions
 * and sqpClose MUST be called before next sqpOpen.
 *
 * pszFirstChar     - pointer to 1st char in sql string
 * pszLastChar      - pointer to last char in sql string (typically a pointer to a '\0' char)
 * hParams          - list of bound parameters
 *
 ***********************/
void sqpOpen( char *pszFirstChar, char *pszLastChar, HLST hParams );

/***********************
 * sqpParse
 *
 * Attempts to parse the sql given in sqpOpen. 
 * Returns true if success else error. Use sqpError to get exact error after call.
 * Only call this once per sqpOpen.
 *
 ***********************/
int sqpParse();

/***********************
 * sqpError
 *
 * Returns the last error message (i.e. why a parse failed). Will
 * be an empty string if no error.
 *
 ***********************/
char * sqpError();

/***********************
 * sqpClose
 *
 * Cleans up globals in prep for next call to sqpOpen.
 *
 ***********************/
void sqpClose();

/***********************
 * sqpAdoptParsedSQL
 *
 * Caller adopts the top level pointer to the parsed sql. This means
 * that the caller must also call sqpFreeParsedSQL when done with it!
 *
 ***********************/
HSQPPARSEDSQL sqpAdoptParsedSQL();

/***********************
 * sqpFreeParsedSQL
 *
 * Frees the parsed sql from memory.
 * If this is being called as a result if a prior call to
 * sqpAdoptParsedSQL (which is the only reason it should be called in
 * this interface) then it can be called even after the sqpClose.
 *
 ***********************/
int  sqpFreeParsedSQL( HSQPPARSEDSQL hParsedSQL );

/***********************
 * sqpFreeParam
 *
 * Frees a bound param from memory.
 *
 ***********************/
void sqpFreeParam( void *pData );

#if defined(__cplusplus)
}
#endif

/*********************************************************************************************
 * INTERNAL FUNCS
 *********************************************************************************************/
int     my_yyinput(char *buf, int max_size);
void    yyerror( char *s );
int     yyparse();
int     yywrap();

short sqpStringTypeToSQLTYPE (char * pszType);

void sqpFreeAssignment( void *pData );
void sqpFreeColumn( void *pData );
void sqpFreeColumnDef( void *pData );
void sqpFreeDataType( void *pData );
void sqpFreeComparison( void *pData );
void sqpFreeCond( void *pData );
void sqpFreeCreateTable( void *pData );
void sqpFreeDropTable( void *pData );
void sqpFreeDelete( void *pData );
void sqpFreeInsert( void *pData );
void sqpFreeSelect( void *pData );
void sqpFreeUpdate( void *pData );
void sqpStoreAssignment( char *pszColumn, char *pszValue );
void sqpStoreColumn( HLST *ph, char *pszColumn, int nColumn );
void sqpStoreColumnDef( char *pszColumn );
void sqpStoreDataType( char *pszType, int nPrecision, int nScale );
HSQPCOMPARISON sqpStoreComparison( char *pszLValue, char *pszOperator, char *pszRValue, char *pszEscape );
HSQPCOND sqpStoreCond( sqpCondType nType, HSQPCOND pLCond, HSQPCOND pRCond, HSQPCOMPARISON pComp );
void sqpStoreCreateTable();
void sqpStoreDropTable();
void sqpStoreDelete();
void sqpStoreInsert();
void sqpStorePositioned( char *pszCursor );
void sqpStoreSelect();
void sqpStoreTable( char *pszTable );
void sqpStoreUpdate();
void sqpStoreValue( char *pszValue );

#endif