2011-08-30 15 views
8

Tengo una enumeración en PostgreSQL se define así:Clojure/postgresql: ¿Cómo accedo a los valores enum desde los resultados de Jdbc4Array?

create type color as enum ('yellow', 'purple', 'white', 'black'); 

Y puedo llegar al Jdbc4Array así:

(def colors 
    ((first (sql/with-connection db/db 
    (sql/with-query-results res 
     ["select enum_range(null::color)"] 
     (doall res)))) :enum_range)) 

Esto muestra un objeto como éste:

#<Jdbc4Array {yellow,purple,white,black}> 

Pero intentar las cosas habituales arroja una excepción:

(.getArray colors) => stream closed 

por lo que figura que necesito para acceder a la matriz antes de que se cierre la conexión:

(def colors 
    ((sql/with-connection db/db 
    (sql/with-query-results res 
     ["select enum_range(null::color)"] 
     (.getArray ((first (doall res)) :enum_range)))))) 

Pero en este caso me sale esta excepción:

Method org.postgresql.jdbc4.Jdbc4Array.getArrayImpl(long,int,Map) 
is not yet implemented. 

siniestro. ¿Qué puedo hacer aquí?

Respuesta

1

Hay algo muy extraño en la implementación de Postgresql Jdbc4Array.getArray(), no pude hacerlo funcionar. Pero, tengo algo de éxito con .getResultSet():

user=> (with-connection db (with-query-results rs ["select enum_range(null::color)"]  
      (.getResultSet (get (first(doall rs)) :enum_range)))) 
#<Jdbc4ResultSet [email protected]> 

Ahora, el contenido de la matriz se puede acceder a través de la interfaz ResultSet estándar. He copiado un cierto código de clojure.contrib.sql hacerlo:

(defn resultset-seq 
    [^java.sql.ResultSet rs] 
    (let [rsmeta (. rs (getMetaData)) 
    idxs (range 1 (inc (. rsmeta (getColumnCount)))) 
    keys (map (fn [i] (. rsmeta (getColumnLabel i))) idxs) 
    check-keys (or (apply distinct? keys) 
       (throw (Exception. "ResultSet must have unique column labels"))) 
    row-struct (apply create-struct keys) 
    row-values (fn [] (map (fn [^Integer i] (. rs (getObject i))) idxs)) 
    rows (fn thisfn [] 
      (when (. rs (next)) 
     (cons (apply struct row-struct (row-values)) (lazy-seq (thisfn)))))] 
    (rows))) 

que da (lo siento por código de estilo rápido-hack)

user=> (with-connection db 
     (with-query-results rs ["select enum_range(null::color)"] 
          (get (first (resultset-seq 
              (.getResultSet (get (first(doall rs)) 
                   :enum_range)))) 
           "VALUE"))) 
#<PGobject yellow> 
Cuestiones relacionadas