[groonga-dev,00149] GRN_DB_TIME: uint64 -> int64

Back to archive index

Kouhei Sutou kou****@clear*****
2009年 7月 31日 (金) 09:47:30 JST


須藤です。

GRN_DB_TIMEをuint64からint64にして、マイクロ秒単位で値を格納
するようにするパッチです。

GRN_TIME_USEC_PER_SECの名前はGLibからもらってきました。
GRN_TIME_PACKとGRN_TIME_UNPACKはおまけです。
# GRN_TIME_UNPACKは気持ち悪い。。。

ついでに、do_eq()やdo_compare()でもGRN_DB_TIMEが使えるように
なります。

diff --git a/groonga.h b/groonga.h
index a404746..6d57b69 100644
--- a/groonga.h
+++ b/groonga.h
@@ -1672,7 +1672,7 @@ GRN_API grn_rc grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj,
   double _val = (double)(val);\
   grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(double));\
 } while (0)
-#define GRN_TIME_SET GRN_UINT64_SET
+#define GRN_TIME_SET GRN_INT64_SET
 #define GRN_RECORD_SET(ctx,obj,val) do {\
   grn_id _val = (grn_id)(val);\
   grn_bulk_write_from((ctx), (obj), (char *)&_val, 0, sizeof(grn_id));\
@@ -1685,13 +1685,20 @@ GRN_API grn_rc grn_text_otoj(grn_ctx *ctx, grn_obj *bulk, grn_obj *obj,
 #define GRN_PTR_SET_AT(ctx,obj,offset,val)
   */
 
+#define GRN_TIME_USEC_PER_SEC 1000000
+#define GRN_TIME_PACK(sec, usec) ((sec) * GRN_TIME_USEC_PER_SEC + (usec))
+#define GRN_TIME_UNPACK(time_value, sec, usec) do {\
+  sec = (time_value) / GRN_TIME_USEC_PER_SEC;\
+  usec = (time_value) % GRN_TIME_USEC_PER_SEC;\
+} while (0)
+
 #define GRN_BOOL_VALUE(obj) (*((unsigned char *)GRN_BULK_HEAD(obj)))
 #define GRN_INT32_VALUE(obj) (*((int *)GRN_BULK_HEAD(obj)))
 #define GRN_UINT32_VALUE(obj) (*((unsigned int *)GRN_BULK_HEAD(obj)))
 #define GRN_INT64_VALUE(obj) (*((long long int *)GRN_BULK_HEAD(obj)))
 #define GRN_UINT64_VALUE(obj) (*((long long unsigned int *)GRN_BULK_HEAD(obj)))
 #define GRN_FLOAT_VALUE(obj) (*((double *)GRN_BULK_HEAD(obj)))
-#define GRN_TIME_VALUE GRN_UINT64_VALUE
+#define GRN_TIME_VALUE GRN_INT64_VALUE
 #define GRN_RECORD_VALUE(obj) (*((grn_id *)GRN_BULK_HEAD(obj)))
 #define GRN_PTR_VALUE(obj) (*((grn_obj **)GRN_BULK_HEAD(obj)))
 #define GRN_PTR_VALUE_AT(obj,offset) (((grn_obj **)GRN_BULK_HEAD(obj))[offset])
diff --git a/lib/db.c b/lib/db.c
index a30f3e7..c61648c 100644
--- a/lib/db.c
+++ b/lib/db.c
@@ -2642,10 +2642,10 @@ grn_obj_get_range(grn_ctx *ctx, grn_obj *obj)
     GRN_UINT32_SET(ctx, dest, getvalue(src));\
     break;\
   case GRN_DB_INT64 :\
+  case GRN_DB_TIME :\
     GRN_INT64_SET(ctx, dest, getvalue(src));\
     break;\
   case GRN_DB_UINT64 :\
-  case GRN_DB_TIME :\
     GRN_UINT64_SET(ctx, dest, getvalue(src));\
     break;\
   case GRN_DB_FLOAT :\
@@ -2697,10 +2697,10 @@ grn_obj_cast(grn_ctx *ctx, grn_obj *src, grn_obj *dest)
     NUM2DEST(GRN_UINT32_VALUE, grn_text_lltoa);
     break;
   case GRN_DB_INT64 :
+  case GRN_DB_TIME :
     NUM2DEST(GRN_INT64_VALUE, grn_text_lltoa);
     break;
   case GRN_DB_UINT64 :
