From 178bc924c10393de2c9951235069a6d2799ee295 Mon Sep 17 00:00:00 2001 From: thomashii Date: Sat, 7 May 2022 15:23:58 +0800 Subject: [PATCH 1/2] Updated ORM Mysql --- packages/orm/angel_orm/CHANGELOG.md | 4 + packages/orm/angel_orm/lib/src/util.dart | 24 ++++ packages/orm/angel_orm/pubspec.yaml | 2 +- packages/orm/angel_orm_generator/CHANGELOG.md | 5 + .../angel_orm_generator/example/main.g.dart | 8 +- .../lib/src/orm_generator.dart | 11 +- packages/orm/angel_orm_generator/pubspec.yaml | 8 +- packages/orm/angel_orm_mysql/CHANGELOG.md | 5 + .../orm/angel_orm_mysql/example/main.g.dart | 4 +- .../angel_orm_mysql/lib/src/orm_mariadb.dart | 110 +++--------------- .../angel_orm_mysql/lib/src/orm_mysql.dart | 69 +++++------ packages/orm/angel_orm_mysql/pubspec.yaml | 22 ++-- .../lib/src/orm_postgres.dart | 3 +- packages/orm/angel_orm_postgres/pubspec.yaml | 10 +- packages/orm/angel_orm_test/CHANGELOG.md | 4 + .../angel_orm_test/lib/src/models/book.g.dart | 8 +- .../angel_orm_test/lib/src/models/car.g.dart | 6 +- .../lib/src/models/custom_expr.g.dart | 8 +- .../lib/src/models/has_car.g.dart | 4 +- .../angel_orm_test/lib/src/models/leg.g.dart | 12 +- .../lib/src/models/order.g.dart | 10 +- .../lib/src/models/person.g.dart | 4 +- .../lib/src/models/person_order.g.dart | 16 +-- .../angel_orm_test/lib/src/models/tree.g.dart | 8 +- .../lib/src/models/unorthodox.g.dart | 4 +- .../angel_orm_test/lib/src/models/user.g.dart | 8 +- packages/orm/angel_orm_test/pubspec.yaml | 48 ++++---- 27 files changed, 198 insertions(+), 227 deletions(-) diff --git a/packages/orm/angel_orm/CHANGELOG.md b/packages/orm/angel_orm/CHANGELOG.md index bebecb69..002b8d51 100644 --- a/packages/orm/angel_orm/CHANGELOG.md +++ b/packages/orm/angel_orm/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## 6.0.1 + +* Added `mapToDateTime` + ## 6.0.0 * Updated to SDK 2.16.x diff --git a/packages/orm/angel_orm/lib/src/util.dart b/packages/orm/angel_orm/lib/src/util.dart index 3a4352c6..74421b74 100644 --- a/packages/orm/angel_orm/lib/src/util.dart +++ b/packages/orm/angel_orm/lib/src/util.dart @@ -19,3 +19,27 @@ String mapToText(dynamic value) { } return value; } + +DateTime? mapToDateTime(dynamic value) { + if (value == null) { + return value; + } + if (value is String) { + return DateTime.tryParse(value); + } + return value; +} + +double mapToDouble(dynamic value) { + if (value == null) { + return 0.0; + } + if (value is String) { + return double.tryParse(value) ?? 0.0; + } + + if (value is! double) { + return 0.0; + } + return value; +} diff --git a/packages/orm/angel_orm/pubspec.yaml b/packages/orm/angel_orm/pubspec.yaml index 7a22c6d9..9d489a47 100644 --- a/packages/orm/angel_orm/pubspec.yaml +++ b/packages/orm/angel_orm/pubspec.yaml @@ -1,5 +1,5 @@ name: angel3_orm -version: 6.0.0 +version: 6.0.1 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 7be9b00b..1ddfef75 100644 --- a/packages/orm/angel_orm_generator/CHANGELOG.md +++ b/packages/orm/angel_orm_generator/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## 6.0.1 + +* Fixed timestamp or date field to DateTime mapping +* Fixed double or float field to double mapping + ## 6.0.0 * Updated to SDK 2.16.x diff --git a/packages/orm/angel_orm_generator/example/main.g.dart b/packages/orm/angel_orm_generator/example/main.g.dart index 97d1d0db..c9da293d 100644 --- a/packages/orm/angel_orm_generator/example/main.g.dart +++ b/packages/orm/angel_orm_generator/example/main.g.dart @@ -93,14 +93,12 @@ class EmployeeQuery extends Query { } var model = Employee( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, uniqueId: fields.contains('unique_id') ? (row[3] as String?) : null, firstName: fields.contains('first_name') ? (row[4] as String?) : null, lastName: fields.contains('last_name') ? (row[5] as String?) : null, - salary: fields.contains('salary') - ? double.tryParse(row[6].toString()) - : null); + salary: fields.contains('salary') ? mapToDouble(row[6]) : null); return Optional.of(model); } 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 62eb7cd5..913fab41 100644 --- a/packages/orm/angel_orm_generator/lib/src/orm_generator.dart +++ b/packages/orm/angel_orm_generator/lib/src/orm_generator.dart @@ -262,9 +262,10 @@ class OrmGenerator extends GeneratorForAnnotation { .property('decode') .call([expr.asA(refer('String'))]).asA(type); } else if (floatTypes.contains(ctx.columns[field.name]?.type)) { - expr = refer('double') - .property('tryParse') - .call([expr.property('toString').call([])]); + //expr = refer('double') + // .property('tryParse') + // .call([expr.property('toString').call([])]); + expr = refer('mapToDouble').call([expr]); } else if (fType is InterfaceType && fType.element.isEnum) { var isNull = expr.equalTo(literalNull); expr = isNull.conditional(literalNull, @@ -272,6 +273,10 @@ class OrmGenerator extends GeneratorForAnnotation { } else if (fType.isDartCoreBool) { // Generated Code: mapToBool(row[i]) expr = refer('mapToBool').call([expr]); + } else if (fType.element?.displayName == 'DateTime') { + //print("fType: ${fType.element?.displayName}"); + // Generated Code: mapToDateTime(row[i]) + expr = refer('mapToDateTime').call([expr]); } else { // Generated Code: (row[i] as type?) expr = expr.asA(type); diff --git a/packages/orm/angel_orm_generator/pubspec.yaml b/packages/orm/angel_orm_generator/pubspec.yaml index cf642009..198e526b 100644 --- a/packages/orm/angel_orm_generator/pubspec.yaml +++ b/packages/orm/angel_orm_generator/pubspec.yaml @@ -1,5 +1,5 @@ name: angel3_orm_generator -version: 6.0.0 +version: 6.0.1 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 @@ -30,7 +30,7 @@ dev_dependencies: postgres: ^2.4.0 test: ^1.21.0 lints: ^1.0.0 -# dependency_overrides: +dependency_overrides: # angel3_container: # path: ../../container/angel_container # angel3_framework: @@ -47,8 +47,8 @@ dev_dependencies: # path: ../../serialize/angel_serialize # angel3_serialize_generator: # path: ../../serialize/angel_serialize_generator -# angel3_orm: -# path: ../angel_orm + angel3_orm: + path: ../angel_orm # angel3_migration: # path: ../angel_migration \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/CHANGELOG.md b/packages/orm/angel_orm_mysql/CHANGELOG.md index c0ad53af..36c22dfc 100644 --- a/packages/orm/angel_orm_mysql/CHANGELOG.md +++ b/packages/orm/angel_orm_mysql/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## 6.0.0-beta.3 + +* Updated transaction for `MariaDbExecutor` +* Updated transaction for `MySqlExecutor` + ## 6.0.0-beta.2 * Updated README diff --git a/packages/orm/angel_orm_mysql/example/main.g.dart b/packages/orm/angel_orm_mysql/example/main.g.dart index 02ae2be8..e361ec2c 100644 --- a/packages/orm/angel_orm_mysql/example/main.g.dart +++ b/packages/orm/angel_orm_mysql/example/main.g.dart @@ -81,8 +81,8 @@ class TodoQuery extends Query { } var model = Todo( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, isComplete: fields.contains('is_complete') ? mapToBool(row[3]) : null, text: fields.contains('text') ? (row[4] as String?) : null); return Optional.of(model); diff --git a/packages/orm/angel_orm_mysql/lib/src/orm_mariadb.dart b/packages/orm/angel_orm_mysql/lib/src/orm_mariadb.dart index 873fa1c8..5675a6f0 100644 --- a/packages/orm/angel_orm_mysql/lib/src/orm_mariadb.dart +++ b/packages/orm/angel_orm_mysql/lib/src/orm_mariadb.dart @@ -4,12 +4,14 @@ import 'package:logging/logging.dart'; import 'package:mysql1/mysql1.dart'; class MariaDbExecutor extends QueryExecutor { - /// An optional [Logger] to write to. - final Logger? logger; + /// An optional [Logger] print information to. A default logger will be used if not set + late Logger logger; final MySqlConnection _connection; - MariaDbExecutor(this._connection, {this.logger}); + MariaDbExecutor(this._connection, {Logger? logger}) { + this.logger = logger ?? Logger('MariaDbExecutor'); + } final Dialect _dialect = const MySQLDialect(); @@ -18,66 +20,8 @@ class MariaDbExecutor extends QueryExecutor { 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?); - } else if (_connection is MySqlConnection) { - return (_connection as MySqlConnection).begin(); - } else { - throw StateError('Connection must be transaction or connection'); - } - } - - @override - Future> query( - String tableName, String query, Map substitutionValues, - [List returningFields = const []]) { - // Change @id -> ? - for (var name in substitutionValues.keys) { - query = query.replaceAll('@$name', '?'); - } - - logger?.fine('Query: $query'); - logger?.fine('Values: $substitutionValues'); - - if (returningFields.isNotEmpty != true) { - return _connection! - .prepared(query, substitutionValues.values) - .then((results) => results.map((r) => r.toList()).toList()); - } else { - return Future(() async { - var tx = await _startTransaction(); - - try { - var writeResults = - await tx.prepared(query, substitutionValues.values); - var fieldSet = returningFields.map((s) => '`$s`').join(','); - var fetchSql = 'select $fieldSet from $tableName where id = ?;'; - logger?.fine(fetchSql); - var readResults = - await tx.prepared(fetchSql, [writeResults.insertId]); - var mapped = readResults.map((r) => r.toList()).toList(); - await tx.commit(); - return mapped; - } catch (_) { - await tx.rollback(); - rethrow; - } - }); - } - } - */ - @override Future> query( String tableName, String query, Map substitutionValues, @@ -101,9 +45,8 @@ class MariaDbExecutor extends QueryExecutor { var result = await _connection.query(query, params); query = returningQuery; - //logger?.warning('Result.insertId: ${result.insertId}'); + // logger?.warning('Result.insertId: ${result.insertId}'); // Has primary key - //if (result.insertId != 0) { if (returningQuery.endsWith('.id=?')) { params = [result.insertId]; } @@ -122,35 +65,20 @@ class MariaDbExecutor extends QueryExecutor { @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); + T? returnValue = await _connection.transaction((ctx) async { + var conn = ctx as MySqlConnection; + try { + logger.fine('Entering transaction'); + var tx = MariaDbExecutor(conn, logger: logger); + return await f(tx); + } catch (e) { + logger.severe('Failed to run transaction', e); + rethrow; + } finally { + logger.fine('Exiting transaction'); + } }); - */ - } - /* - @override - Future transaction(FutureOr Function(QueryExecutor) f) async { - if (_connection is Transaction) { - return await f(this); - } - Transaction? tx; - try { - tx = await _startTransaction(); - var executor = MySqlExecutor(tx, logger: logger); - var result = await f(executor); - await tx.commit(); - return result; - } catch (_) { - await tx?.rollback(); - rethrow; - } + return returnValue!; } - */ } diff --git a/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart b/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart index e8e112e0..937279c3 100644 --- a/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart +++ b/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart @@ -4,12 +4,14 @@ import 'package:logging/logging.dart'; import 'package:mysql_client/mysql_client.dart'; class MySqlExecutor extends QueryExecutor { - /// An optional [Logger] to write to. - final Logger? logger; + /// An optional [Logger] to write to. A default logger will be used if not set + late Logger logger; final MySQLConnection _connection; - MySqlExecutor(this._connection, {this.logger}); + MySqlExecutor(this._connection, {Logger? logger}) { + this.logger = logger ?? Logger('MySqlExecutor'); + } final Dialect _dialect = const MySQLDialect(); @@ -18,13 +20,6 @@ class MySqlExecutor extends QueryExecutor { Future close() { return _connection.close(); - /* - if (_connection is MySqlConnection) { - return (_connection as MySqlConnection).close(); - } else { - return Future.value(); - } - */ } /* @@ -86,13 +81,23 @@ class MySqlExecutor extends QueryExecutor { // Change @id -> ? for (var name in substitutionValues.keys) { query = query.replaceAll('@$name', ':$name'); + + // Convert UTC time to local time + var value = substitutionValues[name]; + if (value is DateTime && value.isUtc) { + var t = value.toLocal(); + logger.warning('Datetime deteted: $name'); + logger.warning('Datetime: UTC -> $value, Local -> $t'); + + substitutionValues[name] = t; + } } //var params = substitutionValues.values.toList(); - var params = []; + //var params = []; - logger?.warning('Query: $query'); - logger?.warning('Values: $substitutionValues'); + logger.warning('Query: $query'); + logger.warning('Values: $substitutionValues'); //logger?.warning('Returning Query: $returningQuery'); if (returningQuery.isNotEmpty) { @@ -101,35 +106,28 @@ class MySqlExecutor extends QueryExecutor { if (query.startsWith("INSERT")) { var result = await _connection.execute(query, substitutionValues); - logger?.warning(result.lastInsertID); + logger.warning(result.lastInsertID); query = returningQuery; //logger?.warning('Result.insertId: ${result.insertId}'); // Has primary key - //if (result.insertId != 0) { if (returningQuery.endsWith('.id=?')) { query = query.replaceAll("?", ":id"); - //params = [result.lastInsertID]; substitutionValues.clear(); substitutionValues['id'] = result.lastInsertID; } } else if (query.startsWith("UPDATE")) { await _connection.execute(query, substitutionValues); query = returningQuery; - params = []; } } - logger?.warning('Query 2: $query'); - logger?.warning('Values 2: $substitutionValues'); + logger.warning('Query 2: $query'); + logger.warning('Values 2: $substitutionValues'); // Handle select return _connection.execute(query, substitutionValues).then((results) { - logger?.warning("SELECT"); - //for (var element in results.cols) { - // print( - // '${element.name} ${element.type.toString()} ${element.runtimeType.toString()}'); - //} + logger.warning("SELECT"); return results.rows.map((r) => r.typedAssoc().values.toList()).toList(); }); @@ -137,17 +135,22 @@ class MySqlExecutor extends QueryExecutor { @override Future transaction(FutureOr Function(QueryExecutor) f) async { - logger?.warning("Transaction"); - return f(this); - /* - if (_connection is! MySqlConnection) { - return await f(this); - } + logger.warning("Transaction"); - await _connection.transaction((context) async { - var executor = MySqlExecutor(context, logger: logger); + T? returnValue = await _connection.transactional((ctx) async { + try { + logger.fine('Entering transaction'); + var tx = MySqlExecutor(ctx, logger: logger); + return await f(tx); + } catch (e) { + logger.severe('Failed to run transaction', e); + rethrow; + } finally { + logger.fine('Exiting transaction'); + } }); - */ + + return returnValue!; } /* @override diff --git a/packages/orm/angel_orm_mysql/pubspec.yaml b/packages/orm/angel_orm_mysql/pubspec.yaml index 3a77498a..d5477ac2 100644 --- a/packages/orm/angel_orm_mysql/pubspec.yaml +++ b/packages/orm/angel_orm_mysql/pubspec.yaml @@ -1,5 +1,5 @@ name: angel3_orm_mysql -version: 6.0.0-beta.2 +version: 6.0.0-beta.3 description: MySQL support for Angel3 ORM. Includes functionality for querying and transactions. homepage: https://angel3-framework.web.app/ repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel_orm_mysql @@ -9,7 +9,7 @@ dependencies: angel3_orm: ^6.0.0 logging: ^1.0.0 mysql1: ^0.19.0 - mysql_client: ^0.0.11 + mysql_client: ^0.0.15 optional: ^6.0.0 dev_dependencies: angel3_orm_generator: ^6.0.0 @@ -17,18 +17,18 @@ dev_dependencies: build_runner: ^2.0.1 test: ^1.21.0 lints: ^1.0.0 -# dependency_overrides: +dependency_overrides: # angel3_serialize: # path: ../../serialize/angel_serialize # angel3_serialize_generator: # path: ../../serialize/angel_serialize_generator # angel3_model: # path: ../../model -# angel3_orm_test: -# path: ../angel_orm_test -# angel3_orm: -# path: ../angel_orm -# angel3_migration: -# path: ../angel_migration -# angel3_orm_generator: -# path: ../angel_orm_generator + angel3_orm_test: + path: ../angel_orm_test + angel3_orm: + path: ../angel_orm + angel3_orm_generator: + path: ../angel_orm_generator +# angel3_migration: +# path: ../angel_migration 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 1314afec..9dbb7dc3 100644 --- a/packages/orm/angel_orm_postgres/lib/src/orm_postgres.dart +++ b/packages/orm/angel_orm_postgres/lib/src/orm_postgres.dart @@ -9,7 +9,8 @@ import 'package:postgres/postgres.dart'; class PostgreSqlExecutor extends QueryExecutor { final PostgreSQLExecutionContext _connection; - /// An optional [Logger] to print information to. + /// An optional [Logger] to print information to. A default logger will be used + /// if not set late Logger logger; PostgreSqlExecutor(this._connection, {Logger? logger}) { diff --git a/packages/orm/angel_orm_postgres/pubspec.yaml b/packages/orm/angel_orm_postgres/pubspec.yaml index f2338b82..cce84d47 100644 --- a/packages/orm/angel_orm_postgres/pubspec.yaml +++ b/packages/orm/angel_orm_postgres/pubspec.yaml @@ -16,14 +16,14 @@ dev_dependencies: angel3_orm_test: ^6.0.0 test: ^1.21.0 lints: ^1.0.0 -# dependency_overrides: +dependency_overrides: # angel3_serialize: # path: ../../serialize/angel_serialize # angel3_model: # path: ../../model -# angel3_orm_test: -# path: ../angel_orm_test -# angel3_orm: -# path: ../angel_orm + angel3_orm_test: + path: ../angel_orm_test + angel3_orm: + path: ../angel_orm # angel3_migration: # path: ../angel_migration diff --git a/packages/orm/angel_orm_test/CHANGELOG.md b/packages/orm/angel_orm_test/CHANGELOG.md index 15099c77..72ee8360 100644 --- a/packages/orm/angel_orm_test/CHANGELOG.md +++ b/packages/orm/angel_orm_test/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## 6.0.1 + +* Updated generated test cases + ## 6.0.0 * Updated to SDK 2.16.x diff --git a/packages/orm/angel_orm_test/lib/src/models/book.g.dart b/packages/orm/angel_orm_test/lib/src/models/book.g.dart index e7342120..7d954e42 100644 --- a/packages/orm/angel_orm_test/lib/src/models/book.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/book.g.dart @@ -122,8 +122,8 @@ class BookQuery extends Query { } var model = Book( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, name: fields.contains('name') ? (row[5] as String?) : null); if (row.length > 6) { var modelOpt = AuthorQuery().parseRow(row.skip(6).take(4).toList()); @@ -285,8 +285,8 @@ class AuthorQuery extends Query { } var model = Author( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, name: fields.contains('name') ? (row[3] as String?) : null); return Optional.of(model); } 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 fa0a8333..80e7ffb9 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 @@ -91,15 +91,15 @@ class CarQuery extends Query { } var model = Car( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, make: fields.contains('make') ? (row[3] as String?) : null, description: fields.contains('description') ? (row[4] as String?) : null, familyFriendly: fields.contains('family_friendly') ? mapToBool(row[5]) : null, recalledAt: - fields.contains('recalled_at') ? (row[6] as DateTime?) : null); + fields.contains('recalled_at') ? mapToDateTime(row[6]) : null); return Optional.of(model); } diff --git a/packages/orm/angel_orm_test/lib/src/models/custom_expr.g.dart b/packages/orm/angel_orm_test/lib/src/models/custom_expr.g.dart index 1993d623..808af190 100644 --- a/packages/orm/angel_orm_test/lib/src/models/custom_expr.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/custom_expr.g.dart @@ -101,8 +101,8 @@ class NumbersQuery extends Query { } var model = Numbers( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, two: fields.contains('two') ? (row[3] as int?) : null); return Optional.of(model); } @@ -218,8 +218,8 @@ class AlphabetQuery extends Query { } var model = Alphabet( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, value: fields.contains('value') ? (row[3] as String?) : null); if (row.length > 5) { var modelOpt = NumbersQuery().parseRow(row.skip(5).take(4).toList()); diff --git a/packages/orm/angel_orm_test/lib/src/models/has_car.g.dart b/packages/orm/angel_orm_test/lib/src/models/has_car.g.dart index fde5d0f6..2a40096d 100644 --- a/packages/orm/angel_orm_test/lib/src/models/has_car.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/has_car.g.dart @@ -81,8 +81,8 @@ class HasCarQuery extends Query { } var model = HasCar( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, type: fields.contains('type') ? row[3] == null ? null 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 5117f6b4..cd7a7a3b 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 @@ -111,8 +111,8 @@ class LegQuery extends Query { } var model = Leg( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, name: fields.contains('name') ? (row[3] as String?) : null); if (row.length > 4) { var modelOpt = FootQuery().parseRow(row.skip(4).take(5).toList()); @@ -240,12 +240,10 @@ class FootQuery extends Query { } var model = Foot( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, legId: fields.contains('leg_id') ? (row[3] as int?) : null, - nToes: fields.contains('n_toes') - ? double.tryParse(row[4].toString()) - : null); + nToes: fields.contains('n_toes') ? mapToDouble(row[4]) : null); return Optional.of(model); } diff --git a/packages/orm/angel_orm_test/lib/src/models/order.g.dart b/packages/orm/angel_orm_test/lib/src/models/order.g.dart index b5845d6b..5fd06694 100644 --- a/packages/orm/angel_orm_test/lib/src/models/order.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/order.g.dart @@ -115,10 +115,10 @@ class OrderQuery extends Query { } var model = Order( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, employeeId: fields.contains('employee_id') ? (row[4] as int?) : null, - orderDate: fields.contains('order_date') ? (row[5] as DateTime?) : null, + orderDate: fields.contains('order_date') ? mapToDateTime(row[5]) : null, shipperId: fields.contains('shipper_id') ? (row[6] as int?) : null); if (row.length > 7) { var modelOpt = CustomerQuery().parseRow(row.skip(7).take(3).toList()); @@ -284,9 +284,9 @@ class CustomerQuery extends Query { } var model = Customer( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, updatedAt: - fields.contains('updated_at') ? (row[2] as DateTime?) : null); + fields.contains('updated_at') ? mapToDateTime(row[2]) : null); return Optional.of(model); } diff --git a/packages/orm/angel_orm_test/lib/src/models/person.g.dart b/packages/orm/angel_orm_test/lib/src/models/person.g.dart index 2f7ccd44..b18bc29b 100644 --- a/packages/orm/angel_orm_test/lib/src/models/person.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/person.g.dart @@ -82,8 +82,8 @@ class PersonQuery extends Query { } var model = Person( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, name: fields.contains('name') ? (row[3] as String?) : null, age: fields.contains('age') ? (row[4] as int?) : 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 0f73ca95..f02b83db 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 @@ -93,13 +93,11 @@ class PersonOrderQuery extends Query { } var model = PersonOrder( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, personId: fields.contains('person_id') ? (row[3] as int?) : null, name: fields.contains('name') ? (row[4] as String?) : null, - price: fields.contains('price') - ? double.tryParse(row[5].toString()) - : null, + price: fields.contains('price') ? mapToDouble(row[5]) : null, deleted: fields.contains('deleted') ? mapToBool(row[6]) : null); return Optional.of(model); } @@ -258,12 +256,10 @@ class OrderWithPersonInfoQuery } var model = OrderWithPersonInfo( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, name: fields.contains('name') ? (row[3] as String?) : null, - price: fields.contains('price') - ? double.tryParse(row[4].toString()) - : null, + price: fields.contains('price') ? mapToDouble(row[4]) : null, deleted: fields.contains('deleted') ? mapToBool(row[5]) : null, personName: fields.contains('person_name') ? (row[6] as String?) : null, personAge: fields.contains('person_age') ? (row[7] as int?) : null); diff --git a/packages/orm/angel_orm_test/lib/src/models/tree.g.dart b/packages/orm/angel_orm_test/lib/src/models/tree.g.dart index c4a34e37..ea1b4063 100644 --- a/packages/orm/angel_orm_test/lib/src/models/tree.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/tree.g.dart @@ -110,8 +110,8 @@ class TreeQuery extends Query { } var model = Tree( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, rings: fields.contains('rings') ? (row[3] as int?) : null); if (row.length > 4) { var modelOpt = FruitQuery().parseRow(row.skip(4).take(5).toList()); @@ -299,8 +299,8 @@ class FruitQuery extends Query { } var model = Fruit( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, treeId: fields.contains('tree_id') ? (row[3] as int?) : null, commonName: fields.contains('common_name') ? (row[4] as String?) : null); diff --git a/packages/orm/angel_orm_test/lib/src/models/unorthodox.g.dart b/packages/orm/angel_orm_test/lib/src/models/unorthodox.g.dart index 731da605..91446563 100644 --- a/packages/orm/angel_orm_test/lib/src/models/unorthodox.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/unorthodox.g.dart @@ -486,8 +486,8 @@ class SongQuery extends Query { } var model = Song( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, weirdJoinId: fields.contains('weird_join_id') ? (row[3] as int?) : null, title: fields.contains('title') ? (row[4] as String?) : null); return Optional.of(model); diff --git a/packages/orm/angel_orm_test/lib/src/models/user.g.dart b/packages/orm/angel_orm_test/lib/src/models/user.g.dart index f88d37ee..7e7a43bb 100644 --- a/packages/orm/angel_orm_test/lib/src/models/user.g.dart +++ b/packages/orm/angel_orm_test/lib/src/models/user.g.dart @@ -127,8 +127,8 @@ class UserQuery extends Query { } var model = User( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, username: fields.contains('username') ? (row[3] as String?) : null, password: fields.contains('password') ? (row[4] as String?) : null, email: fields.contains('email') ? (row[5] as String?) : null); @@ -487,8 +487,8 @@ class RoleQuery extends Query { } var model = Role( id: fields.contains('id') ? row[0].toString() : null, - createdAt: fields.contains('created_at') ? (row[1] as DateTime?) : null, - updatedAt: fields.contains('updated_at') ? (row[2] as DateTime?) : null, + createdAt: fields.contains('created_at') ? mapToDateTime(row[1]) : null, + updatedAt: fields.contains('updated_at') ? mapToDateTime(row[2]) : null, name: fields.contains('name') ? (row[3] as String?) : null); if (row.length > 4) { var modelOpt = UserQuery().parseRow(row.skip(4).take(6).toList()); diff --git a/packages/orm/angel_orm_test/pubspec.yaml b/packages/orm/angel_orm_test/pubspec.yaml index 293df0c6..204c1ffc 100644 --- a/packages/orm/angel_orm_test/pubspec.yaml +++ b/packages/orm/angel_orm_test/pubspec.yaml @@ -1,5 +1,5 @@ name: angel3_orm_test -version: 6.0.0 +version: 6.0.1 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 @@ -19,26 +19,26 @@ dev_dependencies: angel3_framework: ^6.0.0 build_runner: ^2.0.1 lints: ^1.0.0 -# dependency_overrides: -# angel3_container: -# path: ../../container/angel_container -# angel3_framework: -# path: ../../framework -# angel3_http_exception: -# path: ../../http_exception -# angel3_model: -# path: ../../model -# angel3_route: -# path: ../../route -# angel3_mock_request: -# path: ../../mock_request -# angel3_serialize: -# path: ../../serialize/angel_serialize -# angel3_serialize_generator: -# path: ../../serialize/angel_serialize_generator -# angel3_orm: -# path: ../angel_orm -# angel3_migration: -# path: ../angel_migration -# angel3_orm_generator: -# path: ../angel_orm_generator +dependency_overrides: + # angel3_container: + # path: ../../container/angel_container + # angel3_framework: + # path: ../../framework + # angel3_http_exception: + # path: ../../http_exception + # angel3_model: + # path: ../../model + # angel3_route: + # path: ../../route + # angel3_mock_request: + # path: ../../mock_request + # angel3_serialize: + # path: ../../serialize/angel_serialize + # angel3_serialize_generator: + # path: ../../serialize/angel_serialize_generator + angel3_orm: + path: ../angel_orm + # angel3_migration: + # path: ../angel_migration + angel3_orm_generator: + path: ../angel_orm_generator From 03885543c252d4ac1c19d01de743536e0fd9ee7f Mon Sep 17 00:00:00 2001 From: thomashii Date: Mon, 16 May 2022 13:04:21 +0800 Subject: [PATCH 2/2] Fixed failed test cases --- packages/orm/angel_orm_mysql/CHANGELOG.md | 6 +- packages/orm/angel_orm_mysql/README.md | 8 +- .../angel_orm_mysql/lib/src/orm_mysql.dart | 15 ++++ .../orm/angel_orm_mysql/test/all_test.dart | 27 ++++--- packages/orm/angel_orm_mysql/test/common.dart | 78 +++++++++++++++---- .../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 | 2 +- .../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 | 2 +- .../angel_orm_mysql/test/migrations/role.sql | 2 +- .../angel_orm_mysql/test/migrations/song.sql | 2 +- .../angel_orm_mysql/test/migrations/tree.sql | 2 +- .../test/migrations/unorthodox.sql | 2 +- .../angel_orm_mysql/test/migrations/user.sql | 2 +- .../test/migrations/user_role.sql | 2 +- .../test/migrations/weird_join.sql | 6 +- .../orm/angel_orm_mysql/test/orm_debug.dart | 2 +- .../lib/src/many_to_many_test.dart | 3 +- 23 files changed, 125 insertions(+), 50 deletions(-) diff --git a/packages/orm/angel_orm_mysql/CHANGELOG.md b/packages/orm/angel_orm_mysql/CHANGELOG.md index 36c22dfc..f47ce61e 100644 --- a/packages/orm/angel_orm_mysql/CHANGELOG.md +++ b/packages/orm/angel_orm_mysql/CHANGELOG.md @@ -2,8 +2,10 @@ ## 6.0.0-beta.3 -* Updated transaction for `MariaDbExecutor` -* Updated transaction for `MySqlExecutor` +* Fixed transaction for `MariaDbExecutor` +* Fixed transaction for `MySqlExecutor` +* Fixed error for non `id` primary key +* Changed test cases to use tables instead of temporary tables to overcome limitations ## 6.0.0-beta.2 diff --git a/packages/orm/angel_orm_mysql/README.md b/packages/orm/angel_orm_mysql/README.md index 79dc1e4e..038358cd 100644 --- a/packages/orm/angel_orm_mysql/README.md +++ b/packages/orm/angel_orm_mysql/README.md @@ -7,7 +7,7 @@ This package contains the SQL Executor required by Angel3 ORM to work with MySQL and MariaDB respectively. In order to better support the differences in MySQL and MariaDb underlying protocols, two different drives have to be used. For MariaDb 10.2.x, `mysql1` driver provides the best results, while `mysql_client` driver handles MySQL 8.x.x without issues. -* MariaDbExecutor (stable) +* MariaDbExecutor (beta) * MySqlExecutor (beta) ## Supported database version @@ -51,3 +51,9 @@ This package contains the SQL Executor required by Angel3 ORM to work with MySQL await connection.connect(timeoutMs: 10000); var executor = MySqlExecutor(connection, logger: logger); ``` + +## Known limitation + +* UTC time is not supported +* Blob is not supported + \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart b/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart index 937279c3..773e5bc3 100644 --- a/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart +++ b/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart @@ -22,6 +22,8 @@ class MySqlExecutor extends QueryExecutor { return _connection.close(); } + MySQLConnection get rawConnection => _connection; + /* Future _startTransaction() { if (_connection is Transaction) { @@ -115,6 +117,8 @@ class MySqlExecutor extends QueryExecutor { query = query.replaceAll("?", ":id"); substitutionValues.clear(); substitutionValues['id'] = result.lastInsertID; + } else { + query = _convertSQL(query, substitutionValues); } } else if (query.startsWith("UPDATE")) { await _connection.execute(query, substitutionValues); @@ -133,6 +137,17 @@ class MySqlExecutor extends QueryExecutor { }); } + String _convertSQL(String query, Map substitutionValues) { + var newQuery = query; + for (var k in substitutionValues.keys) { + var fromPattern = '.$k = ?'; + var toPattern = '.$k = :$k'; + newQuery = newQuery.replaceFirst(fromPattern, toPattern); + } + + return newQuery; + } + @override Future transaction(FutureOr Function(QueryExecutor) f) async { logger.warning("Transaction"); diff --git a/packages/orm/angel_orm_mysql/test/all_test.dart b/packages/orm/angel_orm_mysql/test/all_test.dart index 57849fd9..14b9fcdb 100644 --- a/packages/orm/angel_orm_mysql/test/all_test.dart +++ b/packages/orm/angel_orm_mysql/test/all_test.dart @@ -11,23 +11,28 @@ void main() { }); group('mysql', () { - group('belongsTo', - () => belongsToTests(my(['author', 'book']), close: closeMy)); + group( + 'belongsTo', + () => belongsToTests(createTables(['author', 'book']), + close: dropTables)); group( 'edgeCase', - () => edgeCaseTests(my(['unorthodox', 'weird_join', 'song', 'numba']), - close: closeMy)); + () => edgeCaseTests( + createTables(['unorthodox', 'weird_join', 'song', 'numba']), + close: dropTables)); group('enumAndNested', - () => enumAndNestedTests(my(['has_car']), close: closeMy)); - group('hasMany', () => hasManyTests(my(['tree', 'fruit']), close: closeMy)); + () => enumAndNestedTests(createTables(['has_car']), close: dropTables)); + group('hasMany', + () => hasManyTests(createTables(['tree', 'fruit']), close: dropTables)); // NOTE: MySQL/MariaDB do not support jsonb data type - //group('hasMap', () => hasMapTests(my(['has_map']), close: closeMy)); + //group('hasMap', () => hasMapTests(createTables(['has_maps']), close: dropTables)); // NOTE: mysql1 driver do not support CAST(); - //group('hasOne', () => hasOneTests(my(['leg', 'foot']), close: closeMy)); + //group('hasOne', () => hasOneTests(createTables(['legs', 'feet']), close: dropTables)); group( 'manyToMany', - () => - manyToManyTests(my(['user', 'role', 'user_role']), close: closeMy)); - group('standalone', () => standaloneTests(my(['car']), close: closeMy)); + () => manyToManyTests(createTables(['user', 'role', 'user_role']), + close: dropTables)); + group('standalone', + () => standaloneTests(createTables(['car']), close: dropTables)); }); } diff --git a/packages/orm/angel_orm_mysql/test/common.dart b/packages/orm/angel_orm_mysql/test/common.dart index 3c342b49..488cff55 100644 --- a/packages/orm/angel_orm_mysql/test/common.dart +++ b/packages/orm/angel_orm_mysql/test/common.dart @@ -6,15 +6,47 @@ import 'package:logging/logging.dart'; import 'package:mysql1/mysql1.dart'; import 'package:mysql_client/mysql_client.dart'; -FutureOr Function() my(Iterable schemas) { - return () => connectToMySql(schemas); +List tmpTables = []; + +FutureOr Function() createTables(List schemas) { + // For MySQL + return () => _connectToMySql(schemas); + + // For MariaDB + // return () => _connectToMariaDb(tables); } -Future closeMy(QueryExecutor executor) => - (executor as MySqlExecutor).close(); +// For MySQL +Future dropTables(QueryExecutor executor) async { + var sqlExecutor = (executor as MySqlExecutor); + for (var tableName in tmpTables.reversed) { + await sqlExecutor.rawConnection.execute('drop table $tableName;'); + } + return sqlExecutor.close(); +} -// Executor for MariaDB 10.2.x -Future connectToMariaDb(Iterable schemas) async { +// For MariaDB +/* Future dropTables(QueryExecutor executor) { + var sqlExecutor = (executor as MariaDbExecutor); + for (var tableName in tmpTables.reversed) { + sqlExecutor.query(tableName, 'DROP TABLE $tableName', {}); + } + return sqlExecutor.close(); +} */ + +String extractTableName(String createQuery) { + var start = createQuery.indexOf('EXISTS'); + var end = createQuery.indexOf('('); + + if (start == -1 || end == -1) { + return ''; + } + + return createQuery.substring(start + 6, end).trim(); +} + +// Executor for MariaDB +Future _connectToMariaDb(List schemas) async { var settings = ConnectionSettings( host: 'localhost', port: 3306, @@ -23,7 +55,9 @@ Future connectToMariaDb(Iterable schemas) async { password: 'Test123*'); var connection = await MySqlConnection.connect(settings); - var logger = Logger('orm_mysql'); + var logger = Logger('orm_mariadb'); + + tmpTables.clear(); for (var s in schemas) { // MySQL driver does not support multiple sql queries @@ -34,6 +68,11 @@ Future connectToMariaDb(Iterable schemas) async { if (q.trim().isNotEmpty) { //await connection.execute(q); await connection.query(q); + + var tableName = extractTableName(q); + if (tableName != '') { + tmpTables.add(tableName); + } } } } @@ -41,20 +80,22 @@ Future connectToMariaDb(Iterable schemas) async { return MariaDbExecutor(connection, logger: logger); } -// Executor for MySQL 8.x.x -Future connectToMySql(Iterable schemas) async { +// Executor for MySQL +Future _connectToMySql(List schemas) async { var connection = await MySQLConnection.createConnection( - databaseName: 'orm_test', - port: 3306, - host: "localhost", - userName: Platform.environment['MYSQL_USERNAME'] ?? 'test', - password: Platform.environment['MYSQL_PASSWORD'] ?? 'Test123*', - ); + databaseName: 'orm_test', + port: 3306, + host: "localhost", + userName: Platform.environment['MYSQL_USERNAME'] ?? 'test', + password: Platform.environment['MYSQL_PASSWORD'] ?? 'Test123*', + secure: false); - await connection.connect(); + await connection.connect(timeoutMs: 10000); var logger = Logger('orm_mysql'); + tmpTables.clear(); + for (var s in schemas) { // MySQL driver does not support multiple sql queries var data = await File('test/migrations/$s.sql').readAsString(); @@ -63,6 +104,11 @@ Future connectToMySql(Iterable schemas) async { //print("Table: [$q]"); if (q.trim().isNotEmpty) { await connection.execute(q); + + var tableName = extractTableName(q); + if (tableName != '') { + tmpTables.add(tableName); + } } } } diff --git a/packages/orm/angel_orm_mysql/test/migrations/author.sql b/packages/orm/angel_orm_mysql/test/migrations/author.sql index 7ae6477a..b862b90f 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 TABLE IF NOT EXISTS 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 1cc39baa..f893c9ef 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 TABLE IF NOT EXISTS 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 c27b953e..80058dfb 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 TABLE IF NOT EXISTS 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 d25733e0..54486289 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 TABLE IF NOT EXISTS 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 88f12969..901f03cb 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/fruit.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/fruit.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE fruits ( +CREATE TABLE IF NOT EXISTS fruits ( id serial, tree_id int, common_name varchar(255), 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 d4b47b42..24319fcd 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 TABLE IF NOT EXISTS 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 046b8145..b0861fbf 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 TABLE IF NOT EXISTS 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 46b19092..77308a3e 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 TABLE IF NOT EXISTS 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 41fe7c4d..c7b23a35 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/numba.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/numba.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE numbas ( +CREATE TABLE IF NOT EXISTS numbas ( i int NOT NULL UNIQUE, parent int, created_at TIMESTAMP, diff --git a/packages/orm/angel_orm_mysql/test/migrations/role.sql b/packages/orm/angel_orm_mysql/test/migrations/role.sql index 7eeeb950..3c9e3413 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/role.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/role.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE roles ( +CREATE TABLE IF NOT EXISTS roles ( id serial PRIMARY KEY, name varchar(255), created_at timestamp, diff --git a/packages/orm/angel_orm_mysql/test/migrations/song.sql b/packages/orm/angel_orm_mysql/test/migrations/song.sql index 98e0ebb2..11435b01 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/song.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/song.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE songs ( +CREATE TABLE IF NOT EXISTS songs ( id serial, weird_join_id int, title varchar(255), diff --git a/packages/orm/angel_orm_mysql/test/migrations/tree.sql b/packages/orm/angel_orm_mysql/test/migrations/tree.sql index 08ec4d84..c9fc19cf 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/tree.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/tree.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE trees ( +CREATE TABLE IF NOT EXISTS trees ( id serial, rings smallint UNIQUE, created_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 24eaa397..40d50e6c 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 ( +CREATE TABLE IF NOT EXISTS unorthodoxes ( name varchar(255) NOT NULL UNIQUE, 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 9b95b734..3248b483 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/user.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/user.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE users ( +CREATE TABLE IF NOT EXISTS users ( id serial PRIMARY KEY, username varchar(255), password varchar(255), 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 cc03240c..43a74d50 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/user_role.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/user_role.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE role_users ( +CREATE TABLE IF NOT EXISTS role_users ( id serial PRIMARY KEY, user_id int NOT NULL, role_id int NOT NULL, 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 9e4ceee6..81bb1f5b 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/weird_join.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/weird_join.sql @@ -1,15 +1,15 @@ -CREATE TEMPORARY TABLE weird_joins ( +CREATE TABLE IF NOT EXISTS weird_joins ( id serial, join_name varchar(255), PRIMARY KEY(id) ); -CREATE TEMPORARY TABLE foos ( +CREATE TABLE IF NOT EXISTS foos ( bar varchar(255) not null UNIQUE, PRIMARY KEY(bar) ); -CREATE TEMPORARY TABLE foo_pivots ( +CREATE TABLE IF NOT EXISTS foo_pivots ( weird_join_id int, foo_bar varchar(255) ); diff --git a/packages/orm/angel_orm_mysql/test/orm_debug.dart b/packages/orm/angel_orm_mysql/test/orm_debug.dart index 7ceeadf9..ed5c6e8e 100644 --- a/packages/orm/angel_orm_mysql/test/orm_debug.dart +++ b/packages/orm/angel_orm_mysql/test/orm_debug.dart @@ -14,7 +14,7 @@ void main() async { // if (rec.stackTrace != null) print(rec.stackTrace); //}); - belongsToTests(my(['author', 'book']), close: closeMy); + belongsToTests(createTables(['author', 'book']), close: dropTables); //hasOneTests(my(['leg', 'foot']), close: closeMy); //standaloneTests(my(['car']), close: closeMy); diff --git a/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart b/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart index 5146eda5..04a138c9 100644 --- a/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart +++ b/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart @@ -61,7 +61,8 @@ void manyToManyTests(FutureOr Function() createExecutor, ..username = 'thosakwe' ..password = 'Hahahahayoureallythoughtiwasstupidenoughtotypethishere' ..email = 'thosakwe AT gmail.com'; - thosakwe = (await thosakweQuery.insert(executor)).value; + var result = await thosakweQuery.insert(executor); + thosakwe = result.value; print('=== THOSAKWE: ${thosakwe?.toJson()}'); // Allow thosakwe to publish...