Further internationalization.
[clsql.git] / db-postgresql / postgresql-sql.lisp
index aad11a0c2aeb1d764be584c50cb551b9e00e13d3..462c447486035c5d806febd3259dbd8ed17e9f0e 100644 (file)
@@ -55,9 +55,9 @@
           (t
            nil)))))
 
-(defun tidy-error-message (message)
+(defun tidy-error-message (message &optional encoding)
   (unless (stringp message)
-    (setq message (uffi:convert-from-foreign-string message)))
+    (setq message (uffi:convert-from-foreign-string message :encoding encoding)))
   (let ((message (string-right-trim '(#\Return #\Newline) message)))
     (cond
       ((< (length message) (length "ERROR:"))
           (error 'sql-database-data-error
                  :database database
                  :expression query-expression
-                 :message (tidy-error-message (PQerrorMessage conn-ptr))))
+                 :message (tidy-error-message (PQerrorMessage conn-ptr) (encoding database))))
         (unwind-protect
             (case (PQresultStatus result)
               ;; User gave a command rather than a query
                                         (if (zerop (PQgetisnull result tuple-index i))
                                             (convert-raw-field
                                              (PQgetvalue result tuple-index i)
-                                             result-types i)
+                                             (nth i result-types)
+                                             :encoding (encoding database))
                                           nil)))))
                    (if field-names
                        (values res (result-field-names num-fields result))
                       :expression query-expression
                       :error-id (PQresultErrorField result +PG-DIAG-SQLSTATE+)
                       :message (tidy-error-message
-                                (PQresultErrorMessage result)))))
+                                (PQresultErrorMessage result)
+                                (encoding database)))))
           (PQclear result))))))
 
 (defun result-field-names (num-fields result)
           (error 'sql-database-data-error
                  :database database
                  :expression sql-expression
-                 :message (tidy-error-message (PQerrorMessage conn-ptr))))
+                 :message (tidy-error-message (PQerrorMessage conn-ptr)
+                                              (encoding databse))))
         (unwind-protect
             (case (PQresultStatus result)
               (#.pgsql-exec-status-type#command-ok
                       :expression sql-expression
                       :error-id (PQresultErrorField result +PG-DIAG-SQLSTATE+)
                       :message (tidy-error-message
-                                (PQresultErrorMessage result)))))
+                                (PQresultErrorMessage result)
+                                (encoding database)))))
           (PQclear result))))))
 
 (defstruct postgresql-result-set
           (error 'sql-database-data-error
                  :database database
                  :expression query-expression
-                 :message (tidy-error-message (PQerrorMessage conn-ptr))))
+                 :message (tidy-error-message (PQerrorMessage conn-ptr)
+                                              (encoding database))))
         (case (PQresultStatus result)
           ((#.pgsql-exec-status-type#empty-query
             #.pgsql-exec-status-type#tuples-ok)
                       :expression query-expression
                       :error-id (PQresultErrorField result +PG-DIAG-SQLSTATE+)
                       :message (tidy-error-message
-                                (PQresultErrorMessage result)))
+                                (PQresultErrorMessage result)
+                                (encoding database)))
              (PQclear result))))))))
 
 (defmethod database-dump-result-set (result-set (database postgresql-database))
               (if (zerop (PQgetisnull result tuple-index i))
                   (convert-raw-field
                    (PQgetvalue result tuple-index i)
-                   types i)
+                   (nth i types)
+                   :encoding (encoding database))
                 nil))
           finally
             (incf (postgresql-result-set-tuple-index result-set))
                            length :unsigned t))
              (when (= (lo-read ptr fd buffer length) length)
                (setf result (uffi:convert-from-foreign-string
-                             buffer :length length :null-terminated-p nil))))))
+                             buffer :length length :null-terminated-p nil
+                             :encoding (encoding database)))))))
       (progn
         (when buffer (uffi:free-foreign-object buffer))
         (when (and fd (>= fd 0)) (lo-close ptr fd))