packages feed

hsql-odbc-1.8.1: DB/HSQL/ODBC/Type.hsc

{-# LANGUAGE ForeignFunctionInterface #-}
module DB.HSQL.ODBC.Type where

import Data.Int(Int32, Int16)
import Data.Word(Word32, Word16)
import Foreign(Ptr,ForeignPtr)

import Database.HSQL.Types(SqlType(..))

#include <HsODBC.h>

type SQLHANDLE = Ptr ()
type HENV = SQLHANDLE
type HDBC = SQLHANDLE
type HSTMT = SQLHANDLE
type HENVRef = ForeignPtr ()

type SQLSMALLINT  = #type SQLSMALLINT
type SQLUSMALLINT = #type SQLUSMALLINT
type SQLINTEGER   = #type SQLINTEGER
type SQLUINTEGER  = #type SQLUINTEGER
type SQLRETURN	  = SQLSMALLINT
type SQLLEN       = SQLINTEGER
type SQLULEN      = SQLINTEGER

type SQL = String

-- |
mkSqlType :: SQLSMALLINT -> SQLULEN -> SQLSMALLINT -> SqlType
mkSqlType sqlChar         size    _    = SqlChar (fromIntegral size)
mkSqlType sqlVarChar      size    _    = SqlVarChar (fromIntegral size)
mkSqlType sqlLongVarChar  size    _    = SqlLongVarChar (fromIntegral size)
mkSqlType sqlDecimal      size    prec = 
    SqlDecimal (fromIntegral size) (fromIntegral prec)
mkSqlType sqlNumeric      size    prec = 
    SqlNumeric (fromIntegral size) (fromIntegral prec)
mkSqlType sqlSmallint     _       _    = SqlSmallInt
mkSqlType sqlInteger      _       _    = SqlInteger
mkSqlType sqlReal          _       _    = SqlReal
-- From: http://msdn.microsoft.com/library/en-us/odbc/htm/odappdpr_2.asp
-- "Depending on the implementation, the precision of SQL_FLOAT can be
-- either 24 or 53:
-- if it is 24, the SQL_FLOAT data type is the same as SQL_REAL;
-- if it is 53, the SQL_FLOAT data type is the same as SQL_DOUBLE."
mkSqlType sqlFloat        _        _    = SqlFloat
mkSqlType sqlDouble		_    	_    = SqlDouble
mkSqlType sqlBit          _       	_    = SqlBit
mkSqlType sqlTinyInt      _    	_    = SqlTinyInt
mkSqlType sqlBigint       _    	_    = SqlBigInt
mkSqlType sqlBinary       size    _    = SqlBinary (fromIntegral size)
mkSqlType sqlVarBinary    size    _    = SqlVarBinary (fromIntegral size)
mkSqlType sqlLongVarBinary size    _    = SqlLongVarBinary (fromIntegral size)
mkSqlType sqlDate         _    	_    = SqlDate
mkSqlType sqlTime         _    	_    = SqlTime
mkSqlType sqlTimestamp	_    	_    = SqlDateTime
mkSqlType sqlWChar        size	_    = SqlWChar (fromIntegral size)
mkSqlType sqlWVarChar     size    _    = SqlWVarChar (fromIntegral size)
mkSqlType sqlWLongVarChar	size    _    = 
    SqlWLongVarChar (fromIntegral size)
mkSqlType tp                        _       _    = SqlUnknown (fromIntegral tp)

-- | #const
sqlChar = #const SQL_CHAR

sqlVarChar = #const SQL_VARCHAR

sqlLongVarChar = #const SQL_LONGVARCHAR

sqlDecimal = #const SQL_DECIMAL

sqlNumeric = #const SQL_NUMERIC

sqlSmallint = #const SQL_SMALLINT

sqlInteger = #const SQL_INTEGER

sqlReal = #const SQL_REAL

sqlFloat = #const SQL_FLOAT

sqlDouble = #const SQL_DOUBLE

sqlBit = #const SQL_BIT

sqlTinyInt = #const SQL_TINYINT

sqlBigint = #const SQL_BIGINT

sqlBinary = #const SQL_BINARY

sqlVarBinary = #const SQL_VARBINARY

sqlLongVarBinary = #const SQL_LONGVARBINARY

sqlDate = #const SQL_DATE

sqlTime = #const SQL_TIME

sqlTimestamp = #const SQL_TIMESTAMP

sqlWChar = #const SQL_WCHAR

sqlWVarChar = #const SQL_WVARCHAR

sqlWLongVarChar = #const SQL_WLONGVARCHAR