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