Skip to content

Commit d34a03b

Browse files
committed
upgrade to postgres v3
1 parent 8f8a0d2 commit d34a03b

File tree

6 files changed

+69
-58
lines changed

6 files changed

+69
-58
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.0.0-rc.1
2+
3+
- Migrate to `postgres` v3.
4+
15
## 1.0.0
26

37
- Initial version.

example/lib/main.dart

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ import 'package:logging/logging.dart';
22
import 'package:logging_appenders/logging_appenders.dart';
33
import 'package:postgres/postgres.dart';
44
import 'package:postgres_utils/postgres_utils.dart';
5+
import 'package:uuid/data.dart';
6+
import 'package:uuid/rng.dart';
57
import 'package:uuid/uuid.dart';
6-
import 'package:uuid/uuid_util.dart';
78

89
final _logger = Logger('main');
910

10-
const Uuid _uuid = Uuid(options: <String, dynamic>{'grng': UuidUtil.cryptoRNG});
11+
final Uuid _uuid = Uuid(goptions: GlobalOptions(CryptoRNG()));
1112

1213
class DatabaseTransaction extends DatabaseTransactionBase<MyTables> {
13-
DatabaseTransaction(PostgreSQLExecutionContext conn, MyTables tables)
14-
: super(conn, tables);
14+
DatabaseTransaction(TxSession conn, MyTables tables) : super(conn, tables);
1515
}
1616

