src/types_metadata.c

00001 /* 
00002  * Copyright (C) 2005 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 <config.h>
00020 #include <stdlib.h>
00021 #include "midgard/midgard_metadata.h"
00022 #include "midgard/midgard_timestamp.h"
00023 #include "midgard/query.h"
00024 #include "midgard/midgard_object.h"
00025 #include "midgard_core_object.h"
00026 #include "schema.h"
00027 
00028 enum {
00029     MIDGARD_METADATA_CREATOR = 1,
00030     MIDGARD_METADATA_CREATED,
00031     MIDGARD_METADATA_REVISOR,
00032     MIDGARD_METADATA_REVISED,
00033     MIDGARD_METADATA_REVISION,
00034     MIDGARD_METADATA_LOCKER,
00035     MIDGARD_METADATA_LOCKED,
00036     MIDGARD_METADATA_APPROVER,
00037     MIDGARD_METADATA_APPROVED,
00038     MIDGARD_METADATA_AUTHORS,
00039     MIDGARD_METADATA_OWNER,
00040     MIDGARD_METADATA_SCHEDULE_START,
00041     MIDGARD_METADATA_SCHEDULE_END,
00042     MIDGARD_METADATA_HIDDEN,
00043     MIDGARD_METADATA_NAV_NOENTRY,
00044     MIDGARD_METADATA_SIZE,
00045     MIDGARD_METADATA_PUBLISHED,
00046     MIDGARD_METADATA_SCORE,
00047     MIDGARD_METADATA_IMPORTED,
00048     MIDGARD_METADATA_EXPORTED,
00049     MIDGARD_METADATA_DELETED
00050 };
00051 
00052 static void
00053 _metadata_set_property (GObject *object, guint property_id,
00054         const GValue *value, GParamSpec *pspec)
00055 {
00056         MidgardMetadata *self = (MidgardMetadata *) object;
00057         
00058         switch (property_id) {
00059                 
00060                 case MIDGARD_METADATA_CREATOR:
00061                         g_free (self->private->creator);
00062                         self->private->creator = g_value_dup_string (value);
00063                         break;
00064                         
00065                 case MIDGARD_METADATA_CREATED:
00066                         g_free (self->private->created);
00067                         self->private->created = g_value_dup_string (value);
00068                         break;
00069                         
00070                 case MIDGARD_METADATA_REVISOR:      
00071                         g_free (self->private->revisor);
00072                         self->private->revisor = g_value_dup_string (value);
00073                         break;
00074                         
00075                 case MIDGARD_METADATA_REVISED:
00076                         g_free (self->private->revised);
00077                         self->private->revised = g_value_dup_string (value);
00078                         break;
00079                         
00080                 case MIDGARD_METADATA_REVISION:
00081                         self->private->revision = g_value_get_uint (value);
00082                         break;
00083                         
00084                 case MIDGARD_METADATA_LOCKER:
00085                         g_free (self->private->locker);                
00086                         self->private->locker = g_value_dup_string (value);
00087                         break;
00088                         
00089                 case MIDGARD_METADATA_LOCKED:
00090                         g_free (self->private->locked);                
00091                         self->private->locked = g_value_dup_string (value);
00092                         break;
00093                         
00094                 case MIDGARD_METADATA_APPROVER:
00095                         g_free (self->private->approver);                
00096                         self->private->approver = g_value_dup_string (value);
00097                         break;                                            
00098                         
00099                 case MIDGARD_METADATA_APPROVED:    
00100                         g_free (self->private->approved);
00101                         self->private->approved = g_value_dup_string (value);
00102                         break;
00103                         
00104                 case MIDGARD_METADATA_AUTHORS:
00105                         g_free (self->private->authors);
00106                         self->private->authors = g_value_dup_string (value);
00107                         break;
00108                         
00109                 case MIDGARD_METADATA_OWNER:
00110                         g_free (self->private->owner);
00111                         self->private->owner = g_value_dup_string (value);
00112                         break;
00113 
00114                 case MIDGARD_METADATA_SCHEDULE_START:
00115                         g_free (self->private->schedule_start);
00116                         self->private->schedule_start = g_value_dup_string (value);
00117                         break;
00118                 
00119                 case MIDGARD_METADATA_SCHEDULE_END:
00120                         g_free (self->private->schedule_end);
00121                         self->private->schedule_end = g_value_dup_string (value);
00122                         break;
00123                 
00124                 case MIDGARD_METADATA_HIDDEN:
00125                         self->private->hidden = g_value_get_boolean (value);
00126                         break;
00127                         
00128                 case MIDGARD_METADATA_NAV_NOENTRY:
00129                         self->private->nav_noentry = g_value_get_boolean (value);
00130                         break;
00131                         
00132                 case MIDGARD_METADATA_SIZE:
00133                         self->private->size = g_value_get_uint (value);
00134                         break;
00135                         
00136                 case MIDGARD_METADATA_PUBLISHED:            
00137                         g_free (self->private->published);
00138                         self->private->published = g_value_dup_string (value);
00139                         break;
00140 
00141                 case MIDGARD_METADATA_SCORE:
00142                         self->private->score = g_value_get_int (value);
00143                         break;
00144 
00145                 case MIDGARD_METADATA_EXPORTED:
00146                         g_free (self->private->exported);
00147                         self->private->exported = g_value_dup_string (value);
00148                         break;
00149                 
00150                 case MIDGARD_METADATA_IMPORTED:
00151                         g_free (self->private->imported);
00152                         self->private->imported = g_value_dup_string (value);
00153                         break;
00154                         
00155                 case MIDGARD_METADATA_DELETED:
00156                         self->private->deleted = g_value_get_boolean (value);
00157                         break;
00158                         
00159                 default:
00160                         G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec);
00161                         break;                  
00162         }
00163 }
00164     
00165 
00166 static void
00167 _metadata_get_property (GObject *object, guint property_id,
00168         GValue *value, GParamSpec *pspec)
00169 {    
00170         MidgardMetadata *self = (MidgardMetadata *) object;
00171         
00172         switch (property_id) {
00173                 
00174                 case MIDGARD_METADATA_CREATOR: 
00175                         g_value_set_string (value, self->private->creator);
00176                         break;
00177                         
00178                 case MIDGARD_METADATA_CREATED:
00179                         g_value_set_string (value, self->private->created);
00180                         break;
00181                         
00182                 case MIDGARD_METADATA_REVISOR:
00183                         g_value_set_string (value, self->private->revisor);
00184                         break;
00185                         
00186                 case MIDGARD_METADATA_REVISED:
00187                         g_value_set_string (value, self->private->revised);
00188                         break;
00189                         
00190                 case MIDGARD_METADATA_LOCKER:
00191                         g_value_set_string (value, self->private->locker);
00192                         break;
00193                         
00194                 case MIDGARD_METADATA_LOCKED:
00195                         g_value_set_string (value, self->private->locked);
00196                         break;
00197                         
00198                 case MIDGARD_METADATA_APPROVER:
00199                         g_value_set_string (value, self->private->approver);
00200                         break;
00201                         
00202                 case MIDGARD_METADATA_APPROVED:    
00203                         g_value_set_string (value, self->private->approved);
00204                         break;
00205                         
00206                 case MIDGARD_METADATA_REVISION:             
00207                         g_value_set_uint (value, self->private->revision);            
00208                         break;
00209                         
00210                 case MIDGARD_METADATA_AUTHORS:
00211                         g_value_set_string (value, self->private->authors);
00212                         break;
00213                         
00214                 case MIDGARD_METADATA_OWNER:
00215                         g_value_set_string (value, self->private->owner);
00216                         break;
00217                         
00218                 case MIDGARD_METADATA_SCHEDULE_START:
00219                         g_value_set_string (value, self->private->schedule_start);
00220                         break;
00221                         
00222                 case MIDGARD_METADATA_SCHEDULE_END:
00223                         g_value_set_string (value, self->private->schedule_end);
00224                         break;
00225                         
00226                 case MIDGARD_METADATA_HIDDEN:
00227                         g_value_set_boolean (value, self->private->hidden);
00228                         break;
00229                         
00230                 case MIDGARD_METADATA_NAV_NOENTRY:
00231                         g_value_set_boolean (value, self->private->nav_noentry);
00232                         break;
00233                         
00234                 case MIDGARD_METADATA_SIZE:
00235                         g_value_set_uint(value,  self->private->size);
00236                         break;
00237                         
00238                 case MIDGARD_METADATA_PUBLISHED:
00239                         g_value_set_string (value, self->private->published);
00240                         break;
00241 
00242                 case MIDGARD_METADATA_SCORE:
00243                         g_value_set_int (value, self->private->score);
00244                         break;
00245 
00246                 case MIDGARD_METADATA_EXPORTED:
00247                         g_value_set_string (value, self->private->exported);
00248                         break;
00249 
00250                 case MIDGARD_METADATA_IMPORTED:
00251                         g_value_set_string (value, self->private->imported);
00252                         break;
00253 
00254                 case MIDGARD_METADATA_DELETED:
00255                         g_value_set_boolean (value, self->private->deleted);
00256                         break;
00257                         
00258                 default:
00259                         G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec);
00260                         break;
00261         }
00262 }
00263 
00264 static void 
00265 _metadata_instance_init(GTypeInstance *instance, gpointer g_class) 
00266 {       
00267         MidgardMetadata *self = (MidgardMetadata *)instance;
00268         
00269         /* allocate private data */
00270         self->private = g_new(MidgardMetadataPrivate, 1);
00271         self->private->creator = NULL;
00272         self->private->created = NULL;
00273         self->private->revised = NULL;
00274         self->private->revisor = NULL;
00275         self->private->locker = NULL;
00276         self->private->locked = NULL;
00277         self->private->approved = NULL;
00278         self->private->approver = NULL;
00279         self->private->authors = NULL;
00280         self->private->owner = NULL;
00281         self->private->revision = 0;
00282         self->private->schedule_start = NULL;
00283         self->private->schedule_end = NULL;
00284         self->private->hidden = FALSE;
00285         self->private->nav_noentry = FALSE;
00286         self->private->size = 0;
00287         self->private->published = NULL;
00288         self->private->score = 0;
00289         self->private->exported = NULL;
00290         self->private->imported = NULL;
00291         self->private->deleted = FALSE;
00292 }
00293 
00294 static void 
00295 _metadata_object_finalize(GObject *object) 
00296 {
00297         g_assert(object);
00298         
00299         MidgardMetadata *self = (MidgardMetadata *)object;
00300         
00301         /* Free private data */
00302         g_free(self->private->creator);
00303         g_free(self->private->created);
00304         g_free(self->private->revised);
00305         g_free(self->private->revisor);
00306         g_free(self->private->locker);
00307         g_free(self->private->locked);
00308         g_free(self->private->approved);
00309         g_free(self->private->approver);
00310         g_free(self->private->authors);
00311         g_free(self->private->owner);
00312         g_free(self->private->schedule_start);
00313         g_free(self->private->schedule_end);
00314         g_free(self->private->published);
00315         g_free(self->private->exported);
00316         g_free(self->private->imported);
00317         
00318         g_free(self->private);
00319 }
00320 
00321 /* Set properties when object is created */
00322 void midgard_metadata_set_create(MgdObject *object)
00323 {
00324         MgdObject *person = (MgdObject *)object->mgd->person;
00325         gchar *person_guid;
00326         g_object_get(G_OBJECT(person), "guid", &person_guid, NULL);
00327 
00328         GValue tval = {0, };
00329         g_value_init(&tval, midgard_timestamp_get_type());
00330         midgard_timestamp_set_time(&tval, time(NULL));
00331         
00332         MidgardMetadata *metadata = (MidgardMetadata *) object->metadata;
00333         metadata->private->creator = person_guid;    
00334         metadata->private->created = midgard_timestamp_dup_string(&tval);
00335 }
00336 
00337 /* Set properties when object is updated */
00338 void midgard_metadata_set_update(MgdObject *object){
00339 
00340     MgdObject *person = (MgdObject *)object->mgd->person;
00341     gchar *person_guid;
00342     g_object_get(G_OBJECT(person), "guid", &person_guid, NULL);
00343 
00344     GValue tval = {0, };
00345     g_value_init(&tval, midgard_timestamp_get_type());
00346     midgard_timestamp_set_time(&tval, time(NULL));
00347 
00348     MidgardMetadata *metadata = (MidgardMetadata *) object->metadata;
00349     metadata->private->revisor = person_guid;
00350     metadata->private->revised = midgard_timestamp_dup_string(&tval);
00351     metadata->private->revision += 1; 
00352 }
00353 
00354 /* Initialize class */
00355 static void
00356 _metadata_class_init (gpointer g_class,
00357         gpointer g_class_data){
00358     
00359     GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
00360     MidgardMetadataClass *klass = MIDGARD_METADATA_CLASS (g_class); 
00361     GParamSpec *pspec;
00362 
00363     gobject_class->set_property = _metadata_set_property;
00364     gobject_class->get_property = _metadata_get_property;
00365     gobject_class->finalize = _metadata_object_finalize;
00366     
00367     /* Register signals */
00368     /* Create signal which should be emitted before MgdObject is created */
00369     klass->set_created = midgard_metadata_set_create;
00370     klass->signal_set_created = g_signal_new("set_created",
00371             G_TYPE_FROM_CLASS(g_class),
00372             G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
00373             G_STRUCT_OFFSET (MidgardMetadataClass, set_created),
00374             NULL, /* accumulator */
00375             NULL, /* accu_data */
00376             NULL, /* marshaller */
00377             G_TYPE_NONE,
00378             0);
00379     
00380     /* Create signal which should be emitted before MgdObject is updates */
00381     klass->set_updated = midgard_metadata_set_update;
00382     klass->signal_set_updated = g_signal_new("set_updated",
00383             G_TYPE_FROM_CLASS(g_class),
00384             G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
00385             G_STRUCT_OFFSET (MidgardMetadataClass, set_updated),
00386             NULL, /* accumulator */
00387             NULL, /* accu_data */
00388             NULL, /* marshaller */
00389             G_TYPE_NONE,
00390             0);
00391        
00392     /* Register properties */        
00393     pspec = g_param_spec_string ("creator",
00394             "metadata_creator",
00395             "The person who created object's record",
00396             "" /* We can set midgard admin */,
00397             G_PARAM_READWRITE);
00398 
00399     g_object_class_install_property (gobject_class,
00400             MIDGARD_METADATA_CREATOR,
00401             pspec);
00402 
00403     pspec = g_param_spec_string ("created",
00404             "metadata_created",
00405             "The date when object's record was created",
00406             "0000-00-00 00:00",
00407             G_PARAM_READWRITE);
00408 
00409     g_object_class_install_property (gobject_class,
00410             MIDGARD_METADATA_CREATED,
00411             pspec);
00412     
00413     pspec = g_param_spec_string ("revisor",
00414             "metadata_revisor",
00415             "The person who revised object's record",
00416             "", 
00417             G_PARAM_READWRITE);
00418 
00419     g_object_class_install_property (gobject_class,
00420             MIDGARD_METADATA_REVISOR,
00421             pspec);
00422 
00423     pspec = g_param_spec_string ("revised",
00424             "metadata_revised",
00425             "The date when object's record was revised",
00426             "0000-00-00 00:00",
00427             G_PARAM_READWRITE);
00428 
00429     g_object_class_install_property (gobject_class,
00430             MIDGARD_METADATA_REVISED,
00431             pspec);
00432 
00433     pspec = g_param_spec_uint ("revision",
00434             "metadata_revision",
00435             "Object's record revision number",
00436             0, G_MAXUINT32, 0, G_PARAM_READWRITE);
00437 
00438     g_object_class_install_property (gobject_class,
00439             MIDGARD_METADATA_REVISION,
00440             pspec);
00441 
00442     pspec = g_param_spec_string ("locker",
00443             "metadata_locker",
00444             "The person who (un)locked object's record",
00445             "",
00446             G_PARAM_READWRITE);
00447 
00448     g_object_class_install_property (gobject_class,
00449             MIDGARD_METADATA_LOCKER,
00450             pspec);
00451 
00452     pspec = g_param_spec_string ("locked",
00453             "metadata_locked",
00454             "The date when object's record  was (un)locked",
00455             "" /* We can set midgard admin */,
00456             G_PARAM_READWRITE);
00457 
00458     g_object_class_install_property (gobject_class,
00459             MIDGARD_METADATA_LOCKED,
00460             pspec);
00461 
00462     pspec = g_param_spec_string ("approver",
00463             "metadata_approver",
00464             "The person who (un)approved object's record",
00465             "",
00466             G_PARAM_READWRITE);
00467 
00468     g_object_class_install_property (gobject_class,
00469             MIDGARD_METADATA_APPROVER,
00470             pspec);
00471 
00472     pspec = g_param_spec_string ("approved",
00473             "metadata_approved",
00474             "The date when object's record was (un)approved",
00475             "",
00476             G_PARAM_READWRITE);
00477 
00478     g_object_class_install_property (gobject_class,
00479             MIDGARD_METADATA_APPROVED,
00480             pspec);
00481 
00482     pspec = g_param_spec_string ("authors",
00483             "metadata_authors",
00484             "The person who is an author",
00485             "",
00486             G_PARAM_READWRITE);
00487 
00488     g_object_class_install_property (gobject_class,
00489             MIDGARD_METADATA_AUTHORS,
00490             pspec);
00491         
00492     pspec = g_param_spec_string ("owner",
00493             "metadata_owner",
00494             "Group's guid which is an owner of the object",
00495             "",
00496             G_PARAM_READWRITE);
00497     
00498     g_object_class_install_property (gobject_class,
00499             MIDGARD_METADATA_OWNER,
00500             pspec);
00501 
00502     pspec = g_param_spec_string ("schedulestart",
00503             "metadata_schedule_start",
00504             "",
00505             "",
00506             G_PARAM_READWRITE);
00507     
00508     g_object_class_install_property (gobject_class,
00509             MIDGARD_METADATA_SCHEDULE_START,
00510             pspec);
00511 
00512         pspec = g_param_spec_string ("scheduleend",
00513             "metadata_schedule_end",
00514             "",
00515             "",
00516             G_PARAM_READWRITE);
00517     
00518     g_object_class_install_property (gobject_class,
00519             MIDGARD_METADATA_SCHEDULE_END,
00520             pspec);
00521 
00522         pspec = g_param_spec_boolean ("hidden",
00523             "metadata_hidden",
00524             "",
00525             FALSE,
00526             G_PARAM_READWRITE);
00527     
00528     g_object_class_install_property (gobject_class,
00529             MIDGARD_METADATA_HIDDEN,
00530             pspec);
00531 
00532         pspec = g_param_spec_boolean ("navnoentry",
00533             "metadata_nav_noentry",
00534             "",
00535             FALSE,
00536             G_PARAM_READWRITE);
00537     
00538     g_object_class_install_property (gobject_class,
00539             MIDGARD_METADATA_NAV_NOENTRY,
00540             pspec);
00541 
00542     pspec = g_param_spec_uint ("size",
00543             "metadata_size",
00544             "Object's size in bytes",
00545             0, G_MAXUINT32, 0, G_PARAM_READWRITE);
00546     
00547     g_object_class_install_property (gobject_class,
00548             MIDGARD_METADATA_SIZE,
00549             pspec);
00550 
00551     pspec = g_param_spec_string ("published",
00552                     "metadata_published",
00553                     "",
00554                     "",
00555                     G_PARAM_READWRITE);
00556     
00557     g_object_class_install_property (gobject_class,
00558                     MIDGARD_METADATA_PUBLISHED,
00559                     pspec);
00560 
00561     pspec = g_param_spec_int ("score",
00562                     "metadata_score",
00563                     "Object's record score",
00564                     0, G_MAXINT32, 0, G_PARAM_READWRITE);
00565     
00566     g_object_class_install_property (gobject_class,      
00567                     MIDGARD_METADATA_SCORE,        
00568                     pspec);
00569 
00570     pspec = g_param_spec_string ("exported",
00571                     "metadata_exported",
00572                     "",
00573                     "",
00574                     G_PARAM_READWRITE);
00575     g_object_class_install_property (gobject_class,
00576                     MIDGARD_METADATA_EXPORTED,
00577                     pspec);
00578     
00579     pspec = g_param_spec_string ("imported",
00580                     "metadata_imported",
00581                     "",
00582                     "",
00583                     G_PARAM_READWRITE);
00584     g_object_class_install_property (gobject_class,
00585                     MIDGARD_METADATA_IMPORTED,
00586                     pspec);
00587     
00588     pspec = g_param_spec_boolean ("deleted",
00589                     "metadata_deleted",
00590                     "",
00591                     FALSE,
00592                     G_PARAM_READWRITE);
00593     g_object_class_install_property (gobject_class,
00594                     MIDGARD_METADATA_DELETED,
00595                     pspec);
00596 }
00597 
00598 
00599 GType midgard_metadata_get_type (void)
00600 {    
00601         static GType type = 0;
00602         if (type == 0) {
00603                 static const GTypeInfo info = {
00604                         sizeof (MidgardMetadataClass),
00605                         NULL,   /* base_init */
00606                         NULL,   /* base_finalize */
00607                         _metadata_class_init,   /* class_init */                        
00608                         NULL,   /* class_finalize */
00609                         NULL,   /* class_data */
00610                         sizeof (MidgardMetadata),
00611                         0,      /* n_preallocs */
00612                         _metadata_instance_init    /* instance_init */
00613                 };
00614                 type = g_type_register_static (G_TYPE_OBJECT,
00615                                 "midgard_metadata",
00616                                 &info, 0);
00617         }
00618         return type;
00619 }
00620 
00621 
00622 MidgardMetadata *midgard_metadata_new(MgdObject *object) 
00623 {
00624         g_assert(object->mgd);
00625 
00626         MidgardMetadata *self = 
00627                 (MidgardMetadata *) g_object_new(MIDGARD_TYPE_METADATA, NULL);
00628         self->private->object = object;
00629 
00630         /* TODO , create part of metadata SQL */
00631         /*
00632         GString *sql = g_string_new (
00633             "SELECT metadata_creator, metadata_created, metadata_revisor, "
00634             "metadata_revised, metadata_revision, "
00635             "metadata_locker, metadata_locked, metadata_approver, "
00636             "metadata_approved, metadata_author, metadata_owner, "
00637             "metadata_schedule_start, metadata_schedule_end, metadata_hidden, "
00638             "metadata_nav_noentry FROM ");
00639     g_string_append_printf(sql, " %s WHERE guid = ", 
00640             midgard_object_class_get_table(
00641                     MIDGARD_OBJECT_GET_CLASS(object)) );
00642                     */
00643         return self;
00644 }
00645 
00646 MidgardMetadata *midgard_object_metadata_get(MgdObject *object){
00647 
00648     MidgardMetadata *mm = midgard_metadata_new(object);
00649     if(mm)
00650         return mm;
00651 
00652     return NULL;
00653 }
00654 
00655 
00656 gchar *midgard_metadata_get_sql(MidgardMetadata *object){
00657 
00658     g_assert(object);
00659     
00660     guint i = 0;    
00661     const gchar *nick, *prop_str;
00662     GValue pval = {0, };
00663     GParamSpec *prop;
00664    
00665     static gchar *props[] = { "locker", "locked", "approver", "approved", 
00666         "authors", "owner", "schedulestart", "scheduleend", "hidden",
00667         "navnoentry", "published", "score", NULL};
00668 
00669     GString *sql = g_string_new("");
00670     
00671     while (props[i] != NULL) {
00672         
00673         prop = g_object_class_find_property(
00674                 G_OBJECT_GET_CLASS(G_OBJECT(object)), 
00675                 props[i]);
00676         
00677         nick = g_param_spec_get_nick (prop);
00678         if((g_ascii_strcasecmp(nick, "") != 0)){
00679 
00680             g_value_init(&pval,prop->value_type);
00681             g_object_get_property(G_OBJECT(object), props[i], &pval);
00682 
00683             switch (prop->value_type) {
00684                 
00685                 case G_TYPE_STRING:
00686                     prop_str = g_value_get_string(&pval);
00687                     if(prop_str == NULL) prop_str = "";
00688                     g_string_append_printf(sql,
00689                             ",%s='%s' ",
00690                             nick, prop_str);
00691                     break;
00692 
00693                 case G_TYPE_BOOLEAN:
00694                     g_string_append_printf(sql,
00695                             ",%s=%d ",
00696                             nick, g_value_get_boolean(&pval));
00697                     break;
00698 
00699                 case G_TYPE_UINT:
00700                     g_string_append_printf(sql,
00701                             ",%s=%d ",
00702                             nick, g_value_get_uint(&pval));
00703                     break;
00704             }
00705             g_value_unset(&pval);
00706         }
00707         i++;
00708     }
00709 
00710     return g_string_free(sql, FALSE);
00711 }
00712 
00713 #define _SET_VALUE_TYPE \
00714     case G_TYPE_STRING:\
00715         g_hash_table_insert(vtable, "type", "string"); \
00716         break;\
00717     case G_TYPE_UINT:\
00718         g_hash_table_insert(vtable, "type", "integer");\
00719         break;\
00720     case G_TYPE_BOOLEAN:\
00721         g_hash_table_insert(vtable, "type", "boolean");\
00722         break;\
00723     case G_TYPE_FLOAT:\
00724         g_hash_table_insert(vtable, "type", "float");\
00725         break;
00726 
00727 
00728 typedef enum
00729 {
00730     MGD_META_PROPERTY_PARENT = 0,
00731     MGD_META_PROPERTY_UP,
00732     MGD_META_PROPERTY_PRIMARY,
00733     MGD_META_TREE_PARENT,
00734     MGD_META_TREE_CHILDS
00735 } MidgardMetadataType;
00736 
00737 static struct
00738 {
00739   const gchar *cname;
00740   MidgardMetadataType type;
00741 } 
00742 _types[] = {
00743     {"MGD_META_PROPERTY_PARENT", MGD_META_PROPERTY_PARENT},
00744     {"MGD_META_PROPERTY_UP", MGD_META_PROPERTY_UP},
00745     {"MGD_META_PROPERTY_PRIMARY", MGD_META_PROPERTY_PRIMARY},
00746     {"MGD_META_TREE_PARENT", MGD_META_TREE_PARENT},
00747     {"MGD_META_TREE_CHILDS", MGD_META_TREE_CHILDS},
00748     {NULL, 0}
00749 };
00750 
00751 GSList *midgard_class_metadata_types()
00752 {
00753     gint i;
00754     GSList *list = NULL;
00755 
00756     for ( i = 0; _types[i].cname; i++) {
00757     
00758         if (_types[i].cname != NULL)
00759             list = g_slist_append(list, (gchar *)_types[i].cname);
00760     }
00761 
00762     return list;
00763 }
00764 
00765 
00766 static void _destroy_metadata_hash_keys(gpointer data){
00767     
00768     g_free((gchar *) data);
00769 }
00770 
00771 static void _destroy_metadata_hash_values(gpointer data){
00772 
00773     g_hash_table_destroy( (GHashTable *) data);
00774 }
00775 
00776 
00777 static void _destroy_metadata_vtable_hash_values(gpointer data){
00778 
00779     g_free((gchar *) data);
00780 }
00781 
00782 GHashTable *_midgard_class_list_properties(const gchar *classname){
00783 
00784     GParamSpec **props;
00785     guint propn, i;
00786     GHashTable *ptable, *vtable;
00787 
00788     
00789     if (( props = g_object_class_list_properties(
00790                     g_type_class_peek(g_type_from_name(classname)), &propn)) == NULL) {
00791 
00792         ptable = g_hash_table_new_full (g_str_hash,  g_str_equal, 
00793                 _destroy_metadata_hash_keys, 
00794                 _destroy_metadata_hash_values);
00795                 
00796         for (i = 0; i < propn; i++) {
00797 
00798             vtable = g_hash_table_new_full (g_str_hash,  g_str_equal,
00799                     _destroy_metadata_hash_keys,
00800                     _destroy_metadata_vtable_hash_values);      
00801 
00802             /* Add value type as string */           
00803             switch(props[i]->value_type) {
00804 
00805                 case G_TYPE_STRING:
00806                     
00807                     g_hash_table_insert(vtable, "type", "string");
00808                     break;
00809 
00810                 case G_TYPE_UINT:
00811 
00812                     g_hash_table_insert(vtable, "type", "integer");
00813                     break;
00814 
00815                 case G_TYPE_BOOLEAN:
00816 
00817                     g_hash_table_insert(vtable, "type", "boolean");
00818                     break;
00819 
00820                 case G_TYPE_FLOAT:
00821 
00822                     g_hash_table_insert(vtable, "type", "float");
00823                     break;
00824 
00825             }
00826 
00827             /* Add description */
00828             g_hash_table_insert(vtable, "description", 
00829                     g_strdup(g_param_spec_get_blurb(props[i])));
00830             
00831             
00832             g_hash_table_insert(ptable, g_strdup(props[i]->name), vtable);  
00833 
00834         } 
00835 
00836         g_free(props);
00837         return ptable;
00838     }
00839  
00840     return NULL;        
00841 }
00842 
00843 
00844 GHashTable *_midgard_class_find_property(const gchar *classname, gchar *propertyname){
00845 
00846     GParamSpec  *prop;
00847     GHashTable  *vtable; 
00848 
00849     if (( prop = g_object_class_find_property(
00850                     g_type_class_peek(g_type_from_name(classname)),
00851                     propertyname)) == NULL) {
00852 
00853         vtable = g_hash_table_new_full (g_str_hash,  g_str_equal,
00854                 _destroy_metadata_hash_keys,
00855                 _destroy_metadata_vtable_hash_values);
00856        /* 
00857         switch(prop[i]->value_type) {
00858             _SET_VALUE_TYPE 
00859         }
00860         */
00861         g_hash_table_insert(vtable, "description",
00862                 g_strdup(g_param_spec_get_blurb(prop)));
00863 
00864         return vtable;        
00865 
00866     }
00867     
00868     return NULL;
00869 }
00870 
00871 GParamSpec **midgard_class_list_properties(MgdObject *object, guint *n)
00872 {
00873     GParamSpec **pspecs = 
00874         g_object_class_list_properties((GObjectClass *)object->klass, n);
00875 
00876     return pspecs; 
00877 }
00878 
00879 
00880 GParamSpec *midgard_class_find_property(MgdObject *object, gchar *propertyname)
00881 {
00882     GParamSpec *pspec =
00883         g_object_class_find_property((GObjectClass *) object->klass, 
00884                 propertyname);
00885     
00886     if (pspec != NULL)
00887         return pspec;
00888 
00889     return NULL;
00890 
00891 }
00892 
00893 
00894 void midgard_class_get_metadata(MgdObject *object,  gint mmt, GValue *val)
00895 {
00896     mmt = (MidgardMetadataType) mmt;
00897     
00898     switch (mmt) {
00899 
00900         case MGD_META_PROPERTY_PARENT:
00901 
00902             g_value_init(val, G_TYPE_STRING);
00903             g_value_set_string(val, object->data->property_parent);
00904             break;
00905 
00906         case MGD_META_PROPERTY_UP:
00907 
00908             g_value_init(val, G_TYPE_STRING);
00909             g_value_set_string(val, object->data->property_up);
00910             break;
00911 
00912         case MGD_META_PROPERTY_PRIMARY:
00913 
00914             g_value_init(val, G_TYPE_STRING);
00915             g_value_set_string(val, object->data->primary);
00916             break;
00917                                     
00918         case MGD_META_TREE_PARENT:
00919 
00920             g_value_init(val, G_TYPE_STRING);
00921             g_value_set_string(val, object->data->parent);
00922             break;
00923                                     
00924         case MGD_META_TREE_CHILDS:
00925 
00926                 g_value_init(val, G_TYPE_POINTER);
00927                 g_value_set_pointer(val,(gpointer )object->data->childs);
00928             
00929             break;
00930 
00931         default:
00932 
00933             g_value_init(val, G_TYPE_INVALID);
00934             break;
00935 
00936     }
00937  
00938     
00939 }
00940 
00941 void midgard_class_list_data()
00942 {
00943  
00944    
00945 }

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