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