From 85a2dd9f13f404e329f9f4283c90ca6d7193b81f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 7 Apr 2025 09:36:52 -0300 Subject: [PATCH] parser: fix orm generic struct table type parsing (fix #24049) (#24149) --- vlib/orm/orm_generic_test.v | 46 +++++++++++++++++++++++++++++++++++++ vlib/v/parser/orm.v | 2 ++ 2 files changed, 48 insertions(+) create mode 100644 vlib/orm/orm_generic_test.v diff --git a/vlib/orm/orm_generic_test.v b/vlib/orm/orm_generic_test.v new file mode 100644 index 000000000..08ce46cfd --- /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 d6b516b99..e2884f6c7 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)) } -- 2.39.5