-  case GRN_DB_TIME :
     NUM2DEST(GRN_UINT64_VALUE, grn_text_lltoa);
     break;
   case GRN_DB_FLOAT :
@@ -2717,10 +2717,10 @@ grn_obj_cast(grn_ctx *ctx, grn_obj *src, grn_obj *dest)
       TEXT2DEST(uint32_t, grn_atoui, GRN_UINT32_SET);
       break;
     case GRN_DB_INT64 :
+    case GRN_DB_TIME :
       TEXT2DEST(int64_t, grn_atoll, GRN_INT64_SET);
       break;
     case GRN_DB_UINT64 :
-    case GRN_DB_TIME :
       TEXT2DEST(int64_t, grn_atoll, GRN_UINT64_SET);
       break;
     case GRN_DB_FLOAT :
@@ -4849,7 +4849,7 @@ grn_db_init_builtin_types(grn_ctx *ctx)
                 GRN_OBJ_KEY_FLOAT, sizeof(double));
   if (!obj || DB_OBJ(obj)->id != GRN_DB_FLOAT) { return GRN_FILE_CORRUPT; }
   obj = deftype(ctx, "Time",
-                GRN_OBJ_KEY_UINT, sizeof(grn_timeval));
+                GRN_OBJ_KEY_INT, sizeof(int64_t));
   if (!obj || DB_OBJ(obj)->id != GRN_DB_TIME) { return GRN_FILE_CORRUPT; }
   obj = deftype(ctx, "ShortText",
                 GRN_OBJ_KEY_VAR_SIZE, GRN_TABLE_MAX_KEY_SIZE);
@@ -5609,10 +5609,10 @@ grn_obj_unlink(grn_ctx *ctx, grn_obj *obj)
     r = (x_ op GRN_UINT32_VALUE(y));\
     break;\
   case GRN_DB_INT64 :\
+  case GRN_DB_TIME :\
     r = (x_ op GRN_INT64_VALUE(y));\
     break;\
   case GRN_DB_UINT64 :\
-  case GRN_DB_TIME :\
     r = (x_ op GRN_UINT64_VALUE(y));\
     break;\
   case GRN_DB_FLOAT :\
@@ -5648,6 +5648,7 @@ grn_obj_unlink(grn_ctx *ctx, grn_obj *obj)
     }\
     break;\
   case GRN_DB_INT64 :\
+  case GRN_DB_TIME :\
     {\
       int64_t x_ = GRN_INT64_VALUE(x);\
       do_compare_sub(op);\
@@ -5702,10 +5703,10 @@ grn_obj_unlink(grn_ctx *ctx, grn_obj *obj)
     r = (x_ == GRN_UINT32_VALUE(y));\
     break;\
   case GRN_DB_INT64 :\
+  case GRN_DB_TIME :\
     r = (x_ == GRN_INT64_VALUE(y));\
     break;\
   case GRN_DB_UINT64 :\
-  case GRN_DB_TIME :\
     r = (x_ == GRN_UINT64_VALUE(y));\
     break;\
   case GRN_DB_FLOAT :\
@@ -5744,6 +5745,7 @@ grn_obj_unlink(grn_ctx *ctx, grn_obj *obj)
     }\
     break;\
   case GRN_DB_INT64 :\
+  case GRN_DB_TIME :\
     {\
       int64_t x_ = GRN_INT64_VALUE(x);\
       do_eq_sub;\
@@ -5766,10 +5768,10 @@ grn_obj_unlink(grn_ctx *ctx, grn_obj *obj)
         r = ((x_ <= GRN_UINT32_VALUE(y)) && (x_ >= GRN_UINT32_VALUE(y)));\
         break;\
       case GRN_DB_INT64 :\
+      case GRN_DB_TIME :\
         r = ((x_ <= GRN_INT64_VALUE(y)) && (x_ >= GRN_INT64_VALUE(y)));\
         break;\
       case GRN_DB_UINT64 :\
-      case GRN_DB_TIME :\
         r = ((x_ <= GRN_UINT64_VALUE(y)) && (x_ >= GRN_UINT64_VALUE(y)));\
         break;\
       case GRN_DB_FLOAT :\

-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード (http://www.clear-code.com/)




groonga-dev メーリングリストの案内
Back to archive index