diff --git a/vlib/orm/orm_generic_test.v b/vlib/orm/orm_generic_test.v new file mode 100644 index 0000000000..08ce46cfdf --- /dev/null +++ b/vlib/orm/orm_generic_test.v @@ -0,0 +1,46 @@ +// vtest build: present_sqlite3? && !sanitize-memory-clang +import db.sqlite + +pub enum MessageStatus as u8 { + ready +} + +pub struct Message[T] { + message_id int @[primary; sql: serial] + status MessageStatus +} + +pub struct Queue[T] { + conn &sqlite.DB +} + +pub struct Queue_config { + path string + db ?sqlite.DB @[omitempty] +} + +pub fn new[T](config Queue_config) !Queue[T] { + mut conn := if db := config.db { + db + } else { + sqlite.connect(config.path) or { return error('Failed to connect to database: ${err}') } + } + mut queue := Queue[T]{ + conn: &conn + } + return queue +} + +pub fn (mut self Queue[T]) take() !Message[T] { + messages := sql self.conn { + select from Message[T] where status == MessageStatus.ready order by message_id limit 1 + } or { return error('') } + message := messages.first() + return message +} + +struct Payload {} + +fn test_main() { + _ := new[Payload](path: ':memory:')! +} diff --git a/vlib/v/parser/orm.v b/vlib/v/parser/orm.v index d6b516b99e..e2884f6c7a 100644 --- a/vlib/v/parser/orm.v +++ b/vlib/v/parser/orm.v @@ -101,6 +101,8 @@ fn (mut p Parser) sql_expr() ast.Expr { if is_count { typ = ast.int_type + } else if table_type.has_flag(.generic) { + typ = ast.new_type(p.table.find_or_register_array(table_type)).set_flag(.generic) } else { typ = ast.new_type(p.table.find_or_register_array(table_type)) }