aboutsummaryrefslogtreecommitdiff
path: root/src/conn.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/conn.zig')
-rw-r--r--src/conn.zig49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/conn.zig b/src/conn.zig
new file mode 100644
index 0000000..870ab01
--- /dev/null
+++ b/src/conn.zig
@@ -0,0 +1,49 @@
+const std = @import("std");
+const SSHashMap = std.StringHashMap([]const u8);
+const Config = @import("config.zig");
+const StartupMessage = @import("startup_message.zig");
+const AuthenticationOk = @import("authentication_ok.zig");
+const AuthenticationCleartextPassword = @import("authentication_cleartext_password.zig");
+const ErrorResponse = @import("error_response.zig");
+
+const Conn = @This();
+
+const ConnStatus = enum {
+ connStatusUninitialized,
+ connStatusConnecting,
+ connStatusClosed,
+ connStatusIdle,
+ connStatusBusy,
+};
+
+stream: std.net.Stream,
+config: Config,
+status: ConnStatus,
+
+pub fn connect(config: Config) !Conn {
+ const allocator = config.allocator;
+ var stream = switch (config.address) {
+ .net => |addr| try std.net.tcpConnectToAddress(addr),
+ .unix => |path| try std.net.connectUnixSocket(path),
+ };
+ var writer = stream.writer();
+
+ errdefer stream.close();
+ var params = SSHashMap.init(allocator);
+ errdefer params.deinit();
+ try params.put("user", config.user);
+ if (config.database) |database| try params.put(database);
+ var sm = StartupMessage{
+ .parameters = params,
+ };
+ defer sm.deinit(allocator);
+ try sm.write(allocator, writer);
+}
+
+const StartupMessageResponseType = enum(u8) {
+ ErrorResponse = 'E',
+ AuthenticationResponse = AuthenticationOk.Tag, // All the authentication responses share a message type and must be decoded by the next field
+};
+const StartupMessageResponse = union(StartupMessageResponseType) {
+ error: ErrorResponse,
+}; \ No newline at end of file