metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-03-05 03:23 pm

Ад, заборы, коровники

Успешно скрестил Clojure, c3p0 connection pool и Firebird JDBC driver (Jaybird):



(ns org.nii.operden
  (:require [clojure.java.jdbc :as sql])  
  (:use org.nii.operden.settings)   
  (:import (javax.sql DataSource))           
  (:import (com.mchange.v2.c3p0 DataSources ComboPooledDataSource))
  (:import (java.util Properties))
)


;;параметры коннекта. пригодны для использования в clojure.java.jdbc/with-connection
(def
 dbspec
 (let [user (get mainConfig "firebird.user" "")
       rolename (get mainConfig "firebird.rolename" "")
       pass (get mainConfig "firebird.password" "") 
       subname (get mainConfig "firebird.subname" "//localhost/operden")
       encoding  (get mainConfig "firebird.encoding" "WIN1251")]   
   {:classname   "org.firebirdsql.jdbc.FBDriver"
    :subprotocol "firebirdsql"
    :user        user
    :roleName    rolename 
    :password    pass
    :subname     subname
    :encoding    encoding}))

;передать роль для коннекта в jaybird через c3p0
(defn roleProp
      [role]
    (doto (Properties.)
          (.put "roleName" role))
)

;функция нагло стырена из korma и модифицирована
;возвращает DataSource, который так же пригоден для использования 
;  в clojure.java.jdbc/with-connection

(defn connection-pool
  "Create a connection pool for the given database spec."
  [spec]
  (let [excess (or (:excess-timeout spec) (* 30 60))
        idle (or (:idle-timeout spec) (* 3 60 60))
        cpds (doto (ComboPooledDataSource.)
               (.setDriverClass (:classname spec))
               (.setJdbcUrl (str "jdbc:" (:subprotocol spec) ":" (:subname spec)))
               (.setProperties (roleProp (:roleName spec)))  
               (.setUser (:user spec))
               (.setPassword (:password spec))               
               (.setAcquireRetryAttempts 3)
               (.setMinPoolSize  5)
               (.setMaxPoolSize  30) 
               (.setMaxIdleTimeExcessConnections excess)
               (.setMaxIdleTime idle))]
    {:datasource cpds}))


(def db (connection-pool dbspec))



Проблема(из-за которой даже пришлось выпилить korma) изначально была в том, что c3p0 сам по себе роль для коннекта не передавал. Роль, судя по всему - понятие сугубо для Firebird, причем даже там ими почти никто не пользуется, "слишком сложно". Примеров на тему "как передать роль" вообще почти нет, документация разрозненная и бредовая, пришлось перекопать исходники jaybird и c3p0, чтобы найти методику ее передачи.

[identity profile] yantayga.livejournal.com 2012-03-05 12:46 pm (UTC)(link)
Скобочек то, скобочек разных... И префиксные операции...

[identity profile] metaclass.livejournal.com 2012-03-05 12:48 pm (UTC)(link)
Да, меня скобки раньше пугали.
Но с нормальной подсветкой они не мешают, кроме того, большую вложенность делать не принято и не обязательно.
А разные виды скобок сильно упрощают синтаксис, делая его лаконичным.