00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
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,
00093 NULL,
00094 (GClassInitFunc) _midgard_connection_class_init,
00095 NULL,
00096 NULL,
00097 sizeof (MidgardConnection),
00098 0,
00099 (GInstanceInitFunc) _midgard_connection_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
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
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
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
00168
00169
00170
00171
00172
00173
00174
00175
00176
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
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
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
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
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
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
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
00287 const gchar *midgard_connection_get_lang(MidgardConnection *mgd)
00288 {
00289 g_assert(mgd != NULL);
00290
00291 return mgd->private->lang;
00292 }
00293
00294
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
00344 guint midgard_connection_get_loglevel(MidgardConnection *mgd)
00345 {
00346 g_assert(mgd != NULL);
00347
00348 return mgd->private->loglevel;
00349 }
00350
00351
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
00364 guint midgard_connection_get_loghandler(MidgardConnection *mgd)
00365 {
00366 g_assert(mgd != NULL);
00367
00368 return mgd->private->loghandler;
00369 }