From cd31c040baab50e553dc54c74ac4f22ce1d17662 Mon Sep 17 00:00:00 2001 From: thomashii Date: Thu, 3 Feb 2022 17:47:36 +0800 Subject: [PATCH 1/4] Updated ORM insert for MySQL --- packages/framework/pubspec.yaml | 6 +- packages/orm/angel_orm/example/main.dart | 10 ++- packages/orm/angel_orm/lib/angel3_orm.dart | 1 + .../angel_orm/lib/src/dialect/dialect.dart | 25 ++++++++ packages/orm/angel_orm/lib/src/query.dart | 26 +++++--- .../orm/angel_orm/lib/src/query_base.dart | 4 +- .../orm/angel_orm/lib/src/query_executor.dart | 12 +++- .../orm/angel_orm_mysql/example/main.dart | 18 ++++-- .../orm/angel_orm_mysql/example/main.g.dart | 2 +- .../angel_orm_mysql/lib/angel3_orm_mysql.dart | 63 +++++++++++++++++-- packages/orm/angel_orm_mysql/pubspec.yaml | 3 +- .../orm/angel_orm_mysql/test/all_test.dart | 2 +- packages/orm/angel_orm_mysql/test/common.dart | 14 ++--- .../test/migrations/author.sql | 2 +- .../angel_orm_mysql/test/migrations/book.sql | 2 +- .../angel_orm_mysql/test/migrations/car.sql | 2 +- .../angel_orm_mysql/test/migrations/foot.sql | 2 +- .../angel_orm_mysql/test/migrations/fruit.sql | 12 ++-- .../test/migrations/has_car.sql | 2 +- .../test/migrations/has_map.sql | 2 +- .../angel_orm_mysql/test/migrations/leg.sql | 2 +- .../angel_orm_mysql/test/migrations/numba.sql | 6 +- .../angel_orm_mysql/test/migrations/role.sql | 10 +-- .../angel_orm_mysql/test/migrations/song.sql | 8 +-- .../angel_orm_mysql/test/migrations/tree.sql | 11 ++-- .../test/migrations/unorthodox.sql | 4 +- .../angel_orm_mysql/test/migrations/user.sql | 14 ++--- .../test/migrations/user_role.sql | 12 ++-- .../test/migrations/weird_join.sql | 20 +++--- .../lib/src/orm_postgres.dart | 20 ++++-- .../lib/src/orm_postgres_pool.dart | 7 ++- 31 files changed, 226 insertions(+), 98 deletions(-) create mode 100644 packages/orm/angel_orm/lib/src/dialect/dialect.dart diff --git a/packages/framework/pubspec.yaml b/packages/framework/pubspec.yaml index 9a6af199..4ea7b9c0 100644 --- a/packages/framework/pubspec.yaml +++ b/packages/framework/pubspec.yaml @@ -35,6 +35,6 @@ dev_dependencies: io: ^1.0.0 test: ^1.17.5 lints: ^1.0.0 -dependency_overrides: - angel3_container: - path: ../container/angel_container +#dependency_overrides: +# angel3_container: +# path: ../container/angel_container diff --git a/packages/orm/angel_orm/example/main.dart b/packages/orm/angel_orm/example/main.dart index 088df150..7f175aeb 100644 --- a/packages/orm/angel_orm/example/main.dart +++ b/packages/orm/angel_orm/example/main.dart @@ -26,8 +26,9 @@ class _FakeExecutor extends QueryExecutor { @override Future> query( - String tableName, String? query, Map substitutionValues, - [returningFields = const []]) async { + String tableName, String query, Map substitutionValues, + {String returningQuery = '', + List returningFields = const []}) async { var now = DateTime.now(); print( '_FakeExecutor received query: $query and values: $substitutionValues'); @@ -40,6 +41,11 @@ class _FakeExecutor extends QueryExecutor { Future transaction(FutureOr Function(QueryExecutor) f) { throw UnsupportedError('Transactions are not supported.'); } + + final Dialect _dialect = const PostgreSQLDialect(); + + @override + Dialect get dialect => _dialect; } @orm diff --git a/packages/orm/angel_orm/lib/angel3_orm.dart b/packages/orm/angel_orm/lib/angel3_orm.dart index 91952278..9a4c39bc 100644 --- a/packages/orm/angel_orm/lib/angel3_orm.dart +++ b/packages/orm/angel_orm/lib/angel3_orm.dart @@ -13,3 +13,4 @@ export 'src/query.dart'; export 'src/relations.dart'; export 'src/union.dart'; export 'src/util.dart'; +export 'src/dialect/dialect.dart'; diff --git a/packages/orm/angel_orm/lib/src/dialect/dialect.dart b/packages/orm/angel_orm/lib/src/dialect/dialect.dart new file mode 100644 index 00000000..dd68a6d1 --- /dev/null +++ b/packages/orm/angel_orm/lib/src/dialect/dialect.dart @@ -0,0 +1,25 @@ +abstract class Dialect { + bool get cteSupport; + + bool get writableCteSupport; +} + +class MySQLDialect implements Dialect { + const MySQLDialect(); + + @override + bool get cteSupport => true; + + @override + bool get writableCteSupport => false; +} + +class PostgreSQLDialect implements Dialect { + const PostgreSQLDialect(); + + @override + bool get cteSupport => true; + + @override + bool get writableCteSupport => true; +} diff --git a/packages/orm/angel_orm/lib/src/query.dart b/packages/orm/angel_orm/lib/src/query.dart index 1e4f6e81..9529e057 100644 --- a/packages/orm/angel_orm/lib/src/query.dart +++ b/packages/orm/angel_orm/lib/src/query.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'package:angel3_orm/angel3_orm.dart'; import 'package:logging/logging.dart'; import 'annotations.dart'; @@ -298,7 +299,7 @@ abstract class Query extends QueryBase { } return ss; })); - _joins.forEach((j) { + for (var j in _joins) { var c = compiledJoins[j] = j.compile(trampoline); //if (c != null) { if (c != '') { @@ -310,7 +311,7 @@ abstract class Query extends QueryBase { f.add('NULL'); } } - }); + } } if (withFields) b.write(f.join(', ')); fromQuery ??= tableName; @@ -354,7 +355,7 @@ abstract class Query extends QueryBase { if (_joins.isEmpty) { return executor .query(tableName, sql, substitutionValues, - fields.map(adornWithTableName).toList()) + returningFields: fields.map(adornWithTableName).toList()) .then((it) => deserializeList(it)); } else { return executor.transaction((tx) async { @@ -379,14 +380,23 @@ abstract class Query extends QueryBase { if (insertion == '') { throw StateError('No values have been specified for update.'); } else { - // TODO: How to do this in a non-Postgres DB? - var returning = fields.map(adornWithTableName).join(', '); var sql = compile({}); - sql = 'WITH $tableName as ($insertion RETURNING $returning) ' + sql; + var returningSql = sql; + if (executor.dialect is PostgreSQLDialect) { + var returning = fields.map(adornWithTableName).join(', '); + sql = 'WITH $tableName as ($insertion RETURNING $returning) ' + sql; + } else if (executor.dialect is MySQLDialect) { + sql = '$insertion'; + } else { + _log.fine("Unsupported database dialect."); + } - //_log.fine("Insert Query = $sql"); + _log.fine("Insert Query = $sql"); - return executor.query(tableName, sql, substitutionValues).then((it) { + return executor + .query(tableName, sql, substitutionValues, + returningQuery: returningSql) + .then((it) { // Return SQL execution results return it.isEmpty ? Optional.empty() : deserialize(it.first); }); diff --git a/packages/orm/angel_orm/lib/src/query_base.dart b/packages/orm/angel_orm/lib/src/query_base.dart index 17a62159..e6b3aab0 100644 --- a/packages/orm/angel_orm/lib/src/query_base.dart +++ b/packages/orm/angel_orm/lib/src/query_base.dart @@ -45,11 +45,11 @@ abstract class QueryBase { List deserializeList(List> it) { var optResult = it.map(deserialize).toList(); var result = []; - optResult.forEach((element) { + for (var element in optResult) { element.ifPresent((item) { result.add(item); }); - }); + } return result; } diff --git a/packages/orm/angel_orm/lib/src/query_executor.dart b/packages/orm/angel_orm/lib/src/query_executor.dart index fac6195f..1cd95d2c 100644 --- a/packages/orm/angel_orm/lib/src/query_executor.dart +++ b/packages/orm/angel_orm/lib/src/query_executor.dart @@ -1,15 +1,23 @@ import 'dart:async'; +import '../angel3_orm.dart'; + /// An abstract interface that performs queries. /// /// This class should be implemented. abstract class QueryExecutor { const QueryExecutor(); + Dialect get dialect; + /// Executes a single query. Future> query( - String tableName, String query, Map substitutionValues, - [List returningFields = const []]); + String tableName, + String query, + Map substitutionValues, { + String returningQuery = '', + List returningFields = const [], + }); /// Enters a database transaction, performing the actions within, /// and returning the results of [f]. diff --git a/packages/orm/angel_orm_mysql/example/main.dart b/packages/orm/angel_orm_mysql/example/main.dart index e9837d77..7c371612 100644 --- a/packages/orm/angel_orm_mysql/example/main.dart +++ b/packages/orm/angel_orm_mysql/example/main.dart @@ -1,10 +1,10 @@ import 'package:angel3_migration/angel3_migration.dart'; -import 'package:angel3_model/angel3_model.dart'; import 'package:angel3_orm/angel3_orm.dart'; import 'package:angel3_orm_mysql/angel3_orm_mysql.dart'; import 'package:angel3_serialize/angel3_serialize.dart'; +//import 'package:galileo_sqljocky5/sqljocky.dart'; import 'package:logging/logging.dart'; -import 'package:galileo_sqljocky5/sqljocky.dart'; +import 'package:mysql1/mysql1.dart'; import 'package:optional/optional.dart'; part 'main.g.dart'; @@ -15,9 +15,19 @@ void main() async { ..onRecord.listen(print); var settings = ConnectionSettings( - db: 'angel_orm_test', user: 'angel_orm_test', password: 'angel_orm_test'); + host: 'localhost', + port: 3306, + db: 'orm_test', + user: 'Test', + password: 'Test123*'); var connection = await MySqlConnection.connect(settings); - var logger = Logger('angel_orm_mysql'); + + var results = await connection.query('select name, is_complete from todos'); + //await connection.close(); + + print("End"); + + var logger = Logger('orm_mysql'); var executor = MySqlExecutor(connection, logger: logger); var query = TodoQuery(); diff --git a/packages/orm/angel_orm_mysql/example/main.g.dart b/packages/orm/angel_orm_mysql/example/main.g.dart index 3261e6d2..cb28a7ab 100644 --- a/packages/orm/angel_orm_mysql/example/main.g.dart +++ b/packages/orm/angel_orm_mysql/example/main.g.dart @@ -69,7 +69,7 @@ class TodoQuery extends Query { if (row.every((x) => x == null)) return null; var model = Todo( id: row[0].toString(), - isComplete: (row[1] as bool?), + isComplete: (row[1] as int?) != 0, text: (row[2] as String?), createdAt: (row[3] as DateTime?), updatedAt: (row[4] as DateTime?)); diff --git a/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart b/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart index b13fd52c..147afaff 100644 --- a/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart +++ b/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart @@ -1,26 +1,33 @@ import 'dart:async'; import 'package:angel3_orm/angel3_orm.dart'; import 'package:logging/logging.dart'; -// import 'package:pool/pool.dart'; -import 'package:galileo_sqljocky5/public/connection/connection.dart'; -import 'package:galileo_sqljocky5/sqljocky.dart'; +import 'package:mysql1/mysql1.dart'; class MySqlExecutor extends QueryExecutor { /// An optional [Logger] to write to. final Logger? logger; - final Querier? _connection; + final MySqlConnection _connection; MySqlExecutor(this._connection, {this.logger}); + final Dialect _dialect = const MySQLDialect(); + + @override + Dialect get dialect => _dialect; + Future close() { + return _connection.close(); + /* if (_connection is MySqlConnection) { return (_connection as MySqlConnection).close(); } else { return Future.value(); } + */ } + /* Future _startTransaction() { if (_connection is Transaction) { return Future.value(_connection as Transaction?); @@ -30,7 +37,7 @@ class MySqlExecutor extends QueryExecutor { throw StateError('Connection must be transaction or connection'); } } - + @override Future> query( String tableName, String query, Map substitutionValues, @@ -69,7 +76,52 @@ class MySqlExecutor extends QueryExecutor { }); } } + */ + @override + Future> query( + String tableName, String query, Map substitutionValues, + {String returningQuery = '', + List returningFields = const []}) async { + // Change @id -> ? + for (var name in substitutionValues.keys) { + query = query.replaceAll('@$name', '?'); + } + + var params = substitutionValues.values.toList(); + + logger?.fine('Query: $query'); + logger?.fine('Values: $params'); + logger?.fine('Returning Query: $returningQuery'); + + if (returningQuery.isNotEmpty) { + // Handle insert, update and delete + // Retrieve back the inserted record + var result = await _connection.query(query, params); + query = '$returningQuery where id = ?'; + params = [result.insertId]; + } + + // Handle select + return _connection.query(query, params).then((results) { + return results.map((r) => r.toList()).toList(); + }); + } + + @override + Future transaction(FutureOr Function(QueryExecutor) f) async { + return f(this); + /* + if (_connection is! MySqlConnection) { + return await f(this); + } + + await _connection.transaction((context) async { + var executor = MySqlExecutor(context, logger: logger); + }); + */ + } + /* @override Future transaction(FutureOr Function(QueryExecutor) f) async { if (_connection is Transaction) { @@ -88,4 +140,5 @@ class MySqlExecutor extends QueryExecutor { rethrow; } } + */ } diff --git a/packages/orm/angel_orm_mysql/pubspec.yaml b/packages/orm/angel_orm_mysql/pubspec.yaml index 6371ee19..7393bc90 100644 --- a/packages/orm/angel_orm_mysql/pubspec.yaml +++ b/packages/orm/angel_orm_mysql/pubspec.yaml @@ -8,8 +8,7 @@ environment: dependencies: angel3_orm: ^4.0.0 logging: ^1.0.0 - pool: ^1.5.0 - galileo_sqljocky5: ^3.0.0 + mysql1: ^0.19.0 optional: ^6.0.0 dev_dependencies: angel3_migration: ^4.0.0 diff --git a/packages/orm/angel_orm_mysql/test/all_test.dart b/packages/orm/angel_orm_mysql/test/all_test.dart index 71673988..e7bd1f89 100644 --- a/packages/orm/angel_orm_mysql/test/all_test.dart +++ b/packages/orm/angel_orm_mysql/test/all_test.dart @@ -10,7 +10,7 @@ void main() { if (rec.stackTrace != null) print(rec.stackTrace); }); - group('postgresql', () { + group('mysql', () { group('belongsTo', () => belongsToTests(my(['author', 'book']), close: closeMy)); group( diff --git a/packages/orm/angel_orm_mysql/test/common.dart b/packages/orm/angel_orm_mysql/test/common.dart index ae3b1e36..e8afba19 100644 --- a/packages/orm/angel_orm_mysql/test/common.dart +++ b/packages/orm/angel_orm_mysql/test/common.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:angel3_orm/angel3_orm.dart'; import 'package:angel3_orm_mysql/angel3_orm_mysql.dart'; import 'package:logging/logging.dart'; -import 'package:galileo_sqljocky5/sqljocky.dart'; +import 'package:mysql1/mysql1.dart'; FutureOr Function() my(Iterable schemas) { return () => connectToMySql(schemas); @@ -14,15 +14,15 @@ Future closeMy(QueryExecutor executor) => Future connectToMySql(Iterable schemas) async { var settings = ConnectionSettings( - db: 'angel_orm_test', - user: Platform.environment['MYSQL_USERNAME'] ?? 'angel_orm_test', - password: Platform.environment['MYSQL_PASSWORD'] ?? 'angel_orm_test'); + db: 'orm_test', + host: "localhost", + user: Platform.environment['MYSQL_USERNAME'] ?? 'Test', + password: Platform.environment['MYSQL_PASSWORD'] ?? 'Test123*'); var connection = await MySqlConnection.connect(settings); - var logger = Logger('angel_orm_mysql'); + var logger = Logger('orm_mysql'); for (var s in schemas) { - await connection - .execute(await File('test/migrations/$s.sql').readAsString()); + await connection.query(await File('test/migrations/$s.sql').readAsString()); } return MySqlExecutor(connection, logger: logger); diff --git a/packages/orm/angel_orm_mysql/test/migrations/author.sql b/packages/orm/angel_orm_mysql/test/migrations/author.sql index 97f0f00f..7ae6477a 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/author.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/author.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE "authors" ( +CREATE TEMPORARY TABLE authors ( id serial PRIMARY KEY, name varchar(255) UNIQUE NOT NULL, created_at timestamp, diff --git a/packages/orm/angel_orm_mysql/test/migrations/book.sql b/packages/orm/angel_orm_mysql/test/migrations/book.sql index 925c1b1d..1cc39baa 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/book.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/book.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE "books" ( +CREATE TEMPORARY TABLE books ( id serial PRIMARY KEY, author_id int NOT NULL, partner_author_id int, diff --git a/packages/orm/angel_orm_mysql/test/migrations/car.sql b/packages/orm/angel_orm_mysql/test/migrations/car.sql index 239d285d..c27b953e 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/car.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/car.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE "cars" ( +CREATE TEMPORARY TABLE cars ( id serial PRIMARY KEY, make varchar(255) NOT NULL, description TEXT NOT NULL, diff --git a/packages/orm/angel_orm_mysql/test/migrations/foot.sql b/packages/orm/angel_orm_mysql/test/migrations/foot.sql index af8bfc1a..d25733e0 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/foot.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/foot.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE "feet" ( +CREATE TEMPORARY TABLE feet ( id serial PRIMARY KEY, leg_id int NOT NULL, n_toes int NOT NULL, diff --git a/packages/orm/angel_orm_mysql/test/migrations/fruit.sql b/packages/orm/angel_orm_mysql/test/migrations/fruit.sql index ecb6f838..88f12969 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/fruit.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/fruit.sql @@ -1,8 +1,8 @@ -CREATE TEMPORARY TABLE "fruits" ( - "id" serial, - "tree_id" int, - "common_name" varchar, - "created_at" timestamp, - "updated_at" timestamp, +CREATE TEMPORARY TABLE fruits ( + id serial, + tree_id int, + common_name varchar(255), + created_at timestamp, + updated_at timestamp, PRIMARY KEY(id) ); \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/test/migrations/has_car.sql b/packages/orm/angel_orm_mysql/test/migrations/has_car.sql index 67794aed..d4b47b42 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/has_car.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/has_car.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE "has_cars" ( +CREATE TEMPORARY TABLE has_cars ( id serial PRIMARY KEY, type int not null, created_at timestamp, diff --git a/packages/orm/angel_orm_mysql/test/migrations/has_map.sql b/packages/orm/angel_orm_mysql/test/migrations/has_map.sql index b05eec1c..046b8145 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/has_map.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/has_map.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE "has_maps" ( +CREATE TEMPORARY TABLE has_maps ( id serial PRIMARY KEY, value jsonb not null, list jsonb not null, diff --git a/packages/orm/angel_orm_mysql/test/migrations/leg.sql b/packages/orm/angel_orm_mysql/test/migrations/leg.sql index abc00d39..46b19092 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/leg.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/leg.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE "legs" ( +CREATE TEMPORARY TABLE legs ( id serial PRIMARY KEY, name varchar(255) NOT NULL, created_at timestamp, diff --git a/packages/orm/angel_orm_mysql/test/migrations/numba.sql b/packages/orm/angel_orm_mysql/test/migrations/numba.sql index 5a69fbc2..32fbc339 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/numba.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/numba.sql @@ -1,6 +1,6 @@ -CREATE TEMPORARY TABLE "numbas" ( - "i" int, - "parent" int references weird_joins(id), +CREATE TEMPORARY TABLE numbas ( + i int, + parent int, created_at TIMESTAMP, updated_at TIMESTAMP, PRIMARY KEY(i) diff --git a/packages/orm/angel_orm_mysql/test/migrations/role.sql b/packages/orm/angel_orm_mysql/test/migrations/role.sql index 5dac21f0..7eeeb950 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/role.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/role.sql @@ -1,6 +1,6 @@ -CREATE TEMPORARY TABLE "roles" ( - "id" serial PRIMARY KEY, - "name" varchar(255), - "created_at" timestamp, - "updated_at" timestamp +CREATE TEMPORARY TABLE roles ( + id serial PRIMARY KEY, + name varchar(255), + created_at timestamp, + updated_at timestamp ); \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/test/migrations/song.sql b/packages/orm/angel_orm_mysql/test/migrations/song.sql index 9683209a..98e0ebb2 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/song.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/song.sql @@ -1,7 +1,7 @@ -CREATE TEMPORARY TABLE "songs" ( - "id" serial, - "weird_join_id" int references weird_joins(id), - "title" varchar(255), +CREATE TEMPORARY TABLE songs ( + id serial, + weird_join_id int, + title varchar(255), created_at TIMESTAMP, updated_at TIMESTAMP, PRIMARY KEY(id) diff --git a/packages/orm/angel_orm_mysql/test/migrations/tree.sql b/packages/orm/angel_orm_mysql/test/migrations/tree.sql index e4ddd439..08ec4d84 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/tree.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/tree.sql @@ -1,8 +1,7 @@ -CREATE TEMPORARY TABLE "trees" ( - "id" serial, - "rings" smallint UNIQUE, - "created_at" timestamp, - "updated_at" timestamp, - UNIQUE(rings), +CREATE TEMPORARY TABLE trees ( + id serial, + rings smallint UNIQUE, + created_at timestamp, + updated_at timestamp, PRIMARY KEY(id) ); \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql b/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql index a448fdd3..fc02b49f 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE "unorthodoxes" ( - "name" varchar(255), +CREATE TEMPORARY TABLE unorthodoxes ( + name varchar(255), PRIMARY KEY(name) ); \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/test/migrations/user.sql b/packages/orm/angel_orm_mysql/test/migrations/user.sql index cdd0abbe..9b95b734 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/user.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/user.sql @@ -1,8 +1,8 @@ -CREATE TEMPORARY TABLE "users" ( - "id" serial PRIMARY KEY, - "username" varchar(255), - "password" varchar(255), - "email" varchar(255), - "created_at" timestamp, - "updated_at" timestamp +CREATE TEMPORARY TABLE users ( + id serial PRIMARY KEY, + username varchar(255), + password varchar(255), + email varchar(255), + created_at timestamp, + updated_at timestamp ); \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/test/migrations/user_role.sql b/packages/orm/angel_orm_mysql/test/migrations/user_role.sql index e4995189..cc03240c 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/user_role.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/user_role.sql @@ -1,7 +1,7 @@ -CREATE TEMPORARY TABLE "role_users" ( - "id" serial PRIMARY KEY, - "user_id" int NOT NULL, - "role_id" int NOT NULL, - "created_at" timestamp, - "updated_at" timestamp +CREATE TEMPORARY TABLE role_users ( + id serial PRIMARY KEY, + user_id int NOT NULL, + role_id int NOT NULL, + created_at timestamp, + updated_at timestamp ); \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/test/migrations/weird_join.sql b/packages/orm/angel_orm_mysql/test/migrations/weird_join.sql index fd9de7ea..9e4ceee6 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/weird_join.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/weird_join.sql @@ -1,13 +1,15 @@ -CREATE TEMPORARY TABLE "weird_joins" ( - "id" serial, - "join_name" varchar(255) references unorthodoxes(name), +CREATE TEMPORARY TABLE weird_joins ( + id serial, + join_name varchar(255), PRIMARY KEY(id) ); -CREATE TEMPORARY TABLE "foos" ( - "bar" varchar(255), + +CREATE TEMPORARY TABLE foos ( + bar varchar(255) not null UNIQUE, PRIMARY KEY(bar) ); -CREATE TEMPORARY TABLE "foo_pivots" ( - "weird_join_id" int references weird_joins(id), - "foo_bar" varchar(255) references foos(bar) -); \ No newline at end of file + +CREATE TEMPORARY TABLE foo_pivots ( + weird_join_id int, + foo_bar varchar(255) +); diff --git a/packages/orm/angel_orm_postgres/lib/src/orm_postgres.dart b/packages/orm/angel_orm_postgres/lib/src/orm_postgres.dart index 26707124..1314afec 100644 --- a/packages/orm/angel_orm_postgres/lib/src/orm_postgres.dart +++ b/packages/orm/angel_orm_postgres/lib/src/orm_postgres.dart @@ -16,6 +16,11 @@ class PostgreSqlExecutor extends QueryExecutor { this.logger = logger ?? Logger('PostgreSqlExecutor'); } + final Dialect _dialect = const PostgreSQLDialect(); + + @override + Dialect get dialect => _dialect; + /// The underlying connection. PostgreSQLExecutionContext get connection => _connection; @@ -31,8 +36,8 @@ class PostgreSqlExecutor extends QueryExecutor { @override Future query( String tableName, String query, Map substitutionValues, - [List? returningFields]) { - if (returningFields != null && returningFields.isNotEmpty) { + {String returningQuery = '', List returningFields = const []}) { + if (returningFields.isNotEmpty) { var fields = returningFields.join(', '); var returning = 'RETURNING $fields'; query = '$query $returning'; @@ -119,6 +124,11 @@ class PostgreSqlExecutorPool extends QueryExecutor { assert(size > 0, 'Connection pool cannot be empty.'); } + final Dialect _dialect = const PostgreSQLDialect(); + + @override + Dialect get dialect => _dialect; + /// Closes all connections. Future close() async { await _pool.close(); @@ -151,11 +161,11 @@ class PostgreSqlExecutorPool extends QueryExecutor { @override Future query( String tableName, String query, Map substitutionValues, - [List? returningFields]) { + {String returningQuery = '', List returningFields = const []}) { return _pool.withResource(() async { var executor = await _next(); - return executor.query( - tableName, query, substitutionValues, returningFields); + return executor.query(tableName, query, substitutionValues, + returningFields: returningFields); }); } diff --git a/packages/orm/angel_orm_postgres/lib/src/orm_postgres_pool.dart b/packages/orm/angel_orm_postgres/lib/src/orm_postgres_pool.dart index 3af1f3ff..9032e945 100644 --- a/packages/orm/angel_orm_postgres/lib/src/orm_postgres_pool.dart +++ b/packages/orm/angel_orm_postgres/lib/src/orm_postgres_pool.dart @@ -17,6 +17,11 @@ class PostgreSqlPoolExecutor extends QueryExecutor { this.logger = logger ?? Logger('PostgreSqlPoolExecutor'); } + final Dialect _dialect = const PostgreSQLDialect(); + + @override + Dialect get dialect => _dialect; + /// The underlying connection pooling. PgPool get pool => _pool; @@ -29,7 +34,7 @@ class PostgreSqlPoolExecutor extends QueryExecutor { @override Future query( String tableName, String query, Map substitutionValues, - [List returningFields = const []]) { + {String returningQuery = '', List returningFields = const []}) { if (returningFields.isNotEmpty) { var fields = returningFields.join(', '); var returning = 'RETURNING $fields'; From f28ba22bb4de1854e830b1d5220a19f1fb249513 Mon Sep 17 00:00:00 2001 From: thomashii Date: Sun, 6 Feb 2022 15:27:19 +0800 Subject: [PATCH 2/4] Fixed insert into table without primary key --- packages/orm/angel_orm/lib/src/builder.dart | 2 +- packages/orm/angel_orm/lib/src/query.dart | 57 ++++++++++--------- .../orm/angel_orm/lib/src/query_base.dart | 4 +- .../orm/angel_orm/lib/src/query_values.dart | 14 +++++ packages/orm/angel_orm/lib/src/util.dart | 18 ++++++ .../orm/angel_orm_mysql/example/main.dart | 5 -- .../angel_orm_mysql/lib/angel3_orm_mysql.dart | 24 ++++++-- packages/orm/angel_orm_mysql/test/common.dart | 13 ++++- .../angel_orm_mysql/test/migrations/numba.sql | 2 +- .../test/migrations/unorthodox.sql | 2 +- .../orm/angel_orm_mysql/test/orm_debug.dart | 21 +++++++ .../angel_orm_postgres/test/orm_debug.dart | 18 ++++++ .../lib/src/edge_case_test.dart | 28 ++++----- .../angel_orm_test/lib/src/models/car.g.dart | 5 +- 14 files changed, 151 insertions(+), 62 deletions(-) create mode 100644 packages/orm/angel_orm_mysql/test/orm_debug.dart create mode 100644 packages/orm/angel_orm_postgres/test/orm_debug.dart diff --git a/packages/orm/angel_orm/lib/src/builder.dart b/packages/orm/angel_orm/lib/src/builder.dart index 313d1257..4810987a 100644 --- a/packages/orm/angel_orm/lib/src/builder.dart +++ b/packages/orm/angel_orm/lib/src/builder.dart @@ -238,7 +238,7 @@ class StringSqlExpressionBuilder extends SqlExpressionBuilder { void like(String pattern, {String Function(String)? sanitize}) { sanitize ??= (s) => pattern; _raw = 'LIKE \'' + sanitize('@$substitution') + '\''; - query.substitutionValues[substitution] = pattern; + //query.substitutionValues[substitution] = pattern; _hasValue = true; _value = null; } diff --git a/packages/orm/angel_orm/lib/src/query.dart b/packages/orm/angel_orm/lib/src/query.dart index 9529e057..0a2a5bb6 100644 --- a/packages/orm/angel_orm/lib/src/query.dart +++ b/packages/orm/angel_orm/lib/src/query.dart @@ -2,13 +2,6 @@ import 'dart:async'; import 'package:angel3_orm/angel3_orm.dart'; import 'package:logging/logging.dart'; -import 'annotations.dart'; -import 'join_builder.dart'; -import 'order_by.dart'; -import 'query_base.dart'; -import 'query_executor.dart'; -import 'query_values.dart'; -import 'query_where.dart'; import 'package:optional/optional.dart'; /// A SQL `SELECT` query builder. @@ -71,7 +64,7 @@ abstract class Query extends QueryBase { nn++; _names[name] = nn; } else { - _names[name] = 1; + _names[name] = 0; //1; } return n == 0 ? name : '$name$n'; } @@ -381,17 +374,19 @@ abstract class Query extends QueryBase { throw StateError('No values have been specified for update.'); } else { var sql = compile({}); - var returningSql = sql; + var returningSql = ''; if (executor.dialect is PostgreSQLDialect) { var returning = fields.map(adornWithTableName).join(', '); sql = 'WITH $tableName as ($insertion RETURNING $returning) ' + sql; } else if (executor.dialect is MySQLDialect) { + var returningSelect = values?.compileInsertSelect(this, tableName); + returningSql = '$sql where $returningSelect'; sql = '$insertion'; } else { - _log.fine("Unsupported database dialect."); + throw ArgumentError("Unsupported database dialect."); } - _log.fine("Insert Query = $sql"); + _log.warning("Insert Query = $sql"); return executor .query(tableName, sql, substitutionValues, @@ -409,24 +404,30 @@ abstract class Query extends QueryBase { if (valuesClause == '') { throw StateError('No values have been specified for update.'); - } else { - updateSql.write(' $valuesClause'); - var whereClause = where?.compile(); - if (whereClause?.isNotEmpty == true) { - updateSql.write(' WHERE $whereClause'); - } - if (_limit != null) updateSql.write(' LIMIT $_limit'); - - var returning = fields.map(adornWithTableName).join(', '); - var sql = compile({}); - sql = 'WITH $tableName as ($updateSql RETURNING $returning) ' + sql; - - //_log.fine("Update Query = $sql"); - - return executor - .query(tableName, sql, substitutionValues) - .then((it) => deserializeList(it)); } + updateSql.write(' $valuesClause'); + var whereClause = where?.compile(); + if (whereClause?.isNotEmpty == true) { + updateSql.write(' WHERE $whereClause'); + } + if (_limit != null) updateSql.write(' LIMIT $_limit'); + + var returning = fields.map(adornWithTableName).join(', '); + var sql = compile({}); + var returningSql = ''; + if (executor.dialect is PostgreSQLDialect) { + sql = 'WITH $tableName as ($updateSql RETURNING $returning) ' + sql; + } else if (executor.dialect is MySQLDialect) { + returningSql = sql; + sql = '$updateSql'; + } else { + throw ArgumentError("Unsupported database dialect."); + } + //_log.fine("Update Query = $sql"); + + return executor + .query(tableName, sql, substitutionValues, returningQuery: returningSql) + .then((it) => deserializeList(it)); } Future> updateOne(QueryExecutor executor) { diff --git a/packages/orm/angel_orm/lib/src/query_base.dart b/packages/orm/angel_orm/lib/src/query_base.dart index e6b3aab0..a7e8644a 100644 --- a/packages/orm/angel_orm/lib/src/query_base.dart +++ b/packages/orm/angel_orm/lib/src/query_base.dart @@ -57,8 +57,8 @@ abstract class QueryBase { Future> get(QueryExecutor executor) async { var sql = compile({}); - //_log.fine('sql = $sql'); - //_log.fine('substitutionValues = $substitutionValues'); + print('sql = $sql'); + print('substitutionValues = $substitutionValues'); return executor.query(tableName, sql, substitutionValues).then((it) { return deserializeList(it); diff --git a/packages/orm/angel_orm/lib/src/query_values.dart b/packages/orm/angel_orm/lib/src/query_values.dart index 2b265cf4..0748dacb 100644 --- a/packages/orm/angel_orm/lib/src/query_values.dart +++ b/packages/orm/angel_orm/lib/src/query_values.dart @@ -52,6 +52,20 @@ abstract class QueryValues { return b.toString(); } + String compileInsertSelect(Query query, String tableName) { + var data = Map.from(toMap()); + + var b = StringBuffer(); + var i = 0; + + for (var entry in data.entries) { + if (i++ > 0) b.write(' AND '); + b.write('$tableName.${entry.key} = ?'); + } + + return b.toString(); + } + String compileForUpdate(Query query) { var data = toMap(); if (data.isEmpty) { diff --git a/packages/orm/angel_orm/lib/src/util.dart b/packages/orm/angel_orm/lib/src/util.dart index 939b36c8..3a4352c6 100644 --- a/packages/orm/angel_orm/lib/src/util.dart +++ b/packages/orm/angel_orm/lib/src/util.dart @@ -1,3 +1,21 @@ import 'package:charcode/ascii.dart'; bool isAscii(int ch) => ch >= $nul && ch <= $del; + +bool mapToBool(dynamic value) { + if (value is int) { + return value != 0; + } + + return value != null ? value as bool : false; +} + +String mapToText(dynamic value) { + if (value == null) { + return ''; + } + if (value is! String) { + return value.toString(); + } + return value; +} diff --git a/packages/orm/angel_orm_mysql/example/main.dart b/packages/orm/angel_orm_mysql/example/main.dart index 7c371612..e2a8d9fc 100644 --- a/packages/orm/angel_orm_mysql/example/main.dart +++ b/packages/orm/angel_orm_mysql/example/main.dart @@ -22,11 +22,6 @@ void main() async { password: 'Test123*'); var connection = await MySqlConnection.connect(settings); - var results = await connection.query('select name, is_complete from todos'); - //await connection.close(); - - print("End"); - var logger = Logger('orm_mysql'); var executor = MySqlExecutor(connection, logger: logger); diff --git a/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart b/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart index 147afaff..55334902 100644 --- a/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart +++ b/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart @@ -90,16 +90,28 @@ class MySqlExecutor extends QueryExecutor { var params = substitutionValues.values.toList(); - logger?.fine('Query: $query'); - logger?.fine('Values: $params'); - logger?.fine('Returning Query: $returningQuery'); + logger?.warning('Query: $query'); + logger?.warning('Values: $params'); + logger?.warning('Returning Query: $returningQuery'); if (returningQuery.isNotEmpty) { // Handle insert, update and delete // Retrieve back the inserted record - var result = await _connection.query(query, params); - query = '$returningQuery where id = ?'; - params = [result.insertId]; + if (query.startsWith("INSERT")) { + var result = await _connection.query(query, params); + + query = returningQuery; + logger?.warning('Result.insertId: ${result.insertId}'); + + // No primary key + //if (result.insertId != 0) { + // params = [result.insertId]; + //} + } else if (query.startsWith("UPDATE")) { + await _connection.query(query, params); + query = returningQuery; + params = []; + } } // Handle select diff --git a/packages/orm/angel_orm_mysql/test/common.dart b/packages/orm/angel_orm_mysql/test/common.dart index e8afba19..7a2111f7 100644 --- a/packages/orm/angel_orm_mysql/test/common.dart +++ b/packages/orm/angel_orm_mysql/test/common.dart @@ -17,12 +17,21 @@ Future connectToMySql(Iterable schemas) async { db: 'orm_test', host: "localhost", user: Platform.environment['MYSQL_USERNAME'] ?? 'Test', - password: Platform.environment['MYSQL_PASSWORD'] ?? 'Test123*'); + password: Platform.environment['MYSQL_PASSWORD'] ?? 'Test123*', + timeout: Duration(minutes: 10)); var connection = await MySqlConnection.connect(settings); var logger = Logger('orm_mysql'); for (var s in schemas) { - await connection.query(await File('test/migrations/$s.sql').readAsString()); + // MySQL driver does not support multiple sql queries + var data = await File('test/migrations/$s.sql').readAsString(); + var queries = data.split(";"); + for (var q in queries) { + //print("Table: [$q]"); + if (q.trim().isNotEmpty) { + await connection.query(q); + } + } } return MySqlExecutor(connection, logger: logger); diff --git a/packages/orm/angel_orm_mysql/test/migrations/numba.sql b/packages/orm/angel_orm_mysql/test/migrations/numba.sql index 32fbc339..41fe7c4d 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/numba.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/numba.sql @@ -1,5 +1,5 @@ CREATE TEMPORARY TABLE numbas ( - i int, + i int NOT NULL UNIQUE, parent int, created_at TIMESTAMP, updated_at TIMESTAMP, diff --git a/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql b/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql index fc02b49f..24eaa397 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql @@ -1,4 +1,4 @@ CREATE TEMPORARY TABLE unorthodoxes ( - name varchar(255), + name varchar(255) NOT NULL UNIQUE, PRIMARY KEY(name) ); \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/test/orm_debug.dart b/packages/orm/angel_orm_mysql/test/orm_debug.dart new file mode 100644 index 00000000..96b21778 --- /dev/null +++ b/packages/orm/angel_orm_mysql/test/orm_debug.dart @@ -0,0 +1,21 @@ +import 'package:angel3_orm_test/angel3_orm_test.dart'; +import 'package:logging/logging.dart'; + +import 'common.dart'; + +void main() async { + //hierarchicalLoggingEnabled = true; + Logger.root + ..level = Level.INFO + ..onRecord.listen(print); + //Logger.root.onRecord.listen((rec) { + // print(rec); + // if (rec.error != null) print(rec.error); + // if (rec.stackTrace != null) print(rec.stackTrace); + //}); + + belongsToTests(my(['author', 'book']), close: closeMy); + + //edgeCaseTests(my(['unorthodox', 'weird_join', 'song', 'numba']), + // close: closeMy); +} diff --git a/packages/orm/angel_orm_postgres/test/orm_debug.dart b/packages/orm/angel_orm_postgres/test/orm_debug.dart new file mode 100644 index 00000000..eac9395f --- /dev/null +++ b/packages/orm/angel_orm_postgres/test/orm_debug.dart @@ -0,0 +1,18 @@ +import 'package:angel3_orm_test/angel3_orm_test.dart'; +import 'package:logging/logging.dart'; + +import 'common.dart'; + +void main() async { + hierarchicalLoggingEnabled = true; + Logger.root + ..level = Level.ALL + ..onRecord.listen(print); + //Logger.root.onRecord.listen((rec) { + // print(rec); + // if (rec.error != null) print(rec.error); + // if (rec.stackTrace != null) print(rec.stackTrace); + //}); + + belongsToTests(pg(['author', 'book']), close: closePg); +} diff --git a/packages/orm/angel_orm_test/lib/src/edge_case_test.dart b/packages/orm/angel_orm_test/lib/src/edge_case_test.dart index 11ab1b2f..2ed01d4a 100644 --- a/packages/orm/angel_orm_test/lib/src/edge_case_test.dart +++ b/packages/orm/angel_orm_test/lib/src/edge_case_test.dart @@ -5,18 +5,20 @@ import 'models/unorthodox.dart'; void edgeCaseTests(FutureOr Function() createExecutor, {FutureOr Function(QueryExecutor)? close}) { - late QueryExecutor executor; + QueryExecutor? executor; close ??= (_) => null; setUp(() async { executor = await createExecutor(); }); - tearDown(() => close!(executor)); + tearDown(() async { + //await close!(executor!); + }); test('can create object with no id', () async { var query = UnorthodoxQuery()..values.name = 'World'; - var modelOpt = await query.insert(executor); + var modelOpt = await query.insert(executor!); expect(modelOpt.isPresent, true); modelOpt.ifPresent((model) { expect(model, Unorthodox(name: 'World')); @@ -30,7 +32,7 @@ void edgeCaseTests(FutureOr Function() createExecutor, //if (unorthodox == null) { var query = UnorthodoxQuery()..values.name = 'Hey'; - var unorthodoxOpt = await query.insert(executor); + var unorthodoxOpt = await query.insert(executor!); unorthodoxOpt.ifPresent((value) { unorthodox = value; }); @@ -39,7 +41,7 @@ void edgeCaseTests(FutureOr Function() createExecutor, test('belongs to', () async { var query = WeirdJoinQuery()..values.joinName = unorthodox!.name; - var modelOpt = await query.insert(executor); + var modelOpt = await query.insert(executor!); expect(modelOpt.isPresent, true); modelOpt.ifPresent((model) { //print(model.toJson()); @@ -55,7 +57,7 @@ void edgeCaseTests(FutureOr Function() createExecutor, setUp(() async { var wjQuery = WeirdJoinQuery()..values.joinName = unorthodox!.name; - var weirdJoinOpt = await wjQuery.insert(executor); + var weirdJoinOpt = await wjQuery.insert(executor!); //weirdJoin = (await wjQuery.insert(executor)).value; weirdJoinOpt.ifPresent((value1) async { weirdJoin = value1; @@ -63,7 +65,7 @@ void edgeCaseTests(FutureOr Function() createExecutor, ..values.weirdJoinId = value1.id ..values.title = 'Girl Blue'; - var girlBlueOpt = await gbQuery.insert(executor); + var girlBlueOpt = await gbQuery.insert(executor!); girlBlueOpt.ifPresent((value2) { girlBlue = value2; }); @@ -72,7 +74,7 @@ void edgeCaseTests(FutureOr Function() createExecutor, test('has one', () async { var query = WeirdJoinQuery()..where!.id.equals(weirdJoin!.id!); - var wjOpt = await query.getOne(executor); + var wjOpt = await query.getOne(executor!); expect(wjOpt.isPresent, true); wjOpt.ifPresent((wj) { //print(wj.toJson()); @@ -87,7 +89,7 @@ void edgeCaseTests(FutureOr Function() createExecutor, var query = NumbaQuery() ..values.parent = weirdJoin!.id ..values.i = i; - var modelObj = await query.insert(executor); + var modelObj = await query.insert(executor!); expect(modelObj.isPresent, true); modelObj.ifPresent((model) { numbas.add(model); @@ -95,7 +97,7 @@ void edgeCaseTests(FutureOr Function() createExecutor, } var query = WeirdJoinQuery()..where!.id.equals(weirdJoin!.id!); - var wjObj = await query.getOne(executor); + var wjObj = await query.getOne(executor!); expect(wjObj.isPresent, true); wjObj.ifPresent((wj) { //print(wj.toJson()); @@ -106,14 +108,14 @@ void edgeCaseTests(FutureOr Function() createExecutor, test('many to many', () async { var fooQuery = FooQuery()..values.bar = 'baz'; var fooBar = - await fooQuery.insert(executor).then((foo) => foo.value.bar); + await fooQuery.insert(executor!).then((foo) => foo.value.bar); var pivotQuery = FooPivotQuery() ..values.weirdJoinId = weirdJoin!.id ..values.fooBar = fooBar; - await pivotQuery.insert(executor); + await pivotQuery.insert(executor!); fooQuery = FooQuery()..where!.bar.equals('baz'); - var fooOpt = await fooQuery.getOne(executor); + var fooOpt = await fooQuery.getOne(executor!); expect(fooOpt.isPresent, true); fooOpt.ifPresent((foo) { //print(foo.toJson()); diff --git a/packages/orm/angel_orm_test/lib/src/models/car.g.dart b/packages/orm/angel_orm_test/lib/src/models/car.g.dart index e7329ddc..2287dd49 100644 --- a/packages/orm/angel_orm_test/lib/src/models/car.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/car.g.dart @@ -94,10 +94,9 @@ class CarQuery extends Query { createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, make: fields.contains('make') ? (row[3] as String?) : null, - description: - fields.contains('description') ? (row[4] as String?) : null, + description: fields.contains('description') ? mapToText(row[4]) : null, familyFriendly: - fields.contains('family_friendly') ? (row[5] as bool?) : null, + fields.contains('family_friendly') ? mapToBool(row[5]) : null, recalledAt: fields.contains('recalled_at') ? (row[6] as DateTime?) : null); return Optional.of(model); From f9b07b247794821138fcf860a41fd56061de81a7 Mon Sep 17 00:00:00 2001 From: thomashii Date: Mon, 7 Feb 2022 20:42:32 +0800 Subject: [PATCH 3/4] Updated ORM generator --- packages/orm/angel_migration/CHANGELOG.md | 5 ++++ packages/orm/angel_migration/README.md | 4 ++-- .../orm/angel_migration/lib/src/table.dart | 4 ++-- packages/orm/angel_migration/pubspec.yaml | 7 ++++-- .../orm/angel_migration_runner/CHANGELOG.md | 4 ++++ packages/orm/angel_migration_runner/README.md | 4 ++-- .../orm/angel_migration_runner/pubspec.yaml | 12 ++++++---- packages/orm/angel_orm/CHANGELOG.md | 5 ++++ packages/orm/angel_orm/README.md | 3 ++- packages/orm/angel_orm/lib/src/query.dart | 14 +++++++---- packages/orm/angel_orm/pubspec.yaml | 2 +- packages/orm/angel_orm_generator/CHANGELOG.md | 5 ++++ .../orm/angel_orm_generator/example/main.dart | 12 ++++++++-- .../lib/src/orm_generator.dart | 3 ++- packages/orm/angel_orm_generator/pubspec.yaml | 14 ++++++----- .../angel_orm_mysql/lib/angel3_orm_mysql.dart | 16 ++++++------- packages/orm/angel_orm_mysql/pubspec.yaml | 5 +--- .../orm/angel_orm_mysql/test/all_test.dart | 6 +++-- .../orm/angel_orm_mysql/test/orm_debug.dart | 4 ++-- .../angel_orm_test/lib/src/models/leg.g.dart | 2 +- .../lib/src/standalone_test.dart | 2 +- .../serialize/angel_serialize/CHANGELOG.md | 9 ++++++++ .../angel_serialize/lib/angel3_serialize.dart | 23 ------------------- .../serialize/angel_serialize/pubspec.yaml | 4 ++-- .../angel_serialize_generator/CHANGELOG.md | 5 ++++ .../lib/angel3_serialize_generator.dart | 1 - .../lib/build_context.dart | 1 - .../angel_serialize_generator/pubspec.yaml | 8 +++---- 28 files changed, 108 insertions(+), 76 deletions(-) diff --git a/packages/orm/angel_migration/CHANGELOG.md b/packages/orm/angel_migration/CHANGELOG.md index 9e56275d..b1005bb5 100755 --- a/packages/orm/angel_migration/CHANGELOG.md +++ b/packages/orm/angel_migration/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## 4.0.4 + +* Updated README +* Removed deprecated + ## 4.0.3 * Updated README diff --git a/packages/orm/angel_migration/README.md b/packages/orm/angel_migration/README.md index c15aa515..4b5c0e73 100755 --- a/packages/orm/angel_migration/README.md +++ b/packages/orm/angel_migration/README.md @@ -10,5 +10,5 @@ A database migration framework built for Angel3 ORM. ## Supported database * PostgreSQL version 10 or later -* MySQL 8.0 or later -* MariaDB 10.2.1 or later +* MySQL 8.0.x +* MariaDB 10.2.x diff --git a/packages/orm/angel_migration/lib/src/table.dart b/packages/orm/angel_migration/lib/src/table.dart index 084a9c62..15deb5c3 100755 --- a/packages/orm/angel_migration/lib/src/table.dart +++ b/packages/orm/angel_migration/lib/src/table.dart @@ -19,8 +19,8 @@ abstract class Table { MigrationColumn date(String name) => declare(name, ColumnType.date); - @deprecated - MigrationColumn dateTime(String name) => timeStamp(name, timezone: true); + //@deprecated + //MigrationColumn dateTime(String name) => timeStamp(name, timezone: true); MigrationColumn timeStamp(String name, {bool timezone = false}) { if (timezone != true) return declare(name, ColumnType.timeStamp); diff --git a/packages/orm/angel_migration/pubspec.yaml b/packages/orm/angel_migration/pubspec.yaml index bb365806..69fe4f0b 100755 --- a/packages/orm/angel_migration/pubspec.yaml +++ b/packages/orm/angel_migration/pubspec.yaml @@ -1,11 +1,14 @@ name: angel3_migration -version: 4.0.3 +version: 4.1.0 description: Database migration runtime for Angel3 ORM. Use this package to define schemas. homepage: https://angel3-framework.web.app/ repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel_migration environment: sdk: '>=2.12.0 <3.0.0' dependencies: - angel3_orm: ^4.0.0 + angel3_orm: ^4.1.0 dev_dependencies: lints: ^1.0.0 +dependency_overrides: + angel3_orm: + path: ../angel_orm \ No newline at end of file diff --git a/packages/orm/angel_migration_runner/CHANGELOG.md b/packages/orm/angel_migration_runner/CHANGELOG.md index a6fc43b0..39cbd741 100755 --- a/packages/orm/angel_migration_runner/CHANGELOG.md +++ b/packages/orm/angel_migration_runner/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## 4.1.2 + +* Updated README + ## 4.1.1 * Updated README diff --git a/packages/orm/angel_migration_runner/README.md b/packages/orm/angel_migration_runner/README.md index 6490ea41..9e70ff49 100755 --- a/packages/orm/angel_migration_runner/README.md +++ b/packages/orm/angel_migration_runner/README.md @@ -10,5 +10,5 @@ Command-line based database migration runner for Angel3 ORM. Supported database: * PostgreSQL version 10 or later -* MySQL 8.0 or later -* MariaDB 10.2.1 or later +* MySQL 8.0.x +* MariaDB 10.2.x diff --git a/packages/orm/angel_migration_runner/pubspec.yaml b/packages/orm/angel_migration_runner/pubspec.yaml index c9d453c6..3a24cbee 100755 --- a/packages/orm/angel_migration_runner/pubspec.yaml +++ b/packages/orm/angel_migration_runner/pubspec.yaml @@ -1,13 +1,13 @@ name: angel3_migration_runner -version: 4.1.1 +version: 4.1.2 description: Command-line based database migration runner for Angel3's ORM. homepage: https://angel3-framework.web.app/ repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel_migration_runner environment: sdk: '>=2.12.0 <3.0.0' dependencies: - angel3_migration: ^4.0.0 - angel3_orm: ^4.0.0 + angel3_migration: ^4.1.0 + angel3_orm: ^4.1.0 args: ^2.1.0 charcode: ^1.2.0 postgres: ^2.4.0 @@ -15,4 +15,8 @@ dependencies: logging: ^1.0.0 dev_dependencies: lints: ^1.0.0 - +dependency_overrides: + angel3_orm: + path: ../angel_orm + angel3_migration: + path: ../angel_migration diff --git a/packages/orm/angel_orm/CHANGELOG.md b/packages/orm/angel_orm/CHANGELOG.md index 58f1887d..f8d60f70 100644 --- a/packages/orm/angel_orm/CHANGELOG.md +++ b/packages/orm/angel_orm/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## 4.1.0 + +* Added `MySQLDialect` to handle MySQL database specific features +* Updated `insert` and `update` query to support database without writable CTE + ## 4.0.6 * Fixed multiple `orderBy` error diff --git a/packages/orm/angel_orm/README.md b/packages/orm/angel_orm/README.md index 43f12ff6..f8c32a55 100644 --- a/packages/orm/angel_orm/README.md +++ b/packages/orm/angel_orm/README.md @@ -10,6 +10,7 @@ Runtime support for Angel3 ORM. Includes a clean, database-agnostic query builde ## Supported database * PostgreSQL version 10, 11, 12, 13 and 14 -* MySQL 8.0 or later +* MariaDB 10.2.x +* MySQL 8.0.x For documentation about the ORM, see [Developer Guide](https://angel3-docs.dukefirehawk.com/guides/orm) diff --git a/packages/orm/angel_orm/lib/src/query.dart b/packages/orm/angel_orm/lib/src/query.dart index 0a2a5bb6..b96f359e 100644 --- a/packages/orm/angel_orm/lib/src/query.dart +++ b/packages/orm/angel_orm/lib/src/query.dart @@ -343,7 +343,7 @@ abstract class Query extends QueryBase { Future> delete(QueryExecutor executor) { var sql = compile({}, preamble: 'DELETE', withFields: false); - //_log.fine("Delete Query = $sql"); + //_log.warning("Delete Query = $sql"); if (_joins.isEmpty) { return executor @@ -379,14 +379,20 @@ abstract class Query extends QueryBase { var returning = fields.map(adornWithTableName).join(', '); sql = 'WITH $tableName as ($insertion RETURNING $returning) ' + sql; } else if (executor.dialect is MySQLDialect) { - var returningSelect = values?.compileInsertSelect(this, tableName); - returningSql = '$sql where $returningSelect'; + // Default to using 'id' as primary key in model + if (fields.contains("id")) { + returningSql = '$sql where $tableName.id=?'; + } else { + var returningSelect = values?.compileInsertSelect(this, tableName); + returningSql = '$sql where $returningSelect'; + } + sql = '$insertion'; } else { throw ArgumentError("Unsupported database dialect."); } - _log.warning("Insert Query = $sql"); + //_log.warning("Insert Query = $sql"); return executor .query(tableName, sql, substitutionValues, diff --git a/packages/orm/angel_orm/pubspec.yaml b/packages/orm/angel_orm/pubspec.yaml index 5f2b1d13..860f8b12 100644 --- a/packages/orm/angel_orm/pubspec.yaml +++ b/packages/orm/angel_orm/pubspec.yaml @@ -1,5 +1,5 @@ name: angel3_orm -version: 4.0.6 +version: 4.1.0 description: Runtime support for Angel3 ORM. Includes base classes for queries. homepage: https://angel3-framework.web.app/ repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel_orm diff --git a/packages/orm/angel_orm_generator/CHANGELOG.md b/packages/orm/angel_orm_generator/CHANGELOG.md index d9447e1a..3eb98587 100644 --- a/packages/orm/angel_orm_generator/CHANGELOG.md +++ b/packages/orm/angel_orm_generator/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## 5.0.0 + +* Updated `analyzer` to version 3.x +* Updated min SDK to 2.14.x + ## 4.3.0 * Added `where.raw()` diff --git a/packages/orm/angel_orm_generator/example/main.dart b/packages/orm/angel_orm_generator/example/main.dart index 434ad9f1..cc2e1b7e 100644 --- a/packages/orm/angel_orm_generator/example/main.dart +++ b/packages/orm/angel_orm_generator/example/main.dart @@ -21,8 +21,12 @@ class _FakeExecutor extends QueryExecutor { @override Future> query( - String tableName, String? query, Map substitutionValues, - [returningFields = const []]) async { + String tableName, + String? query, + Map substitutionValues, { + String returningQuery = '', + List returningFields = const [], + }) async { var now = DateTime.now(); print( '_FakeExecutor received query: $query and values: $substitutionValues'); @@ -35,6 +39,10 @@ class _FakeExecutor extends QueryExecutor { Future transaction(FutureOr Function(QueryExecutor) f) { throw UnsupportedError('Transactions are not supported.'); } + + @override + // TODO: implement dialect + Dialect get dialect => PostgreSQLDialect(); } @orm diff --git a/packages/orm/angel_orm_generator/lib/src/orm_generator.dart b/packages/orm/angel_orm_generator/lib/src/orm_generator.dart index eb75ef9b..0d6dd376 100644 --- a/packages/orm/angel_orm_generator/lib/src/orm_generator.dart +++ b/packages/orm/angel_orm_generator/lib/src/orm_generator.dart @@ -110,7 +110,8 @@ class OrmGenerator extends GeneratorForAnnotation { var type = ctx.columns[field.name]?.type; if (type == null) continue; if (floatTypes.contains(type)) { - args[name] = literalString('text'); + //args[name] = literalString('text'); + args[name] = literalString('char'); } } diff --git a/packages/orm/angel_orm_generator/pubspec.yaml b/packages/orm/angel_orm_generator/pubspec.yaml index e3b9451a..84914431 100644 --- a/packages/orm/angel_orm_generator/pubspec.yaml +++ b/packages/orm/angel_orm_generator/pubspec.yaml @@ -1,16 +1,16 @@ name: angel3_orm_generator -version: 4.3.0 +version: 5.0.0 description: Code generators for Angel3 ORM. Generates query builder classes. homepage: https://angel3-framework.web.app/ repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel_orm_generator environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=2.14.0 <3.0.0' dependencies: - analyzer: ^2.0.0 + analyzer: ^3.0.0 angel3_model: ^3.0.0 angel3_serialize: ^4.0.0 - angel3_orm: ^4.0.0 - angel3_serialize_generator: ^4.0.0 + angel3_orm: ^4.1.0 + angel3_serialize_generator: ^5.0.0 inflection3: ^0.5.3+1 build: ^2.0.1 build_config: ^1.0.0 @@ -25,7 +25,7 @@ dependencies: optional: ^6.0.0 dev_dependencies: angel3_framework: ^4.2.0 - angel3_migration: ^4.0.0 + angel3_migration: ^4.1.0 build_runner: ^2.0.1 postgres: ^2.4.0 test: ^1.17.3 @@ -35,4 +35,6 @@ dependency_overrides: path: ../angel_orm angel3_migration: path: ../angel_migration + angel3_serialize_generator: + path: ../../serialize/angel_serialize_generator \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart b/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart index 55334902..914068ec 100644 --- a/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart +++ b/packages/orm/angel_orm_mysql/lib/angel3_orm_mysql.dart @@ -90,9 +90,9 @@ class MySqlExecutor extends QueryExecutor { var params = substitutionValues.values.toList(); - logger?.warning('Query: $query'); - logger?.warning('Values: $params'); - logger?.warning('Returning Query: $returningQuery'); + //logger?.warning('Query: $query'); + //logger?.warning('Values: $params'); + //logger?.warning('Returning Query: $returningQuery'); if (returningQuery.isNotEmpty) { // Handle insert, update and delete @@ -101,12 +101,12 @@ class MySqlExecutor extends QueryExecutor { var result = await _connection.query(query, params); query = returningQuery; - logger?.warning('Result.insertId: ${result.insertId}'); - - // No primary key + //logger?.warning('Result.insertId: ${result.insertId}'); + // Has primary key //if (result.insertId != 0) { - // params = [result.insertId]; - //} + if (returningQuery.endsWith('.id=?')) { + params = [result.insertId]; + } } else if (query.startsWith("UPDATE")) { await _connection.query(query, params); query = returningQuery; diff --git a/packages/orm/angel_orm_mysql/pubspec.yaml b/packages/orm/angel_orm_mysql/pubspec.yaml index 7393bc90..bc30de7c 100644 --- a/packages/orm/angel_orm_mysql/pubspec.yaml +++ b/packages/orm/angel_orm_mysql/pubspec.yaml @@ -11,11 +11,8 @@ dependencies: mysql1: ^0.19.0 optional: ^6.0.0 dev_dependencies: - angel3_migration: ^4.0.0 - angel3_orm_generator: ^4.0.0 - build_runner: ^2.0.0 - test: ^1.17.0 angel3_orm_test: ^3.0.0 + test: ^1.17.0 lints: ^1.0.0 dependency_overrides: angel3_orm_test: diff --git a/packages/orm/angel_orm_mysql/test/all_test.dart b/packages/orm/angel_orm_mysql/test/all_test.dart index e7bd1f89..57849fd9 100644 --- a/packages/orm/angel_orm_mysql/test/all_test.dart +++ b/packages/orm/angel_orm_mysql/test/all_test.dart @@ -20,8 +20,10 @@ void main() { group('enumAndNested', () => enumAndNestedTests(my(['has_car']), close: closeMy)); group('hasMany', () => hasManyTests(my(['tree', 'fruit']), close: closeMy)); - group('hasMap', () => hasMapTests(my(['has_map']), close: closeMy)); - group('hasOne', () => hasOneTests(my(['leg', 'foot']), close: closeMy)); + // NOTE: MySQL/MariaDB do not support jsonb data type + //group('hasMap', () => hasMapTests(my(['has_map']), close: closeMy)); + // NOTE: mysql1 driver do not support CAST(); + //group('hasOne', () => hasOneTests(my(['leg', 'foot']), close: closeMy)); group( 'manyToMany', () => diff --git a/packages/orm/angel_orm_mysql/test/orm_debug.dart b/packages/orm/angel_orm_mysql/test/orm_debug.dart index 96b21778..7ceeadf9 100644 --- a/packages/orm/angel_orm_mysql/test/orm_debug.dart +++ b/packages/orm/angel_orm_mysql/test/orm_debug.dart @@ -16,6 +16,6 @@ void main() async { belongsToTests(my(['author', 'book']), close: closeMy); - //edgeCaseTests(my(['unorthodox', 'weird_join', 'song', 'numba']), - // close: closeMy); + //hasOneTests(my(['leg', 'foot']), close: closeMy); + //standaloneTests(my(['car']), close: closeMy); } diff --git a/packages/orm/angel_orm_test/lib/src/models/leg.g.dart b/packages/orm/angel_orm_test/lib/src/models/leg.g.dart index e2d692dc..1110200f 100644 --- a/packages/orm/angel_orm_test/lib/src/models/leg.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/leg.g.dart @@ -203,7 +203,7 @@ class FootQuery extends Query { @override Map get casts { - return {'n_toes': 'text'}; + return {'n_toes': 'char'}; } @override diff --git a/packages/orm/angel_orm_test/lib/src/standalone_test.dart b/packages/orm/angel_orm_test/lib/src/standalone_test.dart index f947ac9c..fee387d5 100644 --- a/packages/orm/angel_orm_test/lib/src/standalone_test.dart +++ b/packages/orm/angel_orm_test/lib/src/standalone_test.dart @@ -77,7 +77,7 @@ void standaloneTests(FutureOr Function() createExecutor, var sportsCars = CarQuery()..where!.familyFriendly.isFalse; cars = await sportsCars.get(executor!); - //print(cars.map((c) => c.toJson())); + print(cars.map((c) => c.toJson())); var car = cars.first; expect(car.make, ferrari!.make); diff --git a/packages/serialize/angel_serialize/CHANGELOG.md b/packages/serialize/angel_serialize/CHANGELOG.md index 24f559a4..d59da367 100644 --- a/packages/serialize/angel_serialize/CHANGELOG.md +++ b/packages/serialize/angel_serialize/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 5.0.0 + +* Updated `analyzer` to version 3.x +* Updated min SDK to 2.14.x + +## 4.1.1 + +* Removed deprecated + ## 4.1.0 * Updated README diff --git a/packages/serialize/angel_serialize/lib/angel3_serialize.dart b/packages/serialize/angel_serialize/lib/angel3_serialize.dart index 6b20dbba..cf0fa14a 100644 --- a/packages/serialize/angel_serialize/lib/angel3_serialize.dart +++ b/packages/serialize/angel_serialize/lib/angel3_serialize.dart @@ -87,8 +87,6 @@ class Serializable { const Serializable( {this.serializers = const [Serializers.map, Serializers.json], this.autoSnakeCaseNames = true, - // ignore: deprecated_member_use_from_same_package - //@deprecated this.autoIdAndDateFields = true, this.includeAnnotations = const []}); /// A list of enabled serialization modes. @@ -99,10 +97,6 @@ class Serializable { /// Overrides the setting in `SerializerGenerator`. final bool autoSnakeCaseNames; - /// Overrides the setting in `JsonModelGenerator`. - //@deprecated - //final bool autoIdAndDateFields; - /// A list of constant members to affix to the generated class. final List includeAnnotations; } @@ -130,20 +124,3 @@ abstract class Serializers { /// Generate a TypeScript definition file (`.d.ts`) for use on the client-side. static const int typescript = 2; } - -/* -@deprecated -class DefaultValue { - final value; - - const DefaultValue(this.value); -} - -@deprecated -/// Prefer [SerializableField] instead. -class Alias { - final String name; - - const Alias(this.name); -} -*/ \ No newline at end of file diff --git a/packages/serialize/angel_serialize/pubspec.yaml b/packages/serialize/angel_serialize/pubspec.yaml index aa52f752..9a853785 100644 --- a/packages/serialize/angel_serialize/pubspec.yaml +++ b/packages/serialize/angel_serialize/pubspec.yaml @@ -1,8 +1,8 @@ name: angel3_serialize -version: 4.1.0 +version: 4.1.1 description: Static annotations powering Angel3 model serialization. Combine with angel3_serialize_generator for flexible modeling. homepage: https://angel3-framework.web.app/ -repository: https://github.com/dukefirehawk/angel/tree/angel3/packages/serialize/angel_serialize +repository: https://github.com/dukefirehawk/angel/tree/master/packages/serialize/angel_serialize environment: sdk: '>=2.12.0 <3.0.0' dependencies: diff --git a/packages/serialize/angel_serialize_generator/CHANGELOG.md b/packages/serialize/angel_serialize_generator/CHANGELOG.md index 481f155b..a4991c69 100644 --- a/packages/serialize/angel_serialize_generator/CHANGELOG.md +++ b/packages/serialize/angel_serialize_generator/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## 5.0.0 + +* Updated `analyzer` to version 3.x +* Updated min SDK to 2.14.x + ## 4.3.0 * Updated to use `package:belatuk_code_buffer` diff --git a/packages/serialize/angel_serialize_generator/lib/angel3_serialize_generator.dart b/packages/serialize/angel_serialize_generator/lib/angel3_serialize_generator.dart index fdd1cf29..01ea5ed8 100644 --- a/packages/serialize/angel_serialize_generator/lib/angel3_serialize_generator.dart +++ b/packages/serialize/angel_serialize_generator/lib/angel3_serialize_generator.dart @@ -7,7 +7,6 @@ import 'package:analyzer/dart/constant/value.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/type.dart'; -import 'package:angel3_model/angel3_model.dart'; import 'package:angel3_serialize/angel3_serialize.dart'; import 'package:build/build.dart'; import 'package:belatuk_code_buffer/belatuk_code_buffer.dart'; diff --git a/packages/serialize/angel_serialize_generator/lib/build_context.dart b/packages/serialize/angel_serialize_generator/lib/build_context.dart index 2dc8e268..c7dbfb8d 100644 --- a/packages/serialize/angel_serialize_generator/lib/build_context.dart +++ b/packages/serialize/angel_serialize_generator/lib/build_context.dart @@ -5,7 +5,6 @@ import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/src/dart/element/element.dart'; import 'package:angel3_serialize/angel3_serialize.dart'; import 'package:build/build.dart'; -import 'package:meta/meta.dart'; import 'package:path/path.dart' as p; import 'package:recase/recase.dart'; import 'package:source_gen/source_gen.dart'; diff --git a/packages/serialize/angel_serialize_generator/pubspec.yaml b/packages/serialize/angel_serialize_generator/pubspec.yaml index 824634ba..7fa5b0a7 100644 --- a/packages/serialize/angel_serialize_generator/pubspec.yaml +++ b/packages/serialize/angel_serialize_generator/pubspec.yaml @@ -1,12 +1,12 @@ name: angel3_serialize_generator -version: 4.3.0 +version: 5.0.0 description: Angel3 model serialization generators, designed for use with Angel. Combine with angel_serialize for flexible modeling. homepage: https://angel3-framework.web.app/ -repository: https://github.com/dukefirehawk/angel/tree/angel3/packages/serialize/angel_serialize_generator +repository: https://github.com/dukefirehawk/angel/tree/master/packages/serialize/angel_serialize_generator environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=2.14.0 <3.0.0' dependencies: - analyzer: ^2.0.0 + analyzer: ^3.0.0 angel3_model: ^3.0.0 angel3_serialize: ^4.1.0 belatuk_code_buffer: ^3.0.0 From 02350397196c949236f4923c6b473fa4bb24a696 Mon Sep 17 00:00:00 2001 From: thomashii Date: Sun, 13 Feb 2022 21:01:10 +0800 Subject: [PATCH 4/4] Updated pubspec --- packages/orm/angel_orm_mysql/pubspec.yaml | 2 +- packages/orm/angel_orm_postgres/pubspec.yaml | 4 +++- packages/orm/angel_orm_test/lib/src/models/car.g.dart | 5 +++-- .../orm/angel_orm_test/lib/src/models/person_order.g.dart | 4 ++-- packages/orm/angel_orm_test/pubspec.yaml | 8 +++++--- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/orm/angel_orm_mysql/pubspec.yaml b/packages/orm/angel_orm_mysql/pubspec.yaml index bc30de7c..49abe095 100644 --- a/packages/orm/angel_orm_mysql/pubspec.yaml +++ b/packages/orm/angel_orm_mysql/pubspec.yaml @@ -6,7 +6,7 @@ repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel environment: sdk: '>=2.12.0 <3.0.0' dependencies: - angel3_orm: ^4.0.0 + angel3_orm: ^4.1.0 logging: ^1.0.0 mysql1: ^0.19.0 optional: ^6.0.0 diff --git a/packages/orm/angel_orm_postgres/pubspec.yaml b/packages/orm/angel_orm_postgres/pubspec.yaml index f682fc88..8a17103b 100644 --- a/packages/orm/angel_orm_postgres/pubspec.yaml +++ b/packages/orm/angel_orm_postgres/pubspec.yaml @@ -6,7 +6,7 @@ repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel environment: sdk: '>=2.12.0 <3.0.0' dependencies: - angel3_orm: ^4.0.0 + angel3_orm: ^4.1.0 logging: ^1.0.1 pool: ^1.5.0 postgres: ^2.4.1 @@ -21,3 +21,5 @@ dependency_overrides: path: ../angel_orm_test angel3_orm: path: ../angel_orm + angel3_migration: + path: ../angel_migration diff --git a/packages/orm/angel_orm_test/lib/src/models/car.g.dart b/packages/orm/angel_orm_test/lib/src/models/car.g.dart index 2287dd49..e7329ddc 100644 --- a/packages/orm/angel_orm_test/lib/src/models/car.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/car.g.dart @@ -94,9 +94,10 @@ class CarQuery extends Query { createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, make: fields.contains('make') ? (row[3] as String?) : null, - description: fields.contains('description') ? mapToText(row[4]) : null, + description: + fields.contains('description') ? (row[4] as String?) : null, familyFriendly: - fields.contains('family_friendly') ? mapToBool(row[5]) : null, + fields.contains('family_friendly') ? (row[5] as bool?) : null, recalledAt: fields.contains('recalled_at') ? (row[6] as DateTime?) : null); return Optional.of(model); diff --git a/packages/orm/angel_orm_test/lib/src/models/person_order.g.dart b/packages/orm/angel_orm_test/lib/src/models/person_order.g.dart index cac1ac5f..8dddf199 100644 --- a/packages/orm/angel_orm_test/lib/src/models/person_order.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/person_order.g.dart @@ -48,7 +48,7 @@ class PersonOrderQuery extends Query { @override Map get casts { - return {'price': 'text'}; + return {'price': 'char'}; } @override @@ -212,7 +212,7 @@ class OrderWithPersonInfoQuery @override Map get casts { - return {'price': 'text'}; + return {'price': 'char'}; } @override diff --git a/packages/orm/angel_orm_test/pubspec.yaml b/packages/orm/angel_orm_test/pubspec.yaml index 976812d6..215180de 100644 --- a/packages/orm/angel_orm_test/pubspec.yaml +++ b/packages/orm/angel_orm_test/pubspec.yaml @@ -1,12 +1,12 @@ name: angel3_orm_test -version: 3.1.2 +version: 4.0.0 description: Common tests for Angel3 ORM. Reference implmentation of the generated ORM files. homepage: https://angel3-framework.web.app/ repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel_orm_test environment: sdk: '>=2.12.0 <3.0.0' dependencies: - angel3_migration: ^4.0.0 + angel3_migration: ^4.1.0 angel3_model: ^3.1.0 angel3_orm: ^4.0.0 angel3_serialize: ^4.1.0 @@ -15,7 +15,7 @@ dependencies: collection: ^1.15.0 optional: ^6.0.0 dev_dependencies: - angel3_orm_generator: ^4.1.0 + angel3_orm_generator: ^5.0.0 angel3_framework: ^4.2.0 build_runner: ^2.0.1 lints: ^1.0.0 @@ -26,3 +26,5 @@ dependency_overrides: path: ../angel_orm_generator angel3_migration: path: ../angel_migration + angel3_serialize_generator: + path: ../../serialize/angel_serialize_generator