Skip to content

Commit 2df3120

Browse files
authored
DecodeInput.typeRegistry (#237)
1 parent 4d54e6f commit 2df3120

File tree

7 files changed

+30
-10
lines changed

7 files changed

+30
-10
lines changed

lib/src/types.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,11 +328,13 @@ class DecodeInput {
328328
final Uint8List bytes;
329329
final bool isBinary;
330330
final Encoding encoding;
331+
final TypeRegistry typeRegistry;
331332

332333
DecodeInput({
333334
required this.bytes,
334335
required this.isBinary,
335336
required this.encoding,
337+
required this.typeRegistry,
336338
});
337339

338340
late final asText = encoding.decode(bytes);

lib/src/types/binary_codec.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,9 @@ class PostgresBinaryDecoder {
510510

511511
PostgresBinaryDecoder(this.typeOid);
512512

513-
Object? convert(Uint8List input, Encoding encoding) {
513+
Object? convert(DecodeInput dinput) {
514+
final encoding = dinput.encoding;
515+
final input = dinput.bytes;
514516
late final buffer =
515517
ByteData.view(input.buffer, input.offsetInBytes, input.lengthInBytes);
516518

@@ -585,8 +587,7 @@ class PostgresBinaryDecoder {
585587
case TypeOid.regtype:
586588
final data = input.buffer.asByteData(input.offsetInBytes, input.length);
587589
final oid = data.getInt32(0);
588-
// TODO: DecodeInput may provide the connection-level TypeRegistry
589-
return TypeRegistry().resolveOid(oid);
590+
return dinput.typeRegistry.resolveOid(oid);
590591
case TypeOid.voidType:
591592
return null;
592593

lib/src/types/generic_type.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ class GenericType<T extends Object> extends Type<T> {
4848
@override
4949
T? decode(DecodeInput input) {
5050
if (input.isBinary) {
51-
return PostgresBinaryDecoder(oid!).convert(input.bytes, input.encoding)
52-
as T?;
51+
return PostgresBinaryDecoder(oid!).convert(input) as T?;
5352
} else {
5453
return PostgresTextDecoder(oid!).convert(input) as T?;
5554
}

lib/src/v2/query.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,12 @@ class Query<T> {
174174
if (bd == null) {
175175
return null;
176176
}
177-
return converter.convert(bd, connection.encoding);
177+
return converter.convert(DecodeInput(
178+
bytes: bd,
179+
isBinary: true,
180+
encoding: connection.encoding,
181+
typeRegistry: TypeRegistry(),
182+
));
178183
});
179184

180185
rows.add(lazyDecodedData.toList());

lib/src/v3/connection.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,7 @@ class _PgResultStreamSubscription
682682
bytes: input,
683683
isBinary: field.isBinaryEncoding,
684684
encoding: session.encoding,
685+
typeRegistry: session._connection._settings.typeRegistry,
685686
));
686687
columnValues.add(value);
687688
}

test/decode_test.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import 'dart:convert';
2-
import 'dart:typed_data';
32

3+
import 'package:buffer/buffer.dart';
44
import 'package:postgres/legacy.dart';
55
import 'package:postgres/postgres.dart';
66
import 'package:postgres/src/types/binary_codec.dart';
7+
import 'package:postgres/src/types/type_registry.dart';
78
import 'package:test/test.dart';
89

910
import 'docker.dart';
@@ -252,8 +253,13 @@ void main() {
252253

253254
final decoder = PostgresBinaryDecoder(Type.numeric.oid!);
254255
binaries.forEach((key, value) {
255-
final uint8List = Uint8List.fromList(value);
256-
final res = decoder.convert(uint8List, utf8);
256+
final input = DecodeInput(
257+
bytes: castBytes(value),
258+
isBinary: true,
259+
encoding: utf8,
260+
typeRegistry: TypeRegistry(),
261+
);
262+
final res = decoder.convert(input);
257263
expect(res, key);
258264
});
259265
});

test/encoding_test.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:postgres/legacy.dart';
66
import 'package:postgres/postgres.dart';
77
import 'package:postgres/src/types/binary_codec.dart';
88
import 'package:postgres/src/types/text_codec.dart';
9+
import 'package:postgres/src/types/type_registry.dart';
910
import 'package:test/test.dart';
1011

1112
import 'docker.dart';
@@ -668,7 +669,12 @@ Future expectInverse(dynamic value, Type dataType) async {
668669
final encodedValue = encoder.convert(value, utf8);
669670

670671
final decoder = PostgresBinaryDecoder(dataType.oid!);
671-
final decodedValue = decoder.convert(encodedValue, utf8);
672+
final decodedValue = decoder.convert(DecodeInput(
673+
bytes: encodedValue,
674+
isBinary: true,
675+
encoding: utf8,
676+
typeRegistry: TypeRegistry(),
677+
));
672678

673679
expect(decodedValue, value);
674680
}

0 commit comments

Comments
 (0)