Navigation Menu

Skip to content

Commit

Permalink
Gnx: add db.InsertRow2() and db.SetValue2().
Browse files Browse the repository at this point in the history
  • Loading branch information
s-yata committed Apr 7, 2015
1 parent dd27f1f commit 3773cef
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 0 deletions.
11 changes: 11 additions & 0 deletions go2/gnx/gnx.cpp
Expand Up @@ -14,6 +14,12 @@ gnx_bool gnx_insert_row(grn_ctx *ctx, const char *table_name,
*row_id = GNX_NA_INT;
return GNX_NA_BOOL;
}
return gnx_insert_row2(ctx, table, key_type, key, row_id);
}

gnx_bool gnx_insert_row2(grn_ctx *ctx, grn_obj *table,
gnx_data_type key_type, const void *key,
gnx_int *row_id) {
// TODO: type check.
unsigned int key_size = 0;
switch (key_type) {
Expand Down Expand Up @@ -66,6 +72,11 @@ gnx_bool gnx_set_value(grn_ctx *ctx, const char *table_name,
if (!column) {
return GNX_NA_BOOL;
}
return gnx_set_value2(ctx, column, row_id, value_type, value);
}

gnx_bool gnx_set_value2(grn_ctx *ctx, grn_obj *column, gnx_int row_id,
gnx_data_type value_type, const void *value) {
grn_obj obj;
switch (value_type) {
// case GNX_NA: {
Expand Down
140 changes: 140 additions & 0 deletions go2/gnx/gnx.go
Expand Up @@ -111,6 +111,10 @@ func (this TextVector) IsNA() bool {
return this == nil
}

func (this Text) MarshalJSON() ([]byte, error) {
return json.Marshal(string(this))
}

// -- Common --

func countColumnarRecords(columnarRecords []interface{}) (int, error) {
Expand Down Expand Up @@ -156,6 +160,14 @@ type GroongaDB struct {
ctx *C.grn_ctx
}

type GroongaTable struct {
obj *C.grn_obj
}

type GroongaColumn struct {
obj *C.grn_obj
}

var groongaInitCount = 0

func DisableGroongaInitCount() {
Expand Down Expand Up @@ -458,12 +470,42 @@ func (db *GroongaDB) loadCMap(
return db.loadC(tableName, columnNames, columnarRecords)
}

func (db *GroongaDB) findTable(tableName string) (*GroongaTable, error) {
cTableName := C.CString(tableName)
defer C.free(unsafe.Pointer(cTableName))
table := C.grn_ctx_get(db.ctx, cTableName, C.int(len(tableName)));
if table == nil {
return nil, fmt.Errorf("grn_ctx_get() failed")
}
return &GroongaTable{table}, nil
}

func (db *GroongaDB) findColumn(
table *GroongaTable, columnName string) (*GroongaColumn, error) {
cColumnName := C.CString(columnName)
defer C.free(unsafe.Pointer(cColumnName))
column := C.grn_obj_column(
db.ctx, table.obj, cColumnName, C.uint(len(columnName)))
if column == nil {
return nil, fmt.Errorf("grn_obj_column() failed")
}
return &GroongaColumn{column}, nil
}

// -- DB --

type DB struct {
groongaDBs []*GroongaDB
}

type Table struct {
groongaTables []*GroongaTable
}

type Column struct {
groongaColumns []*GroongaColumn
}

func CreateDB(path string, n int) (*DB, error) {
if n <= 0 {
return nil, fmt.Errorf("invalid parameter: n = %d", n)
Expand Down Expand Up @@ -1064,3 +1106,101 @@ func (db *DB) SetValue(tableName string, columnName string, rowID Int,
}
return nil
}

func (db *DB) FindTable(tableName string) (*Table, error) {
groongaTables := make([]*GroongaTable, len(db.groongaDBs))
for i, groongaDB := range db.groongaDBs {
groongaTable, err := groongaDB.findTable(tableName)
if err != nil {
return nil, err
}
groongaTables[i] = groongaTable
}
return &Table{groongaTables}, nil
}

func (db *DB) FindColumn(table *Table, columnName string) (*Column, error) {
groongaColumns := make([]*GroongaColumn, len(db.groongaDBs))
for i, groongaDB := range db.groongaDBs {
groongaColumn, err :=
groongaDB.findColumn(table.groongaTables[i], columnName)
if err != nil {
return nil, err
}
groongaColumns[i] = groongaColumn
}
return &Column{groongaColumns}, nil
}

func (db *DB) InsertRow2(table *Table, key Valuer) (bool, Int, error) {
dbID, err := db.selectGroongaDB(key)
if err != nil {
return false, NAInt(), err
}
groongaDB := db.groongaDBs[dbID]
groongaTable := table.groongaTables[dbID]

var inserted C.gnx_bool
var rowID C.gnx_int
switch value := key.(type) {
case nil:
inserted = C.gnx_insert_row2(groongaDB.ctx, groongaTable.obj,
C.GNX_NA, nil, &rowID)
case Int:
inserted = C.gnx_insert_row2(groongaDB.ctx, groongaTable.obj,
C.GNX_INT, unsafe.Pointer(&value), &rowID)
case Float:
inserted = C.gnx_insert_row2(groongaDB.ctx, groongaTable.obj,
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_row2(groongaDB.ctx, groongaTable.obj,
C.GNX_TEXT, unsafe.Pointer(&text), &rowID)
default:
return false, NAInt(), fmt.Errorf("unsupported key type")
}
if inserted == C.GNX_NA_BOOL {
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) SetValue2(column *Column, rowID Int, value Valuer) error {
dbID := int(rowID - 1) % len(db.groongaDBs)
rowID = ((rowID - 1) / Int(len(db.groongaDBs))) + 1
groongaDB := db.groongaDBs[dbID]
groongaColumn := column.groongaColumns[dbID]

var ok C.gnx_bool
switch v := value.(type) {
// case nil:
// ok = C.gnx_set_value2(groongaDB.ctx, groongaColumn.obj,
// C.gnx_int(rowID), C.GNX_NA, nil)
case Bool:
ok = C.gnx_set_value2(groongaDB.ctx, groongaColumn.obj,
C.gnx_int(rowID), C.GNX_BOOL, unsafe.Pointer(&v))
case Int:
ok = C.gnx_set_value2(groongaDB.ctx, groongaColumn.obj,
C.gnx_int(rowID), C.GNX_INT, unsafe.Pointer(&v))
case Float:
ok = C.gnx_set_value2(groongaDB.ctx, groongaColumn.obj,
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_value2(groongaDB.ctx, groongaColumn.obj,
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
}
5 changes: 5 additions & 0 deletions go2/gnx/gnx.h
Expand Up @@ -35,10 +35,15 @@ typedef struct {
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_insert_row2(grn_ctx *ctx, grn_obj *table,
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);
gnx_bool gnx_set_value2(grn_ctx *ctx,grn_obj *column, gnx_int row_id,
gnx_data_type value_type, const void *value);

#ifdef __cplusplus
} // extern "C"
Expand Down

0 comments on commit 3773cef

Please sign in to comment.