1 /* 2 * Copyright (C) 2009 - 2011 Vivien Malerba <malerba@gnome-db.org> 3 * Copyright (C) 2010 David King <davidk@openismus.com> 4 * Copyright (C) 2011 Murray Cumming <murrayc@murrayc.com> 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 #include <string.h> 23 #include <glib/gi18n-lib.h> 24 #include "gda-web-pstmt.h" 25 #include "gda-web-util.h" 26 27 static void gda_web_pstmt_class_init (GdaWebPStmtClass *klass); 28 static void gda_web_pstmt_init (GdaWebPStmt *pstmt, GdaWebPStmtClass *klass); 29 static void gda_web_pstmt_finalize (GObject *object); 30 31 static GObjectClass *parent_class = NULL; 32 33 /** 34 * gda_web_pstmt_get_type 35 * 36 * Returns: the #GType of GdaWebPStmt. 37 */ 38 GType 39 gda_web_pstmt_get_type (void) 40 { 41 static GType type = 0; 42 43 if (G_UNLIKELY (type == 0)) { 44 static GMutex registering; 45 static const GTypeInfo info = { 46 sizeof (GdaWebPStmtClass), 47 (GBaseInitFunc) NULL, 48 (GBaseFinalizeFunc) NULL, 49 (GClassInitFunc) gda_web_pstmt_class_init, 50 NULL, 51 NULL, 52 sizeof (GdaWebPStmt), 53 0, 54 (GInstanceInitFunc) gda_web_pstmt_init, 55 0 56 }; 57 58 g_mutex_lock (®istering); 59 if (type == 0) 60 type = g_type_register_static (GDA_TYPE_PSTMT, "GdaWebPStmt", &info, 0); 61 g_mutex_unlock (®istering); 62 } 63 return type; 64 } 65 66 static void 67 gda_web_pstmt_class_init (GdaWebPStmtClass *klass) 68 { 69 GObjectClass *object_class = G_OBJECT_CLASS (klass); 70 parent_class = g_type_class_peek_parent (klass); 71 72 /* virtual functions */ 73 object_class->finalize = gda_web_pstmt_finalize; 74 } 75 76 static void 77 gda_web_pstmt_init (GdaWebPStmt *pstmt, G_GNUC_UNUSED GdaWebPStmtClass *klass) 78 { 79 g_return_if_fail (GDA_IS_PSTMT (pstmt)); 80 81 pstmt->pstmt_hash = NULL; 82 } 83 84 static void 85 gda_web_pstmt_finalize (GObject *object) 86 { 87 GdaWebPStmt *pstmt = (GdaWebPStmt *) object; 88 89 g_return_if_fail (GDA_IS_PSTMT (pstmt)); 90 91 if (pstmt->pstmt_hash) { 92 WebConnectionData *cdata; 93 cdata = (WebConnectionData*) gda_connection_internal_get_provider_data (pstmt->cnc); 94 if (!cdata) 95 goto next; 96 97 /* send command to deallocate prepared statement */ 98 xmlDocPtr doc; 99 xmlNodePtr root, cmdnode; 100 gchar *token; 101 doc = xmlNewDoc (BAD_CAST "1.0"); 102 root = xmlNewNode (NULL, BAD_CAST "request"); 103 xmlDocSetRootElement (doc, root); 104 token = _gda_web_compute_token (cdata); 105 xmlNewChild (root, NULL, BAD_CAST "token", BAD_CAST token); 106 g_free (token); 107 cmdnode = xmlNewChild (root, NULL, BAD_CAST "cmd", BAD_CAST "UNPREPARE"); 108 xmlNewChild (cmdnode, NULL, BAD_CAST "preparehash", BAD_CAST pstmt->pstmt_hash); 109 110 xmlChar *cmde; 111 xmlDocPtr replydoc; 112 int size; 113 gchar status; 114 115 xmlDocDumpMemory (doc, &cmde, &size); 116 xmlFreeDoc (doc); 117 replydoc = _gda_web_send_message_to_frontend (pstmt->cnc, cdata, MESSAGE_UNPREPARE, (gchar*) cmde, 118 cdata->key, &status); 119 xmlFree (cmde); 120 if (replydoc) 121 xmlFreeDoc (replydoc); 122 123 next: 124 /* free memory */ 125 g_free (pstmt->pstmt_hash); 126 } 127 128 /* chain to parent class */ 129 parent_class->finalize (object); 130 } 131 132 GdaWebPStmt * 133 gda_web_pstmt_new (GdaConnection *cnc, const gchar *pstmt_hash) 134 { 135 GdaWebPStmt *pstmt; 136 g_return_val_if_fail (pstmt_hash && *pstmt_hash, NULL); 137 138 pstmt = (GdaWebPStmt *) g_object_new (GDA_TYPE_WEB_PSTMT, NULL); 139 pstmt->cnc = cnc; 140 pstmt->pstmt_hash = g_strdup (pstmt_hash); 141 142 return pstmt; 143 } 144