diff --git a/examples/database/pg/customer.v b/examples/database/pg/customer.v index 4f62282a27..39b82ba4af 100644 --- a/examples/database/pg/customer.v +++ b/examples/database/pg/customer.v @@ -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() { - -} diff --git a/vlib/compiler/query.v b/vlib/compiler/query.v index ba7c132928..862c0d0cc2 100644 --- a/vlib/compiler/query.v +++ b/vlib/compiler/query.v @@ -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 diff --git a/vlib/pg/pg.v b/vlib/pg/pg.v index 5f7ffb12d8..ee7d34361e 100644 --- a/vlib/pg/pg.v +++ b/vlib/pg/pg.v @@ -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} }