[Groonga-commit] groonga/grnxx at 5d85065 [master] Gnx: add db.SetValue().

Back to archive index

susumu.yata null+****@clear*****
Mon Apr 6 16:48:46 JST 2015


susumu.yata	2015-04-06 16:48:46 +0900 (Mon, 06 Apr 2015)

  New Revision: 5d85065c1771af768aed779d1ce2136992d13f3d
  https://github.com/groonga/grnxx/commit/5d85065c1771af768aed779d1ce2136992d13f3d

  Message:
    Gnx: add db.SetValue().

  Modified files:
    go2/gnx/gnx.cpp
    go2/gnx/gnx.go
    go2/gnx/gnx.h
    go2/gnxTest.go

  Modified: go2/gnx/gnx.cpp (+50 -1)
===================================================================
--- go2/gnx/gnx.cpp    2015-04-06 15:33:50 +0900 (c6e0607)
+++ go2/gnx/gnx.cpp    2015-04-06 16:48:46 +0900 (2da59ff)
@@ -12,7 +12,7 @@ gnx_bool gnx_insert_row(grn_ctx *ctx, const char *table_name,
   grn_obj *table = grn_ctx_get(ctx, table_name, strlen(table_name));
   if (!table) {
     *row_id = GNX_NA_INT;
-  	return GNX_NA_BOOL;
+    return GNX_NA_BOOL;
   }
   // TODO: type check.
   unsigned int key_size = 0;
@@ -31,6 +31,7 @@ gnx_bool gnx_insert_row(grn_ctx *ctx, const char *table_name,
     }
 //    case GNX_GEO_POINT: {
 //      key_size = sizeof(gnx_geo_point);
+//      break;
 //    }
     case GNX_TEXT: {
       gnx_text text = *static_cast<const gnx_text *>(key);
@@ -53,6 +54,54 @@ gnx_bool gnx_insert_row(grn_ctx *ctx, const char *table_name,
   return added ? GNX_TRUE : GNX_FALSE;
 }
 
+gnx_bool gnx_set_value(grn_ctx *ctx, const char *table_name,
+                       const char *column_name, gnx_int row_id,
+                       gnx_data_type value_type, const void *value) {
+  grn_obj *table = grn_ctx_get(ctx, table_name, strlen(table_name));
+  if (!table) {
+    return GNX_NA_BOOL;
+  }
+  grn_obj *column = grn_obj_column(
+    ctx, table, column_name, strlen(column_name));
+  if (!column) {
+    return GNX_NA_BOOL;
+  }
+  grn_obj obj;
+  switch (value_type) {
+//    case GNX_NA: {
+//      break;
+//    }
+    case GNX_INT: {
+      GRN_INT64_INIT(&obj, 0);
+      GRN_INT64_SET(ctx, &obj, *static_cast<const gnx_int *>(value));
+      break;
+    }
+    case GNX_FLOAT: {
+      GRN_FLOAT_INIT(&obj, 0);
+      GRN_FLOAT_SET(ctx, &obj, *static_cast<const gnx_float *>(value));
+      break;
+    }
+//    case GNX_GEO_POINT: {
+//      break;
+//    }
+    case GNX_TEXT: {
+      gnx_text text = *static_cast<const gnx_text *>(value);
+      GRN_TEXT_INIT(&obj, 0);
+      GRN_TEXT_SET(ctx, &obj, text.data, text.size);
+      break;
+    }
+    default: {
+      return GNX_NA_BOOL;
+    }
+  }
+  grn_rc rc = grn_obj_set_value(ctx, column, row_id, &obj, GRN_OBJ_SET);
+  GRN_OBJ_FIN(ctx, &obj);
+  if (rc != GRN_SUCCESS) {
+    return GNX_NA_BOOL;
+  }
+  return GNX_TRUE;
+}
+
 #ifdef __cplusplus
 }  // extern "C"
 #endif  // __cplusplus

  Modified: go2/gnx/gnx.go (+42 -3)
===================================================================
--- go2/gnx/gnx.go    2015-04-06 15:33:50 +0900 (4482b2d)
+++ go2/gnx/gnx.go    2015-04-06 16:48:46 +0900 (7949d81)
@@ -215,7 +215,7 @@ func CreateGroongaDB(path string) (*GroongaDB, error) {
 // Example:
 // db, dir, err := CreateTempGroonggnx.aDB("", "gnx")
 // if err != nil {
-//   log.Fatalln(err)
+//	 log.Fatalln(err)
 // }
 // defer os.RemoveAll(dir)
 // defer db.Close()
@@ -570,7 +570,7 @@ func (db *DB) hashInt(value Int) int {
 func (db *DB) hashFloat(value Float) int {
 	hasher := fnv.New32a()
 	binary.Write(hasher, binary.LittleEndian, value)
-	return  int(hasher.Sum32())
+	return int(hasher.Sum32())
 }
 
 func (db *DB) hashText(value Text) int {
@@ -1015,10 +1015,49 @@ func (db *DB) InsertRow(tableName string, key Valuer) (bool, Int, error) {
 		text := C.gnx_text{cValue, C.gnx_int(len(value))}
 		inserted = C.gnx_insert_row(
 			groongaDB.ctx, cTableName, C.GNX_TEXT, unsafe.Pointer(&text), &rowID)
+	default:
+		return false, NAInt(), fmt.Errorf("unsupported key type")
 	}
 	if inserted == C.GNX_NA_BOOL {
-		err = fmt.Errorf("gnx_insert_row() failed")
+		return false, NAInt(), fmt.Errorf("gnx_insert_row() failed")
 	}
 	rowID = ((rowID - 1) * C.gnx_int(len(db.groongaDBs))) + C.gnx_int(dbID) + 1
 	return inserted == C.GNX_TRUE, Int(rowID), err
 }
+
+func (db *DB) SetValue(tableName string, columnName string, rowID Int,
+	value Valuer) error {
+	dbID := int(rowID - 1) % len(db.groongaDBs)
+	rowID = ((rowID - 1) / Int(len(db.groongaDBs))) + 1
+	groongaDB := db.groongaDBs[dbID]
+
+	var ok C.gnx_bool
+	cTableName := C.CString(tableName)
+	defer C.free(unsafe.Pointer(cTableName))
+	cColumnName := C.CString(columnName)
+	defer C.free(unsafe.Pointer(cColumnName))
+	switch v := value.(type) {
+	case nil:
+		ok = C.gnx_set_value(groongaDB.ctx, cTableName, cColumnName,
+			C.gnx_int(rowID), C.GNX_NA, nil)
+	case Int:
+		ok = C.gnx_set_value(groongaDB.ctx, cTableName, cColumnName,
+			C.gnx_int(rowID), C.GNX_INT, unsafe.Pointer(&v))
+	case Float:
+		ok = C.gnx_set_value(groongaDB.ctx, cTableName, cColumnName,
+			C.gnx_int(rowID), C.GNX_FLOAT, unsafe.Pointer(&v))
+//	case GeoPoint:
+	case Text:
+		cValue := C.CString(string(v))
+		defer C.free(unsafe.Pointer(cValue))
+		text := C.gnx_text{cValue, C.gnx_int(len(v))}
+		ok = C.gnx_set_value(groongaDB.ctx, cTableName, cColumnName,
+			C.gnx_int(rowID), C.GNX_TEXT, unsafe.Pointer(&text))
+	default:
+		return fmt.Errorf("unsupported value type")
+	}
+	if ok != C.GNX_TRUE {
+		return fmt.Errorf("gnx_set_value() failed")
+	}
+	return nil
+}

  Modified: go2/gnx/gnx.h (+4 -0)
===================================================================
--- go2/gnx/gnx.h    2015-04-06 15:33:50 +0900 (d8fb8ee)
+++ go2/gnx/gnx.h    2015-04-06 16:48:46 +0900 (cb89a3d)
@@ -36,6 +36,10 @@ gnx_bool gnx_insert_row(grn_ctx *ctx, const char *table_name,
                         gnx_data_type key_type, const void *key,
                         gnx_int *row_id);
 
+gnx_bool gnx_set_value(grn_ctx *ctx, const char *table_name,
+                       const char *column_name, gnx_int row_id,
+                       gnx_data_type value_type, const void *value);
+
 #ifdef __cplusplus
 }  // extern "C"
 #endif  // __cplusplus

  Modified: go2/gnxTest.go (+92 -4)
===================================================================
--- go2/gnxTest.go    2015-04-06 15:33:50 +0900 (727e664)
+++ go2/gnxTest.go    2015-04-06 16:48:46 +0900 (84dd1bd)
@@ -261,7 +261,8 @@ func testC() {
 		for i, key := range keys {
 			inserted, rowID, err := db.InsertRow("Table", key)
 			if err != nil {
-				log.Fatalln("err:", err)
+				log.Println(err)
+				return
 			}
 			fmt.Printf("i: %v, key: %v, inserted: %v, rowID: %v\n",
 				i, key, inserted, rowID)
@@ -289,7 +290,8 @@ func testC() {
 		for i, key := range keys {
 			inserted, rowID, err := db.InsertRow("Table2", key)
 			if err != nil {
-				log.Fatalln("err:", err)
+				log.Println(err)
+				return
 			}
 			fmt.Printf("i: %v, key: %v, inserted: %v, rowID: %v\n",
 				i, key, inserted, rowID)
@@ -317,7 +319,8 @@ func testC() {
 		for i, key := range keys {
 			inserted, rowID, err := db.InsertRow("Table3", key)
 			if err != nil {
-				log.Fatalln("err:", err)
+				log.Println(err)
+				return
 			}
 			fmt.Printf("i: %v, key: %v, inserted: %v, rowID: %v\n",
 				i, key, inserted, rowID)
@@ -345,7 +348,8 @@ func testC() {
 		for i, key := range keys {
 			inserted, rowID, err := db.InsertRow("Table4", key)
 			if err != nil {
-				log.Fatalln("err:", err)
+				log.Println(err)
+				return
 			}
 			fmt.Printf("i: %v, key: %v, inserted: %v, rowID: %v\n",
 				i, key, inserted, rowID)
@@ -362,8 +366,92 @@ func testC() {
 	}
 }
 
+func testD() {
+	log.Println("testC()")
+
+	db, dir, err := gnx.CreateTempDB("", "gnxConsole", 3)
+	if err != nil {
+		log.Println(err)
+		return
+	}
+	defer os.RemoveAll(dir)
+	defer db.Close()
+
+	for i := 0; i < 3; i++ {
+		_, err = db.GroongaQuery(i, "table_create Table TABLE_NO_KEY")
+		if err != nil {
+			log.Println(err)
+			return
+		}
+		_, err = db.GroongaQuery(
+			i, "column_create Table Value1 COLUMN_SCALAR Int32")
+		if err != nil {
+			log.Println(err)
+			return
+		}
+		_, err = db.GroongaQuery(
+			i, "column_create Table Value2 COLUMN_SCALAR Float")
+		if err != nil {
+			log.Println(err)
+			return
+		}
+		_, err = db.GroongaQuery(
+			i, "column_create Table Value3 COLUMN_SCALAR Text")
+		if err != nil {
+			log.Println(err)
+			return
+		}
+	}
+
+	var rowIDs []gnx.Int
+	for i := 0; i < 5; i++ {
+		inserted, rowID, err := db.InsertRow("Table", nil)
+		if err != nil {
+			log.Println(err)
+			return
+		}
+		fmt.Printf("i: %v, key: %v, inserted: %v, rowID: %v\n",
+			i, nil, inserted, rowID)
+		rowIDs = append(rowIDs, rowID)
+	}
+
+	values1 := []gnx.Int{
+		gnx.Int(10), gnx.Int(20), gnx.Int(30), gnx.Int(40), gnx.Int(50)}
+	values2 := []gnx.Float{
+		gnx.Float(1.25), gnx.Float(2.5), gnx.Float(3.75),
+		gnx.Float(5.0), gnx.Float(6.25)}
+	values3 := []gnx.Text{
+		gnx.Text("Apple"), gnx.Text("Banana"), gnx.Text("Orange"),
+		gnx.Text("Pineapple"), gnx.Text("Strawberry")}
+	for i, rowID := range rowIDs {
+		if err := db.SetValue("Table", "Value1", rowID, values1[i]); err != nil {
+			log.Println(err)
+			return
+		}
+		if err := db.SetValue("Table", "Value2", rowID, values2[i]); err != nil {
+			log.Println(err)
+			return
+		}
+		if err := db.SetValue("Table", "Value3", rowID, values3[i]); err != nil {
+			log.Println(err)
+			return
+		}
+	}
+
+	command := "select Table --limit -1 --cache no"
+	for i := 0; i < 3; i++ {
+		jsonBytes, err := db.GroongaQuery(i, command)
+		if err != nil {
+			log.Println(err)
+			return
+		}
+		fmt.Printf("result[%d]: %s\n", i, string(jsonBytes))
+	}
+}
+
 func main() {
 	testA()
 	testB()
 	testC()
+	testD()
 }
-------------- next part --------------
HTML����������������������������...
Descargar 



More information about the Groonga-commit mailing list
Back to archive index