Working select statements for know tables, with and without semi at the end
This commit is contained in:
108
manager.go
108
manager.go
@@ -61,6 +61,114 @@ func NewManager(path string) (*Manager, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (m *Manager) RunSql(sqlText string) (Table, error) {
|
||||
p := engine.NewParser(strings.NewReader(sqlText))
|
||||
stmt, err := p.Parse()
|
||||
if err != nil && !errors.Is(err, io.EOF) {
|
||||
return Table{}, err
|
||||
}
|
||||
|
||||
selectStmt, ok := stmt.(*engine.SelectStatement)
|
||||
if !ok {
|
||||
panic("HELP ITS NOT A SELECT STATMET")
|
||||
}
|
||||
|
||||
table, ok := m.GetTable(selectStmt.From)
|
||||
if !ok {
|
||||
panic("HELP TABLE NOT FOUND")
|
||||
}
|
||||
|
||||
rows, err := m.conn.Query(sqlText)
|
||||
if err != nil {
|
||||
return Table{}, err
|
||||
}
|
||||
table.Rows = make([]Row, 0)
|
||||
|
||||
if slices.Contains(selectStmt.Fields, "*") {
|
||||
for rows.Next() {
|
||||
cols := make([]any, len(table.Columns))
|
||||
|
||||
for i, column := range table.Columns {
|
||||
switch column.Type {
|
||||
case BLOB:
|
||||
cols[i] = new([]byte)
|
||||
case TEXT:
|
||||
cols[i] = new(string)
|
||||
case INTEGER:
|
||||
cols[i] = new(int)
|
||||
case REAL:
|
||||
cols[i] = new(float64)
|
||||
default:
|
||||
panic("THIS SHOULD NEVER HAPPEN, WE HIT AN UNKNOWN COLUMN.TYPE")
|
||||
}
|
||||
}
|
||||
|
||||
err = rows.Scan(cols...)
|
||||
if err != nil {
|
||||
return Table{}, err
|
||||
}
|
||||
|
||||
table.Rows = append(table.Rows, Row{
|
||||
Values: anyToStr(cols),
|
||||
})
|
||||
}
|
||||
|
||||
return table, nil
|
||||
} else {
|
||||
columns := make([]Column, len(selectStmt.Fields))
|
||||
firstTime := true
|
||||
|
||||
for rows.Next() {
|
||||
|
||||
cols := make([]any, len(selectStmt.Fields))
|
||||
|
||||
for i, s := range selectStmt.Fields {
|
||||
for _, column := range table.Columns {
|
||||
if column.Name != s {
|
||||
continue
|
||||
}
|
||||
|
||||
if firstTime {
|
||||
columns[i] = column
|
||||
}
|
||||
|
||||
switch column.Type {
|
||||
case BLOB:
|
||||
cols[i] = new([]byte)
|
||||
case TEXT:
|
||||
cols[i] = new(string)
|
||||
case INTEGER:
|
||||
cols[i] = new(int)
|
||||
case REAL:
|
||||
cols[i] = new(float64)
|
||||
default:
|
||||
panic("THIS SHOULD NEVER HAPPEN, WE HIT AN UNKNOWN COLUMN.TYPE")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
firstTime = false
|
||||
|
||||
err = rows.Scan(cols...)
|
||||
if err != nil {
|
||||
return Table{}, err
|
||||
}
|
||||
|
||||
table.Rows = append(table.Rows, Row{
|
||||
Values: anyToStr(cols),
|
||||
})
|
||||
}
|
||||
|
||||
nTable := Table{
|
||||
Name: selectStmt.From,
|
||||
Columns: columns,
|
||||
Rows: table.Rows,
|
||||
}
|
||||
|
||||
return nTable, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Manager) Start() error {
|
||||
for {
|
||||
stmt, err := m.parser.Parse()
|
||||
|
||||
Reference in New Issue
Block a user