null+****@clear*****
null+****@clear*****
2011年 12月 21日 (水) 18:39:22 JST
Daijiro MORI 2011-12-21 09:39:22 +0000 (Wed, 21 Dec 2011)
New Revision: d10f6b9ee1fb6721e021dc39b48aed1ed72280c5
Log:
added grn_obj_get_values()
Modified files:
include/groonga.h
lib/db.c
Modified: include/groonga.h (+16 -0)
===================================================================
--- include/groonga.h 2011-12-20 09:46:02 +0000 (1704ebe)
+++ include/groonga.h 2011-12-21 09:39:22 +0000 (af5ed49)
@@ -1416,6 +1416,22 @@ GRN_API grn_bool grn_obj_is_builtin(grn_ctx *ctx, grn_obj *obj);
GRN_API grn_obj *grn_obj_get_value(grn_ctx *ctx, grn_obj *obj, grn_id id, grn_obj *value);
/**
+ * grn_obj_get_values:
+ * @obj: 対象object
+ * @offset: 値を取得する範囲の開始位置となるレコードID
+ * @values: 値の配列がセットされる
+ *
+ * objに指定されたカラムについて、offsetに指定されたレコードIDを開始位置として、IDが連続
+ * するレコードに対応するカラム値が昇順に格納された配列へのポインタをvaluesにセットします。
+ * 取得できた件数が戻り値として返される。エラーが発生した場合は -1 が返されます。
+ * 注意: 値が固定長であるカラムのみがobjに指定できます。
+ * 範囲内のIDに対応するレコードが有効であるとは限りません。
+ * delete操作を実行したことのあるテーブルに対しては、
+ * grn_table_at()などによって各レコードの存否を別途確認しなければなりません。
+ **/
+GRN_API int grn_obj_get_values(grn_ctx *ctx, grn_obj *obj, grn_id offset, void **values);
+
+/**
* grn_obj_set_value:
* @obj: 対象object
* @id: 対象レコードのID
Modified: lib/db.c (+23 -0)
===================================================================
--- lib/db.c 2011-12-20 09:46:02 +0000 (c7c0b85)
+++ lib/db.c 2011-12-21 09:39:22 +0000 (a11d602)
@@ -5525,6 +5525,29 @@ grn_obj_set_value_o(grn_ctx *ctx, grn_obj *obj, grn_obj *id,
return grn_obj_set_value(ctx, obj, *idp, value, flags);
}
+int
+grn_obj_get_values(grn_ctx *ctx, grn_obj *obj, grn_id offset, void **values)
+{
+ int nrecords = -1;
+ GRN_API_ENTER;
+ if (obj->header.type == GRN_COLUMN_FIX_SIZE) {
+ grn_ra *ra = (grn_ra *)obj;
+ grn_obj *domain = grn_column_table(ctx, obj);
+
+table_size
+
+ void *p = grn_ra_ref(ctx, ra, offset);
+ if (p) {
+ nrecords = ra->element_mask + 1 - (offset & ra->element_mask);
+ } else {
+ ERR(GRN_NO_MEMORY_AVAILABLE, "ra get failed");
+ }
+ } else {
+ ERR(GRN_INVALID_ARGUMENT, "obj is not a fix sized column");
+ }
+ GRN_API_RETURN(nrecords);
+}
+
grn_rc
grn_column_index_update(grn_ctx *ctx, grn_obj *column,
grn_id id, unsigned int section,