diff --git a/docker/docker-compose-mariadb.yml b/docker/docker-compose-mariadb.yml new file mode 100644 index 00000000..91a71473 --- /dev/null +++ b/docker/docker-compose-mariadb.yml @@ -0,0 +1,20 @@ +version: "3.8" +services: + mariadb: + image: mariadb:latest + restart: "no" + ports: + - "3306:3306" + environment: + - MARIADB_ROOT_PASSWORD=Qwerty + volumes: + - "mariadb:/var/lib/mysql" + networks: + - webnet + +volumes: + mariadb: + driver: local + +networks: + webnet: diff --git a/docker/docker-compose-mysql.yml b/docker/docker-compose-mysql.yml new file mode 100644 index 00000000..14e64ef9 --- /dev/null +++ b/docker/docker-compose-mysql.yml @@ -0,0 +1,20 @@ +version: "3.8" +services: + mysql: + image: mysql:latest + restart: "no" + ports: + - "3306:3306" + environment: + - MYSQL_ROOT_PASSWORD=Qwerty + volumes: + - "mysql:/var/lib/mysql" + networks: + - webnet + +volumes: + mysql: + driver: local + +networks: + webnet: diff --git a/docker/docker-compose-pg.yml b/docker/docker-compose-pg.yml index c79ef058..f6c1b4e7 100644 --- a/docker/docker-compose-pg.yml +++ b/docker/docker-compose-pg.yml @@ -2,7 +2,7 @@ version: "3.8" services: pgdb: image: postgres:latest - restart: always + restart: "no" ports: - "5432:5432" environment: @@ -12,7 +12,6 @@ services: - "db:/var/lib/postgresql/data" networks: - webnet - volumes: db: driver: local diff --git a/docker/docker-compose-redis.yml b/docker/docker-compose-redis.yml new file mode 100644 index 00000000..b39a2d68 --- /dev/null +++ b/docker/docker-compose-redis.yml @@ -0,0 +1,21 @@ +version: "3.8" +services: + redis: + image: redis:latest + restart: "no" + ports: + - "5432:5432" + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + volumes: + - "redis:/data" + networks: + - webnet + +volumes: + redis: + driver: local + +networks: + webnet: diff --git a/packages/orm/angel_migration_runner/lib/src/mariadb/schema.dart b/packages/orm/angel_migration_runner/lib/src/mariadb/schema.dart index 9a753842..f9ed00e2 100644 --- a/packages/orm/angel_migration_runner/lib/src/mariadb/schema.dart +++ b/packages/orm/angel_migration_runner/lib/src/mariadb/schema.dart @@ -23,7 +23,7 @@ class MariaDbSchema extends Schema { _log.severe('Failed to run query: [ $sql ]', e); throw e; }); - affectedRows = result?.affectedRows ?? 0; + affectedRows = result.affectedRows ?? 0; }); return affectedRows; diff --git a/packages/orm/angel_orm/lib/src/query.dart b/packages/orm/angel_orm/lib/src/query.dart index fd07ce8b..cec7350d 100644 --- a/packages/orm/angel_orm/lib/src/query.dart +++ b/packages/orm/angel_orm/lib/src/query.dart @@ -371,7 +371,7 @@ abstract class Query extends QueryBase { var insertion = values?.compileInsert(this, tableName); if (insertion == '') { - throw StateError('No values have been specified for update.'); + throw StateError('No values have been specified for insertion.'); } else { var sql = compile({}); var returningSql = ''; diff --git a/packages/orm/angel_orm/lib/src/query_values.dart b/packages/orm/angel_orm/lib/src/query_values.dart index 09535211..0748dacb 100644 --- a/packages/orm/angel_orm/lib/src/query_values.dart +++ b/packages/orm/angel_orm/lib/src/query_values.dart @@ -16,7 +16,7 @@ abstract class QueryValues { String compileInsert(Query query, String tableName) { var data = Map.from(toMap()); - var now = DateTime.now().toUtc(); + var now = DateTime.now(); if (data.containsKey('created_at') && data['created_at'] == null) { data['created_at'] = now; } @@ -71,7 +71,7 @@ abstract class QueryValues { if (data.isEmpty) { return ''; } - var now = DateTime.now().toUtc(); + var now = DateTime.now(); if (data.containsKey('created_at') && data['created_at'] == null) { data.remove('created_at'); } diff --git a/packages/orm/angel_orm_mysql/README.md b/packages/orm/angel_orm_mysql/README.md index 038358cd..1a1776a7 100644 --- a/packages/orm/angel_orm_mysql/README.md +++ b/packages/orm/angel_orm_mysql/README.md @@ -7,8 +7,8 @@ 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 (beta) -* MySqlExecutor (beta) +* MariaDbExecutor +* MySqlExecutor ## Supported database version @@ -26,8 +26,8 @@ This package contains the SQL Executor required by Angel3 ORM to work with MySQL host: 'localhost', port: 3306, db: 'orm_test', - user: 'Test', - password: 'Test123*'); + user: 'test', + password: 'test123'); var connection = await MySqlConnection.connect(settings); var logger = Logger('orm_mariadb'); @@ -44,7 +44,7 @@ This package contains the SQL Executor required by Angel3 ORM to work with MySQL port: 3306, databaseName: "orm_test", userName: "test", - password: "Test123*", + password: "test123", secure: false); var logger = Logger('orm_mysql'); @@ -52,8 +52,48 @@ This package contains the SQL Executor required by Angel3 ORM to work with MySQL var executor = MySqlExecutor(connection, logger: logger); ``` +### Issues + +* Blob +* DateTime value not in UTC +* Transaction is broken + +## Creating a new database in MariaDB/MySQL + +1. Login to MariaDB/MySQL database console with the following command. + +```bash + mysql -u root -p +``` + +1. Run the following commands to create a new database, `orm_test` and grant both local and remote access to user, `test`. Replace `orm_test`, `test` and `test123` with your own database name, username and password respectively. + +```mysql + create database orm_test; + + create user 'test'@'localhost' identified by 'test123'; + grant all privileges on orm_test.* to 'test'@'localhost'; + + create user 'test'@'%' identified by 'test123'; + grant all privileges on orm_test.* to 'test'@'%'; +``` + ## Known limitation -* UTC time is not supported +### Using `mysql1` driver on MariabDb + +* Blob +* DateTime value not in UTC +* Transaction is broken + +### Using `mysql1` driver on MySQL + +* Blob is not supported + +### Using `mysql_client` driver on MariabDb + +* Blob is not supported + +### Using `mysql_client` driver on MySQL + * Blob is not supported - \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/example/main.dart b/packages/orm/angel_orm_mysql/example/main.dart index cf84baa7..a32806d7 100644 --- a/packages/orm/angel_orm_mysql/example/main.dart +++ b/packages/orm/angel_orm_mysql/example/main.dart @@ -13,8 +13,8 @@ part 'main.g.dart'; void main() async { //hierarchicalLoggingEnabled = true; - //await mariaDBExample(); - await mysqlExample(); + await mariaDBExample(); + //await mysqlExample(); exit(0); } @@ -28,8 +28,8 @@ Future mariaDBExample() async { host: 'localhost', port: 3306, db: 'orm_test', - user: 'Test', - password: 'Test123*'); + user: 'test', + password: 'test123'); var connection = await MySqlConnection.connect(settings); print("Connected to MariaDb"); @@ -61,7 +61,7 @@ Future mysqlExample() async { port: 3306, databaseName: "orm_test", userName: "test", - password: "Test123*", + password: "test123", secure: false); print("Connected to MySQL"); 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 5675a6f0..8ecb4725 100644 --- a/packages/orm/angel_orm_mysql/lib/src/orm_mariadb.dart +++ b/packages/orm/angel_orm_mysql/lib/src/orm_mariadb.dart @@ -34,9 +34,9 @@ class MariaDbExecutor 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 @@ -66,6 +66,7 @@ class MariaDbExecutor extends QueryExecutor { @override Future transaction(FutureOr Function(QueryExecutor) f) async { T? returnValue = await _connection.transaction((ctx) async { + // TODO: This is broken var conn = ctx as MySqlConnection; try { logger.fine('Entering transaction'); diff --git a/packages/orm/angel_orm_mysql/pubspec.yaml b/packages/orm/angel_orm_mysql/pubspec.yaml index 126a65e6..327b6d1b 100644 --- a/packages/orm/angel_orm_mysql/pubspec.yaml +++ b/packages/orm/angel_orm_mysql/pubspec.yaml @@ -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_orm_test: + path: ../angel_orm_test + angel3_orm: + path: ../angel_orm # angel3_orm_generator: # path: ../angel_orm_generator -# angel3_migration: -# path: ../angel_migration + angel3_migration: + path: ../angel_migration diff --git a/packages/orm/angel_orm_mysql/test/common.dart b/packages/orm/angel_orm_mysql/test/common.dart index 488cff55..58be1adb 100644 --- a/packages/orm/angel_orm_mysql/test/common.dart +++ b/packages/orm/angel_orm_mysql/test/common.dart @@ -10,14 +10,14 @@ List tmpTables = []; FutureOr Function() createTables(List schemas) { // For MySQL - return () => _connectToMySql(schemas); + //return () => _connectToMySql(schemas); // For MariaDB - // return () => _connectToMariaDb(tables); + return () => _connectToMariaDb(schemas); } // For MySQL -Future dropTables(QueryExecutor executor) async { +Future dropTables2(QueryExecutor executor) async { var sqlExecutor = (executor as MySqlExecutor); for (var tableName in tmpTables.reversed) { await sqlExecutor.rawConnection.execute('drop table $tableName;'); @@ -26,13 +26,13 @@ Future dropTables(QueryExecutor executor) async { } // For MariaDB -/* Future dropTables(QueryExecutor executor) { +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'); @@ -51,8 +51,8 @@ Future _connectToMariaDb(List schemas) async { host: 'localhost', port: 3306, db: 'orm_test', - user: 'Test', - password: 'Test123*'); + user: 'test', + password: 'test123'); var connection = await MySqlConnection.connect(settings); var logger = Logger('orm_mariadb'); @@ -87,7 +87,7 @@ Future _connectToMySql(List schemas) async { port: 3306, host: "localhost", userName: Platform.environment['MYSQL_USERNAME'] ?? 'test', - password: Platform.environment['MYSQL_PASSWORD'] ?? 'Test123*', + password: Platform.environment['MYSQL_PASSWORD'] ?? 'test123', secure: false); await connection.connect(timeoutMs: 10000); 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 66097910..840f0fd3 100644 --- a/packages/orm/angel_orm_test/lib/src/standalone_test.dart +++ b/packages/orm/angel_orm_test/lib/src/standalone_test.dart @@ -3,7 +3,7 @@ import 'package:angel3_orm/angel3_orm.dart'; import 'package:test/test.dart'; import 'models/car.dart'; -final DateTime y2k = DateTime.utc(2000, 1, 1); +final DateTime y2k = DateTime(2000, 1, 1); void standaloneTests(FutureOr Function() createExecutor, {FutureOr Function(QueryExecutor)? close}) { @@ -173,9 +173,9 @@ void standaloneTests(FutureOr Function() createExecutor, }); test('insert', () async { - var recalledAt = DateTime.now().toUtc(); + var recalledAt = DateTime.now(); var query = CarQuery(); - var now = DateTime.now().toUtc(); + var now = DateTime.now(); query.values ..make = 'Honda' ..description = 'Hello' @@ -198,7 +198,7 @@ void standaloneTests(FutureOr Function() createExecutor, }); test('insert car', () async { - var recalledAt = DateTime.now().toUtc(); + var recalledAt = DateTime.now(); var beetle = Car( make: 'Beetle', description: 'Herbie',