1
0
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:
Delyan Angelov
2019-08-20 17:32:39 +03:00
committed by Alexander Medvednikov
parent 900df8ecf9
commit cf06faf09b
4 changed files with 202 additions and 16 deletions

View File

@ -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'