Skip to content

Commit c171e1b

Browse files
committed
add point support
1 parent b170158 commit c171e1b

File tree

6 files changed

+31
-10
lines changed

6 files changed

+31
-10
lines changed

Sources/PostgreSQL/Base/PostgreSQLData.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public enum PostgreSQLData {
1818

1919
case float(Float)
2020
case double(Double)
21+
22+
case point(x: Int, y: Int)
2123

2224
case null
2325
}
@@ -90,6 +92,7 @@ extension PostgreSQLData: Equatable {
9092
case (.uint(let a), .uint(let b)): return a == b
9193
case (.float(let a), .float(let b)): return a == b
9294
case (.double(let a), .double(let b)): return a == b
95+
case (.point(let a), .point(let b)): return a == b
9396
case (.null, .null): return true
9497
default: return false
9598
}
@@ -117,6 +120,7 @@ extension PostgreSQLData: CustomStringConvertible {
117120
case .uint(let val): return "\(val) (uint)"
118121
case .float(let val): return "\(val) (float)"
119122
case .double(let val): return "\(val) (double)"
123+
case .point(let x, let y): return "(\(x), \(y))"
120124
case .null: return "null"
121125
}
122126
}

Sources/PostgreSQL/Base/PostgreSQLDataType+Parse.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ extension PostgreSQLDataType {
2222
case .float4: return .float(data.makeFloatingPoint())
2323
case .float8: return .double(data.makeFloatingPoint())
2424
case .bpchar: return try .string(data.makeString())
25+
case .point: return .point(x: data[0..<8].makeFixedWidthInteger(), y: data[8..<16].makeFixedWidthInteger())
2526
case .timestamp, .date, .time, .numeric, .pg_node_tree, ._aclitem:
2627
fatalError("Unexpected binary for \(self) (preferred format): \(data.hexDebug)")
2728
}
@@ -43,6 +44,14 @@ extension PostgreSQLDataType {
4344
case .date: return try .date(data.makeString().parseDate(format: "yyyy-MM-dd"))
4445
case .time: return try .date(data.makeString().parseDate(format: "HH:mm:ss"))
4546
case .void: return .null
47+
case .point:
48+
let string = try data.makeString()
49+
let parts = string.split(separator: ",")
50+
var x = parts[0]
51+
var y = parts[1]
52+
assert(x.popFirst()! == "(")
53+
assert(y.popLast()! == ")")
54+
return .point(x: Int(x)!, y: Int(y)!)
4655
case .pg_node_tree, ._aclitem: return try .string(data.makeString())
4756
}
4857
}

Sources/PostgreSQL/Base/PostgreSQLDataType+Serialize.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ extension PostgreSQLData {
1414
let serialized: Data?
1515
switch self {
1616
case .date(let date): serialized = Data(date.description.utf8)
17-
case .string, .null, .int8, .int16, .int32, .int, .uint8, .uint16, .uint32, .uint, .double, .float, .data:
17+
case .string, .null, .int8, .int16, .int32, .int, .uint8, .uint16, .uint32, .uint, .double, .float, .data, .point:
1818
fatalError("Unsupported serialize text: \(self)")
1919
}
2020
return serialized
@@ -37,6 +37,7 @@ extension PostgreSQLData {
3737
case .double(let double): serialized = Data(double.bytes)
3838
case .float(let float): serialized = Data(float.bytes)
3939
case .data(let data): serialized = data
40+
case .point(let x, let y): serialized = Data(x.bytes) + Data(y.bytes)
4041
case .date:
4142
fatalError("Unsupported serialize binary: \(self)")
4243
}

Sources/PostgreSQL/Base/PostgreSQLDataType.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ enum PostgreSQLDataType: Int32, Codable {
1414
case text = 25
1515
case oid = 26
1616
case pg_node_tree = 194
17+
case point = 600
1718
case float4 = 700
1819
case float8 = 701
1920
case _aclitem = 1034
@@ -44,6 +45,7 @@ extension PostgreSQLDataType {
4445
case .float: return .float4
4546
case .data: return .bytea
4647
case .date: return .timestamp
48+
case .point: return .point
4749
}
4850
}
4951
}
@@ -70,6 +72,7 @@ extension PostgreSQLDataType {
7072
case .bpchar: return .binary
7173
case .varchar: return .binary
7274
case .void: return .binary
75+
case .point: return .binary
7376

7477
// Text
7578
// Converting these to binary supporting may improve performance

Sources/PostgreSQL/Client/PostgreSQLClient.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public final class PostgreSQLClient {
3535
}
3636
}
3737

