[Groonga-commit] groonga/groonga [master] added grn_obj_get_values()

Back to archive index

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,




Groonga-commit メーリングリストの案内
Back to archive index