Have the full CURD operations going, but need pagination.

main
Zed A. Shaw 4 days ago
parent 59a71534ae
commit aa3afa0d21
  1. 100
      tests/admin_test.go

@ -1,56 +1,87 @@
package tests
import (
"database/sql"
"testing"
"fmt"
"reflect"
"log"
"zedshaw.games/webapp/data"
_ "github.com/mattn/go-sqlite3"
sq "github.com/Masterminds/squirrel"
)
func SelectTable1(table string, theType reflect.Type, err error, sql_query string, args ...interface{}) (error) {
db, err := sql.Open("sqlite3", "./db.sqlite3")
defer db.Close()
func SelectTable(table string, the_type reflect.Type) ([]reflect.Value, error) {
var results []reflect.Value
sql_query, args, err := sq.Select("*").From(table).ToSql()
if err != nil { return results, err }
rows, err := db.Query(sql_query, args...)
if err != nil { log.Fatal(err) }
rows, err := data.DB.Queryx(sql_query, args...)
if err != nil { return results, err }
defer rows.Close()
for rows.Next() {
data := make([]interface{}, theType.NumField())
columns := make([]interface{}, theType.NumField())
the_data := reflect.New(the_type)
err = rows.StructScan(the_data.Interface())
if err != nil { return results, err }
for i := 0; i < len(columns); i++ {
columns[i] = &data[i]
results = append(results, the_data.Elem())
}
rows.Scan(columns...)
return results, rows.Err()
}
fmt.Println(data)
}
func Get(table string, the_type reflect.Type, id int64) (reflect.Value, error) {
sql_query, args, err := sq.Select("*").From(table).Where("id", id).ToSql()
if err != nil { return reflect.New(nil), err }
the_data := reflect.New(the_type)
err = data.DB.Get(the_data.Interface(), sql_query, args...)
return rows.Err()
// BUG: not sure if Elem or returning the reflect.New is better
return the_data.Elem(), err
}
func SelectTable2(theType reflect.Type, err error, sql_query string, args ...interface{}) (error) {
func Delete(table string, id int64) error {
sql_query, args, err := sq.Delete(table).Where("id", id).ToSql()
if err != nil { return err }
the_data := reflect.New(theType)
_, err = data.DB.Exec(sql_query, args...)
return err
}
err = data.DB.Get(the_data.Interface(), sql_query, args...)
func Update(table string, value reflect.Value) error {
builder := sq.Update(table)
type_of := value.Type()
field_num := value.NumField()
fmt.Printf("value has %d fields", field_num)
for i := 0; i < field_num; i++ {
field := value.Field(i)
tag := type_of.Field(i).Tag.Get("db")
// skip update of id to avoid replacing it
if tag == "id" { continue }
fmt.Printf("\nset %v to %v", tag, field.Interface())
builder = builder.Set(tag, field.Interface())
}
builder.Where("id", value.FieldByName("Id").Interface())
sql_query, args, err := builder.ToSql()
fmt.Println("select after says", the_data)
fmt.Println("SQL: sql_query", sql_query, args, err)
_, err = data.DB.Exec(sql_query, args...)
return err
}
func TestAdminIndexPage(t *testing.T) {
models := data.Models()
table := "user"
model := models[table]
for table, model := range models {
fmt.Printf("\n------\ntable=%s; model=%s\n", table, model.Name())
fields := reflect.VisibleFields(model)
@ -58,8 +89,29 @@ func TestAdminIndexPage(t *testing.T) {
fmt.Println("\t", field.Name, field.Type, field.Tag)
}
sql, args, err := sq.Select("*").From(table).ToSql()
err = SelectTable2(model, err, sql, args...)
all_rows, err := SelectTable(table, model)
if err != nil { fmt.Println("ERROR", err) }
}
first_row := all_rows[0]
result, err := Get(table, model, first_row.FieldByName("Id").Int())
if err != nil { fmt.Println("ERROR", err) }
fmt.Println("TABLE: ", result)
id := result.FieldByName("Id")
result, err = Get(table, model, id.Int())
if err != nil { fmt.Println("ERROR", err) }
fmt.Println("GET: ", result)
username := result.FieldByName("Username")
username.SetString("joeblow")
err = Update(table, result)
if err != nil { fmt.Println("ERROR", err) }
username.SetString("zedshaw")
err = Update(table, result)
if err != nil { fmt.Println("ERROR", err) }
// err = Delete(table, id.Int())
// if err != nil { fmt.Println("ERROR", err) }
}

Loading…
Cancel
Save