morit****@razil*****
morit****@razil*****
2009年 7月 31日 (金) 14:04:43 JST
森です。 ありがとうございます!! さっそく取り込ませていただきました。 >>> Kouhei Sutou さんは書きました: > 須藤です。 > > 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 mailing list > groon****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev > -- morita