diff --git a/src/invidious/helpers/handlers.cr b/src/invidious/helpers/handlers.cr index 216f9b5d..7fbfb643 100644 --- a/src/invidious/helpers/handlers.cr +++ b/src/invidious/helpers/handlers.cr @@ -225,3 +225,41 @@ class HTTP::Client response end end + +# https://github.com/will/crystal-pg/pull/171 +class PG::Statement < ::DB::Statement + protected def perform_query(args : Enumerable) : ResultSet + params = args.map { |arg| PQ::Param.encode(arg) } + conn = self.conn + conn.send_parse_message(@sql) + conn.send_bind_message params + conn.send_describe_portal_message + conn.send_execute_message + conn.send_sync_message + conn.expect_frame PQ::Frame::ParseComplete + conn.expect_frame PQ::Frame::BindComplete + frame = conn.read + case frame + when PQ::Frame::RowDescription + fields = frame.fields + when PQ::Frame::NoData + fields = nil + else + raise "expected RowDescription or NoData, got #{frame}" + end + ResultSet.new(self, fields) + rescue IO::Error + raise DB::ConnectionLost.new(connection) + end + + protected def perform_exec(args : Enumerable) : ::DB::ExecResult + result = perform_query(args) + result.each { } + ::DB::ExecResult.new( + rows_affected: result.rows_affected, + last_insert_id: 0_i64 # postgres doesn't support this + ) + rescue IO::Error + raise DB::ConnectionLost.new(connection) + end +end