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 **/
_gda_sql_statement_compound_get_infos(void)50 typedef GdaSqlError GdaSqlErrorType;
51
52 /*
53 * Struct declarations
54 */
55 /*
gda_sql_statement_compound_new(void)56 * GdaSqlAnyPart: (skip)
57 *
58 **/
59 typedef struct _GdaSqlAnyPart GdaSqlAnyPart;
60 /*
61 * GdaSqlStatement: (skip)
62 *
63 **/
64 typedef struct _GdaSqlStatement GdaSqlStatement;
65 /*
_gda_sql_statement_compound_free(gpointer stmt)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 *
_gda_sql_statement_compound_copy(gpointer src)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 *
_gda_sql_statement_compound_serialize(gpointer stmt)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
gda_sql_statement_compound_take_stmt(GdaSqlStatement * stmt,GdaSqlStatement * s)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 */
gda_sql_statement_compound_set_type(GdaSqlStatement * stmt,GdaSqlStatementCompoundType type)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;
gda_sql_statement_compound_check_structure(GdaSqlAnyPart * stmt,G_GNUC_UNUSED gpointer data,GError ** error)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