Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Haskell] Jak przerobić "Database.HaskellDB.GenericConnect" na "Database.HDBC.ODBC"?

Ostatnio zmodyfikowano 2016-02-29 19:41
Autor Wiadomość
DejaVu
Temat założony przez niniejszego użytkownika
[Haskell] Jak przerobić "Database.HaskellDB.GenericConnect" na "Database.HDBC.ODBC"?
» 2016-02-29 12:23:12
Mam bardzo stary kod, który wygląd mniej więcej tak:
Haskell
import Database.HaskellDB.GenericConnect
import Database.HaskellDB.Query (Table(..))
import Database.HaskellDB.PrimQuery (TableName)

connect :: [String] -> (Database -> IO a) -> IO a
connect (driver:args) = genericConnect driver args
connect _ = error "No driver argument supplied"

foraConnect :: (Database -> IO a) -> IO a
foraConnect f = do
    connect ["mysql", "localhost", "baza", "login", "haslo"] $ \db ->
 transaction db (f db)


Na aktualnym systemie operacyjnym nie mam jednak pakietu GenericConnect i chciałbym go przerobić na coś bardziej aktualnego. Wydaje mi się, że trzeba przerobić to na Database.HDBC.ODBC. Problem w tym, że niezbyt przyjemny jest ten język i coś mi przeróbki nie wychodzą :P

Znalazłem w necie przykład, który teoretycznie łączy się z MySQL-em po 'nowemu':
Haskell
import           Database.HDBC       
import qualified Database.HDBC.ODBC   as ODBC
import           Control.Monad
-- http://www.dofactory.com/reference/connection-strings
-- | Main application.
main :: IO ()
main = dbTest

dbTest :: IO ()
dbTest = do
    connHandle <- Database.HDBC.ODBC.connectODBC "Driver={MySql};Server=localhost;Option=131072;Port=3306;Stmt=;DataBase=baza;Uid=login;Pwd=haslo;"
    replicateM_ 20000 (loop connHandle)
    disconnect connHandle
  where
    loop c = do
        result <- getTables c
        commit c
        putStrLn $ show result

Jeżeli ktoś ma wiedzę z Haskella to prosiłbym o informację jak powinien wyglądać przytoczony fragment kodu pierwszego programu tak, aby łączył się on z bazą danych MySQL za pomocą tego, co zostało przytoczone w drugim programie.
P-145412
Monika90
» 2016-02-29 18:37:00
Przerobienie tych dwóch funkcji z pierwszego pliku prawdopodobnie nie wystarczy, trzeba będzie jeszcze zmienić miejsca z których są wywoływane.

Tę drugą można przerobić tak
Haskell

foraConnect :: IConnection conn => (conn -> IO a) -> IO a
foraConnect f = do
    c <- Database.HDBC.ODBC.connectODBC "Driver={MySql};Server=localhost;Option=131072;Port=3306;Stmt=;DataBase=baza;Uid=login;Pwd=haslo;"
    withTransaction c f

chyba, bo nawet nie mam tego jak sprawdzić.

Sprawdzałeś czy ten drugi przykładowy kod da się uruchomić i czy faktycznie łączy się z bazą danych?
P-145422
DejaVu
Temat założony przez niniejszego użytkownika
» 2016-02-29 19:41:18
Nie sprawdzałem - musiałem skupić się na tym, aby skompilować stary kod i odpalić na nowej maszynie. Musiałem postawić sobie debiana 4 :) Jutro pewnie będę miał chwilę czasu, aby spróbować nawiązać połączenie z bazą danych na nowej wersji Haskella. Dziękuję więc za fragment kodu - jutro potestuję :)
P-145424
« 1 »
  Strona 1 z 1