@@ -2,10 +2,12 @@ extension PostgresData {
22 public init < T> ( array: [ T ] )
33 where T: PostgresDataConvertible
44 {
5- let elementType = T . postgresDataType
6- guard let arrayType = elementType. arrayType else {
7- fatalError ( " No array type for \( elementType) " )
8- }
5+ self . init (
6+ array: array. map { $0. postgresData } ,
7+ elementType: T . postgresDataType
8+ )
9+ }
10+ public init ( array: [ PostgresData ? ] , elementType: PostgresDataType ) {
911 var buffer = ByteBufferAllocator ( ) . buffer ( capacity: 0 )
1012 // 0 if empty, 1 if not
1113 buffer. writeInteger ( array. isEmpty ? 0 : 1 , as: UInt32 . self)
@@ -22,7 +24,7 @@ extension PostgresData {
2224 buffer. writeInteger ( 1 , as: UInt32 . self)
2325
2426 for item in array {
25- if var value = item. postgresData ? . value {
27+ if let item = item , var value = item. value {
2628 buffer. writeInteger ( numericCast ( value. readableBytes) , as: UInt32 . self)
2729 buffer. writeBuffer ( & value)
2830 } else {
@@ -31,12 +33,35 @@ extension PostgresData {
3133 }
3234 }
3335
34- self . init ( type: arrayType, typeModifier: nil , formatCode: . binary, value: buffer)
36+ guard let arrayType = elementType. arrayType else {
37+ fatalError ( " No array type for \( elementType) " )
38+ }
39+ self . init (
40+ type: arrayType,
41+ typeModifier: nil ,
42+ formatCode: . binary,
43+ value: buffer
44+ )
3545 }
3646
3747 public func array< T> ( of type: T . Type = T . self) -> [ T ] ?
3848 where T: PostgresDataConvertible
3949 {
50+ guard let array = self . array else {
51+ return nil
52+ }
53+ var items : [ T ] = [ ]
54+ for data in array {
55+ guard let item = T ( postgresData: data) else {
56+ // if we fail to convert any data, fail the entire array
57+ return nil
58+ }
59+ items. append ( item)
60+ }
61+ return items
62+ }
63+
64+ public var array : [ PostgresData ] ? {
4065 guard var value = self . value else {
4166 return nil
4267 }
@@ -67,17 +92,18 @@ extension PostgresData {
6792 }
6893 assert ( dimensions == 1 , " Multi-dimensional arrays not yet supported " )
6994
70- var array : [ T ] = [ ]
95+ var array : [ PostgresData ] = [ ]
7196 while
7297 let itemLength = value. readInteger ( as: UInt32 . self) ,
7398 let itemValue = value. readSlice ( length: numericCast ( itemLength) )
7499 {
75- let data = PostgresData ( type: type, typeModifier: nil , formatCode: self . formatCode, value: itemValue)
76- guard let t = T ( postgresData: data) else {
77- // if we fail to convert any data, fail the entire array
78- return nil
79- }
80- array. append ( t)
100+ let data = PostgresData (
101+ type: type,
102+ typeModifier: nil ,
103+ formatCode: self . formatCode,
104+ value: itemValue
105+ )
106+ array. append ( data)
81107 }
82108 return array
83109 }
0 commit comments