1 /*
2 * Copyright (C) 2008 - 2010 Murray Cumming <murrayc@murrayc.com>
3 * Copyright (C) 2008 - 2011 Vivien Malerba <malerba@gnome-db.org>
4 * Copyright (C) 2009 Bas Driessen <bas.driessen@xobas.com>
5 * Copyright (C) 2010 David King <davidk@openismus.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 <libgda/gda-debug-macros.h>
24 #include <libgda/sql-parser/gda-statement-struct.h>
25 #include <libgda/sql-parser/gda-statement-struct-delete.h>
26 #include <libgda/sql-parser/gda-statement-struct-util.h>
27 #include <libgda/sql-parser/gda-statement-struct-pspec.h>
28 #include <string.h>
29 #include <glib/gi18n-lib.h>
30
31 static gpointer gda_sql_statement_delete_new (void);
32 static void gda_sql_statement_delete_free (gpointer stmt);
33 static gpointer gda_sql_statement_delete_copy (gpointer src);
34 static gchar *gda_sql_statement_delete_serialize (gpointer stmt);
35 static gboolean gda_sql_statement_delete_check_structure (GdaSqlAnyPart *stmt, gpointer data, GError **error);
36
37 GdaSqlStatementContentsInfo delete_infos = {
38 GDA_SQL_STATEMENT_DELETE,
39 "DELETE",
40 gda_sql_statement_delete_new,
41 gda_sql_statement_delete_free,
42 gda_sql_statement_delete_copy,
43 gda_sql_statement_delete_serialize,
44
45 gda_sql_statement_delete_check_structure,
46 NULL,
47 NULL,
48 NULL,
49 NULL,
50 NULL
51 };
52
53 GdaSqlStatementContentsInfo *
_gda_sql_statement_delete_get_infos(void)54 _gda_sql_statement_delete_get_infos (void)
55 {
56 return &delete_infos;
57 }
58
59 static gpointer
gda_sql_statement_delete_new(void)60 gda_sql_statement_delete_new (void)
61 {
62 GdaSqlStatementDelete *stmt;
63 stmt = g_new0 (GdaSqlStatementDelete, 1);
64 GDA_SQL_ANY_PART (stmt)->type = GDA_SQL_ANY_STMT_DELETE;
65 return (gpointer) stmt;
66 }
67
68 static void
gda_sql_statement_delete_free(gpointer stmt)69 gda_sql_statement_delete_free (gpointer stmt)
70 {
71 GdaSqlStatementDelete *delete = (GdaSqlStatementDelete *) stmt;
72
73 if (delete->table)
74 gda_sql_table_free (delete->table);
75 if (delete->cond)
76 gda_sql_expr_free (delete->cond);
77 g_free (delete);
78 }
79
80 static gpointer
gda_sql_statement_delete_copy(gpointer src)81 gda_sql_statement_delete_copy (gpointer src)
82 {
83 GdaSqlStatementDelete *dest;
84 GdaSqlStatementDelete *delete = (GdaSqlStatementDelete *) src;
85
86 dest = gda_sql_statement_delete_new ();
87
88 dest->table = gda_sql_table_copy (delete->table);
89 gda_sql_any_part_set_parent (dest->table, dest);
90
91 dest->cond = gda_sql_expr_copy (delete->cond);
92 gda_sql_any_part_set_parent (dest->cond, dest);
93
94 return dest;
95 }
96
97 static gchar *
gda_sql_statement_delete_serialize(gpointer stmt)98 gda_sql_statement_delete_serialize (gpointer stmt)
99 {
100 GString *string;
101 gchar *str;
102 GdaSqlStatementDelete *delete = (GdaSqlStatementDelete *) stmt;
103
104 g_return_val_if_fail (stmt, NULL);
105
106 string = g_string_new ("\"contents\":{");
107
108 /* table name */
109 g_string_append (string, "\"table\":");
110 str = gda_sql_table_serialize (delete->table);
111 g_string_append (string, str);
112 g_free (str);
113
114 /* condition */
115 if (delete->cond) {
116 g_string_append (string, ",\"condition\":");
117 str = gda_sql_expr_serialize (delete->cond);
118 g_string_append (string, str);
119 g_free (str);
120 }
121 g_string_append_c (string, '}');
122 str = string->str;
123 g_string_free (string, FALSE);
124 return str;
125 }
126
127 /**
128 * gda_sql_statement_delete_take_table_name
129 * @stmt: a #GdaSqlStatement pointer
130 * @value: a table name as a G_TYPE_STRING #GValue
131 *
132 * Sets the name of the table to delete from in @stmt. @value's ownership is transferred to
133 * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
134 */
135 void
gda_sql_statement_delete_take_table_name(GdaSqlStatement * stmt,GValue * value)136 gda_sql_statement_delete_take_table_name (GdaSqlStatement *stmt, GValue *value)
137 {
138 GdaSqlStatementDelete *delete = (GdaSqlStatementDelete *) stmt->contents;
139 if (value) {
140 delete->table = gda_sql_table_new (GDA_SQL_ANY_PART (stmt));
141 gda_sql_table_take_name (delete->table, value);
142 }
143 }
144
145 /**
146 * gda_sql_statement_delete_take_condition
147 * @stmt: a #GdaSqlStatement pointer
148 * @cond: the WHERE condition of the DELETE statement, as a #GdaSqlExpr
149 *
150 * Sets the WHERE condition of @stmt. @cond's ownership is transferred to
151 * @stmt (which means @stmt is then responsible for freeing it when no longer needed).
152 */
153 void
gda_sql_statement_delete_take_condition(GdaSqlStatement * stmt,GdaSqlExpr * cond)154 gda_sql_statement_delete_take_condition (GdaSqlStatement *stmt, GdaSqlExpr *cond)
155 {
156 GdaSqlStatementDelete *delete = (GdaSqlStatementDelete *) stmt->contents;
157 delete->cond = cond;
158 gda_sql_any_part_set_parent (delete->cond, delete);
159 }
160
161 static gboolean
gda_sql_statement_delete_check_structure(GdaSqlAnyPart * stmt,G_GNUC_UNUSED gpointer data,GError ** error)162 gda_sql_statement_delete_check_structure (GdaSqlAnyPart *stmt, G_GNUC_UNUSED gpointer data, GError **error)
163 {
164 GdaSqlStatementDelete *delete = (GdaSqlStatementDelete *) stmt;
165 if (!delete->table) {
166 g_set_error (error, GDA_SQL_ERROR, GDA_SQL_STRUCTURE_CONTENTS_ERROR,
167 "%s", _("DELETE statement needs a table to delete from"));
168 return FALSE;
169 }
170
171 return TRUE;
172 }
173