module Database.Beam.Backend.Sqlite3 where

import Database.Beam.Internal
import Database.Beam.Query.Internal
import Database.Beam.Backend
import Database.Beam.SQL.Types

import Control.Monad.Trans

import Database.HDBC.Sqlite3
import Database.HDBC

import Data.Text (Text, unpack)

-- * Sqlite3 support

data Sqlite3Settings = Sqlite3Settings FilePath
                       deriving Show

instance BeamBackend Sqlite3Settings where
    openBeam dbSettings (Sqlite3Settings fp) =
        do conn <- liftIO (connectSqlite3 fp)

           return Beam { beamDbSettings = dbSettings
                       , beamDebug = False
                       , closeBeam = liftIO (disconnect conn)
                       , compareSchemas = defaultBeamCompareSchemas
                       , adjustColDescForBackend =
                           \cs -> cs { csConstraints = filter (/=SQLAutoIncrement) (csConstraints cs) }
                       , getLastInsertedRow = getLastInsertedRow' conn
                       , withHDBCConnection = \f -> f conn }

getLastInsertedRow' :: MonadIO m => Connection -> Text -> m [SqlValue]
getLastInsertedRow' conn tblName = do
  [res] <- liftIO (quickQuery conn (concat ["SELECT * FROM ", unpack tblName, " WHERE ROWID=(SELECT last_insert_rowid()) limit 1"]) [])
  return res

(++.) :: QExpr Text -> QExpr Text -> QExpr Text
QExpr a ++. QExpr b = QExpr (SQLBinOpE "||" a b)