Navigation Menu

Skip to content

Commit

Permalink
Gnx: add db.SetValue().
Browse files Browse the repository at this point in the history
  • Loading branch information
s-yata committed Apr 6, 2015
1 parent 26c9921 commit 5d85065
Show file tree
Hide file tree
Showing 4 changed files with 188 additions and 8 deletions.
51 changes: 50 additions & 1 deletion go2/gnx/gnx.cpp
Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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
45 changes: 42 additions & 3 deletions go2/gnx/gnx.go
Expand Up @@ -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()
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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
}
4 changes: 4 additions & 0 deletions go2/gnx/gnx.h
Expand Up @@ -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
Expand Down
96 changes: 92 additions & 4 deletions go2/gnxTest.go
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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()
}

0 comments on commit 5d85065

Please sign in to comment.