Skip to content

Commit 66e48fc

Browse files
authored
WIP: TypeRegistry in ConnectionSettings. (#235)
1 parent 2684dc6 commit 66e48fc

File tree

7 files changed

+24
-12
lines changed

7 files changed

+24
-12
lines changed

lib/postgres.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:convert';
33

44
import 'package:collection/collection.dart';
55
import 'package:meta/meta.dart';
6+
import 'package:postgres/src/types/type_registry.dart';
67
import 'package:stream_channel/stream_channel.dart';
78

89
import 'src/replication.dart';
@@ -436,13 +437,18 @@ class ConnectionSettings extends SessionSettings {
436437
/// [Streaming Replication Protocol]: https://www.postgresql.org/docs/current/protocol-replication.html
437438
final ReplicationMode? replicationMode;
438439

440+
/// When set, use the type registry with custom types, instead of the
441+
/// built-in ones provided by the package.
442+
final TypeRegistry? typeRegistry;
443+
439444
ConnectionSettings({
440445
this.applicationName,
441446
this.timeZone,
442447
this.encoding,
443448
this.sslMode,
444449
this.transformer,
445450
this.replicationMode,
451+
this.typeRegistry,
446452
super.connectTimeout,
447453
super.queryTimeout,
448454
super.queryMode,

lib/src/types/binary_codec.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,8 @@ class PostgresBinaryDecoder {
585585
case TypeOid.regtype:
586586
final data = input.buffer.asByteData(input.offsetInBytes, input.length);
587587
final oid = data.getInt32(0);
588-
return TypeRegistry.instance.resolveOid(oid);
588+
// TODO: DecodeInput may provide the connection-level TypeRegistry
589+
return TypeRegistry().resolveOid(oid);
589590
case TypeOid.voidType:
590591
return null;
591592

lib/src/types/type_registry.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,6 @@ final _builtInTypes = <Type>{
7171
};
7272

7373
class TypeRegistry {
74-
// TODO: implement connection-level registry
75-
@internal
76-
static final instance = TypeRegistry();
77-
7874
final _byTypeOid = <int, Type>{};
7975
final _bySubstitutionName = <String, Type>{};
8076

@@ -110,6 +106,7 @@ class TypeRegistry {
110106

111107
Type? resolveSubstitution(String name) => _bySubstitutionName[name];
112108

109+
/// Note: this returns only types with oids.
113110
@internal
114-
Iterable<Type> get values => _byTypeOid.values;
111+
Iterable<Type> get registered => _byTypeOid.values;
115112
}

lib/src/v3/connection.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'package:async/async.dart' as async;
77
import 'package:charcode/ascii.dart';
88
import 'package:meta/meta.dart';
99
import 'package:pool/pool.dart' as pool;
10-
import 'package:postgres/src/types/type_registry.dart';
1110
import 'package:stream_channel/stream_channel.dart';
1211

1312
import '../../postgres.dart';
@@ -658,7 +657,8 @@ class _PgResultStreamSubscription
658657
for (final field in message.fieldDescriptions)
659658
ResultSchemaColumn(
660659
typeOid: field.typeOid,
661-
type: TypeRegistry.instance.resolveOid(field.typeOid),
660+
type: session._connection._settings.typeRegistry
661+
.resolveOid(field.typeOid),
662662
columnName: field.fieldName,
663663
columnOid: field.columnOid,
664664
tableOid: field.tableOid,

lib/src/v3/resolved_settings.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:convert';
22

33
import 'package:postgres/messages.dart';
4+
import 'package:postgres/src/types/type_registry.dart';
45
import 'package:stream_channel/stream_channel.dart';
56

67
import '../../postgres.dart';
@@ -50,6 +51,8 @@ class ResolvedConnectionSettings extends ResolvedSessionSettings
5051
final StreamChannelTransformer<Message, Message>? transformer;
5152
@override
5253
final ReplicationMode replicationMode;
54+
@override
55+
final TypeRegistry typeRegistry;
5356

5457
ResolvedConnectionSettings(
5558
ConnectionSettings? super.settings, ConnectionSettings? super.fallback)
@@ -62,7 +65,10 @@ class ResolvedConnectionSettings extends ResolvedSessionSettings
6265
transformer = settings?.transformer ?? fallback?.transformer,
6366
replicationMode = settings?.replicationMode ??
6467
fallback?.replicationMode ??
65-
ReplicationMode.none;
68+
ReplicationMode.none,
69+
// TODO: consider merging the type registries
70+
typeRegistry =
71+
settings?.typeRegistry ?? fallback?.typeRegistry ?? TypeRegistry();
6672

6773
bool isMatchingConnection(ResolvedConnectionSettings other) {
6874
return isMatchingSession(other) &&

lib/src/v3/variable_tokenizer.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,8 @@ class VariableTokenizer {
386386

387387
if (consumedColonForType) {
388388
final typeName = typeBuffer.toString();
389-
final type = TypeRegistry.instance.resolveSubstitution(typeName);
389+
// TODO: get this from the connection settings
390+
final type = TypeRegistry().resolveSubstitution(typeName);
390391
if (type == null) {
391392
error('Unknown type: $typeName');
392393
}

test/interpolation_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@ void main() {
1515
Type.serial,
1616
};
1717

18-
for (final type in TypeRegistry.instance.values) {
18+
for (final type in TypeRegistry().registered) {
1919
if (withoutMapping.contains(type)) continue;
2020

2121
expect(
22-
PostgreSQLFormatIdentifier.typeStringToCodeMap.values.contains(type),
22+
PostgreSQLFormatIdentifier.typeStringToCodeMap.registered
23+
.contains(type),
2324
true,
2425
reason: 'There should be a type mapping for $type',
2526
);

0 commit comments

Comments
 (0)