ORM fixes

pull/2997/head
Alexander Medvednikov 2019-12-05 22:31:56 +03:00
parent 79b26b1654
commit 71c0c4803f
3 changed files with 39 additions and 42 deletions

View File

@ -1,5 +1,3 @@
/*
module main
import pg
@ -12,52 +10,52 @@ struct Customer {
}
fn main() {
db := pg.connect(pg.Config{host: '127.0.0.1' user: 'myuser' dbname: 'mydb'})
db := pg.connect(pg.Config{
host: 'localhost' //'127.0.0.1'
user: 'postgres'
dbname: 'customerdb'
}) or {
println('failed to connect')
println(err)
return
}
nr_customers := db.select count from Customer
println('Total customers: $nr_customers')
// V syntax can be used to build queries
println('------------------------------------------------------------------------')
println('----------------------------------------------------------------')
bg_customers := db.select from Customer where country == 'Bulgaria' && id != 2
for customer in bg_customers {
println('$customer.country | $customer.id - $customer.name')
}
println('------------------------------------------------------------------------')
println('----------------------------------------------------------------')
ru_customers := db.select from Customer where country == 'Russia'
for customer in ru_customers {
println('$customer.country | $customer.id - $customer.name')
}
// by adding `limit 1` we tell V that there will be only one object
println('------------------------------------------------------------------------')
existing := db.select from Customer where id == 1 limit 1 or { panic(err) }
println('----------------------------------------------------------------')
existing := db.select from Customer where id == 1 limit 1 or { panic(err) }
println('Existing customer name: $existing.name')
println('Existing customer full information:')
println(existing)
println('------------------------------------------------------------------------')
q := Customer{}
for {
anon := db.select from Customer where id == 12345 && name == q.name && nr_orders > q.nr_orders limit 1 or { eprintln('No such customer. Error: $err') break }
q := Customer{}
// It's easy to handle queries that don't return any data
if anon := db.select from Customer where id == 12345 && name == q.name &&
nr_orders > q.nr_orders limit 1 {
println('Non existing customer name: $anon.name')
break
}
// TODO: insert a new customer
/*
// Insert a new customer
nc := Customer{
name: 'John Doe'
nr_orders: 10
}
db.insert(nc)
*/
}
*/
fn main() {
}

View File

@ -41,7 +41,6 @@ fn (p mut Parser) select_query(fn_ph int) string {
p.sql_params = []
if false {}
p.sql_types = []
mut q := 'select '
p.check(.key_select)
n := p.check_name()
@ -91,8 +90,8 @@ fn (p mut Parser) select_query(fn_ph int) string {
// `where` statement
if p.tok == .name && p.lit == 'where' {
p.next()
_, expr := p.tmp_expr()
p.is_sql = true
_, expr := p.tmp_expr()
p.is_sql = false
q += ' where ' + expr
}
@ -100,8 +99,8 @@ fn (p mut Parser) select_query(fn_ph int) string {
mut query_one := false
if p.tok == .name && p.lit == 'limit' {
p.next()
_, limit := p.tmp_expr()
p.is_sql = true
_, limit := p.tmp_expr()
p.is_sql = false
q += ' limit ' + limit
// `limit 1` means we are getting `?User`, not `[]User`
@ -111,7 +110,7 @@ fn (p mut Parser) select_query(fn_ph int) string {
}
println('sql query="$q"')
p.cgen.insert_before('// DEBUG_SQL prefix: $qprefix | fn_ph: $fn_ph | query: "$q" ')
if n == 'count' {
p.cgen.set_placeholder(fn_ph, 'pg__DB_q_int(')
p.gen(', tos2("$q"))')
@ -171,12 +170,12 @@ for (int i = 0; i < ${qprefix}rows.len; i++) {
')
p.cgen.resetln('${qprefix}arr_$tmp')
}
}
if n == 'count' {
return 'int'
} else if query_one {
opt_type := 'Option_$table_name'
} else if query_one {
opt_type := 'Option_$table_name'
p.cgen.typedefs << 'typedef Option $opt_type;'
p.table.register_builtin( opt_type )
return opt_type

View File

@ -19,10 +19,10 @@ struct C.PGResult { }
pub struct Config {
pub:
host string
user string
password string
dbname string
host string
user string
password string
dbname string
}
fn C.PQconnectdb(a byteptr) &C.PGconn
@ -31,17 +31,17 @@ fn C.PQgetvalue(voidptr, int, int) byteptr
fn C.PQstatus(voidptr) int
fn C.PQntuples(voidptr) int
fn C.PQnfields(voidptr) int
fn C.PQexec(voidptr) int
fn C.PQexecParams(voidptr) int
fn C.PQexec(voidptr) voidptr
fn C.PQexecParams(voidptr) voidptr
pub fn connect(config pg.Config) DB {
pub fn connect(config pg.Config) ?DB {
conninfo := 'host=$config.host user=$config.user dbname=$config.dbname'
conn:=C.PQconnectdb(conninfo.str)
conn := C.PQconnectdb(conninfo.str)
status := C.PQstatus(conn)
println("status=$status")
if status != C.CONNECTION_OK {
error_msg := C.PQerrorMessage(conn)
eprintln('Connection to a PG database failed: ' + string(error_msg))
exit(1)
return error ('Connection to a PG database failed: ' + string(error_msg))
}
return DB {conn: conn}
}