- Timestamp:
- 02/08/10 21:20:10 (7 months ago)
- Files:
-
- trunk/midgard/core/midgard/src/midgard_metadata.c (modified) (10 diffs)
- trunk/midgard/core/midgard/src/midgard_object.c (modified) (9 diffs)
- trunk/midgard/core/midgard/src/midgard_timestamp.c (modified) (6 diffs)
- trunk/midgard/core/midgard/src/midgard_timestamp.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/midgard/core/midgard/src/midgard_metadata.c
r24841 r25026 41 41 42 42 if (person) 43 person_guid = (gchar *)MGD_OBJECT_GUID(person); 44 45 GValue *tval = midgard_timestamp_new_current(); 43 person_guid = (gchar *)MGD_OBJECT_GUID (person); 46 44 47 45 /* set creator */ 48 midgard_core_metadata_set_creator (mdata, person_guid);49 50 /* set created */ 51 midgard_core_ metadata_set_created(mdata, tval);46 midgard_core_metadata_set_creator (mdata, person_guid); 47 48 /* set created */ 49 midgard_core_timestamp_set_current_time (mdata->priv->created); 52 50 53 51 /* set revised */ 54 midgard_core_ metadata_set_revised(mdata, tval);52 midgard_core_timestamp_set_current_time (mdata->priv->revised); 55 53 56 54 /* set revision */ 57 midgard_core_metadata_set_revision (mdata, 0);55 midgard_core_metadata_set_revision (mdata, 0); 58 56 59 57 /* set revisor */ 60 midgard_core_metadata_set_revisor(mdata, person_guid); 61 62 g_value_unset(tval); 63 g_free (tval); 58 midgard_core_metadata_set_revisor (mdata, person_guid); 64 59 } 65 60 … … 75 70 person_guid = (gchar *)MGD_OBJECT_GUID(person); 76 71 77 GValue *tval = midgard_timestamp_new_current();78 79 72 /* set revisor */ 80 73 midgard_core_metadata_set_revisor(mdata, person_guid); 81 74 82 75 /* set revised */ 83 midgard_core_ metadata_set_revised(mdata, tval);76 midgard_core_timestamp_set_current_time (mdata->priv->revised); 84 77 85 78 /* set revision */ 86 midgard_core_metadata_increase_revision(mdata); 87 88 g_value_unset(tval); 89 g_free (tval); 79 midgard_core_metadata_increase_revision (mdata); 90 80 } 91 81 … … 98 88 { 99 89 MidgardMetadata *mdata = (MidgardMetadata *) ud; 100 GValue *tval = midgard_timestamp_new_current(); 101 102 /* set imported */ 103 midgard_core_metadata_set_imported (mdata, tval); 104 105 g_value_unset (tval); 106 g_free (tval); 90 midgard_core_timestamp_set_current_time (mdata->priv->imported); 107 91 } 108 92 … … 116 100 * touched by new API */ 117 101 if (!mdata->priv->revised && !mdata->priv->created) { 118 midgard_core_ metadata_set_created(mdata, tval);119 midgard_core_ metadata_set_revised(mdata, tval);102 midgard_core_timestamp_set_current_time (mdata->priv->created); 103 midgard_core_timestamp_set_current_time (mdata->priv->revised); 120 104 } 121 105 122 106 if (!mdata->priv->revised && mdata->priv->created) { 123 midgard_core_ metadata_set_created(mdata, tval);107 midgard_core_timestamp_set_current_time (mdata->priv->created); 124 108 midgard_core_metadata_increase_revision(mdata); 125 109 } 126 110 127 111 if (!mdata->priv->created && mdata->priv->revised) { 128 midgard_core_ metadata_set_created(mdata, tval);112 midgard_core_timestamp_set_current_time (mdata->priv->created); 129 113 } 130 114 131 115 /* set exported */ 132 midgard_core_ metadata_set_exported(mdata, tval);116 midgard_core_timestamp_set_current_time (mdata->priv->exported); 133 117 134 118 g_value_unset ((GValue *)tval); … … 395 379 self->priv = g_new(MidgardMetadataPrivate, 1); 396 380 self->priv->creator = NULL; 397 self->priv->created = NULL;398 self->priv->revised = NULL;381 self->priv->created = midgard_timestamp_new(); 382 self->priv->revised = midgard_timestamp_new(); 399 383 self->priv->revisor = NULL; 400 384 self->priv->locker = NULL; 401 self->priv->locked = NULL;402 self->priv->approved = NULL;385 self->priv->locked = midgard_timestamp_new(); 386 self->priv->approved = midgard_timestamp_new(); 403 387 self->priv->approver = NULL; 404 388 self->priv->authors = NULL; 405 389 self->priv->owner = NULL; 406 390 self->priv->revision = 0; 407 self->priv->schedule_start = NULL;408 self->priv->schedule_end = NULL;391 self->priv->schedule_start = midgard_timestamp_new(); 392 self->priv->schedule_end = midgard_timestamp_new(); 409 393 self->priv->hidden = FALSE; 410 394 self->priv->nav_noentry = FALSE; 411 395 self->priv->size = 0; 412 self->priv->published = NULL;396 self->priv->published = midgard_timestamp_new(); 413 397 self->priv->score = 0; 414 self->priv->exported = NULL;415 self->priv->imported = NULL;398 self->priv->exported = midgard_timestamp_new(); 399 self->priv->imported = midgard_timestamp_new(); 416 400 self->priv->deleted = FALSE; 417 401 … … 942 926 klass->dbpriv->storage_data = type_attr; 943 927 klass->dbpriv->set_from_xml_node = __set_from_xml_node; 928 klass->dbpriv->has_metadata = FALSE; 944 929 } 945 930 … … 1013 998 } 1014 999 1015 void __set_date_from_node(xmlNode *node, MidgardTimestamp **date) 1000 void __set_date_from_node (xmlNode *node, MidgardTimestamp **date) 1001 { 1002 if (!node) 1003 return; 1004 1005 gchar *content = NULL; 1006 content = (gchar *)xmlNodeGetContent (node); 1007 1008 if (content == NULL) { 1009 g_warning ("Can not handle NULL date for datetime property"); 1010 return; 1011 } 1012 1013 if (*date != NULL) 1014 g_free (*date); 1015 1016 *date = midgard_timestamp_new_from_iso8601 (content); 1017 xmlFree (content); 1018 1019 return; 1020 } 1021 1022 gint __get_node_content_int(xmlNode *node) 1016 1023 { 1017 1024 if(!node) 1018 return ;1025 return 0; 1019 1026 1020 1027 gchar *content = NULL; 1021 1028 content = (gchar *)xmlNodeGetContent(node); 1022 1029 1023 if (content == NULL) { 1024 g_warning("Can not handle NULL date for datetime property"); 1025 return; 1026 } 1027 1028 if (*date != NULL) 1029 g_free(*date); 1030 1031 *date = midgard_timestamp_new_from_iso8601(content); 1032 1033 return; 1034 } 1035 1036 gint __get_node_content_int(xmlNode *node) 1030 if(content == NULL) 1031 return 0; 1032 1033 gint rv = (gint)atoi((gchar *)content); 1034 1035 g_free(content); 1036 1037 return rv; 1038 } 1039 1040 guint __get_node_content_uint(xmlNode *node) 1037 1041 { 1038 1042 if(!node) … … 1045 1049 return 0; 1046 1050 1047 g int rv = (gint)atoi((gchar *)content);1051 guint rv = (guint)atoi((gchar *)content); 1048 1052 1049 1053 g_free(content); … … 1052 1056 } 1053 1057 1054 g uint __get_node_content_uint(xmlNode *node)1058 gboolean __get_node_content_bool(xmlNode *node) 1055 1059 { 1056 1060 if(!node) 1057 return 0;1061 return FALSE; 1058 1062 1059 1063 gchar *content = NULL; … … 1063 1067 return 0; 1064 1068 1065 guint rv = (guint)atoi((gchar *)content);1066 1067 g_free(content);1068 1069 return rv;1070 }1071 1072 gboolean __get_node_content_bool(xmlNode *node)1073 {1074 if(!node)1075 return FALSE;1076 1077 gchar *content = NULL;1078 content = (gchar *)xmlNodeGetContent(node);1079 1080 if(content == NULL)1081 return 0;1082 1083 1069 gboolean rv = (gboolean)atoi((gchar *)content); 1084 1070 trunk/midgard/core/midgard/src/midgard_object.c
r25005 r25026 196 196 MidgardObject *self = (MidgardObject *) object; 197 197 MidgardConnection *mgd = MGD_OBJECT_CNC (MIDGARD_DBOBJECT (object)); 198 GValue *pval; 198 199 199 200 if (midgard_core_object_property_refuse_private (mgd, priv, MIDGARD_DBOBJECT (object), pspec->name)) … … 216 217 prop_id_local < priv->num_properties)) { 217 218 if (priv->num_properties) { 218 if (priv->properties && G_IS_VALUE( 219 &priv->properties[prop_id_local]->value)) { 220 g_value_copy(&priv->properties[prop_id_local]->value, 221 value); 219 if (priv->properties) { 220 pval = &priv->properties[prop_id_local]->value; 221 if (G_IS_VALUE (pval)) { 222 g_value_copy(pval, value); 223 } else { 224 /* Initialize Midgardtimestamp. 225 * There's no need to do it in constructor. Just do it when it's really needed */ 226 if (G_VALUE_TYPE (value) == MGD_TYPE_TIMESTAMP) { 227 MidgardTimestamp *mt = midgard_timestamp_new (); 228 g_value_init (pval, MGD_TYPE_TIMESTAMP); 229 g_value_take_boxed (pval, mt); 230 g_value_copy (pval, value); 231 } 232 } 222 233 } 223 234 } … … 2414 2425 g_value_init (&tval, MGD_TYPE_TIMESTAMP); 2415 2426 midgard_timestamp_set_current_time(&tval); 2416 constgchar *timeupdated = midgard_timestamp_get_string_from_value (&tval);2427 gchar *timeupdated = midgard_timestamp_get_string_from_value (&tval); 2417 2428 object->metadata->priv->revision++; 2418 2429 g_string_append_printf(sql, … … 2424 2435 2425 2436 g_string_append_printf(sql, " WHERE guid = '%s' ", MGD_OBJECT_GUID(object)); 2426 2427 2437 gint qr = midgard_core_query_execute(MGD_OBJECT_CNC (object), sql->str, FALSE); 2438 2428 2439 g_string_free(sql, TRUE); 2440 g_free (timeupdated); 2429 2441 2430 2442 if (qr == 0) { … … 2967 2979 } 2968 2980 2981 if (midgard_object_is_approved(self)) { 2982 2983 g_warning("Object is already approved"); 2984 return FALSE; 2985 } 2986 2969 2987 /* approved time value */ 2970 2988 GValue *tval = midgard_timestamp_new_current(); … … 2989 3007 g_value_init (&stval, GDA_TYPE_TIMESTAMP); 2990 3008 g_value_transform (tval, &stval); 2991 2992 if (midgard_object_is_approved(self)) {2993 2994 g_warning("Object is already approved");2995 return FALSE;2996 }2997 3009 2998 3010 gboolean rv = midgard_core_query_update_object_fields( … … 3012 3024 self->metadata->priv->is_approved = TRUE; 3013 3025 3014 midgard_core_metadata_set_approved (self->metadata, tval);3015 self->metadata->priv->approver = g_value_dup_string(&gval);3016 self->metadata->priv->revisor = g_value_dup_string(&gval);3017 midgard_core_metadata_set_revised (self->metadata, tval);3018 self->metadata->priv->revision = g_value_get_uint (&rval);3026 midgard_core_metadata_set_approved (self->metadata, tval); 3027 midgard_core_metadata_set_approver (self->metadata, g_value_get_string (&gval)); 3028 midgard_core_metadata_set_revisor (self->metadata, g_value_get_string (&gval)); 3029 midgard_core_metadata_set_revised (self->metadata, tval); 3030 self->metadata->priv->revision = g_value_get_uint (&rval); 3019 3031 } 3020 3032 … … 3250 3262 } 3251 3263 3264 if (midgard_object_is_locked(self)) { 3265 3266 g_warning("Object is already locked"); 3267 MIDGARD_ERRNO_SET(mgd, MGD_ERR_OBJECT_IS_LOCKED); 3268 g_object_unref(self); 3269 return FALSE; 3270 } 3271 3252 3272 /* approved time value */ 3253 3273 GValue *tval = midgard_timestamp_new_current(); … … 3278 3298 g_value_transform (tval, &stval); 3279 3299 3280 if (midgard_object_is_locked(self)) {3281 3282 g_warning("Object is already locked");3283 MIDGARD_ERRNO_SET(mgd, MGD_ERR_OBJECT_IS_LOCKED);3284 g_object_unref(self);3285 return FALSE;3286 }3287 3288 3300 gboolean rv = midgard_core_query_update_object_fields( 3289 3301 MIDGARD_DBOBJECT(self), trunk/midgard/core/midgard/src/midgard_timestamp.c
r24402 r25026 158 158 } 159 159 160 static void 161 __timestamp_struct_reset (MidgardTimestamp *ct) 162 { 163 g_return_if_fail (ct != NULL); 164 165 guint64 u = ct->date_value + 58486; 166 long s = u % 86400ULL; 167 long day = u / 86400ULL - 53375995543064ULL; 168 long year = day / 146097L; 169 long month; 170 //int yday; 171 172 ct->second = s % 60; s /= 60; 173 ct->minute = s % 60; s /= 60; 174 ct->hour = s; 175 176 day = (day % 146097L) + 678881L; 177 while (day >= 146097L) { day -= 146097L; ++year; } 178 179 // year * 146097 + day - 678881 is MJD; 0 <= day < 146097 180 // 2000-03-01, MJD 51604, is year 5, day 0 181 182 year *= 4; 183 if (day == 146096L) { year += 3; day = 36524L; } 184 else { year += day / 36524L; day %= 36524L; } 185 year = year * 25 + day / 1461; 186 day %= 1461; 187 year *= 4; 188 189 if (day == 1460) { year += 3; day = 365; } 190 else { year += day / 365; day %= 365; } 191 192 day *= 10; 193 month = (day + 5) / 306; 194 day = (day + 5) % 306; 195 day /= 10; 196 197 if (month >= 10) { ++year; month -= 10; } 198 else { month += 2; } 199 200 ct->year = year; 201 ct->month = month + 1; 202 ct->day = day + 1; 203 204 ct->offset = 0; 205 } 206 160 207 static void midgard_timestamp_set(MidgardTimestamp *ct) 161 208 { … … 238 285 } 239 286 240 /* Internal initialization function for the midgard_timestamp value type. */241 static void value_init_timestamp(GValue *value)242 {243 g_assert(G_VALUE_HOLDS(value, MIDGARD_TYPE_TIMESTAMP));244 245 MidgardTimestamp *mt = midgard_timestamp_new();246 g_value_take_boxed(value, mt);247 }248 249 287 /* Internal copy function for the midgard_timestamp value type. */ 250 static void value_copy_timestamp(const GValue *src, GValue *dst) 251 { 252 g_assert(G_VALUE_HOLDS(src, MIDGARD_TYPE_TIMESTAMP)); 253 g_assert(G_VALUE_HOLDS(dst, MIDGARD_TYPE_TIMESTAMP)); 288 gpointer 289 __midgard_timestamp_copy (gpointer boxed) 290 { 291 MidgardTimestamp *src = (MidgardTimestamp *) boxed; 292 //g_assert (G_VALUE_HOLDS (src, MIDGARD_TYPE_TIMESTAMP)); 254 293 255 294 MidgardTimestamp *mt = midgard_timestamp_new(); 256 295 257 MidgardTimestamp *mtsrc = (MidgardTimestamp *) g_value_get_boxed(src);258 259 if(mtsrc == NULL)260 mtsrc = midgard_timestamp_new(); 261 262 mt-> year = mtsrc->year;263 mt-> month = mtsrc->month;264 mt->day = mtsrc->day; 265 266 mt-> hour = mtsrc->hour;267 mt->minute = mtsrc->minute; 268 mt-> second = mtsrc->second;269 270 mt->offset = mtsrc->offset;271 mt->nano = mtsrc->nano;272 273 mt->date_value = mtsrc->date_value;274 275 if (mtsrc->date_string != NULL) 276 mt->date_string = g_strdup(mtsrc->date_string); 277 278 g_value_take_boxed(dst, mt); 279 } 280 281 static void midgard_timestamp_value_free(GValue *value) 282 { 283 MidgardTimestamp *mt = (MidgardTimestamp *) g_value_get_boxed(value); 284 midgard_timestamp_free(mt);296 mt->year = src->year; 297 mt->month = src->month; 298 mt->day = src->day; 299 300 mt->hour = src->hour; 301 mt->minute = src->minute; 302 mt->second = src->second; 303 304 mt->offset = src->offset; 305 mt->nano = src->nano; 306 307 mt->date_value = src->date_value; 308 309 if (src->date_string != NULL) 310 mt->date_string = g_strdup (src->date_string); 311 312 return mt; 313 } 314 315 void 316 __midgard_timestamp_free (gpointer boxed) 317 { 318 MidgardTimestamp *mt = (MidgardTimestamp *) boxed; 319 if (mt->date_string) 320 g_free (mt->date_string); 321 mt->date_string = NULL; 322 323 g_free (mt); 285 324 286 325 return; 287 }288 289 /* Internal collect function for the midgard_timestamp value type. */290 static gchar *value_collect_timestamp(291 GValue *value, guint n_collect_values,292 GTypeCValue *collect_values, guint collect_flags)293 {294 g_assert(G_VALUE_HOLDS(value, MIDGARD_TYPE_TIMESTAMP));295 g_assert(n_collect_values == 1);296 g_assert(collect_values != NULL);297 298 const gchar *time = (const gchar *) collect_values;299 if (time == NULL) {300 return g_strdup("Midgard timestamp value string passed as NULL");301 }302 303 return NULL;304 }305 306 /* Internal lcopy function for the midgard_timestamp value type. */307 static gchar *value_lcopy_timestamp(308 const GValue *value, guint n_collect_values,309 GTypeCValue *collect_values, guint collect_flags)310 {311 g_assert(G_VALUE_HOLDS(value, MIDGARD_TYPE_TIMESTAMP));312 g_assert(n_collect_values == 1);313 g_assert(collect_values != NULL);314 315 const gchar **time = (const gchar **) collect_values;316 if (time == NULL) {317 return g_strdup("Midgard timestamp value string passed as NULL");318 }319 320 return NULL;321 326 } 322 327 … … 429 434 { 430 435 static GType type = 0; 431 432 if (type == 0) { 433 434 static const GTypeValueTable value_table = { 435 &value_init_timestamp, /* value_init */ 436 &midgard_timestamp_value_free, /* value_free */ 437 &value_copy_timestamp, /* value_copy */ 438 NULL, /* value_peek_pointer */ 439 "p", /* collect_format */ 440 &value_collect_timestamp, /* collect_value */ 441 "p", /* lcopy_format */ 442 &value_lcopy_timestamp /* lcopy_value */ 443 }; 444 445 static const GTypeInfo info = { 446 0, /* class_size */ 447 NULL, /* base_init */ 448 NULL, /* base_destroy */ 449 NULL, /* class_init */ 450 NULL, /* class_destroy */ 451 NULL, /* class_data */ 452 0, /* instance_size */ 453 0, /* n_preallocs */ 454 NULL, /* instance_init */ 455 &value_table /* value_table */ 456 }; 457 458 type = g_type_register_static (G_TYPE_BOXED, "MidgardTimestamp", &info, 0); 459 436 437 if (G_UNLIKELY (type == 0)) { 438 439 type = g_boxed_type_register_static ("MidgardTimestamp", 440 (GBoxedCopyFunc) __midgard_timestamp_copy, 441 (GBoxedFreeFunc) __midgard_timestamp_free); 442 460 443 /* Register transform functions */ 461 444 g_value_register_transform_func(type, G_TYPE_STRING, midgard_timestamp_transform_to_string); … … 468 451 } 469 452 470 void midgard_timestamp_set_current_time(const GValue *value) 471 { 472 g_assert(value != NULL); 473 g_return_if_fail(G_VALUE_HOLDS(value, MGD_TYPE_TIMESTAMP)); 474 475 MidgardTimestamp *mt = (MidgardTimestamp *) g_value_get_boxed(value); 476 time_t utctime = time(NULL); 453 void 454 midgard_timestamp_set_current_time (const GValue *value) 455 { 456 g_assert (value != NULL); 457 g_return_if_fail (G_VALUE_HOLDS(value, MGD_TYPE_TIMESTAMP)); 458 459 MidgardTimestamp *mt = (MidgardTimestamp *) g_value_get_boxed (value); 460 if (!mt) { 461 mt = midgard_timestamp_new (); 462 g_value_take_boxed ((GValue *)value, mt); 463 } 464 465 time_t utctime = time (NULL); 477 466 mt->date_value = utctime + 4611686018427387914ULL; 478 467 mt->nano = 0; … … 489 478 } 490 479 480 void 481 midgard_core_timestamp_set_current_time (MidgardTimestamp *mt) 482 { 483 g_return_if_fail (mt != NULL); 484 485 time_t utctime = time (NULL); 486 mt->date_value = utctime + 4611686018427387914ULL; 487 mt->nano = 0; 488 489 __timestamp_struct_reset (mt); 490 } 491 491 492 gchar *midgard_timestamp_get_string(MidgardTimestamp *mt) 492 493 { … … 501 502 g_return_val_if_fail(G_VALUE_HOLDS(value, MGD_TYPE_TIMESTAMP), NULL); 502 503 503 MidgardTimestamp *mt = (MidgardTimestamp *) g_value_get_boxed (value);504 MidgardTimestamp *mt = (MidgardTimestamp *) g_value_get_boxed (value); 504 505 505 506 return caltime_fmt(mt); trunk/midgard/core/midgard/src/midgard_timestamp.h
r24402 r25026 51 51 void midgard_timestamp_free (MidgardTimestamp *mt); 52 52 53 void midgard_core_timestamp_set_current_time (MidgardTimestamp *tm); 54 53 55 #endif