38+
/// Authenticates the `PostgreSQLClient` using a username with no password.
3839
public func authenticate(username: String) -> Future<Void> {
3940
let startup = PostgreSQLStartupMessage.versionThree(parameters: ["user": username])
4041
return send(.startupMessage(startup)).transform(to: ())

Tests/PostgreSQLTests/PostgreSQLClientTests.swift

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ class PostgreSQLClientTests: XCTestCase {
5050
"timestamp" timestamp,
5151
"date" date,
5252
"time" time,
53-
"boolean" boolean-- ,
54-
-- "point" point,
53+
"boolean" boolean,
54+
"point" point
5555
-- "line" line,
5656
-- "lseg" lseg,
5757
-- "box" box,
@@ -85,8 +85,8 @@ class PostgreSQLClientTests: XCTestCase {
8585
now(), -- "timestamp" timestamp
8686
current_date, -- "date" date
8787
localtime, -- "time" time
88-
true -- "boolean" boolean
89-
-- "point" point,
88+
true, -- "boolean" boolean
89+
point(13,14) -- "point" point,
9090
-- "line" line,
9191
-- "lseg" lseg,
9292
-- "box" box,
@@ -100,7 +100,7 @@ class PostgreSQLClientTests: XCTestCase {
100100
-- "uuid" uuid
101101
);
102102
"""
103-
let insertResult = try client.query(insertQuery).await(on: eventLoop)
103+
let insertResult = try! client.query(insertQuery).await(on: eventLoop)
104104
XCTAssertEqual(insertResult.count, 0)
105105
let queryResult = try client.query("select * from kitchen_sink").await(on: eventLoop)
106106
if queryResult.count == 1 {
@@ -116,6 +116,7 @@ class PostgreSQLClientTests: XCTestCase {
116116
XCTAssertEqual(row["text"], .string("11"))
117117
XCTAssertEqual(row["bytea"], .data(Data([0x31, 0x32])))
118118
XCTAssertEqual(row["boolean"], .uint8(0x01))
119+
XCTAssertEqual(row["point"], .point(x: 13, y: 14))
119120
} else {
120121
XCTFail("query result count is: \(queryResult.count)")
121122
}
@@ -139,8 +140,8 @@ class PostgreSQLClientTests: XCTestCase {
139140
"timestamp" timestamp,
140141
"date" date,
141142
"time" time,
142-
"boolean" boolean-- ,
143-
-- "point" point,
143+
"boolean" boolean,
144+
"point" point
144145
-- "line" line,
145146
-- "lseg" lseg,
146147
-- "box" box,
@@ -174,8 +175,8 @@ class PostgreSQLClientTests: XCTestCase {
174175
$12, -- "timestamp" timestamp
175176
$13, -- "date" date
176177
$14, -- "time" time
177-
$15 -- "boolean" boolean
178-
-- "point" point,
178+
$15, -- "boolean" boolean
179+
$16 -- "point" point
179180
-- "line" line,
180181
-- "lseg" lseg,
181182
-- "box" box,
@@ -205,6 +206,7 @@ class PostgreSQLClientTests: XCTestCase {
205206
PostgreSQLData.date(Date()), // date
206207
PostgreSQLData.date(Date()), // time
207208
PostgreSQLData.uint8(1), // boolean
209+
PostgreSQLData.point(x: 11, y: 12) // point
208210
]).await(on: eventLoop)
209211
XCTAssertEqual(insertResult.count, 0)
210212

@@ -222,6 +224,7 @@ class PostgreSQLClientTests: XCTestCase {
222224
XCTAssertEqual(row["text"], .string("10"))
223225
XCTAssertEqual(row["bytea"], .data(Data([0x31, 0x32])))
224226
XCTAssertEqual(row["boolean"], .uint8(0x01))
227+
XCTAssertEqual(row["point"], .point(x: 11, y: 12))
225228
} else {
226229
XCTFail("parameterized result count is: \(parameterizedResult.count)")
227230
}

0 commit comments

Comments
 (0)