// XXX: just return a Vector of map[string] string... // XXX: this is using search, then getting each individual record....very slow...try ExecuteGet below // XXX: assuming ExecuteGet proves to work, it will eventually replace this one... func (connection *Connection) Execute(query *Query) SearchResult { list := C.xtcrdb_qrysearch(query.Tyrant) list_size := int(C.xtc_listnum(list)) fmt.Printf("list size: %d\n", list_size) rows := make([]Row, list_size) for i := 0; i < list_size; i++ { pk := C.xtc_listval(list, C.int(i)) cols := C.xtcrdb_tblget(connection.Tyrant, pk) if cols != nil { var row Row row.Data = make(ColumnMap) row.Data["PKEY"] = C.GoString(pk) C.xtc_mapiterinit(cols) name := C.xtc_mapiternext2(cols) for name != nil { row.Data[C.GoString(name)] = C.GoString(C.xtc_mapget2(cols, name)) name = C.xtc_mapiternext2(cols) } rows[i] = row } } var result SearchResult result.Rows = rows result.Count = list_size return result }
func (connection *Connection) Get(primaryKey string) *ColumnMap { cols := C.xtcrdb_tblget(connection.Tyrant, C.CString(primaryKey)) if cols == nil { return nil } result := make(ColumnMap) result["PKEY"] = primaryKey C.xtc_mapiterinit(cols) name := C.xtc_mapiternext2(cols) for name != nil { result[C.GoString(name)] = C.GoString(C.xtc_mapget2(cols, name)) name = C.xtc_mapiternext2(cols) } return &result }