1717
class DatabaseAccess extends DatabaseAccessBase<DatabaseTransaction, MyTables> {
@@ -25,7 +25,7 @@ class DatabaseAccess extends DatabaseAccessBase<DatabaseTransaction, MyTables> {
2525

2626
@override
2727
DatabaseTransaction createDatabaseTransaction(
28-
PostgreSQLExecutionContext conn, MyTables tables) {
28+
TxSession conn, MyTables tables) {
2929
return DatabaseTransaction(conn, tables);
3030
}
3131
}

example/pubspec.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ environment:
77
sdk: '>=2.12.0 <3.0.0'
88

99
dependencies:
10-
postgres: ^2.4.1+2
11-
uuid: ^3.0.4
10+
postgres: ^3.2.0
11+
uuid: ^4.4.0
1212
logging_appenders: ^1.0.0
1313
postgres_utils:
1414
path: ../

lib/src/database_access.dart

+48-40
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'package:clock/clock.dart';
22
import 'package:logging/logging.dart';
33
import 'package:meta/meta.dart';
44
import 'package:postgres/postgres.dart';
5+
// ignore: implementation_imports
6+
import 'package:postgres/src/types/type_registry.dart' show TypeRegistryExt;
57
import 'package:postgres_utils/src/config.dart';
68
import 'package:postgres_utils/src/tables/base_tables.dart';
79
import 'package:postgres_utils/src/tables/migration_tables.dart';
@@ -26,7 +28,7 @@ abstract class OnConflictAction {
2628
class DatabaseTransactionBase<TABLES extends TablesBase> {
2729
DatabaseTransactionBase(this._conn, this.tables);
2830

29-
final PostgreSQLExecutionContext _conn;
31+
final TxSession _conn;
3032
final TABLES tables;
3133
static final columnNamePattern = RegExp(r'^[a-z_]+$');
3234

@@ -155,14 +157,13 @@ class DatabaseTransactionBase<TABLES extends TablesBase> {
155157
_logger.finest('Executing query: $fmtString with values: $values');
156158

157159
final int result;
158-
if (useExtendedQuery) {
159-
final sqlResult = await _conn.query(fmtString,
160-
substitutionValues: values, timeoutInSeconds: timeoutInSeconds);
161-
result = sqlResult.affectedRowCount;
162-
} else {
163-
result = await _conn.execute(fmtString,
164-
substitutionValues: values, timeoutInSeconds: timeoutInSeconds);
165-
}
160+
final sqlResult = await query(
161+
fmtString,
162+
values: values,
163+
timeoutInSeconds: timeoutInSeconds,
164+
queryMode: useExtendedQuery ? QueryMode.extended : null,
165+
);
166+
result = sqlResult.affectedRows;
166167
if (expectedResultCount != null && result != expectedResultCount) {
167168
throw StateError(
168169
'Expected result: $expectedResultCount but got $result. '
@@ -176,17 +177,22 @@ class DatabaseTransactionBase<TABLES extends TablesBase> {
176177
}
177178
}
178179

179-
Future<PostgreSQLResult> query(String fmtString,
180-
{Map<String, Object?>? values,
181-
bool allowReuse = true,
182-
int? timeoutInSeconds}) async {
180+
Future<Result> query(
181+
String fmtString, {
182+
Map<String, Object?>? values,
183+
bool allowReuse = true,
184+
int? timeoutInSeconds,
185+
QueryMode? queryMode,
186+
}) async {
183187
assert(_assertCorrectValues(values));
184188
try {
185189
// _logger.finest('QUERY: $fmtString');
186-
return _conn.query(fmtString,
187-
substitutionValues: values,
188-
allowReuse: allowReuse,
189-
timeoutInSeconds: timeoutInSeconds);
190+
return _conn.execute(Sql.named(fmtString),
191+
parameters: values,
192+
queryMode: queryMode,
193+
timeout: timeoutInSeconds == null
194+
? null
195+
: Duration(seconds: timeoutInSeconds));
190196
} catch (e, stackTrace) {
191197
_logger.warning(
192198
'Error while running statement $fmtString', e, stackTrace);
@@ -196,29 +202,30 @@ class DatabaseTransactionBase<TABLES extends TablesBase> {
196202
}
197203

198204
class CustomBind {
199-
CustomBind(this._bind, this.value, {this.type});
205+
CustomBind(this._bind, this.value, {Type? type}) : _type = type;
200206
final String _bind;
201207
final Object value;
202-
final PostgreSQLDataType? type;
208+
final Type? _type;
203209

204210
String formatString(String bindName) => _bind;
205211
}
206212

207213
class CustomTypeBind extends CustomBind {
208-
factory CustomTypeBind(PostgreSQLDataType type, Object value) {
214+
factory CustomTypeBind(Type type, Object value) {
209215
// _bindCount.to
210216
return CustomTypeBind._(
211217
'',
212218
value,
213219
type,
214220
);
215221
}
216-
CustomTypeBind._(String bind, Object value, PostgreSQLDataType type)
222+
CustomTypeBind._(String bind, Object value, Type type)
217223
: super(bind, value, type: type);
218224

219225
@override
220-
String formatString(String bindName) =>
221-
'${PostgreSQLFormat.id(bindName)}::jsonb';
226+
String formatString(String bindName) => _type == null
227+
? '@$bindName'
228+
: '@$bindName::${TypeRegistry().lookupTypeName(_type)}';
222229
}
223230

224231
abstract class DatabaseAccessBase<TX extends DatabaseTransactionBase<TABLES>,
@@ -233,20 +240,19 @@ abstract class DatabaseAccessBase<TX extends DatabaseTransactionBase<TABLES>,
233240
final DatabaseConfig config;
234241
final MigrationsProvider<TX, TABLES> migrations;
235242

236-
PostgreSQLConnection? _conn;
243+
Connection? _conn;
237244

238-
Future<PostgreSQLConnection> _connection() async {
245+
Future<Connection> _connection() async {
239246
if (_conn != null) {
240247
return _conn!;
241248
}
242-
final conn = PostgreSQLConnection(
243-
config.host,
244-
config.port,
245-
config.databaseName,
249+
final conn = await Connection.open(Endpoint(
250+
host: config.host,
251+
port: config.port,
252+
database: config.databaseName,
246253
username: config.username,
247254
password: config.password,
248-
);
249-
await conn.open();
255+
));
250256
return _conn = conn;
251257
}
252258

@@ -273,15 +279,17 @@ abstract class DatabaseAccessBase<TX extends DatabaseTransactionBase<TABLES>,
273279
});
274280

275281
Future<T> _transaction<T>(
276-
Future<T> Function(PostgreSQLExecutionContext conn) queryBlock) async {
282+
Future<T> Function(TxSession conn) queryBlock) async {
277283
final conn = await _connection();
278-
final dynamic result = await conn.transaction(queryBlock);
279-
if (result is T) {
280-
return result;
281-
}
282-
throw Exception(
283-
'Error running in transaction, $result (${result.runtimeType})'
284-
' is not ${T.runtimeType}');
284+
return conn.runTx((session) async {
285+
final dynamic result = await queryBlock(session);
286+
if (result is T) {
287+
return result;
288+
}
289+
throw Exception(
290+
'Error running in transaction, $result (${result.runtimeType})'
291+
' is not ${T.runtimeType}');
292+
});
285293
}
286294

287295
Future<void> prepareDatabase() async {
@@ -362,7 +370,7 @@ abstract class DatabaseAccessBase<TX extends DatabaseTransactionBase<TABLES>,
362370
}
363371

364372
@protected
365-
TX createDatabaseTransaction(PostgreSQLExecutionContext conn, TABLES tables);
373+
TX createDatabaseTransaction(TxSession conn, TABLES tables);
366374
}
367375

368376
//extension on SqlClientBase {

lib/src/tables/base_tables.dart

+6-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ abstract class TableBase {
77
List<String> get types => const [];
88
}
99

10-
abstract class TableConstants {
10+
abstract mixin class TableConstants {
1111
final columnId = 'id';
1212
String get specColumnIdPrimaryKey => '$columnId uuid primary key';
1313

@@ -23,15 +23,14 @@ abstract class TableConstants {
2323
'DEFAULT CURRENT_TIMESTAMP';
2424
}
2525

26-
extension FuturePostgreSQL on Future<PostgreSQLResult> {
27-
Future<T?> singleOrNull<T>(
28-
FutureOr<T?> Function(PostgreSQLResultRow row) cb) =>
26+
extension FuturePostgreSQL on Future<Result> {
27+
Future<T?> singleOrNull<T>(FutureOr<T?> Function(ResultRow row) cb) =>
2928
then((value) => value.singleOrNull<FutureOr<T?>>(cb));
30-
Future<PostgreSQLResultRow> get single => then((value) => value.single);
29+
Future<ResultRow> get single => then((value) => value.single);
3130
}
3231

33-
extension PostgreSQLResultExt on PostgreSQLResult {
34-
T? singleOrNull<T>(T Function(PostgreSQLResultRow row) cb) {
32+
extension PostgreSQLResultExt on Result {
33+
T? singleOrNull<T>(T Function(ResultRow row) cb) {
3534
if (isEmpty) {
3635
return null;
3736
}

pubspec.yaml

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
name: postgres_utils
22
description: A few utils for working with postgresql databases.
3-
version: 1.0.0
3+
version: 2.0.0-rc.1
44
homepage: https://github.com/authpass/postgres_utils.dart
55
issue_tracker: https://github.com/authpass/postgres_utils.dart/issues
66

77
environment:
8-
sdk: '>=2.12.0 <3.0.0'
8+
sdk: '>=3.3.0 <4.0.0'
99

1010
dependencies:
1111
quiver: ^3.0.0
1212
meta: ^1.3.0
1313
clock: ^1.1.0
1414
logging: ^1.0.0
15-
postgres: ^2.3.0
15+
postgres: ^3.2.0
1616
json_annotation: ^4.0.1
1717

1818
dev_dependencies:
19-
json_serializable: ^5.0.0
19+
json_serializable: ^6.8.0
2020
pedantic: ^1.11.0
2121
test: ^1.16.8
2222
build_runner: ^2.1.2

0 commit comments

Comments
 (0)