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