1
- import DatabaseKit
2
- import Foundation
3
- import NIO
4
- import NIOPostgres
5
- import NIOOpenSSL
6
- import SQLKit
1
+ @_exported import struct Foundation. URL
7
2
8
- public final class PostgresDatabase : Database {
9
- public struct Config {
10
- public let address : ( ) throws -> SocketAddress
11
- public let username : String
12
- public let password : String
13
- public let database : String ?
14
- public let tlsConfig : TLSConfiguration ?
15
-
16
- public init ? ( url: URL ) {
17
- guard url. scheme == " postgres " else {
18
- return nil
19
- }
20
- guard let username = url. user else {
21
- return nil
22
- }
23
- guard let password = url. password else {
24
- return nil
25
- }
26
- guard let hostname = url. host else {
27
- return nil
28
- }
29
- guard let port = url. port else {
30
- return nil
31
- }
32
-
33
- let tlsConfig : TLSConfiguration ?
34
- if url. query == " ssl=true " {
35
- tlsConfig = TLSConfiguration . forClient ( certificateVerification: . none)
36
- } else {
37
- tlsConfig = nil
38
- }
39
-
40
- self . init (
41
- hostname: hostname,
42
- port: port,
43
- username: username,
44
- password: password,
45
- database: url. databaseName,
46
- tlsConfig: tlsConfig
47
- )
3
+ public struct PostgresConfig {
4
+ public let address : ( ) throws -> SocketAddress
5
+ public let username : String
6
+ public let password : String
7
+ public let database : String ?
8
+ public let tlsConfig : TLSConfiguration ?
9
+
10
+ public init ? ( url: URL ) {
11
+ guard url. scheme == " postgres " else {
12
+ return nil
13
+ }
14
+ guard let username = url. user else {
15
+ return nil
16
+ }
17
+ guard let password = url. password else {
18
+ return nil
19
+ }
20
+ guard let hostname = url. host else {
21
+ return nil
22
+ }
23
+ guard let port = url. port else {
24
+ return nil
48
25
}
49
26
50
- public init (
51
- hostname: String ,
52
- port: Int = 5432 ,
53
- username: String ,
54
- password: String ,
55
- database: String ? = nil ,
56
- tlsConfig: TLSConfiguration ? = nil
57
- ) {
58
- self . address = {
59
- return try SocketAddress . makeAddressResolvingHost ( hostname, port: port)
60
- }
61
- self . username = username
62
- self . database = database
63
- self . password = password
64
- self . tlsConfig = tlsConfig
27
+ let tlsConfig : TLSConfiguration ?
28
+ if url. query == " ssl=true " {
29
+ tlsConfig = TLSConfiguration . forClient ( certificateVerification: . none)
30
+ } else {
31
+ tlsConfig = nil
65
32
}
33
+
34
+ self . init (
35
+ hostname: hostname,
36
+ port: port,
37
+ username: username,
38
+ password: password,
39
+ database: url. path. split ( separator: " / " ) . last. flatMap ( String . init) ,
40
+ tlsConfig: tlsConfig
41
+ )
66
42
}
67
43
44
+ public init (
45
+ hostname: String ,
46
+ port: Int = 5432 ,
47
+ username: String ,
48
+ password: String ,
49
+ database: String ? = nil ,
50
+ tlsConfig: TLSConfiguration ? = nil
51
+ ) {
52
+ self . address = {
53
+ return try SocketAddress . makeAddressResolvingHost ( hostname, port: port)
54
+ }
55
+ self . username = username
56
+ self . database = database
57
+ self . password = password
58
+ self . tlsConfig = tlsConfig
59
+ }
60
+ }
61
+
62
+ public struct PostgresConnectionSource : ConnectionPoolSource {
68
63
public var eventLoop : EventLoop
69
- public let config : Config
64
+ public let config : PostgresConfig
70
65
71
- public init ( config: Config , on eventLoop: EventLoop ) {
66
+ public init ( config: PostgresConfig , on eventLoop: EventLoop ) {
72
67
self . config = config
73
68
self . eventLoop = eventLoop
74
69
}
@@ -102,7 +97,7 @@ public final class PostgresDatabase: Database {
102
97
}
103
98
}
104
99
105
- extension PostgresConnection : DatabaseConnection {
100
+ extension PostgresConnection : ConnectionPoolItem {
106
101
public var isClosed : Bool {
107
102
#warning("implement is closed")
108
103
return false
@@ -164,7 +159,8 @@ struct PostgresDialect: SQLDialect {
164
159
}
165
160
}
166
161
167
- extension PostgresConnection : SQLDatabase {
162
+ extension PostgresConnection : SQLDatabase { }
163
+ extension SQLDatabase where Self: PostgresDatabase {
168
164
public func sqlQuery( _ query: SQLExpression , _ onRow: @escaping ( SQLRow ) throws -> ( ) ) -> EventLoopFuture < Void > {
169
165
var serializer = SQLSerializer ( dialect: PostgresDialect ( ) )
170
166
query. serialize ( to: & serializer)
@@ -176,10 +172,21 @@ extension PostgresConnection: SQLDatabase {
176
172
}
177
173
}
178
174
179
- extension PostgresDatabase : SQLDatabase {
175
+ #warning("TODO: move to NIOPostgres?")
176
+ extension ConnectionPool : PostgresDatabase where Source. Connection: PostgresDatabase {
177
+ public var eventLoop : EventLoop {
178
+ return self . source. eventLoop
179
+ }
180
+
181
+ public func send( _ request: PostgresRequestHandler ) -> EventLoopFuture < Void > {
182
+ return self . withConnection { $0. send ( request) }
183
+ }
184
+ }
185
+
186
+ #warning("TODO: move to SQLKit?")
187
+ extension ConnectionPool : SQLDatabase where Source. Connection: SQLDatabase {
180
188
public func sqlQuery( _ query: SQLExpression , _ onRow: @escaping ( SQLRow ) throws -> ( ) ) -> EventLoopFuture < Void > {
181
- return self . makeConnection ( ) . flatMap { conn in
182
- return conn. sqlQuery ( query, onRow)
183
- }
189
+ return self . withConnection { $0. sqlQuery ( query, onRow) }
184
190
}
185
191
}
192
+
0 commit comments