1 /*
2  * Copyright (C) 2008 - 2011 Vivien Malerba <malerba@gnome-db.org>
3  * Copyright (C) 2009 Bas Driessen <bas.driessen@xobas.com>
4  * Copyright (C) 2010 David King <davidk@openismus.com>
5  * Copyright (C) 2010 Murray Cumming <murrayc@murrayc.com>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20  * Boston, MA  02110-1301, USA.
21  */
22 
23 #include <string.h>
24 #include <libgda/sql-parser/gda-statement-struct.h>
25 #include <libgda/sql-parser/gda-statement-struct-unknown.h>
26 #include <libgda/sql-parser/gda-statement-struct-parts.h>
27 
28 static gpointer  gda_sql_statement_unknown_new (void);
29 static void      gda_sql_statement_unknown_free (gpointer stmt);
30 static gpointer  gda_sql_statement_unknown_copy (gpointer src);
31 static gchar    *gda_sql_statement_unknown_serialize (gpointer stmt);
32 
33 GdaSqlStatementContentsInfo unknown_infos = {
34 	GDA_SQL_STATEMENT_UNKNOWN,
35 	"UNKNOWN",
36 	gda_sql_statement_unknown_new,
37 	gda_sql_statement_unknown_free,
38 	gda_sql_statement_unknown_copy,
39 	gda_sql_statement_unknown_serialize,
40 	NULL,
41 	NULL,
42 	NULL,
43 	NULL,
44 	NULL,
45 	NULL
46 };
47 
48 GdaSqlStatementContentsInfo *
_gda_sql_statement_unknown_get_infos(void)49 _gda_sql_statement_unknown_get_infos (void)
50 {
51 	return &unknown_infos;
52 }
53 
54 static gpointer
gda_sql_statement_unknown_new(void)55 gda_sql_statement_unknown_new (void)
56 {
57 	GdaSqlStatementUnknown *stmt;
58 	stmt = g_new0 (GdaSqlStatementUnknown, 1);
59 	GDA_SQL_ANY_PART (stmt)->type = GDA_SQL_ANY_STMT_UNKNOWN;
60 	return (gpointer) stmt;
61 }
62 
63 static void
gda_sql_statement_unknown_free(gpointer stmt)64 gda_sql_statement_unknown_free (gpointer stmt)
65 {
66 	GdaSqlStatementUnknown *unknown = (GdaSqlStatementUnknown *) stmt;
67 	g_slist_foreach (unknown->expressions, (GFunc) gda_sql_expr_free, NULL);
68 	g_slist_free (unknown->expressions);
69 	g_free (unknown);
70 }
71 
72 static gpointer
gda_sql_statement_unknown_copy(gpointer src)73 gda_sql_statement_unknown_copy (gpointer src)
74 {
75 	GdaSqlStatementUnknown *dest;
76 	GSList *list;
77 	GdaSqlStatementUnknown *unknown = (GdaSqlStatementUnknown *) src;
78 
79 	dest = gda_sql_statement_unknown_new ();
80 	for (list = unknown->expressions; list; list = list->next) {
81 		dest->expressions = g_slist_prepend (dest->expressions,
82 						     gda_sql_expr_copy ((GdaSqlExpr*) list->data));
83 		gda_sql_any_part_set_parent (dest->expressions->data, dest);
84 	}
85 	dest->expressions = g_slist_reverse (dest->expressions);
86 	return dest;
87 }
88 
89 static gchar *
gda_sql_statement_unknown_serialize(gpointer stmt)90 gda_sql_statement_unknown_serialize (gpointer stmt)
91 {
92 	GString *string;
93 	gchar *str;
94 	GSList *list;
95 	GdaSqlStatementUnknown *unknown = (GdaSqlStatementUnknown *) stmt;
96 
97 	g_return_val_if_fail (stmt, NULL);
98 
99 	string = g_string_new ("\"contents\":[");
100 	for (list = unknown->expressions; list; list = list->next) {
101 		gchar *str;
102 		str = gda_sql_expr_serialize ((GdaSqlExpr*) list->data);
103 		if (list != unknown->expressions)
104 			g_string_append_c (string, ',');
105 		g_string_append (string, str);
106 		g_free (str);
107 	}
108 	g_string_append_c (string, ']');
109 	str = string->str;
110 	g_string_free (string, FALSE);
111 	return str;
112 }
113 
114 /**
115  * gda_sql_statement_unknown_take_expressions
116  * @stmt: a #GdaSqlStatement pointer
117  * @expressions: a list of #GdaSqlExpr pointers
118  *
119  * Sets @stmt's list of expressions
120  *
121  * @expressions's
122  * ownership is transferred to
123  * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
124  */
125 void
gda_sql_statement_unknown_take_expressions(GdaSqlStatement * stmt,GSList * expressions)126 gda_sql_statement_unknown_take_expressions (GdaSqlStatement *stmt, GSList *expressions)
127 {
128 	GSList *l;
129 	GdaSqlStatementUnknown *unknown = (GdaSqlStatementUnknown *) stmt->contents;
130 	unknown->expressions = expressions;
131 
132 	for (l = expressions; l; l = l->next)
133 		gda_sql_any_part_set_parent (l->data, unknown);
134 }
135