Skip to content

Commit 852f17e

Browse files
author
Isaque Neves
committed
implement sslmode for mysql
1 parent 7ebf0be commit 852f17e

10 files changed

+62
-23
lines changed

example/bin/mysql_example.dart

+11-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ void main(List<String> args) async {
1010
'database': 'banco_teste',
1111
'username': 'dart',
1212
'password': 'dart',
13+
// for SSL conection
14+
'sslmode': 'require',
15+
// not implemented
16+
// 'options': {
17+
// PDO_MYSQL_ATTR_SSL_VERIFY_SERVER_CERT: false,
18+
// PDO_MYSQL_ATTR_SSL_KEY: '/certs/client-key.pem',
19+
// PDO_MYSQL_ATTR_SSL_CERT: '/certs/client-cert.pem',
20+
// PDO_MYSQL_ATTR_SSL_CA: '/certs/ca.pem',
21+
// },
22+
// to enable pool of conections
1323
// 'pool': true,
1424
// 'poolsize': 2,
1525
});
@@ -18,7 +28,7 @@ void main(List<String> args) async {
1828

1929
final db = await manager.connection();
2030

21-
await db.execute('DROP TABLE clients');
31+
await db.execute('DROP TABLE IF EXISTS clients');
2232
await db.execute(''' CREATE TABLE IF NOT EXISTS clients (
2333
id int NOT NULL AUTO_INCREMENT,
2434
name varchar(255) NOT NULL,

lib/eloquent.dart

+2
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,5 @@ export 'src/exceptions/query_exception.dart';
4444
export 'src/pdo/core/pdo_execution_context.dart';
4545
export 'src/pdo/core/pdo_result.dart';
4646
export 'src/pdo/core/pdo_interface.dart';
47+
48+
export '/src/pdo/core/constants.dart';

lib/src/connectors/connector.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@ abstract class Connector with DetectsLostConnections {
66
///
77
/// @var array
88
///
9-
Map<String, dynamic> options = {};
9+
Map<dynamic, dynamic> options = {};
1010

1111
///
1212
/// Get the PDO options based on the configuration.
1313
///
1414
/// @param array $config
1515
/// @return array
1616
///
17-
Map<String, dynamic> getOptions(Map<String, dynamic> config) {
17+
Map<dynamic, dynamic> getOptions(Map<dynamic, dynamic> config) {
1818
var optionsP = config['options'];
1919

2020
//return array_diff_key(options, optionsP) + $options;
21+
//Utils.map_merge_sd(options, optionsP);
2122
if (optionsP != null) {
22-
return Utils.map_merge_sd(options, optionsP);
23+
return {...options, ...optionsP};
2324
}
2425
return options;
2526
}

lib/src/connectors/mysql_connector.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class MySqlConnector extends Connector implements ConnectorInterface {
88
///
99
/// @var array
1010
///
11-
Map<String, dynamic> options = {};
11+
Map<dynamic, dynamic> options = {};
1212

1313
///
1414
/// Establish a database connection.
@@ -150,8 +150,8 @@ class MySqlConnector extends Connector implements ConnectorInterface {
150150
/// @return \PDO
151151
/// Aqui que cria a conexão com o Banco de Dados de fato
152152
///
153-
Future<PDOInterface> createConnection(String dsn, Map<String, dynamic> config,
154-
Map<String, dynamic> options) async {
153+
Future<PDOInterface> createConnection(String dsn, Map<dynamic, dynamic> config,
154+
Map<dynamic, dynamic> options) async {
155155
final username = config['username'];
156156
final password = config['password'];
157157

@@ -161,7 +161,7 @@ class MySqlConnector extends Connector implements ConnectorInterface {
161161
// pdo = MySqlClientPDO(dsn, username, password, options);
162162

163163

164-
pdo = MySqlClientPDO(dsn, username, password);
164+
pdo = MySqlClientPDO(dsn, username, password,options);
165165

166166
await pdo.connect();
167167

lib/src/connectors/postgres_connector.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class PostgresConnector extends Connector implements ConnectorInterface {
99
///
1010
/// @var array
1111
///
12-
Map<String, dynamic> options = {};
12+
Map<dynamic, dynamic> options = {};
1313

1414
///
1515
/// Establish a database connection.
@@ -142,7 +142,7 @@ class PostgresConnector extends Connector implements ConnectorInterface {
142142
/// Aqui que cria a conexão com o Banco de Dados de fato
143143
///
144144
Future<PDOInterface> createConnection(String dsn, Map<String, dynamic> config,
145-
Map<String, dynamic> options) async {
145+
Map<dynamic, dynamic> options) async {
146146
final username = config['username'];
147147
final password = config['password'];
148148
// var host = config['host'];

lib/src/pdo/core/constants.dart

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
const PDO_MYSQL_ATTR_SSL_VERIFY_SERVER_CERT = 1014; //false;
2+
const PDO_MYSQL_ATTR_SSL_KEY = 1007; //'/certs/client-key.pem';
3+
const PDO_MYSQL_ATTR_SSL_CERT = 1008; //'/certs/client-cert.pem';
4+
const PDO_MYSQL_ATTR_SSL_CA = 1009; //'/certs/ca.pem';
+4-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import 'package:eloquent/src/pdo/core/pdo_interface.dart';
22
import 'pdo_result.dart';
33

4+
5+
46
abstract class PDOExecutionContext {
57
late PDOInterface pdoInstance;
68

79
/// Executa uma instrução SQL e retornar o número de linhas afetadas
810
Future<int> execute(String statement, [int? timeoutInSeconds]);
9-
Future<PDOResults> query(String query, [dynamic params, int? timeoutInSeconds]);
11+
Future<PDOResults> query(String query,
12+
[dynamic params, int? timeoutInSeconds]);
1013
}

lib/src/pdo/mysql_client/mysql_client_pdo.dart

+7-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class MySqlClientPDO extends PDOInterface {
1515
int port = 3306;
1616
String driver = 'mysql_client';
1717
String host = 'localhost';
18-
dynamic attributes;
18+
Map<dynamic, dynamic>? attributes;
1919

2020
/// Creates a PDO instance representing a connection to a database
2121
/// Example
@@ -35,6 +35,10 @@ class MySqlClientPDO extends PDOInterface {
3535
//called from postgres_connector.dart
3636
Future<MySqlClientPDO> connect() async {
3737
final dsnParser = DSNParser(dsn, DsnType.pdoPostgreSql);
38+
// print('MySqlClientPDO@connect dsnParser: $dsnParser');
39+
// print('MySqlClientPDO@connect sslmode: ${dsnParser.sslmode}');
40+
// print('MySqlClientPDO@connect sslmode: ${dsnParser.sslmode?.toString() == 'require'}');
41+
//print('MySqlClientPDO@connect options: $attributes');
3842

3943
if (dsnParser.pool == true) {
4044
connection = MySQLConnectionPool(
@@ -45,7 +49,7 @@ class MySqlClientPDO extends PDOInterface {
4549
password: password,
4650
collation: dsnParser.charset ?? 'utf8mb4_general_ci',
4751
maxConnections: dsnParser.poolSize,
48-
secure: false,
52+
secure: dsnParser.sslmode?.toString() == 'require',
4953
);
5054
} else {
5155
connection = await MySQLConnection.createConnection(
@@ -55,7 +59,7 @@ class MySqlClientPDO extends PDOInterface {
5559
userName: user,
5660
password: password,
5761
collation: dsnParser.charset ?? 'utf8mb4_general_ci',
58-
secure: false,
62+
secure: dsnParser.sslmode?.toString() == 'require',
5963
);
6064
}
6165
if (connection is MySQLConnection) {

lib/src/pdo/postgres_v3/postgres_v3_pdo.dart

+14-8
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class PostgresV3PDO extends PDOInterface {
1717
int port = 5432;
1818
String driver = 'pgsql';
1919
String host = 'localhost';
20-
dynamic attributes;
20+
Map<dynamic, dynamic>? attributes;
2121

2222
/// Creates a PDO instance representing a connection to a database
2323
/// Example
@@ -56,6 +56,8 @@ class PostgresV3PDO extends PDOInterface {
5656
Future<PostgresV3PDO> connect() async {
5757
final dsnParser = DSNParser(dsn, DsnType.pdoPostgreSql);
5858

59+
// dsnParser.sslmode?.toString() == 'require'
60+
5961
connection = await Connection.open(
6062
Endpoint(
6163
host: dsnParser.host,
@@ -66,15 +68,18 @@ class PostgresV3PDO extends PDOInterface {
6668
),
6769
settings: ConnectionSettings(
6870
encoding: _getEncoding(dsnParser.charset ?? 'utf8'),
69-
sslMode: SslMode.disable,
71+
sslMode: dsnParser.sslmode?.toString() == 'require'
72+
? SslMode.require
73+
: SslMode.disable,
7074
));
7175

7276
await connection
7377
.execute('''SET client_encoding = '${dsnParser.charset}';''');
7478
return this;
7579
}
7680

77-
Future<T> runInTransaction<T>(Future<T> operation(PostgresV3PDOTransaction ctx),
81+
Future<T> runInTransaction<T>(
82+
Future<T> operation(PostgresV3PDOTransaction ctx),
7883
[int? timeoutInSeconds]) async {
7984
if (timeoutInSeconds == null) {
8085
timeoutInSeconds = defaultTimeoutInSeconds;
@@ -85,7 +90,7 @@ class PostgresV3PDO extends PDOInterface {
8590
return operation(pdoCtx);
8691
});
8792

88-
return res ;
93+
return res;
8994
}
9095

9196
/// Executa uma instrução SQL e retornar o número de linhas afetadas
@@ -116,16 +121,17 @@ class PostgresV3PDO extends PDOInterface {
116121
final rows = rs.map((row) => row.toColumnMap()).toList();
117122
final maps = <Map<String, dynamic>>[];
118123
if (rows.isNotEmpty) {
119-
for (final row in rows) {
124+
for (final row in rows) {
120125
final map = <String, dynamic>{};
121126
for (final col in row.entries) {
122127
final key = col.key;
123-
final value = col.value is UndecodedBytes ? col.value.asString : col.value;
128+
final value =
129+
col.value is UndecodedBytes ? col.value.asString : col.value;
124130
map.addAll({key: value});
125131
}
126-
maps.add(map);
132+
maps.add(map);
127133
}
128-
}
134+
}
129135

130136
final pdoResult = PDOResults(maps, rs.affectedRows);
131137
return pdoResult;

lib/src/utils/dsn_parser.dart

+10-1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class DSNParser {
5151
int get poolSize => int.tryParse(dsnParts['poolsize'] ?? '') ?? 1;
5252
bool get allowReconnect => dsnParts['allowreconnect'].toString() == 'true';
5353
String? get applicationName => dsnParts['application_name'];
54+
String? get sslmode => dsnParts['sslmode'];
55+
Map<String, dynamic>? get options => dsnParts['options'];
5456

5557
Map<String, dynamic> get params => dsnParts['params'];
5658

@@ -103,7 +105,6 @@ class DSNParser {
103105
if (parts.join().contains('pool=')) {
104106
dsnParts['pool'] =
105107
parts.lastWhere((p) => p.contains('pool=')).split('=').last;
106-
107108
}
108109
if (parts.join().contains('poolsize=')) {
109110
dsnParts['poolsize'] =
@@ -121,6 +122,14 @@ class DSNParser {
121122
.split('=')
122123
.last;
123124
}
125+
if (parts.join().contains('sslmode=')) {
126+
dsnParts['sslmode'] =
127+
parts.lastWhere((p) => p.contains('sslmode=')).split('=').last;
128+
}
129+
if (parts.join().contains('options=')) {
130+
dsnParts['options'] =
131+
parts.lastWhere((p) => p.contains('options=')).split('=').last;
132+
}
124133
} else if (dsnType == DsnType.heroku) {
125134
var patternString = '^' +
126135
'(?:' +

0 commit comments

Comments
 (0)