
On Tue, 24 Jun 2008, Alistair Bayley wrote:
2008/6/24 Henning Thielemann
: (Btw. Takusen should be split into several packages for all database backends because Cabal flags must not influence the package interface.)
I don't understand this (cabal flags must not influence package interface). I thought that was the point of cabal flags? I wanted to have a single package installation, and this seems like the best way.
No, if a package imports Takusen - how can it be assert that it can import the Oracle back-end? It can't because it can reference the Takusen package only by its name and a version. Flags are there to make a package appear consistent under different circumstances (e.g. Windows and Unix, or GHC-6.4 and GHC-6.8). If the back-end modules would not be exported, then the API would remain the same for different back-ends and that would be ok.
But on installation Cabal complains about missing /usr/oci directory.
When you run configure, you should get output that says: Using Oracle: <path>
What is <path>?
I don't get these questions.
The Setup.hs assumes the entire Oracle installation is under a single root folder ($ORACLE_HOME); is this not true on Linux?
Ah, I must have set ORACLE_HOME for the Takusen installation ... should be documented. However in my case, this doesn't change the path used by Takusen's Setup/install. $ echo $ORACLE_HOME /usr/lib/oracle/10.2.0.4/client $ ls $ORACLE_HOME bin lib $ ll $ORACLE_HOME/lib -rw-r--r-- 1 root root 1525 17. Feb 09:58 glogin.sql lrwxrwxrwx 1 root root 17 24. Jun 15:36 libclntsh.so -> libclntsh.so.10.1 -rw-r--r-- 1 root root 19076649 17. Feb 09:57 libclntsh.so.10.1 -rw-r--r-- 1 root root 5656445 17. Feb 09:57 libnnz10.so lrwxrwxrwx 1 root root 15 24. Jun 15:36 libocci.so -> libocci.so.10.1 -rw-r--r-- 1 root root 1398244 17. Feb 09:57 libocci.so.10.1 -rw-r--r-- 1 root root 72698427 17. Feb 09:57 libociei.so -rw-r--r-- 1 root root 120443 17. Feb 09:57 libocijdbc10.so -rw-r--r-- 1 root root 1434263 17. Feb 09:58 libsqlplusic.so -rw-r--r-- 1 root root 1069221 17. Feb 09:58 libsqlplus.so -rw-r--r-- 1 root root 781311 17. Feb 09:58 libsqora.so.10.1 -rw-r--r-- 1 root root 1555682 17. Feb 09:57 ojdbc14.jar I assume that libociei.so is the library I need. $ runhaskell Setup.hs configure --user -f oracle Configuring Takusen-0.8.2... $ runhaskell Setup.hs build && runhaskell Setup.hs haddock Preprocessing library Takusen-0.8.2... Building Takusen-0.8.2... /usr/bin/ar: creating dist/build/libHSTakusen-0.8.2.a Preprocessing library Takusen-0.8.2... Running Haddock for Takusen-0.8.2... Preprocessing library Takusen-0.8.2... ... Documentation created: dist/doc/html/Takusen/index.html $ runhaskell Setup.hs install Installing: [...]/lib/Takusen-0.8.2/ghc-6.8.2 Registering Takusen-0.8.2... Reading package info from "dist/installed-pkg-config" ... done. ghc-pkg: /usr/oci doesn't exist or isn't a directory (use --force to override)
Once I will get Takusen running with OCI - how would I use it? Is there a minimal example which connects to an Oracle database, performing a very simple query?
There's an example in the README.txt, which I've tweaked here for Oracle:
{-# OPTIONS -fglasgow-exts #-} {-# OPTIONS -fallow-overlapping-instances #-} module Main where import Database.Oracle.Enumerator import Control.Monad.Trans (liftIO) main = flip catchDB reportRethrow $ withSession (connect "user" "pswd" "dbname") (do let iter (s::String) (_::String) = result s result <- doQuery (sql "select 'Hello world.' from dual") iter "" liftIO (putStrLn result) )
Thanks for the adapted example!