mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
orm: allow both integer and string arguments in db.select and db.select limit 1
This commit is contained in:

committed by
Alexander Medvednikov

parent
900df8ecf9
commit
cf06faf09b
@@ -84,7 +84,7 @@ mut:
|
||||
is_vweb bool
|
||||
is_sql bool
|
||||
sql_i int // $1 $2 $3
|
||||
sql_params string // ("select * from users where id = $1", ***"100"***)
|
||||
sql_params []string // ("select * from users where id = $1", ***"100"***)
|
||||
}
|
||||
|
||||
const (
|
||||
@@ -1400,7 +1400,7 @@ fn (p mut Parser) bterm() string {
|
||||
p.gen('$' + p.sql_i.str())
|
||||
p.cgen.start_cut()
|
||||
p.check_types(p.expression(), typ)
|
||||
p.sql_params = p.sql_params + p.cgen.cut() + ','
|
||||
p.sql_params << p.cgen.cut()
|
||||
//println('sql params = "$p.sql_params"')
|
||||
} else {
|
||||
p.check_types(p.expression(), typ)
|
||||
|
@@ -6,13 +6,27 @@ module main
|
||||
|
||||
import strings
|
||||
|
||||
fn sql_params2params_gen(sql_params []string, qprefix string) string {
|
||||
mut params_gen := ''
|
||||
for i, mparam in sql_params {
|
||||
param := mparam.trim(` `)
|
||||
if param[0].is_digit() {
|
||||
params_gen += '${qprefix}params[$i] = int_str($param).str;\n'
|
||||
}else{
|
||||
sparam := param.trim(`\'`)
|
||||
params_gen += '${qprefix}params[$i] = "$sparam";\n'
|
||||
}
|
||||
}
|
||||
return params_gen
|
||||
}
|
||||
|
||||
// `db.select from User where id == 1 && nr_bookings > 0`
|
||||
fn (p mut Parser) select_query(fn_ph int) string {
|
||||
// NB: qprefix, p.sql_i, p.sql_params SHOULD be reset for each query,
|
||||
// because we can have many queries in the _same_ scope.
|
||||
qprefix := p.get_tmp().replace('tmp','sql') + '_'
|
||||
p.sql_i = 0
|
||||
p.sql_params = ''
|
||||
p.sql_params = []string
|
||||
|
||||
mut q := 'select '
|
||||
p.check(.key_select)
|
||||
@@ -103,11 +117,7 @@ fn (p mut Parser) select_query(fn_ph int) string {
|
||||
}
|
||||
// One object
|
||||
if query_one {
|
||||
mut params_gen := ''
|
||||
params := p.sql_params.split(',')
|
||||
for i, param in params {
|
||||
params_gen += '${qprefix}params[$i] = int_str($param).str;'
|
||||
}
|
||||
mut params_gen := sql_params2params_gen( p.sql_params, qprefix )
|
||||
p.cgen.insert_before('
|
||||
|
||||
char* ${qprefix}params[$p.sql_i];
|
||||
@@ -131,12 +141,8 @@ ${obj_gen.str()}
|
||||
}
|
||||
// Array
|
||||
else {
|
||||
q += ' order by id'
|
||||
mut params_gen := ''
|
||||
params := p.sql_params.split(',')
|
||||
for i, param in params {
|
||||
params_gen += '${qprefix}params[$i] = int_str($param).str;'
|
||||
}
|
||||
q += ' order by id'
|
||||
params_gen := sql_params2params_gen( p.sql_params, qprefix )
|
||||
p.cgen.insert_before('char* ${qprefix}params[$p.sql_i];
|
||||
$params_gen
|
||||
|
||||
@@ -158,8 +164,11 @@ for (int i = 0; i < ${qprefix}rows.len; i++) {
|
||||
}
|
||||
if n == 'count' {
|
||||
return 'int'
|
||||
} else if query_one {
|
||||
return 'Option_$table_name'
|
||||
} else if query_one {
|
||||
opt_type := 'Option_$table_name'
|
||||
p.cgen.typedefs << 'typedef Option $opt_type;'
|
||||
p.table.register_type( opt_type )
|
||||
return opt_type
|
||||
} else {
|
||||
p.register_array('array_$table_name')
|
||||
return 'array_$table_name'
|
||||
|
Reference in New Issue
Block a user