From c97470c722775cf9571f130a4f5fb5eb4f4f41b2 Mon Sep 17 00:00:00 2001 From: Cyrus Harmon Date: Fri, 9 Sep 2016 09:41:57 -0700 Subject: [PATCH] Add interpreters for row and recordarray types --- cl-postgres/interpret.lisp | 43 +++++++++++++++++++++++++++++++++++++++++++ cl-postgres/protocol.lisp | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/cl-postgres/interpret.lisp b/cl-postgres/interpret.lisp index fd15087..6588475 100644 --- a/cl-postgres/interpret.lisp +++ b/cl-postgres/interpret.lisp @@ -92,6 +92,49 @@ interpreted as an array of the given type." (define-interpreter 1042 "bpchar" string) (define-interpreter 1043 "varchar" string) +(defun row-value-reader (stream size) + (declare (type stream stream) + (type integer size) + (ignore size)) + (let ((num-fields (read-uint4 stream))) + (loop for i below num-fields + collect (let ((oid (read-uint4 stream)) + (size (read-int4 stream))) + (declare (type (signed-byte 32) size)) + (if (eq size -1) + :null + (funcall (cdr (type-interpreter oid)) stream size)))))) +;; "row" types +(set-sql-reader 2249 #'row-value-reader :binary-p t) + +(defun recordarray-value-reader (stream size) + (declare (type stream stream) + (type integer size) + (ignore size)) + (let ((num-dims (read-uint4 stream)) + (has-null (read-uint4 stream)) + (element-type (read-uint4 stream))) + (declare (ignore has-null)) + (let* ((array-dims + (loop for i below num-dims + collect (let ((dim (read-uint4 stream)) + (lb (read-uint4 stream))) + (declare (ignore lb)) + dim))) + (num-items (reduce #'* array-dims))) + (let ((results (make-array array-dims))) + (loop for i below num-items + do (let ((size (read-int4 stream))) + (declare (type (signed-byte 32) size)) + (setf (row-major-aref results i) + (if (eq size -1) + :null + (funcall (cdr (type-interpreter element-type)) stream size))))) + results)))) + +;; "recordarray" types +(set-sql-reader 2287 #'recordarray-value-reader :binary-p t) + (define-interpreter 700 "float4" ((bits uint 4)) (cl-postgres-ieee-floats:decode-float32 bits)) (define-interpreter 701 "float8" ((bits uint 8)) diff --git a/cl-postgres/protocol.lisp b/cl-postgres/protocol.lisp index 7c28bb7..37c8c81 100644 --- a/cl-postgres/protocol.lisp +++ b/cl-postgres/protocol.lisp @@ -446,7 +446,7 @@ to the result." (message-case socket ;; RowDescription (#\T (setf row-description (read-field-descriptions socket))) - ;; NoData + ;; NoData (#\n)) (unless (= (length parameters) n-parameters) (error 'database-error -- 2.11.4.GIT