[groonga-dev,00150] Re: GRN_DB_TIME: uint64 -> int64

Back to archive index

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




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