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/)