[Groonga-commit] groonga/grnxx at 26c9921 [master] Gnx: add db.InsertRow().

Zurück zum Archiv-Index

susumu.yata null+****@clear*****
Mon Apr 6 15:33:50 JST 2015


susumu.yata	2015-04-06 15:33:50 +0900 (Mon, 06 Apr 2015)

  New Revision: 26c9921b3162a43f5e1d31c6b4a3994eb2525f36
  https://github.com/groonga/grnxx/commit/26c9921b3162a43f5e1d31c6b4a3994eb2525f36

  Message:
    Gnx: add db.InsertRow().

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

  Added: go2/gnx/gnx.cpp (+58 -0) 100644
===================================================================
--- /dev/null
+++ go2/gnx/gnx.cpp    2015-04-06 15:33:50 +0900 (c6e0607)
@@ -0,0 +1,58 @@
+#include "gnx.h"
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif  // __cplusplus
+
+gnx_bool gnx_insert_row(grn_ctx *ctx, const char *table_name,
+                        gnx_data_type key_type, const void *key,
+                        gnx_int *row_id) {
+  grn_obj *table = grn_ctx_get(ctx, table_name, strlen(table_name));
+  if (!table) {
+    *row_id = GNX_NA_INT;
+  	return GNX_NA_BOOL;
+  }
+  // TODO: type check.
+  unsigned int key_size = 0;
+  switch (key_type) {
+    case GNX_NA: {
+      key = nullptr;
+      break;
+    }
+    case GNX_INT: {
+      key_size = sizeof(gnx_int);
+      break;
+    }
+    case GNX_FLOAT: {
+      key_size = sizeof(gnx_float);
+      break;
+    }
+//    case GNX_GEO_POINT: {
+//      key_size = sizeof(gnx_geo_point);
+//    }
+    case GNX_TEXT: {
+      gnx_text text = *static_cast<const gnx_text *>(key);
+      key = text.data;
+      key_size = text.size;
+      break;
+    }
+    default: {
+      *row_id = GNX_NA_INT;
+      return GNX_NA_BOOL;
+    }
+  }
+  int added;
+  grn_id id = grn_table_add(ctx, table, key, key_size, &added);
+  if (id == GRN_ID_NIL) {
+    *row_id = GNX_NA_INT;
+    return GNX_NA_BOOL;
+  }
+  *row_id = id;
+  return added ? GNX_TRUE : GNX_FALSE;
+}
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif  // __cplusplus

  Modified: go2/gnx/gnx.go (+39 -0)
===================================================================
--- go2/gnx/gnx.go    2015-04-06 11:37:15 +0900 (abe2bcf)
+++ go2/gnx/gnx.go    2015-04-06 15:33:50 +0900 (4482b2d)
@@ -1,9 +1,12 @@
 package gnx
 
 /*
+#cgo CXXFLAGS: -std=c++11
+#cgo LDFLAGS: -lgrnxx -lstdc++
 #cgo pkg-config: groonga
 #include <groonga.h>
 #include <stdlib.h>
+#include "gnx.h"
 */
 import "C"
 
@@ -983,3 +986,39 @@ func (db *DB) LoadCMap(
 		return db.loadCMap(tableName, columnarRecordsMap)
 	}
 }
+
+func (db *DB) InsertRow(tableName string, key Valuer) (bool, Int, error) {
+	dbID, err := db.selectGroongaDB(key)
+	if err != nil {
+		return false, NAInt(), err
+	}
+	groongaDB := db.groongaDBs[dbID]
+
+	var inserted C.gnx_bool
+	var rowID C.gnx_int
+	cTableName := C.CString(tableName)
+	defer C.free(unsafe.Pointer(cTableName))
+	switch value := key.(type) {
+	case nil:
+		inserted = C.gnx_insert_row(
+			groongaDB.ctx, cTableName, C.GNX_NA, nil, &rowID)
+	case Int:
+		inserted = C.gnx_insert_row(
+			groongaDB.ctx, cTableName, C.GNX_INT, unsafe.Pointer(&value), &rowID)
+	case Float:
+		inserted = C.gnx_insert_row(
+			groongaDB.ctx, cTableName, C.GNX_FLOAT, unsafe.Pointer(&value), &rowID)
+//	case GeoPoint:
+	case Text:
+		cValue := C.CString(string(value))
+		defer C.free(unsafe.Pointer(cValue))
+		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)
+	}
+	if inserted == C.GNX_NA_BOOL {
+		err = 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
+}

  Added: go2/gnx/gnx.h (+43 -0) 100644
