src/midgard_connection.c

00001 /* 
00002  * Copyright (C) 2006 Piotr Pokora <piotr.pokora@infoglob.pl>
00003  *
00004  * This program is free software; you can redistribute it and/or modify it
00005  * under the terms of the GNU Lesser General Public License as published
00006  * by the Free Software Foundation; either version 2 of the License, or
00007  * (at your option) any later version.
00008  * 
00009  * This program is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  * GNU General Public License for more details.
00013  * 
00014  * You should have received a copy of the GNU General Public License
00015  * along with this program; if not, write to the Free Software
00016  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017  */
00018 
00019 #include "midgard/midgard_connection.h"
00020 #include "midgard/midgard_error.h"
00021 #include "schema.h"
00022 #include "midgard/midgard_legacy.h"
00023 
00024 struct _MidgardConnectionPrivate{
00025 
00026         MidgardConfig *config;
00027         guint loghandler;
00028         guint loglevel;
00029         const gchar *sitegroup;
00030         const gchar *lang;
00031         guint lang_id;
00032         MidgardSchema *schema;  
00033 }; 
00034 
00035 static void _midgard_connection_finalize(GObject *object)
00036 {
00037         g_assert(object != NULL);
00038         MidgardConnection *self = (MidgardConnection *) object;
00039 
00040         self->private->loghandler = 0;
00041         if(self->private->sitegroup)
00042                 g_free((gchar *) self->private->sitegroup);
00043         if(self->private->lang)
00044                 g_free((gchar *) self->private->lang);
00045         g_clear_error(&self->err);
00046         g_free(self->private);
00047 }
00048 
00049 static void _midgard_connection_class_init(
00050                 gpointer g_class, gpointer g_class_data)
00051 {
00052         GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
00053         MidgardConnectionClass *klass = MIDGARD_CONNECTION_CLASS (g_class);
00054 
00055         gobject_class->finalize = _midgard_connection_finalize;
00056         klass->open = midgard_connection_open;
00057         klass->open_config = midgard_connection_open_config;
00058         klass->close = midgard_connection_close;
00059         klass->set_sitegroup = midgard_connection_set_sitegroup;
00060         klass->get_sitegroup = midgard_connection_get_sitegroup;
00061         klass->set_lang = midgard_connection_set_lang; 
00062         klass->get_lang = midgard_connection_get_lang;
00063         klass->set_loglevel = midgard_connection_set_loglevel;
00064         klass->get_loglevel = midgard_connection_get_loglevel;
00065         klass->set_loghandler = midgard_connection_set_loghandler;
00066         klass->get_loghandler = midgard_connection_get_loghandler;
00067 }
00068 
00069 static void _midgard_connection_instance_init(
00070                 GTypeInstance *instance, gpointer g_class)
00071 {
00072         MidgardConnection *self = (MidgardConnection *) instance;
00073         self->private = g_new(MidgardConnectionPrivate, 1);
00074 
00075         self->private->config = NULL;
00076         self->private->loghandler = 0;
00077         self->private->loglevel = 0; 
00078         self->private->sitegroup = NULL;
00079         self->private->lang = NULL;
00080         self->private->lang_id = 0;
00081         self->err = NULL;
00082         self->errstr = NULL;
00083 }
00084 
00085 /* Registers the type as  a fundamental GType unless already registered. */
00086 GType midgard_connection_get_type(void)
00087 {
00088         static GType type = 0;
00089         if (type == 0) {
00090                 static const GTypeInfo info = {
00091                         sizeof (MidgardConnectionClass),
00092                         NULL,           /* base_init */
00093                         NULL,           /* base_finalize */
00094                         (GClassInitFunc) _midgard_connection_class_init,
00095                         NULL,           /* class_finalize */
00096                         NULL,           /* class_data */
00097                         sizeof (MidgardConnection),
00098                         0,              /* n_preallocs */
00099                         (GInstanceInitFunc) _midgard_connection_instance_init /* instance_init */
00100                 };
00101                 type = g_type_register_static (G_TYPE_OBJECT,
00102                                 "midgard_connection",
00103                                 &info, 0);
00104         }
00105         return type;
00106 }
00107 
00108 /* Creates new MidgardConnection object instance. */ 
00109 MidgardConnection *midgard_connection_new(void){
00110         
00111         MidgardConnection *self = 
00112                 g_object_new(MIDGARD_TYPE_CONNECTION, NULL);
00113         
00114         return self;
00115 }
00116 
00117 gboolean __midgard_connection_open(
00118                 MidgardConnection *mgd, MidgardConfig *config, GError *err)
00119 {
00120         gchar *host, *dbname, *dbuser, *dbpass, *schemafile, *loglevel;
00121         g_object_get(G_OBJECT(mgd->private->config),
00122                         "host", &host,
00123                         "database", &dbname,
00124                         "dbuser", &dbuser,
00125                         "dbpass", &dbpass,
00126                         "schema", &schemafile,
00127                         "loglevel", &loglevel,
00128                         NULL);
00129         
00130         /* FIXME when we switch to libgda usage */
00131         midgard *legacy_mgd = mgd_connect(
00132                         host,
00133                         dbname,
00134                         dbuser,
00135                         dbpass);
00136 
00137         if(!legacy_mgd) {
00138                 midgard_set_error(mgd,
00139                                 MGD_GENERIC_ERROR,
00140                                 MGD_ERR_NOT_CONNECTED,
00141                                 "Database %s@%s.", dbname, host);
00142                 g_warning("%s", err->message);
00143                 g_clear_error(&err); 
00144                 return FALSE;
00145         }
00146 
00147         MidgardSchema *schema = g_object_new(MIDGARD_TYPE_SCHEMA, NULL);
00148         midgard_schema_init(schema);
00149         midgard_schema_read_dir(schema, MIDGARD_LSCHEMA_DIR);
00150 
00151         mgd->private->schema = schema;
00152         midgard_connection_set_loglevel(mgd, loglevel);
00153                 
00154         /* Set legacy midgard connection handler's data*/
00155         gchar *mgduser = NULL, *mgdpass = NULL, *blobdir;
00156         g_object_get(mgd->private->config,
00157                         "midgardusername", &mgduser,
00158                         "midgardpassword", &mgdpass,
00159                         "blobdir", &blobdir,
00160                         NULL);
00161 
00162         legacy_mgd->blobdir = blobdir;
00163         legacy_mgd->loglevel = midgard_connection_get_loglevel(mgd);
00164         mgd->mgd = legacy_mgd;
00165         legacy_mgd->_mgd = mgd;
00166         
00167         /* This is commented:
00168          1. I am not sure if this is application specific
00169                 -  requires special config object  management
00170                 ( like check for root id when getting some secret data )
00171          2. Core's loghandler should be initialized before to avoid 
00172          unconditional debug logs before we switch to application's log handler
00173          and log function
00174         */ 
00175         /* if((mgduser != NULL) && (mgdpass != NULL))
00176                 mgd_auth(legacy_mgd, mgduser, mgdpass, 1);
00177         */
00178         g_free(host);
00179         g_free(dbname);
00180         g_free(dbuser);
00181         g_free(dbpass);
00182         g_free(schemafile);
00183         g_free(loglevel);
00184         g_free(mgduser);
00185         g_free(mgdpass);
00186         g_free(blobdir);
00187         
00188         return TRUE;
00189 }
00190 
00191 /* Opens a connection to the named Midgard database. */
00192 gboolean midgard_connection_open(
00193                 MidgardConnection *mgd, const char *name, GError *err)
00194 {       
00195         g_assert(mgd != NULL);
00196         g_assert (name != NULL);
00197         g_assert(err == NULL);
00198         
00199         if(mgd->private->config != NULL){
00200                 midgard_set_error(mgd,
00201                                 MGD_GENERIC_ERROR,
00202                                 MGD_ERR_USER_DATA,
00203                                 "MidgardConfig already associated with "
00204                                 "MidgardConnection");
00205                 g_warning("%s", err->message);
00206                 return FALSE;
00207         }
00208         
00209         MidgardConfig *config = midgard_config_new();
00210         if(!midgard_config_read_file(config, name))
00211                 return FALSE;
00212         
00213         mgd->private->config = config;
00214 
00215         if(!__midgard_connection_open(mgd, config, err))
00216                 return FALSE;
00217 
00218         return TRUE;    
00219 }
00220 
00221 /* Opens a Midgard connection with the given configuration. */
00222 gboolean midgard_connection_open_config(
00223                 MidgardConnection *mgd, MidgardConfig *config, GError *err)
00224 {
00225         g_assert(mgd != NULL);  
00226         g_assert(config != NULL);
00227         g_assert(err == NULL);
00228 
00229         mgd->private->config = config;
00230         
00231         if(!__midgard_connection_open(mgd, config, err))
00232                 return FALSE;
00233         
00234         return TRUE;
00235 }
00236 
00237 /* Closes database connection. */ 
00238 void midgard_connection_close(MidgardConnection *mgd)
00239 {
00240         g_assert(mgd != NULL);
00241         
00242         if(mgd->mgd)
00243                 mgd_close(mgd->mgd);
00244 
00245         g_object_unref(G_OBJECT(mgd));
00246         
00247         return;
00248 }
00249 
00250 /* Sets sitegroup's value for the given MidgardConnection. */ 
00251 gboolean midgard_connection_set_sitegroup(
00252                 MidgardConnection *mgd, const gchar *guid)
00253 {
00254         g_assert(mgd != NULL);
00255         g_assert(guid != NULL);
00256 
00257         if((mgd->private->sitegroup = (const gchar *)g_strdup(guid)))
00258                 return TRUE;
00259         
00260         return FALSE;
00261 }
00262 
00263 /* Return the sitegroup of the given MidgardConnection. */ 
00264 const gchar *midgard_connection_get_sitegroup(
00265                 MidgardConnection *mgd)
00266 {
00267         g_assert(mgd != NULL);
00268         g_assert(mgd->private->sitegroup != NULL);
00269 
00270         return mgd->private->sitegroup;
00271 }
00272 
00273 /* Sets the language of the given Midgard connection. */
00274 gboolean midgard_connection_set_lang(
00275                 MidgardConnection *mgd, const char *language)
00276 {
00277         g_assert(mgd != NULL);
00278         g_assert(language != NULL);
00279 
00280         if((mgd->private->lang = (const gchar *)g_strdup(language)))
00281                 return TRUE;
00282         
00283         return FALSE;
00284 }
00285 
00286 /* Returns language of the given MidgardConnection. */
00287 const gchar *midgard_connection_get_lang(MidgardConnection *mgd)
00288 {
00289         g_assert(mgd != NULL);
00290         
00291         return mgd->private->lang;
00292 }
00293 
00294 /* Sets log level of the given MidgardConnection. */
00295 void midgard_connection_set_loglevel(
00296                 MidgardConnection *mgd, const gchar *levelstring)
00297 {
00298         g_assert(mgd != NULL);
00299 
00300         guint level = 0, mask = 0;
00301         guint len = strlen(levelstring);
00302         gchar *newlevel = g_ascii_strdown(levelstring, len);
00303 
00304         if(g_str_equal(newlevel, "error")) 
00305                 level = G_LOG_LEVEL_ERROR;
00306         if(g_str_equal(newlevel, "critical"))
00307                 level = G_LOG_LEVEL_CRITICAL;
00308         if(g_str_equal(newlevel, "warn"))
00309                 level = G_LOG_LEVEL_WARNING;
00310         if(g_str_equal(newlevel, "message"))    
00311                 level = G_LOG_LEVEL_MESSAGE;
00312         if(g_str_equal(newlevel, "info"))
00313                 level = G_LOG_LEVEL_INFO;
00314         if(g_str_equal(newlevel, "debug"))
00315                 level = G_LOG_LEVEL_DEBUG;
00316 
00317         g_free(newlevel);
00318         
00319         switch(level){
00320 
00321                 case G_LOG_LEVEL_ERROR:
00322                 case G_LOG_LEVEL_CRITICAL:
00323                 case G_LOG_LEVEL_WARNING:
00324                 case G_LOG_LEVEL_MESSAGE:
00325                 case G_LOG_LEVEL_INFO:
00326                 case G_LOG_LEVEL_DEBUG:
00327                         for (; level && level > G_LOG_FLAG_FATAL; level >>= 1) {
00328                                 mask |= level;
00329                         }
00330                         mgd->private->loglevel = mask;
00331                         break;
00332 
00333                 default:
00334                         midgard_set_error(mgd,
00335                                         MGD_GENERIC_ERROR,
00336                                         MGD_ERR_INTERNAL,
00337                                         "Unknown log level.");
00338                         g_error("%s", mgd->err->message);
00339         }
00340         return;
00341 }
00342 
00343 /* Get loglevel's value. */
00344 guint midgard_connection_get_loglevel(MidgardConnection *mgd)
00345 {
00346         g_assert(mgd != NULL);
00347 
00348         return mgd->private->loglevel;
00349 }
00350 
00351 /* Sets loghandler of the given MidgardConnection. */
00352 void midgard_connection_set_loghandler(
00353                 MidgardConnection *mgd, guint loghandler){
00354 
00355         g_assert(mgd != NULL);
00356 
00357         if(mgd->private->loghandler == 0) 
00358                 mgd->private->loghandler = loghandler;
00359 
00360         return;
00361 }
00362 
00363 /* Get loghandler associated with MidgardConnection. */
00364 guint midgard_connection_get_loghandler(MidgardConnection *mgd)
00365 {
00366         g_assert(mgd != NULL);
00367         
00368         return mgd->private->loghandler;
00369 }

Generated on Thu Feb 22 06:15:17 2007 for midgard-core by  doxygen 1.4.6