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