===================================================================
--- /dev/null
+++ go2/gnx/gnx.h    2015-04-06 15:33:50 +0900 (d8fb8ee)
@@ -0,0 +1,43 @@
+#ifndef GNX_H
+#define GNX_H
+
+#include <groonga.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif  // __cplusplus
+
+typedef enum gnx_data_type {
+  GNX_NA,
+  GNX_BOOL,
+  GNX_INT,
+  GNX_FLOAT,
+  GNX_GEO_POINT,
+  GNX_TEXT
+} gnx_data_type;
+
+typedef uint8_t gnx_bool;
+typedef int64_t gnx_int;
+typedef double gnx_float;
+//typedef gnx_geo_point struct { int32_t latitude; int32_t longitude; };
+typedef struct {
+  const char *data;
+  gnx_int size;
+} gnx_text;
+
+#define GNX_TRUE ((gnx_bool)3)
+#define GNX_FALSE ((gnx_bool)0)
+
+#define GNX_NA_BOOL ((gnx_bool)1)
+#define GNX_NA_INT (((gnx_int)1) << 63)
+
+gnx_bool gnx_insert_row(grn_ctx *ctx, const char *table_name,
+                        gnx_data_type key_type, const void *key,
+                        gnx_int *row_id);
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif  // __cplusplus
+
+#endif  // GNX_H

  Modified: go2/gnxTest.go (+125 -0)
===================================================================
--- go2/gnxTest.go    2015-04-06 11:37:15 +0900 (37dd7db)
+++ go2/gnxTest.go    2015-04-06 15:33:50 +0900 (727e664)
@@ -238,7 +238,132 @@ func testB() {
 	}
 }
 
+func testC() {
+	log.Println("testC()")
+
+	db, dir, err := gnx.CreateTempDB("", "gnxConsole", 2)
+	if err != nil {
+		log.Println(err)
+		return
+	}
+	defer os.RemoveAll(dir)
+	defer db.Close()
+
+	{
+		for i := 0; i < 2; i++ {
+			_, err = db.GroongaQuery(i, "table_create Table TABLE_NO_KEY")
+			if err != nil {
+				log.Println(err)
+				return
+			}
+		}
+		keys := []gnx.Valuer{nil, nil, nil}
+		for i, key := range keys {
+			inserted, rowID, err := db.InsertRow("Table", key)
+			if err != nil {
+				log.Fatalln("err:", err)
+			}
+			fmt.Printf("i: %v, key: %v, inserted: %v, rowID: %v\n",
+				i, key, inserted, rowID)
+		}
+		command := "select Table --limit -1 --cache no"
+		for i := 0; i < 2; i++ {
+			jsonBytes, err := db.GroongaQuery(i, command)
+			if err != nil {
+				log.Println(err)
+				return
+			}
+			fmt.Printf("result[%d]: %s\n", i, string(jsonBytes))
+		}
+	}
+
+	{
+		for i := 0; i < 2; i++ {
+			_, err = db.GroongaQuery(i, "table_create Table2 TABLE_PAT_KEY Int32")
+			if err != nil {
+				log.Println(err)
+				return
+			}
+		}
+		keys := []gnx.Valuer{gnx.Int(10), gnx.Int(20), gnx.Int(30)}
+		for i, key := range keys {
+			inserted, rowID, err := db.InsertRow("Table2", key)
+			if err != nil {
+				log.Fatalln("err:", err)
+			}
+			fmt.Printf("i: %v, key: %v, inserted: %v, rowID: %v\n",
+				i, key, inserted, rowID)
+		}
+		command := "select Table2 --limit -1 --cache no"
+		for i := 0; i < 2; i++ {
+			jsonBytes, err := db.GroongaQuery(i, command)
+			if err != nil {
+				log.Println(err)
+				return
+			}
+			fmt.Printf("result[%d]: %s\n", i, string(jsonBytes))
+		}
+	}
+
+	{
+		for i := 0; i < 2; i++ {
+			_, err = db.GroongaQuery(i, "table_create Table3 TABLE_PAT_KEY Float")
+			if err != nil {
+				log.Println(err)
+				return
+			}
+		}
+		keys := []gnx.Valuer{gnx.Float(1.25), gnx.Float(2.5), gnx.Float(3.75)}
+		for i, key := range keys {
+			inserted, rowID, err := db.InsertRow("Table3", key)
+			if err != nil {
+				log.Fatalln("err:", err)
+			}
+			fmt.Printf("i: %v, key: %v, inserted: %v, rowID: %v\n",
+				i, key, inserted, rowID)
+		}
+		command := "select Table3 --limit -1 --cache no"
+		for i := 0; i < 2; i++ {
+			jsonBytes, err := db.GroongaQuery(i, command)
+			if err != nil {
+				log.Println(err)
+				return
+			}
+			fmt.Printf("result[%d]: %s\n", i, string(jsonBytes))
+		}
+	}
+
+	{
+		for i := 0; i < 2; i++ {
+			_, err = db.GroongaQuery(i, "table_create Table4 TABLE_PAT_KEY ShortText")
+			if err != nil {
+				log.Println(err)
+				return
+			}
+		}
+		keys := []gnx.Valuer{gnx.Text("cat"), gnx.Text("dog"), gnx.Text("horse")}
+		for i, key := range keys {
+			inserted, rowID, err := db.InsertRow("Table4", key)
+			if err != nil {
+				log.Fatalln("err:", err)
+			}
+			fmt.Printf("i: %v, key: %v, inserted: %v, rowID: %v\n",
+				i, key, inserted, rowID)
+		}
+		command := "select Table4 --limit -1 --cache no"
+		for i := 0; i < 2; 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()
 }
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Zurück zum Archiv-Index