1 /*
2  * Copyright (C) 2008 - 2011 Vivien Malerba <malerba@gnome-db.org>
3  * Copyright (C) 2009 Murray Cumming <murrayc@murrayc.com>
4  * Copyright (C) 2011 Daniel Espinosa <despinosa@src.gnome.org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19  * Boston, MA  02110-1301, USA.
20  */
21 
22 #ifndef _GDA_STATEMENT_STRUCT_DECL_H
23 #define _GDA_STATEMENT_STRUCT_DECL_H
24 
25 #include <glib.h>
26 #include <glib-object.h>
27 #include <libgda/gda-decl.h>
28 #include <libgda/gda-meta-store.h>
29 #include <libgda/gda-meta-struct.h>
30 
31 G_BEGIN_DECLS
32 
33 /* error reporting */
34 extern GQuark gda_sql_error_quark (void);
35 #define GDA_SQL_ERROR gda_sql_error_quark ()
36 /*
37  * GdaSqlError: (skip)
38  *
39  **/
40 typedef enum {
41 	GDA_SQL_STRUCTURE_CONTENTS_ERROR,
42 	GDA_SQL_MALFORMED_IDENTIFIER_ERROR,
43 	GDA_SQL_MISSING_IDENTIFIER_ERROR,
44 	GDA_SQL_VALIDATION_ERROR
45 } GdaSqlError;
46 /*
47  * GdaSqlErrorType:
48  *
49  **/
50 typedef GdaSqlError GdaSqlErrorType;
51 
52 /*
53  * Struct declarations
54  */
55 /*
56  * GdaSqlAnyPart: (skip)
57  *
58  **/
59 typedef struct _GdaSqlAnyPart   GdaSqlAnyPart;
60 /*
61  * GdaSqlStatement: (skip)
62  *
63  **/
64 typedef struct _GdaSqlStatement GdaSqlStatement;
65 /*
66  * GdaSqlStatementUnknown: (skip)
67  *
68  **/
69 typedef struct _GdaSqlStatementUnknown GdaSqlStatementUnknown;
70 /*
71  * GdaSqlStatementTransaction: (skip)
72  *
73  **/
74 typedef struct _GdaSqlStatementTransaction GdaSqlStatementTransaction;
75 /*
76  * GdaSqlStatementSelect: (skip)
77  *
78  **/
79 typedef struct _GdaSqlStatementSelect GdaSqlStatementSelect;
80 /*
81  * GdaSqlStatementInsert: (skip)
82  *
83  **/
84 typedef struct _GdaSqlStatementInsert GdaSqlStatementInsert;
85 /*
86  * GdaSqlStatementDelete: (skip)
87  *
88  **/
89 typedef struct _GdaSqlStatementDelete GdaSqlStatementDelete;
90 /*
91  * GdaSqlStatementUpdate: (skip)
92  *
93  **/
94 typedef struct _GdaSqlStatementUpdate GdaSqlStatementUpdate;
95 /*
96  * GdaSqlStatementCompound: (skip)
97  *
98  **/
99 typedef struct _GdaSqlStatementCompound GdaSqlStatementCompound;
100 
101 /*
102  * Statement type
103  */
104 /**
105  * GdaSqlStatementType:
106  * @GDA_SQL_STATEMENT_SELECT: a SELECT statement
107  * @GDA_SQL_STATEMENT_INSERT: an INSERT statement
108  * @GDA_SQL_STATEMENT_UPDATE: an UPDATE statement
109  * @GDA_SQL_STATEMENT_DELETE: a DELETE statement
110  * @GDA_SQL_STATEMENT_COMPOUND: a compound statement: multiple SELECT statements grouped together using an operator
111  * @GDA_SQL_STATEMENT_BEGIN: start of transaction statement
112  * @GDA_SQL_STATEMENT_ROLLBACK: transaction abort statement
113  * @GDA_SQL_STATEMENT_COMMIT: transaction commit statement
114  * @GDA_SQL_STATEMENT_SAVEPOINT: new savepoint definition statement
115  * @GDA_SQL_STATEMENT_ROLLBACK_SAVEPOINT: return to savepoint statement
116  * @GDA_SQL_STATEMENT_DELETE_SAVEPOINT: savepoint deletion statement
117  * @GDA_SQL_STATEMENT_UNKNOWN: unknown statement, only identifies variables
118  * @GDA_SQL_STATEMENT_NONE: not used
119  *
120  * Known types of statements
121  */
122 typedef enum {
123 	GDA_SQL_STATEMENT_SELECT,
124 	GDA_SQL_STATEMENT_INSERT,
125 	GDA_SQL_STATEMENT_UPDATE,
126 	GDA_SQL_STATEMENT_DELETE,
127 	GDA_SQL_STATEMENT_COMPOUND,
128 
129 	GDA_SQL_STATEMENT_BEGIN,
130 	GDA_SQL_STATEMENT_ROLLBACK,
131 	GDA_SQL_STATEMENT_COMMIT,
132 
133 	GDA_SQL_STATEMENT_SAVEPOINT,
134 	GDA_SQL_STATEMENT_ROLLBACK_SAVEPOINT,
135 	GDA_SQL_STATEMENT_DELETE_SAVEPOINT,
136 
137 	GDA_SQL_STATEMENT_UNKNOWN,
138 	GDA_SQL_STATEMENT_NONE
139 } GdaSqlStatementType;
140 
141 
142 /*
143  * Structures identification
144  */
145 /**
146  * GdaSqlAnyPartType: (skip)
147  * @GDA_SQL_ANY_STMT_SELECT: structure is a #GdaSqlStatementSelect
148  * @GDA_SQL_ANY_STMT_INSERT: structure is a #GdaSqlStatementInsert
149  * @GDA_SQL_ANY_STMT_UPDATE: structure is a #GdaSqlStatementUpdate
150  * @GDA_SQL_ANY_STMT_DELETE: structure is a #GdaSqlStatementDelete
151  * @GDA_SQL_ANY_STMT_COMPOUND: structure is a #GdaSqlStatementCompound
152  * @GDA_SQL_ANY_STMT_BEGIN: structure is a #GdaSqlStatementTransaction
153  * @GDA_SQL_ANY_STMT_ROLLBACK: structure is a #GdaSqlStatementTransaction
154  * @GDA_SQL_ANY_STMT_COMMIT: structure is a #GdaSqlStatementTransaction
155  * @GDA_SQL_ANY_STMT_SAVEPOINT: structure is a #GdaSqlStatementTransaction
156  * @GDA_SQL_ANY_STMT_ROLLBACK_SAVEPOINT: structure is a #GdaSqlStatementTransaction
157  * @GDA_SQL_ANY_STMT_DELETE_SAVEPOINT: structure is a #GdaSqlStatementTransaction
158  * @GDA_SQL_ANY_STMT_UNKNOWN: structure is a #GdaSqlStatementUnknown
159  * @GDA_SQL_ANY_EXPR: structure is a #GdaSqlExpr
160  * @GDA_SQL_ANY_SQL_FIELD: structure is a #GdaSqlField
161  * @GDA_SQL_ANY_SQL_TABLE: structure is a #GdaSqlTable
162  * @GDA_SQL_ANY_SQL_FUNCTION: structure is a #GdaSqlFunction
163  * @GDA_SQL_ANY_SQL_OPERATION: structure is a #GdaSqlOperation
164  * @GDA_SQL_ANY_SQL_CASE: structure is a #GdaSqlCase
165  * @GDA_SQL_ANY_SQL_SELECT_FIELD: structure is a #GdaSqlSelectField
166  * @GDA_SQL_ANY_SQL_SELECT_TARGET: structure is a #GdaSqlSelectTarget
167  * @GDA_SQL_ANY_SQL_SELECT_JOIN: structure is a #GdaSqlSelectJoin
168  * @GDA_SQL_ANY_SQL_SELECT_FROM: structure is a #GdaSqlSelectFrom
169  * @GDA_SQL_ANY_SQL_SELECT_ORDER: structure is a #GdaSqlSelectOrder
170  *
171  * Type of part.
172  */
173 typedef enum {
174 	/* complete statements */
175 	GDA_SQL_ANY_STMT_SELECT = GDA_SQL_STATEMENT_SELECT,
176 	GDA_SQL_ANY_STMT_INSERT = GDA_SQL_STATEMENT_INSERT,
177 	GDA_SQL_ANY_STMT_UPDATE = GDA_SQL_STATEMENT_UPDATE,
178 	GDA_SQL_ANY_STMT_DELETE = GDA_SQL_STATEMENT_DELETE,
179 	GDA_SQL_ANY_STMT_COMPOUND = GDA_SQL_STATEMENT_COMPOUND,
180 	GDA_SQL_ANY_STMT_BEGIN = GDA_SQL_STATEMENT_BEGIN,
181 	GDA_SQL_ANY_STMT_ROLLBACK = GDA_SQL_STATEMENT_ROLLBACK,
182 	GDA_SQL_ANY_STMT_COMMIT = GDA_SQL_STATEMENT_COMMIT,
183 	GDA_SQL_ANY_STMT_SAVEPOINT = GDA_SQL_STATEMENT_SAVEPOINT,
184 	GDA_SQL_ANY_STMT_ROLLBACK_SAVEPOINT = GDA_SQL_STATEMENT_ROLLBACK_SAVEPOINT,
185 	GDA_SQL_ANY_STMT_DELETE_SAVEPOINT = GDA_SQL_STATEMENT_DELETE_SAVEPOINT,
186 	GDA_SQL_ANY_STMT_UNKNOWN = GDA_SQL_STATEMENT_UNKNOWN,
187 
188 	/* individual parts */
189 	GDA_SQL_ANY_EXPR = 500,
190 	GDA_SQL_ANY_SQL_FIELD,
191 	GDA_SQL_ANY_SQL_TABLE,
192 	GDA_SQL_ANY_SQL_FUNCTION,
193 	GDA_SQL_ANY_SQL_OPERATION,
194 	GDA_SQL_ANY_SQL_CASE,
195 	GDA_SQL_ANY_SQL_SELECT_FIELD,
196 	GDA_SQL_ANY_SQL_SELECT_TARGET,
197 	GDA_SQL_ANY_SQL_SELECT_JOIN,
198 	GDA_SQL_ANY_SQL_SELECT_FROM,
199 	GDA_SQL_ANY_SQL_SELECT_ORDER
200 } GdaSqlAnyPartType;
201 
202 
203 /**
204  * GdaSqlAnyPart: (skip)
205  * @type: type of structure, as a #GdaSqlAnyPartType enum.
206  * @parent: pointer to the parent #GdaSqlAnyPart structure
207  *
208  * Base structure of which all structures (except #GdaSqlStatement) "inherit". It identifies, for each structure,
209  * its type and its parent in the structure hierarchy.
210  */
211 struct _GdaSqlAnyPart {
212 	GdaSqlAnyPartType  type;
213 	GdaSqlAnyPart     *parent;
214 };
215 
216 #define GDA_SQL_ANY_PART(x) ((GdaSqlAnyPart*)(x))
217 #define gda_sql_any_part_set_parent(a,p) \
218 	if (a) GDA_SQL_ANY_PART(a)->parent = GDA_SQL_ANY_PART(p)
219 
220 /*
221  * Iteration
222  */
223 
224 /* returns FALSE if a recursive walking should be stopped (mandatory is @error is set) */
225 /**
226  * GdaSqlForeachFunc: (skip)
227  * @part: the current #GdaSqlAnyPart node
228  * @data: user data passed to gda_sql_any_part_foreach().
229  * @error: pointer to a place to store errors
230  * @Returns: FALSE if the gda_sql_any_part_foreach() should stop at this point and fail
231  *
232  * Specifies the type of functions passed to gda_sql_any_part_foreach().
233  */
234 typedef gboolean (*GdaSqlForeachFunc) (GdaSqlAnyPart *part, gpointer data, GError **error);
235 
236 gboolean gda_sql_any_part_foreach (GdaSqlAnyPart *node, GdaSqlForeachFunc func, gpointer data, GError **error);
237 
238 /*
239  * Structure validation
240  */
241 gboolean gda_sql_any_part_check_structure (GdaSqlAnyPart *node, GError **error);
242 
243 /**
244  * GdaSqlStatementContentsInfo: (skip)
245  *
246  * Contents' infos
247  */
248 typedef struct {
249 	GdaSqlStatementType  type;
250 	gchar               *name;
251 	gpointer            (*construct) (void);
252 	void                (*free) (gpointer stm);
253 	gpointer            (*copy) (gpointer stm);
254 	gchar              *(*serialize) (gpointer stm);
255 
256 	/* augmenting information precision using a dictionary */
257 	GdaSqlForeachFunc     check_structure_func;
258 	GdaSqlForeachFunc     check_validity_func;
259 
260 	/*< private >*/
261 	/* Padding for future expansion */
262 	gpointer         _gda_reserved1;
263 	gpointer         _gda_reserved2;
264 	gpointer         _gda_reserved3;
265 	gpointer         _gda_reserved4;
266 } GdaSqlStatementContentsInfo;
267 
268 /**
269  * GdaSqlStatementCheckValidityData: (skip)
270  *
271  * Validation against a dictionary
272  */
273 typedef struct {
274 	GdaConnection *cnc;
275 	GdaMetaStore  *store;
276 	GdaMetaStruct *mstruct;
277 
278 	/*< private >*/
279 	/* Padding for future expansion */
280 	gpointer         _gda_reserved1;
281 	gpointer         _gda_reserved2;
282 	gpointer         _gda_reserved3;
283 	gpointer         _gda_reserved4;
284 } GdaSqlStatementCheckValidityData;
285 
286 G_END_DECLS
287 
288 #endif
289