func (m *MockCsvSource) loadTable(tableName string) error { csvRaw, ok := m.raw[tableName] if !ok { return schema.ErrNotFound } sr := strings.NewReader(csvRaw) u.Debugf("mockcsv:%p load mockcsv: %q data:%v", m, tableName, csvRaw) csvSource, _ := datasource.NewCsvSource(tableName, 0, sr, make(<-chan bool, 1)) tbl := membtree.NewStaticData(tableName) u.Infof("loaded columns %v", csvSource.Columns()) tbl.SetColumns(csvSource.Columns()) //u.Infof("set index col for %v: %v -- %v", tableName, 0, csvSource.Columns()[0]) m.tables[tableName] = tbl // Now we are going to page through the Csv rows and Put into // Static Data Source, ie copy into memory btree structure for { msg := csvSource.Next() if msg == nil { //u.Infof("table:%v len=%v", tableName, tbl.Length()) return nil } dm, ok := msg.Body().(*datasource.SqlDriverMessageMap) if !ok { return fmt.Errorf("Expected *datasource.SqlDriverMessageMap but got %T", msg.Body()) } // We don't know the Key tbl.Put(nil, nil, dm.Values()) } return nil }
func (m *csvStaticSource) Open(connInfo string) (schema.Conn, error) { if data, ok := m.testData[connInfo]; ok { sr := strings.NewReader(data) return datasource.NewCsvSource(connInfo, 0, sr, make(<-chan bool, 1)) } return nil, fmt.Errorf("not found") }
func (m *MockCsvSource) Open(connInfo string) (datasource.SourceConn, error) { if data, ok := m.data[connInfo]; ok { sr := strings.NewReader(data) u.Debugf("open mockcsv: %v", connInfo) return datasource.NewCsvSource(sr, make(<-chan bool, 1)) } u.Errorf("not found? %v", connInfo) return nil, fmt.Errorf("not found") }
func main() { if sqlText == "" { u.Errorf("You must provide a valid select query in argument: --sql=\"select ...\"") return } // load all of our built-in functions builtins.LoadAllBuiltins() // Add a custom function to the VM to make available to SQL language expr.FuncAdd("email_is_valid", EmailIsValid) // Our file source of csv's is stdin stdIn, err := os.Open("/dev/stdin") if err != nil { u.Errorf("could not open stdin? %v", err) return } // We are registering the "csv" datasource, to show that // the backend/sources can be easily created/added. This csv // reader is an example datasource that is very, very simple. exit := make(chan bool) src, _ := datasource.NewCsvSource("stdin", 0, stdIn, exit) datasource.Register("csv", src) db, err := sql.Open("qlbridge", "csv:///dev/stdin") if err != nil { panic(err.Error()) } defer db.Close() rows, err := db.Query(sqlText) if err != nil { u.Errorf("could not execute query: %v", err) return } defer rows.Close() cols, _ := rows.Columns() // this is just stupid hijinx for getting pointers for unknown len columns readCols := make([]interface{}, len(cols)) writeCols := make([]string, len(cols)) for i, _ := range writeCols { readCols[i] = &writeCols[i] } fmt.Printf("\n\nScanning through CSV: (%v)\n\n", strings.Join(cols, ",")) for rows.Next() { rows.Scan(readCols...) fmt.Println(strings.Join(writeCols, ", ")) } fmt.Println("") }