diff -r 28c358053693 -r 8aa32fa19a8f branches/gmyth-0.1b/src/gmyth_query.c --- a/branches/gmyth-0.1b/src/gmyth_query.c Wed Feb 14 23:06:17 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,239 +0,0 @@ -/** - * GMyth Library - * - * @file gmyth/gmyth_query.c - * - * @brief

GMythQuery class provides a wrapper for accessing - * the libmysqlclient funtions. - * - * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia. - * @author Leonardo Sobral Cunha - * - *//* - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include - -#include "gmyth_query.h" -#include "gmyth_debug.h" - -static void gmyth_query_class_init (GMythQueryClass *klass); -static void gmyth_query_init (GMythQuery *object); - -static void gmyth_query_dispose (GObject *object); -static void gmyth_query_finalize (GObject *object); - -static void gmyth_query_print_error (MYSQL *conn, char *message); - -G_DEFINE_TYPE(GMythQuery, gmyth_query, G_TYPE_OBJECT) - -static void -gmyth_query_class_init (GMythQueryClass *klass) -{ - GObjectClass *gobject_class; - - gobject_class = (GObjectClass *) klass; - - gobject_class->dispose = gmyth_query_dispose; - gobject_class->finalize = gmyth_query_finalize; -} - -static void -gmyth_query_init (GMythQuery *gmyth_query) -{ - gmyth_query->backend_info = NULL; - - /* initialize connection handler */ - gmyth_query->conn = mysql_init (NULL); - - - if (!(gmyth_query->conn)) - g_warning ("[%s] MSQL structure not initialized", __FUNCTION__); - -} - -static void -gmyth_query_dispose (GObject *object) -{ - GMythQuery *gmyth_query = GMYTH_QUERY (object); - - if (gmyth_query->backend_info) { - g_object_unref (gmyth_query->backend_info); - //gmyth_query->backend_info = NULL; - } - - G_OBJECT_CLASS (gmyth_query_parent_class)->dispose (object); -} - -static void -gmyth_query_finalize (GObject *object) -{ - g_signal_handlers_destroy (object); - - G_OBJECT_CLASS (gmyth_query_parent_class)->finalize (object); -} - -/** Creates a new instance of GMythQuery. - * - * @return a new instance of GMythQuery. - */ -GMythQuery* -gmyth_query_new () -{ - GMythQuery *sql_query = GMYTH_QUERY (g_object_new(GMYTH_QUERY_TYPE, NULL)); - - return sql_query; -} - -gboolean -gmyth_query_connect_with_timeout (GMythQuery *gmyth_query, - GMythBackendInfo *backend_info, guint timeout) -{ - assert(gmyth_query); - g_return_val_if_fail (gmyth_query->conn != NULL, FALSE); - if (timeout != 0) { - /* sets connection timeout */ - mysql_options (gmyth_query->conn, MYSQL_OPT_CONNECT_TIMEOUT, (gchar*) &timeout); - } - - return gmyth_query_connect (gmyth_query, backend_info); -} - -/** Connects to the Mysql database in the backend. The backend address - * is loaded from the GMythBackendInfo instance. - * - * @param gmyth_query the GMythEPG instance to be connected. - * @return true if connection was success, false if failed. - */ -gboolean -gmyth_query_connect (GMythQuery *gmyth_query, GMythBackendInfo *backend_info) -{ - assert(gmyth_query); - g_return_val_if_fail (backend_info != NULL, FALSE); - g_return_val_if_fail (backend_info->hostname != NULL, FALSE); - g_return_val_if_fail (backend_info->username != NULL, FALSE); - g_return_val_if_fail (backend_info->password != NULL, FALSE); - g_return_val_if_fail (backend_info->db_name != NULL, FALSE); - - g_object_ref (backend_info); - gmyth_query->backend_info = backend_info; - - if (gmyth_query->conn == NULL) { - gmyth_query_print_error (NULL, "mysql_init() failed (probably out of memory)"); - return FALSE; - } - - /* connect to server */ - if (mysql_real_connect (gmyth_query->conn, - gmyth_query->backend_info->hostname, - gmyth_query->backend_info->username, - gmyth_query->backend_info->password, - gmyth_query->backend_info->db_name, - 0, NULL, 0) == NULL) { - - gmyth_query_print_error (gmyth_query->conn, "mysql_real_connect() failed"); - return FALSE; - } - - g_debug ("[%s] Connection to Mysql server succeeded! (host = %s, user = %s, "\ - "password = %s, db name = %s)", __FUNCTION__, - gmyth_query->backend_info->hostname, gmyth_query->backend_info->username, - gmyth_query->backend_info->password, gmyth_query->backend_info->db_name ); - - return TRUE; -} - -/** Disconnects from the Mysql database in the backend. - * - * @param gmyth_query the GMythQuery instance to be disconnected - * @return true if disconnection was success, false if failed. - */ -gboolean -gmyth_query_disconnect (GMythQuery *gmyth_query) -{ - assert(gmyth_query); - - /* TODO: Check how to return error */ - g_debug ("[%s] Closing gmyth_query->conn", __FUNCTION__); - mysql_close (gmyth_query->conn); - - return TRUE; -} - -static void -gmyth_query_print_error (MYSQL *conn, char *message) -{ - g_debug ("%s", message); - - if (conn != NULL) { -#if MYSQL_VERSION_ID >= 40101 - g_debug ("Error %u (%s): %s\n", - mysql_errno (conn), mysql_sqlstate(conn), mysql_error (conn)); -#else - g_debug ("Error %u: %s\n", - mysql_errno (conn), mysql_error (conn)); -#endif - } -} - -/** Sends the given query to the backend returning the query result as - * MYSQL_RES pointer. - * - * FIXME: this function is returning NULL whether any error happens - * or no rows are returned (e.g. UPDATE or REPLACE). - * - * @param gmyth_query the GMythQuery instance. - * @param stmt_str the query text. - * @return the MYSQL_RES result pointer or NULL if any error happens. - */ -MYSQL_RES* -gmyth_query_process_statement (GMythQuery *gmyth_query, char *stmt_str) -{ - MYSQL_RES *res_set; - - assert(gmyth_query); - - g_debug ("[%s] Running mysql query %s", __FUNCTION__, stmt_str); - - if (gmyth_query == NULL) - return NULL; - - /* the statement failed */ - if (mysql_query (gmyth_query->conn, stmt_str) != 0) { - gmyth_query_print_error (gmyth_query->conn, "Could not execute statement"); - return NULL; - } - - /* the statement succeeded; determine whether it returned data */ - res_set = mysql_store_result (gmyth_query->conn); - if (res_set) { - return res_set; - } else if (mysql_field_count (gmyth_query->conn) == 0) { - g_debug ("%lu rows affected\n", - (unsigned long) mysql_affected_rows (gmyth_query->conn)); - } else { - gmyth_query_print_error (gmyth_query->conn, "Could not retrieve result set"); - } - - return NULL; -}