You can subscribe to this list here.
| 2003 |
Jan
(30) |
Feb
(20) |
Mar
(151) |
Apr
(86) |
May
(23) |
Jun
(25) |
Jul
(107) |
Aug
(141) |
Sep
(55) |
Oct
(85) |
Nov
(65) |
Dec
(2) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2004 |
Jan
(22) |
Feb
(18) |
Mar
(3) |
Apr
(16) |
May
(69) |
Jun
(3) |
Jul
(1) |
Aug
(3) |
Sep
(1) |
Oct
|
Nov
(6) |
Dec
(1) |
| 2005 |
Jan
(2) |
Feb
(16) |
Mar
|
Apr
|
May
|
Jun
(47) |
Jul
(1) |
Aug
|
Sep
(6) |
Oct
(4) |
Nov
|
Dec
(34) |
| 2006 |
Jan
(39) |
Feb
|
Mar
(2) |
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
(5) |
Oct
|
Nov
(4) |
Dec
|
| 2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
| 2008 |
Jan
|
Feb
|
Mar
(26) |
Apr
(1) |
May
(1) |
Jun
|
Jul
(5) |
Aug
(2) |
Sep
(8) |
Oct
(8) |
Nov
(22) |
Dec
(30) |
| 2009 |
Jan
(10) |
Feb
(13) |
Mar
(14) |
Apr
(14) |
May
(32) |
Jun
(25) |
Jul
(36) |
Aug
(10) |
Sep
(2) |
Oct
|
Nov
|
Dec
(10) |
| 2010 |
Jan
(9) |
Feb
(4) |
Mar
(2) |
Apr
(1) |
May
(2) |
Jun
(2) |
Jul
(1) |
Aug
(4) |
Sep
|
Oct
(1) |
Nov
|
Dec
|
|
From: <kr_...@us...> - 2003-09-09 13:34:43
|
Update of /cvsroot/htoolkit/port
In directory sc8-pr-cvs1:/tmp/cvs-serv11150
Modified Files:
configure makefile
Log Message:
Turn back to old configure/make scripts
Index: configure
===================================================================
RCS file: /cvsroot/htoolkit/port/configure,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** configure 31 Aug 2003 08:09:00 -0000 1.19
--- configure 9 Sep 2003 13:34:39 -0000 1.20
***************
*** 1,1824 ****
! #! /bin/sh
! # Guess values for system-dependent variables and create Makefiles.
! # Generated by GNU Autoconf 2.57 for HToolkit 1.0.
! #
! # Report bugs to <ka2...@ya...>.
! #
! # Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
! # Free Software Foundation, Inc.
! # This configure script is free software; the Free Software Foundation
! # gives unlimited permission to copy, distribute and modify it.
[...3354 lines suppressed...]
! echo "#ifndef _config_h" >> src/include/config.h
! echo "# define ${target}_TARGET" >> src/include/config.h
! echo "#endif" >> src/include/config.h
+ echo "creating package description"
+ echo " - config/port.pkg"
+ echo "Package" > config/port.pkg
+ echo " { name=\"port\"" >> config/port.pkg
+ echo " , auto=True" >> config/port.pkg
+ echo " , import_dirs=[\"\$libdir/imports\"]" >> config/port.pkg
+ echo " , library_dirs=[\"$libdir\" $extralibdirs]" >> config/port.pkg
+ echo " , hs_libraries=[\"HSport\"]" >> config/port.pkg
+ echo " , extra_libraries=[$extralibs]" >> config/port.pkg
+ echo " , package_deps=[]" >> config/port.pkg
+ echo " , include_dirs = [$incdirs]" >> config/port.pkg
+ echo " , c_includes = [\"HsPort.h\"]" >> config/port.pkg
+ echo " }" >> config/port.pkg
echo "done -- type 'make' to build the package."
+ echo ""
Index: makefile
===================================================================
RCS file: /cvsroot/htoolkit/port/makefile,v
retrieving revision 1.40
retrieving revision 1.41
diff -C2 -d -r1.40 -r1.41
*** makefile 3 Sep 2003 17:03:24 -0000 1.40
--- makefile 9 Sep 2003 13:34:39 -0000 1.41
***************
*** 19,23 ****
# system dependent stuff
! -include config.mk
#--------------------------------------------------------------------------
--- 19,23 ----
# system dependent stuff
! -include config/config.mk
#--------------------------------------------------------------------------
***************
*** 44,48 ****
STUBS = Port/Handlers.hs
- GSTSTUBS = GST/Handlers.c
CSRCS = Window.c Util.c Bitmap.c Button.c CheckBox.c EditBox.c \
--- 44,47 ----
***************
*** 58,62 ****
# package description
! PKG = $(MAIN).pkg
#--------------------------------------------------------------------------
--- 57,61 ----
# package description
! PKG = config/$(MAIN).pkg
#--------------------------------------------------------------------------
***************
*** 88,92 ****
HC-OPTIONS = -O2
! CC-OPTIONS = -O2 -Wall $(CCOPTIONS)
ifdef HDOCHTML
--- 87,91 ----
HC-OPTIONS = -O2
! CC-OPTIONS = -O2
ifdef HDOCHTML
***************
*** 113,131 ****
# main, object files, dependencies and hi files
! HSLIB = $(BUILDDIR)/libHS$(MAIN).a
! GSTLIB = $(BUILDDIR)/libGST$(MAIN).so
MAINOBJ = HS$(MAIN).o
HOBJS = $(patsubst %.hs,$(HOUTDIR)/%.o, $(HSRCS))
! HDEPS = $(patsubst %.hs,$(HOUTDIR)/%.d, $(HSRCS))
! COBJS = $(patsubst %.c,$(COUTDIR)/%.c.o, $(CSRCS))
! CLOBJS = $(patsubst %.c,$(COUTDIR)/%.c.lo, $(CSRCS))
! CDEPS = $(patsubst %.c,$(COUTDIR)/%.c.d, $(CSRCS))
STUBOBJS = $(patsubst %.hs,$(HOUTDIR)/%.o, $(STUBS))
STUBINCS = $(patsubst %.hs,$(HOUTDIR)/%_stub.h, $(STUBS))
STUBSTUBOBJS= $(patsubst %.hs,$(HOUTDIR)/%_stub.o, $(STUBS))
! GSTSTUBOBJS = $(patsubst %.c,$(COUTDIR)/%_stub.o, $(GSTSTUBS))
#--------------------------------------------------------------------------
--- 112,128 ----
# main, object files, dependencies and hi files
! MAINLIB = $(BUILDDIR)/libHS$(MAIN).a
MAINOBJ = HS$(MAIN).o
HOBJS = $(patsubst %.hs,$(HOUTDIR)/%.o, $(HSRCS))
! HDEPS = $(patsubst %.hs,$(HOUTDIR)/%.d, $(HSRCS))
! COBJS = $(patsubst %.c,$(COUTDIR)/%.c.o, $(CSRCS))
! CDEPS = $(patsubst %.c,$(COUTDIR)/%.c.d, $(CSRCS))
STUBOBJS = $(patsubst %.hs,$(HOUTDIR)/%.o, $(STUBS))
STUBINCS = $(patsubst %.hs,$(HOUTDIR)/%_stub.h, $(STUBS))
STUBSTUBOBJS= $(patsubst %.hs,$(HOUTDIR)/%_stub.o, $(STUBS))
!
#--------------------------------------------------------------------------
***************
*** 134,152 ****
# The main targets
! .PHONY: all release
all: release doc
! TARGETLIBS=
! ifeq "$(GHCDISABLED)" "NO"
! TARGETLIBS += $(HSLIB)
! endif
! ifeq "$(GSTDISABLED)" "NO"
! TARGETLIBS += $(GSTLIB)
! endif
!
! release: $(TARGETLIBS)
! install: $(HSLIB) $(PKG)
install -d $(LIBDIR)/imports/Graphics/UI/Port
install -d $(LIBDIR)/include/port
--- 131,141 ----
# The main targets
! .PHONY: all release
all: release doc
! release: $(MAINLIB)
! install: $(MAINLIB) $(PKG)
install -d $(LIBDIR)/imports/Graphics/UI/Port
install -d $(LIBDIR)/include/port
***************
*** 155,159 ****
install -m 644 $(HOUTDIR)/*.hi $(LIBDIR)/imports/Graphics/UI
install -m 644 $(HOUTDIR)/Port/*.hi $(LIBDIR)/imports/Graphics/UI/Port
! install -m 644 $(HSLIB) $(LIBDIR)
install -m 644 src/include/HsPort.h $(LIBDIR)/include
install -m 644 src/include/*.h $(LIBDIR)/include/port
--- 144,148 ----
install -m 644 $(HOUTDIR)/*.hi $(LIBDIR)/imports/Graphics/UI
install -m 644 $(HOUTDIR)/Port/*.hi $(LIBDIR)/imports/Graphics/UI/Port
! install -m 644 $(MAINLIB) $(LIBDIR)
install -m 644 src/include/HsPort.h $(LIBDIR)/include
install -m 644 src/include/*.h $(LIBDIR)/include/port
***************
*** 163,172 ****
install -m 644 doc/*.html doc/*.css doc/*.gif doc/*.haddock $(LIBDIR)/doc/html/port
! $(HSLIB): $(HOBJS) $(COBJS) $(STUBSTUBOBJS)
! $(RM) $(HSLIB)
! $(AR) -r $@ $^
- $(GSTLIB) : $(CLOBJS) $(GSTSTUBOBJS)
- $(LD) $^ -o $@ $(CLIBS)
# create an object file from source files. Note that we also generate
--- 152,159 ----
install -m 644 doc/*.html doc/*.css doc/*.gif doc/*.haddock $(LIBDIR)/doc/html/port
! $(MAINLIB): $(HOBJS) $(COBJS) $(STUBSTUBOBJS)
! $(RM) $(MAINLIB)
! $(AR) -r $@ $^
# create an object file from source files. Note that we also generate
***************
*** 174,178 ****
# by sed to prepend the proper directory to the target and to move it
# into the proper directory (debug or release). The way dependency files
! # are handled was 'discovered' by Tom Tromey, and described by Paul Smith,
# see: "http://www.paulandlesley.org/gmake/autodep.html"
.SUFFIXES: .hs .hi .o .c
--- 161,165 ----
# by sed to prepend the proper directory to the target and to move it
# into the proper directory (debug or release). The way dependency files
! # are handled was 'discovered' by Tom Tromey, and described by Paul Smith,
# see: "http://www.paulandlesley.org/gmake/autodep.html"
.SUFFIXES: .hs .hi .o .c
***************
*** 181,187 ****
$(HC) -o $@ -package-name port -ohi $(BUILDDIR)/Graphics/UI/$(*D)/$(*F).hi -odir $(HOUTDIR)/$(*D) -c $< $(HC-OPTIONS) $($(*F)_OPTIONS) -i$(BUILDDIR) $(INCDIRS)
@# move stub files
! @-if test -f $(<D)/$(*F)_stub.h; then $(MV) $(<D)/$(*F)_stub.[ch] $(HOUTDIR)/$(*D); fi
@# create dependency file
! @$(HC) $< $(HC-OPTIONS) -M -optdep-f -optdep$(*F).d -i$(BUILDDIR)
@sed -e 's|$(subst .hs,,$<)\.o|$(HOUTDIR)/$*\.o|' $(*F).d > $(HOUTDIR)/$*.d
@rm $(*F).d
--- 168,174 ----
$(HC) -o $@ -package-name port -ohi $(BUILDDIR)/Graphics/UI/$(*D)/$(*F).hi -odir $(HOUTDIR)/$(*D) -c $< $(HC-OPTIONS) $($(*F)_OPTIONS) -i$(BUILDDIR) $(INCDIRS)
@# move stub files
! @-if test -f $(<D)/$(*F)_stub.h; then $(MV) $(<D)/$(*F)_stub.[ch] $(HOUTDIR)/$(*D); fi
@# create dependency file
! @$(HC) $< $(HC-OPTIONS) -M -optdep-f -optdep$(*F).d -i$(BUILDDIR)
@sed -e 's|$(subst .hs,,$<)\.o|$(HOUTDIR)/$*\.o|' $(*F).d > $(HOUTDIR)/$*.d
@rm $(*F).d
***************
*** 192,200 ****
$(COBJS): $(COUTDIR)/%.c.o: %.c
$(CC) -o $@ -c $< $(CC-OPTIONS) -MD $(INCDIRS)
! @#move dependendcy files only needed for gcc 2.xx
! @#@mv $(*F).d $(COUTDIR)/$(*F).c.d
!
! $(GSTSTUBOBJS) : $(COUTDIR)/%.o: %.c
! $(CC) -o $@ -c $< $(CC-OPTIONS) -MD $(INCDIRS)
#--------------------------------------------------------------------------
--- 179,184 ----
$(COBJS): $(COUTDIR)/%.c.o: %.c
$(CC) -o $@ -c $< $(CC-OPTIONS) -MD $(INCDIRS)
! @#move dependendcy files only needed for gcc 2.xx
! @#@mv $(*F).d $(COUTDIR)/$(*F).c.d
#--------------------------------------------------------------------------
***************
*** 236,240 ****
# extra commands: clean up all directories and show linecounts.
clean:
! $(RM) $(HSLIB)
$(RM) $(DOCDIR)/*.html $(DOCDIR)/*.gif $(DOCDIR)/*.css $(DOCDIR)/*.haddock
$(RM) $(HOUTDIR)/*.*
--- 220,224 ----
# extra commands: clean up all directories and show linecounts.
clean:
! $(RM) $(MAINLIB)
$(RM) $(DOCDIR)/*.html $(DOCDIR)/*.gif $(DOCDIR)/*.css $(DOCDIR)/*.haddock
$(RM) $(HOUTDIR)/*.*
|
|
From: <kr_...@us...> - 2003-09-07 22:57:32
|
Update of /cvsroot/htoolkit/HSQL/MySQL
In directory sc8-pr-cvs1:/tmp/cvs-serv8597/MySQL
Modified Files:
HSQL.hsc
Log Message:
comments
Index: HSQL.hsc
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/MySQL/HSQL.hsc,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** HSQL.hsc 7 Sep 2003 19:16:11 -0000 1.1
--- HSQL.hsc 7 Sep 2003 22:57:25 -0000 1.2
***************
*** 133,137 ****
-----------------------------------------------------------------------------------------
! connect :: String -> String -> String -> String -> IO Connection
connect server database user authentication = do
pMYSQL <- mysql_init nullPtr
--- 133,142 ----
-----------------------------------------------------------------------------------------
! -- | Makes a new connection to the database server.
! connect :: String -- ^ Server name
! -> String -- ^ Database name
! -> String -- ^ User identifier
! -> String -- ^ Authentication string (password)
! -> IO Connection
connect server database user authentication = do
pMYSQL <- mysql_init nullPtr
***************
*** 147,151 ****
when (res == nullPtr) (handleSqlError pMYSQL)
return (Connection pMYSQL)
!
disconnect :: Connection -> IO ()
disconnect (Connection pMYSQL) = mysql_close pMYSQL
--- 152,157 ----
when (res == nullPtr) (handleSqlError pMYSQL)
return (Connection pMYSQL)
!
! -- | Closes the connection.
disconnect :: Connection -> IO ()
disconnect (Connection pMYSQL) = mysql_close pMYSQL
***************
*** 155,163 ****
-----------------------------------------------------------------------------------------
execute :: Connection -> String -> IO ()
execute conn@(Connection pMYSQL) query = do
res <- withCString query (mysql_query pMYSQL)
when (res /= 0) (handleSqlError pMYSQL)
!
query :: Connection -> String -> IO Statement
query conn@(Connection pMYSQL) query = do
--- 161,171 ----
-----------------------------------------------------------------------------------------
+ -- | Execute statement
execute :: Connection -> String -> IO ()
execute conn@(Connection pMYSQL) query = do
res <- withCString query (mysql_query pMYSQL)
when (res /= 0) (handleSqlError pMYSQL)
!
! -- | Executes the statement and returns a 'Statement' value which represents the result set
query :: Connection -> String -> IO Statement
query conn@(Connection pMYSQL) query = do
***************
*** 210,213 ****
--- 218,223 ----
mkSqlType (#const FIELD_TYPE_NULL) _ _ = SqlUnknown
+ -- | 'fetch' fetches the next rowset of data from the result set.
+ -- The values from columns can be retrieved with 'getFieldValue' function.
fetch :: Statement -> IO Bool
fetch (Statement {pRes=pRes,currRow=currRow})
***************
*** 218,221 ****
--- 228,234 ----
return (pRow /= nullPtr)
+ -- | 'closeStatement' stops processing associated with a specific statement, closes any open cursors
+ -- associated with the statement, discards pending results, and frees all resources associated with
+ -- the statement.
closeStatement :: Statement -> IO ()
closeStatement (Statement {pRes=pRes})
***************
*** 227,230 ****
--- 240,247 ----
-----------------------------------------------------------------------------------------
+ -- | The 'inTransaction' function executes the specified action in transaction mode.
+ -- If the action completes successfully then the transaction will be commited.
+ -- If the action completes with an exception then the transaction will be rolled back
+ -- and the exception will be throw again.
inTransaction :: Connection -> (Connection -> IO a) -> IO a
inTransaction conn action = do
***************
*** 364,368 ****
! getFieldValueMB :: SqlBind a => Statement -> String -> IO (Maybe a)
getFieldValueMB (Statement {currRow=currRow, fields=fieldDefs}) name = do
row <- readIORef currRow
--- 381,389 ----
! -- | Retrieves the value of field with the specified name.
! -- The returned value is Nothing if the field value is @null@.
! getFieldValueMB :: SqlBind a => Statement
! -> String -- ^ Field name
! -> IO (Maybe a) -- ^ Field value or Nothing
getFieldValueMB (Statement {currRow=currRow, fields=fieldDefs}) name = do
row <- readIORef currRow
***************
*** 377,381 ****
Nothing -> throwDyn (SqlBadTypeCast name sqlType)
! getFieldValue :: SqlBind a => Statement -> String -> IO a
getFieldValue stmt name = do
mb_v <- getFieldValueMB stmt name
--- 398,406 ----
Nothing -> throwDyn (SqlBadTypeCast name sqlType)
! -- | Retrieves the value of field with the specified name.
! -- If the field value is @null@ then the function will throw 'SqlFetchNull' exception.
! getFieldValue :: SqlBind a => Statement
! -> String -- ^ Field name
! -> IO a -- ^ Field value
getFieldValue stmt name = do
mb_v <- getFieldValueMB stmt name
***************
*** 384,392 ****
Just a -> return a
! getFieldValue' :: SqlBind a => Statement -> String -> a -> IO a
getFieldValue' stmt name def = do
mb_v <- getFieldValueMB stmt name
return (case mb_v of { Nothing -> def; Just a -> a })
getFieldValueType :: Statement -> String -> (SqlType, Bool)
getFieldValueType stmt name = (sqlType, nullable)
--- 409,423 ----
Just a -> return a
! -- | Retrieves the value of field with the specified name.
! -- If the field value is @null@ then the function will return the default value.
! getFieldValue' :: SqlBind a => Statement
! -> String -- ^ Field name
! -> a -- ^ Default field value
! -> IO a -- ^ Field value
getFieldValue' stmt name def = do
mb_v <- getFieldValueMB stmt name
return (case mb_v of { Nothing -> def; Just a -> a })
+ -- | Returns the type and the @nullable@ flag for field with specified name
getFieldValueType :: Statement -> String -> (SqlType, Bool)
getFieldValueType stmt name = (sqlType, nullable)
***************
*** 394,397 ****
--- 425,429 ----
(sqlType,nullable,colNumber) = findFieldInfo name (fields stmt) 1
+ -- | Returns the list of fields with their types and @nullable@ flags
getFieldsTypes :: Statement -> [(String, SqlType, Bool)]
getFieldsTypes = fields
***************
*** 407,415 ****
-----------------------------------------------------------------------------------------
! forEachRow :: (Statement -> s -> IO s) -> Statement -> s -> IO s
forEachRow f stmt s = do
success <- fetch stmt
if success then f stmt s >>= forEachRow f stmt else closeStatement stmt >> return s
forEachRow' :: (Statement -> IO ()) -> Statement -> IO ()
forEachRow' f stmt = do
--- 439,454 ----
-----------------------------------------------------------------------------------------
! -- | The 'forEachRow' function iterates through the result set in 'Statement' and
! -- executes the given action for each row in the set. After processing the last row
! -- the statement is automatically closed.
! forEachRow :: (Statement -> s -> IO s) -- ^ an action
! -> Statement -- ^ the statement
! -> s -- ^ initial state
! -> IO s -- ^ final state
forEachRow f stmt s = do
success <- fetch stmt
if success then f stmt s >>= forEachRow f stmt else closeStatement stmt >> return s
+ -- | The 'forEachRow\'' function is analogous to 'forEachRow' but doesn't provide state.
forEachRow' :: (Statement -> IO ()) -> Statement -> IO ()
forEachRow' f stmt = do
***************
*** 417,420 ****
--- 456,462 ----
if success then f stmt >> forEachRow' f stmt else closeStatement stmt
+ -- | The 'collectRows' function iterates through the result set in 'Statement' and
+ -- executes the given action for each row in the set. The values returned from action
+ -- are collected and returned as list.
collectRows :: (Statement -> IO a) -> Statement -> IO [a]
collectRows f stmt = loop
|
|
From: <kr_...@us...> - 2003-09-07 22:57:31
|
Update of /cvsroot/htoolkit/HSQL/PostgreSQL
In directory sc8-pr-cvs1:/tmp/cvs-serv8597/PostgreSQL
Modified Files:
HSQL.hsc
Log Message:
comments
Index: HSQL.hsc
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/PostgreSQL/HSQL.hsc,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** HSQL.hsc 7 Sep 2003 19:28:01 -0000 1.4
--- HSQL.hsc 7 Sep 2003 22:57:25 -0000 1.5
***************
*** 161,165 ****
-----------------------------------------------------------------------------------------
! connect :: String -> String -> String -> String -> IO Connection
connect server database user authentication = do
pServer <- newCString server
--- 161,170 ----
-----------------------------------------------------------------------------------------
! -- | Makes a new connection to the database server.
! connect :: String -- ^ Server name
! -> String -- ^ Database name
! -> String -- ^ User identifier
! -> String -- ^ Authentication string (password)
! -> IO Connection
connect server database user authentication = do
pServer <- newCString server
***************
*** 178,181 ****
--- 183,187 ----
return (Connection pConn)
+ -- | Closes the connection.
disconnect :: Connection -> IO ()
disconnect (Connection pConn) = pqFinish pConn
***************
*** 186,189 ****
--- 192,196 ----
-----------------------------------------------------------------------------------------
+ -- | Execute statement
execute :: Connection -> String -> IO ()
execute conn@(Connection pConn) sqlExpr = do
***************
*** 198,201 ****
--- 205,209 ----
return ()
+ -- | Executes the statement and returns a 'Statement' value which represents the result set
query :: Connection -> String -> IO Statement
query conn@(Connection pConn) query = do
***************
*** 258,261 ****
--- 266,271 ----
mkSqlType (#const UNKNOWNOID) size = SqlUnknown
+ -- | 'fetch' fetches the next rowset of data from the result set.
+ -- The values from columns can be retrieved with 'getFieldValue' function.
fetch :: Statement -> IO Bool
fetch (Statement {countTuples=countTuples, tupleIndex=tupleIndex}) = do
***************
*** 266,269 ****
--- 276,282 ----
else writeIORef tupleIndex index' >> return True
+ -- | 'closeStatement' stops processing associated with a specific statement, closes any open cursors
+ -- associated with the statement, discards pending results, and frees all resources associated with
+ -- the statement.
closeStatement :: Statement -> IO ()
closeStatement _ = return ()
***************
*** 273,277 ****
-----------------------------------------------------------------------------------------
! inTransaction :: Connection -> (Connection -> IO a) -> IO a
inTransaction conn action = do
execute conn "begin"
--- 286,296 ----
-----------------------------------------------------------------------------------------
! -- | The 'inTransaction' function executes the specified action in transaction mode.
! -- If the action completes successfully then the transaction will be commited.
! -- If the action completes with an exception then the transaction will be rolled back
! -- and the exception will be throw again.
! inTransaction :: Connection
! -> (Connection -> IO a) -- ^ an action
! -> IO a -- ^ the returned value is the result returned from action
inTransaction conn action = do
execute conn "begin"
***************
*** 544,548 ****
showHex = showIntAtBase 16 intToDigit
! getFieldValueMB :: SqlBind a => Statement -> String -> IO (Maybe a)
getFieldValueMB (Statement {pRes=pRes, connection=conn, fields=fieldDefs, countTuples=countTuples, tupleIndex=tupleIndex}) name = do
index <- readIORef tupleIndex
--- 563,571 ----
showHex = showIntAtBase 16 intToDigit
! -- | Retrieves the value of field with the specified name.
! -- The returned value is Nothing if the field value is @null@.
! getFieldValueMB :: SqlBind a => Statement
! -> String -- ^ Field name
! -> IO (Maybe a) -- ^ Field value or Nothing
getFieldValueMB (Statement {pRes=pRes, connection=conn, fields=fieldDefs, countTuples=countTuples, tupleIndex=tupleIndex}) name = do
index <- readIORef tupleIndex
***************
*** 558,562 ****
Nothing -> throwDyn (SqlBadTypeCast name sqlType)
! getFieldValue :: SqlBind a => Statement -> String -> IO a
getFieldValue stmt name = do
mb_v <- getFieldValueMB stmt name
--- 581,589 ----
Nothing -> throwDyn (SqlBadTypeCast name sqlType)
! -- | Retrieves the value of field with the specified name.
! -- If the field value is @null@ then the function will throw 'SqlFetchNull' exception.
! getFieldValue :: SqlBind a => Statement
! -> String -- ^ Field name
! -> IO a -- ^ Field value
getFieldValue stmt name = do
mb_v <- getFieldValueMB stmt name
***************
*** 565,573 ****
Just a -> return a
! getFieldValue' :: SqlBind a => Statement -> String -> a -> IO a
getFieldValue' stmt name def = do
mb_v <- getFieldValueMB stmt name
return (case mb_v of { Nothing -> def; Just a -> a })
getFieldValueType :: Statement -> String -> SqlType
getFieldValueType stmt name = sqlType
--- 592,606 ----
Just a -> return a
! -- | Retrieves the value of field with the specified name.
! -- If the field value is @null@ then the function will return the default value.
! getFieldValue' :: SqlBind a => Statement
! -> String -- ^ Field name
! -> a -- ^ Default field value
! -> IO a -- ^ Field value
getFieldValue' stmt name def = do
mb_v <- getFieldValueMB stmt name
return (case mb_v of { Nothing -> def; Just a -> a })
+ -- | Returns the type and the @nullable@ flag for field with specified name
getFieldValueType :: Statement -> String -> SqlType
getFieldValueType stmt name = sqlType
***************
*** 575,578 ****
--- 608,612 ----
(sqlType,colNumber) = findFieldInfo name (fields stmt) 1
+ -- | Returns the list of fields with their types and @nullable@ flags
getFieldsTypes :: Statement -> [(String, SqlType)]
getFieldsTypes = fields
***************
*** 589,597 ****
-----------------------------------------------------------------------------------------
! forEachRow :: (Statement -> s -> IO s) -> Statement -> s -> IO s
forEachRow f stmt s = do
success <- fetch stmt
if success then f stmt s >>= forEachRow f stmt else closeStatement stmt >> return s
forEachRow' :: (Statement -> IO ()) -> Statement -> IO ()
forEachRow' f stmt = do
--- 623,638 ----
-----------------------------------------------------------------------------------------
! -- | The 'forEachRow' function iterates through the result set in 'Statement' and
! -- executes the given action for each row in the set. After processing the last row
! -- the statement is automatically closed.
! forEachRow :: (Statement -> s -> IO s) -- ^ an action
! -> Statement -- ^ the statement
! -> s -- ^ initial state
! -> IO s -- ^ final state
forEachRow f stmt s = do
success <- fetch stmt
if success then f stmt s >>= forEachRow f stmt else closeStatement stmt >> return s
+ -- | The 'forEachRow\'' function is analogous to 'forEachRow' but doesn't provide state.
forEachRow' :: (Statement -> IO ()) -> Statement -> IO ()
forEachRow' f stmt = do
***************
*** 599,602 ****
--- 640,646 ----
if success then f stmt >> forEachRow' f stmt else closeStatement stmt
+ -- | The 'collectRows' function iterates through the result set in 'Statement' and
+ -- executes the given action for each row in the set. The values returned from action
+ -- are collected and returned as list.
collectRows :: (Statement -> IO a) -> Statement -> IO [a]
collectRows f stmt = loop
|
|
From: <kr_...@us...> - 2003-09-07 22:57:31
|
Update of /cvsroot/htoolkit/HSQL/ODBC
In directory sc8-pr-cvs1:/tmp/cvs-serv8597/ODBC
Modified Files:
HSQL.hsc
Log Message:
comments
Index: HSQL.hsc
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/ODBC/HSQL.hsc,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** HSQL.hsc 6 Sep 2003 22:44:13 -0000 1.2
--- HSQL.hsc 7 Sep 2003 22:57:25 -0000 1.3
***************
*** 198,202 ****
-----------------------------------------------------------------------------------------
! connect :: String -> String -> String -> IO Connection
connect server user authentication = withForeignPtr myEnvironment $ \hEnv -> do
(phDBC :: Ptr HDBC) <- malloc
--- 198,206 ----
-----------------------------------------------------------------------------------------
! -- | Makes a new connection to the database server.
! connect :: String -- ^ Data source name
! -> String -- ^ User identifier
! -> String -- ^ Authentication string (password)
! -> IO Connection -- ^ the returned value represents the new connection
connect server user authentication = withForeignPtr myEnvironment $ \hEnv -> do
(phDBC :: Ptr HDBC) <- malloc
***************
*** 214,218 ****
handleSqlResult (#const SQL_HANDLE_ENV) hEnv res
return (Connection {hDBC=hDBC, environment=myEnvironment})
!
disconnect :: Connection -> IO ()
disconnect (Connection {hDBC=hDBC}) = do
--- 218,223 ----
handleSqlResult (#const SQL_HANDLE_ENV) hEnv res
return (Connection {hDBC=hDBC, environment=myEnvironment})
!
! -- | Closes the connection.
disconnect :: Connection -> IO ()
disconnect (Connection {hDBC=hDBC}) = do
***************
*** 225,228 ****
--- 230,234 ----
-----------------------------------------------------------------------------------------
+ -- | Execute statement
execute :: Connection -> String -> IO ()
execute conn@(Connection {hDBC=hDBC}) query = do
***************
*** 242,245 ****
--- 248,252 ----
free pFIELD
+ -- | Executes the statement and returns a 'Statement' value which represents the result set
query :: Connection -> String -> IO Statement
query conn@(Connection {hDBC=hDBC}) query = do
***************
*** 302,305 ****
--- 309,314 ----
{-# NOINLINE fetch #-}
+ -- | 'fetch' fetches the next rowset of data from the result set.
+ -- The values from columns can be retrieved with 'getFieldValue' function.
fetch :: Statement -> IO Bool
fetch stmt = do
***************
*** 308,312 ****
return (res /= (#const SQL_NO_DATA))
!
closeStatement :: Statement -> IO ()
closeStatement stmt = do
--- 317,323 ----
return (res /= (#const SQL_NO_DATA))
! -- | 'closeStatement' stops processing associated with a specific statement, closes any open cursors
! -- associated with the statement, discards pending results, and frees all resources associated with
! -- the statement.
closeStatement :: Statement -> IO ()
closeStatement stmt = do
***************
*** 318,322 ****
-----------------------------------------------------------------------------------------
! inTransaction :: Connection -> (Connection -> IO a) -> IO a
inTransaction conn@(Connection {hDBC=hDBC, environment=envRef}) action = withForeignPtr envRef $ \hEnv -> do
sqlSetConnectOption hDBC (#const SQL_AUTOCOMMIT) (#const SQL_AUTOCOMMIT_OFF)
--- 329,339 ----
-----------------------------------------------------------------------------------------
! -- | The 'inTransaction' function executes the specified action in transaction mode.
! -- If the action completes successfully then the transaction will be commited.
! -- If the action completes with an exception then the transaction will be rolled back
! -- and the exception will be throw again.
! inTransaction :: Connection
! -> (Connection -> IO a) -- ^ an action
! -> IO a -- ^ the returned value is the result returned from action
inTransaction conn@(Connection {hDBC=hDBC, environment=envRef}) action = withForeignPtr envRef $ \hEnv -> do
sqlSetConnectOption hDBC (#const SQL_AUTOCOMMIT) (#const SQL_AUTOCOMMIT_OFF)
***************
*** 418,422 ****
foreign import ccall unsafe mktime :: Ptr () -> IO CTime
! getFieldValueMB :: SqlBind a => Statement -> String -> IO (Maybe a)
getFieldValueMB (Statement {hSTMT=hSTMT, fields=fields, fetchBuffer=buffer, fetchBufferSize=bufferSize}) name = do
let dataBuffer = buffer `plusPtr` (#const sizeof(SQLINTEGER))
--- 435,443 ----
foreign import ccall unsafe mktime :: Ptr () -> IO CTime
! -- | Retrieves the value of field with the specified name.
! -- The returned value is Nothing if the field value is @null@.
! getFieldValueMB :: SqlBind a => Statement
! -> String -- ^ Field name
! -> IO (Maybe a) -- ^ Field value or Nothing
getFieldValueMB (Statement {hSTMT=hSTMT, fields=fields, fetchBuffer=buffer, fetchBufferSize=bufferSize}) name = do
let dataBuffer = buffer `plusPtr` (#const sizeof(SQLINTEGER))
***************
*** 467,471 ****
SqlLongVarBinary _ -> (#const SQL_C_BINARY)
! getFieldValue :: SqlBind a => Statement -> String -> IO a
getFieldValue stmt name = do
mb_v <- getFieldValueMB stmt name
--- 488,496 ----
SqlLongVarBinary _ -> (#const SQL_C_BINARY)
! -- | Retrieves the value of field with the specified name.
! -- If the field value is @null@ then the function will throw 'SqlFetchNull' exception.
! getFieldValue :: SqlBind a => Statement
! -> String -- ^ Field name
! -> IO a -- ^ Field value
getFieldValue stmt name = do
mb_v <- getFieldValueMB stmt name
***************
*** 474,487 ****
Just a -> return a
! getFieldValue' :: SqlBind a => Statement -> String -> a -> IO a
getFieldValue' stmt name def = do
mb_v <- getFieldValueMB stmt name
return (case mb_v of { Nothing -> def; Just a -> a })
!
! getFieldValueType :: Statement -> String -> (SqlType, Bool)
getFieldValueType stmt name = (sqlType, nullable)
where
(sqlType,nullable,colNumber) = findFieldInfo name (fields stmt) 1
getFieldsTypes :: Statement -> [(String, SqlType, Bool)]
getFieldsTypes = fields
--- 499,521 ----
Just a -> return a
! -- | Retrieves the value of field with the specified name.
! -- If the field value is @null@ then the function will return the default value.
! getFieldValue' :: SqlBind a => Statement
! -> String -- ^ Field name
! -> a -- ^ Default field value
! -> IO a -- ^ Field value
getFieldValue' stmt name def = do
mb_v <- getFieldValueMB stmt name
return (case mb_v of { Nothing -> def; Just a -> a })
!
! -- | Returns the type and the @nullable@ flag for field with specified name
! getFieldValueType :: Statement
! -> String -- ^ Field name
! -> (SqlType, Bool) -- ^ Field type and @nullable@
getFieldValueType stmt name = (sqlType, nullable)
where
(sqlType,nullable,colNumber) = findFieldInfo name (fields stmt) 1
+ -- | Returns the list of fields with their types and @nullable@ flags
getFieldsTypes :: Statement -> [(String, SqlType, Bool)]
getFieldsTypes = fields
***************
*** 497,510 ****
-----------------------------------------------------------------------------------------
! forEachRow :: (Statement -> s -> IO s) -> Statement -> s -> IO s
forEachRow f stmt s = do
success <- fetch stmt
if success then f stmt s >>= forEachRow f stmt else closeStatement stmt >> return s
!
forEachRow' :: (Statement -> IO ()) -> Statement -> IO ()
forEachRow' f stmt = do
success <- fetch stmt
if success then f stmt >> forEachRow' f stmt else closeStatement stmt
!
collectRows :: (Statement -> IO a) -> Statement -> IO [a]
collectRows f stmt = loop
--- 531,554 ----
-----------------------------------------------------------------------------------------
! -- | The 'forEachRow' function iterates through the result set in 'Statement' and
! -- executes the given action for each row in the set. After processing the last row
! -- the statement is automatically closed.
! forEachRow :: (Statement -> s -> IO s) -- ^ an action
! -> Statement -- ^ the statement
! -> s -- ^ initial state
! -> IO s -- ^ final state
forEachRow f stmt s = do
success <- fetch stmt
if success then f stmt s >>= forEachRow f stmt else closeStatement stmt >> return s
!
! -- | The 'forEachRow\'' function is analogous to 'forEachRow' but doesn't provide state.
forEachRow' :: (Statement -> IO ()) -> Statement -> IO ()
forEachRow' f stmt = do
success <- fetch stmt
if success then f stmt >> forEachRow' f stmt else closeStatement stmt
!
! -- | The 'collectRows' function iterates through the result set in 'Statement' and
! -- executes the given action for each row in the set. The values returned from action
! -- are collected and returned as list.
collectRows :: (Statement -> IO a) -> Statement -> IO [a]
collectRows f stmt = loop
|
|
From: <kr_...@us...> - 2003-09-07 22:56:24
|
Update of /cvsroot/htoolkit/HSQL In directory sc8-pr-cvs1:/tmp/cvs-serv8537 Modified Files: Makefile Log Message: bugfix Index: Makefile =================================================================== RCS file: /cvsroot/htoolkit/HSQL/Makefile,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Makefile 6 Sep 2003 21:52:42 -0000 1.4 --- Makefile 7 Sep 2003 22:56:18 -0000 1.5 *************** *** 16,22 **** HI_SRC = $(patsubst %.hs,%.hi,$(HS_SRC)) ! ifneq "$(HADDOCK)" "" ! HS_PPS = $(addsuffix .raw-hs, $(basename $(HS_SRC))) HADDOCK = echo endif --- 16,23 ---- HI_SRC = $(patsubst %.hs,%.hi,$(HS_SRC)) ! ifeq "$(HADDOCK)" "" HADDOCK = echo + else + HS_PPS = $(addsuffix .raw-hs, $(basename $(HS_SRC))) endif *************** *** 47,55 **** rm -f $(HS_PPS) ! doc : $(HS_PPS) mkdir -p doc $(HADDOCK) -h -o doc $(HS_PPS) ! install: libHSsql.a $(HI_SRC) doc $(INSTALL) libHSsql.a $(prefix)/libHSsql.a $(INSTALL) -d $(prefix)/imports/Database --- 48,56 ---- rm -f $(HS_PPS) ! docs : $(HS_PPS) mkdir -p doc $(HADDOCK) -h -o doc $(HS_PPS) ! install: libHSsql.a $(HI_SRC) docs $(INSTALL) libHSsql.a $(prefix)/libHSsql.a $(INSTALL) -d $(prefix)/imports/Database |
|
From: <kr_...@us...> - 2003-09-07 19:28:05
|
Update of /cvsroot/htoolkit/HSQL/PostgreSQL In directory sc8-pr-cvs1:/tmp/cvs-serv3737/PostgreSQL Modified Files: HSQL.hsc Log Message: bugfix Index: HSQL.hsc =================================================================== RCS file: /cvsroot/htoolkit/HSQL/PostgreSQL/HSQL.hsc,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** HSQL.hsc 6 Sep 2003 22:48:00 -0000 1.3 --- HSQL.hsc 7 Sep 2003 19:28:01 -0000 1.4 *************** *** 307,310 **** --- 307,311 ---- toSqlValue s = '\'' : foldr mapChar "'" s where + mapChar '\\' s = '\\':'\\':s mapChar '\'' s = '\\':'\'':s mapChar '\n' s = '\\':'n':s |
|
From: <kr_...@us...> - 2003-09-07 19:16:15
|
Update of /cvsroot/htoolkit/HSQL/MySQL
In directory sc8-pr-cvs1:/tmp/cvs-serv1819/MySQL
Added Files:
HSQL.hsc
Log Message:
Add support for MySQL
--- NEW FILE: HSQL.hsc ---
#include <config.h>
module Database.MySQL.HSQL
( SqlBind(..), SqlError(..), SqlType(..), Connection, Statement
, catchSql -- :: IO a -> (SqlError -> IO a) -> IO a
, handleSql -- :: (SqlError -> IO a) -> IO a -> IO a
, sqlExceptions -- :: Exception -> Maybe SqlError
, connect -- :: String -> String -> String -> IO Connection
, disconnect -- :: Connection -> IO ()
, execute -- :: Connection -> String -> IO ()
, query -- :: Connection -> String -> IO Statement
, closeStatement -- :: Statement -> IO ()
, fetch -- :: Statement -> IO Bool
, inTransaction -- :: Connection -> (Connection -> IO a) -> IO a
, getFieldValueMB -- :: SqlBind a => Statement -> String -> IO (Maybe a)
, getFieldValue -- :: SqlBind a => Statement -> String -> IO a
, getFieldValue' -- :: SqlBind a => Statement -> String -> a -> IO a
, getFieldValueType -- :: Statement -> String -> (SqlType, Bool)
, getFieldsTypes -- :: Statement -> [(String, SqlType, Bool)]
, forEachRow -- :: (Statement -> s -> IO s) -> Statement -> s -> IO s
, forEachRow' -- :: (Statement -> IO ()) -> Statement -> IO ()
, collectRows -- :: (Statement -> IO s) -> Statement -> IO [s]
) where
import Data.Dynamic
import Data.Bits
import Data.IORef
import Data.Char
import Foreign
import Foreign.C
import Control.Monad(when,unless)
import Control.Exception (throwDyn, catchDyn, dynExceptions, Exception(..))
import System.Time
import System.IO.Unsafe
import Text.ParserCombinators.ReadP
import Text.Read
#ifdef ENABLED_GUI
import Graphics.UI.HGUI.BasicTypes
import Graphics.UI.HGUI.BasicClasses
#endif
#include <mysql.h>
#include <time.h>
type MYSQL = Ptr ()
type MYSQL_RES = Ptr ()
type MYSQL_FIELD = Ptr ()
type MYSQL_ROW = Ptr CString
foreign import ccall "mysql.h mysql_init" mysql_init :: MYSQL -> IO MYSQL
foreign import ccall "mysql.h mysql_real_connect" mysql_real_connect :: MYSQL -> CString -> CString -> CString -> CString -> Int -> CString -> Int -> IO MYSQL
foreign import ccall "mysql.h mysql_close" mysql_close :: MYSQL -> IO ()
foreign import ccall "mysql.h mysql_errno" mysql_errno :: MYSQL -> IO Int
foreign import ccall "mysql.h mysql_error" mysql_error :: MYSQL -> IO CString
foreign import ccall "mysql.h mysql_query" mysql_query :: MYSQL -> CString -> IO Int
foreign import ccall "mysql.h mysql_use_result" mysql_use_result :: MYSQL -> IO MYSQL_RES
foreign import ccall "mysql.h mysql_fetch_field" mysql_fetch_field :: MYSQL_RES -> IO MYSQL_FIELD
foreign import ccall "mysql.h mysql_free_result" mysql_free_result :: MYSQL_RES -> IO ()
foreign import ccall "mysql.h mysql_fetch_row" mysql_fetch_row :: MYSQL_RES -> IO MYSQL_ROW
newtype Connection = Connection MYSQL
data Statement
= Statement
{ pRes :: !MYSQL_RES
, connection :: !Connection
, fields :: ![FieldDef]
, currRow :: IORef MYSQL_ROW
}
type FieldDef = (String, SqlType, Bool)
data SqlType
= SqlChar Int
| SqlVarChar Int
| SqlNumeric Int Int
| SqlSmallInt
| SqlMedInt
| SqlInteger
| SqlReal
| SqlDouble
| SqlTinyInt
| SqlBigInt
| SqlDate
| SqlTime
| SqlTimeStamp
| SqlDateTime
| SqlYear
| SqlSET
| SqlENUM
| SqlBLOB
| SqlUnknown
deriving (Eq, Show)
data SqlError
= SqlError
{ seNativeError :: Int
, seErrorMsg :: String
}
| SqlBadTypeCast
{ seFieldName :: String
, seFieldType :: SqlType
}
| SqlFetchNull
{ seFieldName :: String
}
deriving (Typeable, Show)
-----------------------------------------------------------------------------------------
-- routines for handling exceptions
-----------------------------------------------------------------------------------------
catchSql :: IO a -> (SqlError -> IO a) -> IO a
catchSql = catchDyn
handleSql :: (SqlError -> IO a) -> IO a -> IO a
handleSql h f = catchDyn f h
sqlExceptions :: Exception -> Maybe SqlError
sqlExceptions e = dynExceptions e >>= fromDynamic
handleSqlError :: MYSQL -> IO a
handleSqlError pMYSQL = do
errno <- mysql_errno pMYSQL
errMsg <- mysql_error pMYSQL >>= peekCString
throwDyn (SqlError errno errMsg)
-----------------------------------------------------------------------------------------
-- Connect/Disconnect
-----------------------------------------------------------------------------------------
connect :: String -> String -> String -> String -> IO Connection
connect server database user authentication = do
pMYSQL <- mysql_init nullPtr
pServer <- newCString server
pDatabase <- newCString database
pUser <- newCString user
pAuthentication <- newCString authentication
res <- mysql_real_connect pMYSQL pServer pUser pAuthentication pDatabase 0 nullPtr 0
free pServer
free pDatabase
free pUser
free pAuthentication
when (res == nullPtr) (handleSqlError pMYSQL)
return (Connection pMYSQL)
disconnect :: Connection -> IO ()
disconnect (Connection pMYSQL) = mysql_close pMYSQL
-----------------------------------------------------------------------------------------
-- queries
-----------------------------------------------------------------------------------------
execute :: Connection -> String -> IO ()
execute conn@(Connection pMYSQL) query = do
res <- withCString query (mysql_query pMYSQL)
when (res /= 0) (handleSqlError pMYSQL)
query :: Connection -> String -> IO Statement
query conn@(Connection pMYSQL) query = do
res <- withCString query (mysql_query pMYSQL)
when (res /= 0) (handleSqlError pMYSQL)
currRow <- newIORef nullPtr
pRes <- mysql_use_result pMYSQL
if (pRes == nullPtr)
then do
errno <- mysql_errno pMYSQL
when (errno /= 0) (handleSqlError pMYSQL)
return (Statement {pRes=nullPtr, fields=[], connection=conn, currRow=currRow})
else do
fieldDefs <- getFieldDefs pRes
return (Statement {pRes=pRes, fields=fieldDefs, connection=conn, currRow=currRow})
where
getFieldDefs pRes = do
pField <- mysql_fetch_field pRes
if pField == nullPtr
then return []
else do
name <- (#peek MYSQL_FIELD, name) pField >>= peekCString
(dataType :: Int) <- (#peek MYSQL_FIELD, type) pField
(columnSize :: Int) <- (#peek MYSQL_FIELD, length) pField
(flags :: Int) <- (#peek MYSQL_FIELD, flags) pField
(decimalDigits :: Int) <- (#peek MYSQL_FIELD, decimals) pField
let sqlType = mkSqlType dataType columnSize decimalDigits
defs <- getFieldDefs pRes
return ((name,sqlType,(flags .&. (#const NOT_NULL_FLAG)) == 0):defs)
mkSqlType :: Int -> Int -> Int -> SqlType
mkSqlType (#const FIELD_TYPE_STRING ) size _ = SqlChar size
mkSqlType (#const FIELD_TYPE_VAR_STRING) size _ = SqlVarChar size
mkSqlType (#const FIELD_TYPE_DECIMAL) size prec = SqlNumeric size prec
mkSqlType (#const FIELD_TYPE_SHORT) _ _ = SqlSmallInt
mkSqlType (#const FIELD_TYPE_INT24) _ _ = SqlMedInt
mkSqlType (#const FIELD_TYPE_LONG) _ _ = SqlInteger
mkSqlType (#const FIELD_TYPE_FLOAT) _ _ = SqlReal
mkSqlType (#const FIELD_TYPE_DOUBLE ) _ _ = SqlDouble
mkSqlType (#const FIELD_TYPE_TINY) _ _ = SqlTinyInt
mkSqlType (#const FIELD_TYPE_LONGLONG) _ _ = SqlBigInt
mkSqlType (#const FIELD_TYPE_DATE ) _ _ = SqlDate
mkSqlType (#const FIELD_TYPE_TIME ) _ _ = SqlTime
mkSqlType (#const FIELD_TYPE_TIMESTAMP ) _ _ = SqlTimeStamp
mkSqlType (#const FIELD_TYPE_DATETIME) _ _ = SqlDateTime
mkSqlType (#const FIELD_TYPE_YEAR) _ _ = SqlYear
mkSqlType (#const FIELD_TYPE_BLOB) _ _ = SqlBLOB
mkSqlType (#const FIELD_TYPE_SET) _ _ = SqlSET
mkSqlType (#const FIELD_TYPE_ENUM) _ _ = SqlENUM
mkSqlType (#const FIELD_TYPE_NULL) _ _ = SqlUnknown
fetch :: Statement -> IO Bool
fetch (Statement {pRes=pRes,currRow=currRow})
| pRes == nullPtr = return False
| otherwise = do
pRow <- mysql_fetch_row pRes
writeIORef currRow pRow
return (pRow /= nullPtr)
closeStatement :: Statement -> IO ()
closeStatement (Statement {pRes=pRes})
| pRes == nullPtr = return ()
| otherwise = mysql_free_result pRes
-----------------------------------------------------------------------------------------
-- transactions
-----------------------------------------------------------------------------------------
inTransaction :: Connection -> (Connection -> IO a) -> IO a
inTransaction conn action = do
execute conn "begin"
r <- catchSql (action conn) (\err -> execute conn "rollback" >>= throwDyn err)
execute conn "commit"
return r
-----------------------------------------------------------------------------------------
-- binding
-----------------------------------------------------------------------------------------
class SqlBind a where
fromSqlValue :: SqlType -> String -> Maybe a
toSqlValue :: a -> String
instance SqlBind Int where
fromSqlValue SqlInteger s = Just (read s)
fromSqlValue SqlSmallInt s = Just (read s)
fromSqlValue _ s = Nothing
toSqlValue val = show val
instance SqlBind Integer where
fromSqlValue SqlInteger s = Just (read s)
fromSqlValue SqlSmallInt s = Just (read s)
fromSqlValue SqlBigInt s = Just (read s)
fromSqlValue _ s = Nothing
toSqlValue val = show val
instance SqlBind String where
fromSqlValue _ = Just
toSqlValue s = '\'' : foldr mapChar "'" s
where
mapChar '\\' s = '\\':'\\':s
mapChar '\'' s = '\\':'\'':s
mapChar '\n' s = '\\':'n':s
mapChar '\r' s = '\\':'r':s
mapChar '\t' s = '\\':'t':s
mapChar c s = c:s
instance SqlBind Double where
fromSqlValue (SqlNumeric _ _) s = Just (read s)
fromSqlValue SqlDouble s = Just (read s)
fromSqlValue SqlReal s = Just (read s)
fromSqlValue _ s = Nothing
toSqlValue val = show val
mkClockTime :: Int -> Int -> Int -> Int -> Int -> Int -> ClockTime
mkClockTime year mon mday hour min sec =
unsafePerformIO $ do
allocaBytes (#const sizeof(struct tm)) $ \ p_tm -> do
(#poke struct tm,tm_sec ) p_tm (fromIntegral sec :: CInt)
(#poke struct tm,tm_min ) p_tm (fromIntegral min :: CInt)
(#poke struct tm,tm_hour ) p_tm (fromIntegral hour :: CInt)
(#poke struct tm,tm_mday) p_tm (fromIntegral mday :: CInt)
(#poke struct tm,tm_mon ) p_tm (fromIntegral (mon-1) :: CInt)
(#poke struct tm,tm_year ) p_tm (fromIntegral (year-1900) :: CInt)
(#poke struct tm,tm_isdst) p_tm (-1 :: CInt)
t <- mktime p_tm
return (TOD (fromIntegral t) 0)
foreign import ccall unsafe mktime :: Ptr () -> IO CTime
instance SqlBind ClockTime where
fromSqlValue SqlTime s = case readP_to_S getTime s of { [(x,_)] -> Just x }
where
getTime :: ReadP ClockTime
getTime = do
hour <- readS_to_P reads
satisfy (==':')
minutes <- readS_to_P reads
satisfy (==':')
seconds <- readS_to_P reads
return (mkClockTime 1970 0 1 hour minutes seconds)
fromSqlValue SqlDate s = case readP_to_S getDate s of { [(x,_)] -> Just x }
where
getDate :: ReadP ClockTime
getDate = do
year <- readS_to_P reads
satisfy (=='-')
month <- readS_to_P reads
satisfy (=='-')
day <- readS_to_P reads
return (mkClockTime year month day 0 0 0)
fromSqlValue SqlDateTime s = case readP_to_S getTimeStamp s of { [(x,_)] -> Just x }
where
getTimeStamp :: ReadP ClockTime
getTimeStamp = do
year <- readS_to_P reads
satisfy (=='-')
month <- readS_to_P reads
satisfy (=='-')
day <- readS_to_P reads
skipSpaces
hour <- readS_to_P reads
satisfy (==':')
minutes <- readS_to_P reads
satisfy (==':')
seconds <- readS_to_P reads
return (mkClockTime year month day hour minutes seconds)
fromSqlValue SqlTimeStamp s =
let
[year,month,day,hour,minutes,seconds] = parts [4,2,2,2,2,2] s
parts [] xs = []
parts (ix:ixs) xs = part ix 0 xs
where
part 0 n xs = n : parts ixs xs
part k n (x:xs) = part (k-1) (n*10 + (ord x - ord '0')) xs
in
Just (mkClockTime year month day hour minutes seconds)
fromSqlValue _ s = Nothing
toSqlValue ct = '\'' : (shows (ctYear t) .
score .
shows (fromEnum (ctMonth t)) .
score .
shows (ctDay t) .
space .
shows (ctHour t) .
colon .
shows (ctMin t) .
colon .
shows (ctSec t)) "'"
where
t = toUTCTime ct
score = showChar '-'
space = showChar ' '
colon = showChar ':'
getFieldValueMB :: SqlBind a => Statement -> String -> IO (Maybe a)
getFieldValueMB (Statement {currRow=currRow, fields=fieldDefs}) name = do
row <- readIORef currRow
let (sqlType,nullable,colNumber) = findFieldInfo name fieldDefs 0
pValue <- peekElemOff row colNumber
if pValue == nullPtr
then return Nothing
else do
value <- peekCString pValue
case fromSqlValue sqlType value of
Just v -> return (Just v)
Nothing -> throwDyn (SqlBadTypeCast name sqlType)
getFieldValue :: SqlBind a => Statement -> String -> IO a
getFieldValue stmt name = do
mb_v <- getFieldValueMB stmt name
case mb_v of
Nothing -> throwDyn (SqlFetchNull name)
Just a -> return a
getFieldValue' :: SqlBind a => Statement -> String -> a -> IO a
getFieldValue' stmt name def = do
mb_v <- getFieldValueMB stmt name
return (case mb_v of { Nothing -> def; Just a -> a })
getFieldValueType :: Statement -> String -> (SqlType, Bool)
getFieldValueType stmt name = (sqlType, nullable)
where
(sqlType,nullable,colNumber) = findFieldInfo name (fields stmt) 1
getFieldsTypes :: Statement -> [(String, SqlType, Bool)]
getFieldsTypes = fields
findFieldInfo :: String -> [FieldDef] -> Int -> (SqlType,Bool,Int)
findFieldInfo name [] colNumber = error ("Undefined column name \"" ++ name ++ "\"")
findFieldInfo name (fieldDef@(name',sqlType,nullable):fields) colNumber
| name == name' = (sqlType,nullable,colNumber)
| otherwise = findFieldInfo name fields (colNumber+1)
-----------------------------------------------------------------------------------------
-- helpers
-----------------------------------------------------------------------------------------
forEachRow :: (Statement -> s -> IO s) -> Statement -> s -> IO s
forEachRow f stmt s = do
success <- fetch stmt
if success then f stmt s >>= forEachRow f stmt else closeStatement stmt >> return s
forEachRow' :: (Statement -> IO ()) -> Statement -> IO ()
forEachRow' f stmt = do
success <- fetch stmt
if success then f stmt >> forEachRow' f stmt else closeStatement stmt
collectRows :: (Statement -> IO a) -> Statement -> IO [a]
collectRows f stmt = loop
where
loop = do
success <- fetch stmt
if success
then do
x <- f stmt
xs <- loop
return (x:xs)
else closeStatement stmt >> return []
|
|
From: <kr_...@us...> - 2003-09-07 09:19:13
|
Update of /cvsroot/htoolkit/HSQL/src/PostgreSQL In directory sc8-pr-cvs1:/tmp/cvs-serv26918/PostgreSQL Removed Files: HSQL.hsc Log Message: Remove old files --- HSQL.hsc DELETED --- |
|
From: <kr_...@us...> - 2003-09-07 09:19:13
|
Update of /cvsroot/htoolkit/HSQL/src/ODBC In directory sc8-pr-cvs1:/tmp/cvs-serv26918/ODBC Removed Files: HSQL.hsc HSQLStructs.h Log Message: Remove old files --- HSQL.hsc DELETED --- --- HSQLStructs.h DELETED --- |
|
From: <kr_...@us...> - 2003-09-07 09:19:13
|
Update of /cvsroot/htoolkit/HSQL/src/MySQL In directory sc8-pr-cvs1:/tmp/cvs-serv26918/MySQL Removed Files: HSQL.hsc Log Message: Remove old files --- HSQL.hsc DELETED --- |
|
From: <kr_...@us...> - 2003-09-07 09:13:41
|
Update of /cvsroot/htoolkit/HSQL/MySQL In directory sc8-pr-cvs1:/tmp/cvs-serv26186/MySQL Log Message: Directory /cvsroot/htoolkit/HSQL/MySQL added to the repository |
|
From: <kr_...@us...> - 2003-09-07 09:09:51
|
Update of /cvsroot/htoolkit/HSQL
In directory sc8-pr-cvs1:/tmp/cvs-serv25631
Modified Files:
configure.ac
Log Message:
Add additional test for PostgreSQL
Index: configure.ac
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/configure.ac,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** configure.ac 6 Sep 2003 22:57:23 -0000 1.4
--- configure.ac 7 Sep 2003 09:09:47 -0000 1.5
***************
*** 180,183 ****
--- 180,184 ----
AC_CHECK_HEADER(libpq-fe.h,,AC_MSG_ERROR([libpq-fe.h header not found]))
+ AC_CHECK_HEADER(postgres.h,,AC_MSG_ERROR([postgres.h header not found]))
AC_CHECK_LIB(pq,PQsetdbLogin,,AC_MSG_ERROR([libpq.a library not found]))
fi
***************
*** 191,195 ****
if test "$MYSQL_CONFIG" = "" || test ! -f $MYSQL_CONFIG; then
! AC_MSG_ERROR([mysql_config is required to build PostgreSQL binding])
fi
--- 192,196 ----
if test "$MYSQL_CONFIG" = "" || test ! -f $MYSQL_CONFIG; then
! AC_MSG_ERROR([mysql_config is required to build MySQL binding])
fi
|
|
From: <kr_...@us...> - 2003-09-06 22:57:36
|
Update of /cvsroot/htoolkit/HSQL
In directory sc8-pr-cvs1:/tmp/cvs-serv12616
Modified Files:
configure.ac
Log Message:
better support for PostgreSQL for Windows
Index: configure.ac
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/configure.ac,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** configure.ac 6 Sep 2003 19:59:06 -0000 1.3
--- configure.ac 6 Sep 2003 22:57:23 -0000 1.4
***************
*** 167,177 ****
fi
case $ac_cv_target_alias in
i[[3456]]86-*-cygwin*|i[[3456]]86-*-mingw32*)
LDFLAGS="$LDFLAGS -L$(cygpath -m `$PG_CONFIG --libdir`)"
! CPPFLAGS="$CPPFLAGS -I$(cygpath -m /usr/include) -I$(cygpath -m `$PG_CONFIG --includedir`)"
;;
*) LDFLAGS="$LDFLAGS -L`$PG_CONFIG --libdir`"
! CPPFLAGS="$CPPFLAGS -I`$PG_CONFIG --includedir` -I`$PG_CONFIG --includedir`/server"
;;
esac
--- 167,179 ----
fi
+ incdir=`$PG_CONFIG --includedir`
case $ac_cv_target_alias in
i[[3456]]86-*-cygwin*|i[[3456]]86-*-mingw32*)
LDFLAGS="$LDFLAGS -L$(cygpath -m `$PG_CONFIG --libdir`)"
! incdir=$(cygpath -m $incdir)
! CPPFLAGS="$CPPFLAGS -I$(cygpath -m /usr/include) -I$incdir -I$incdir/server"
;;
*) LDFLAGS="$LDFLAGS -L`$PG_CONFIG --libdir`"
! CPPFLAGS="$CPPFLAGS -I$incdir -I$incdir/server"
;;
esac
|
|
From: <kr_...@us...> - 2003-09-06 22:48:49
|
Update of /cvsroot/htoolkit/HSQL/PostgreSQL In directory sc8-pr-cvs1:/tmp/cvs-serv11308/PostgreSQL Modified Files: HSQL.hsc Log Message: formatting Index: HSQL.hsc =================================================================== RCS file: /cvsroot/htoolkit/HSQL/PostgreSQL/HSQL.hsc,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** HSQL.hsc 6 Sep 2003 21:50:28 -0000 1.2 --- HSQL.hsc 6 Sep 2003 22:48:00 -0000 1.3 *************** *** 286,303 **** class SqlBind a where fromSqlValue :: SqlType -> String -> Maybe a ! toSqlValue :: a -> String instance SqlBind Int where ! fromSqlValue SqlInteger s = Just (read s) fromSqlValue SqlSmallInt s = Just (read s) ! fromSqlValue _ _ = Nothing toSqlValue s = show s instance SqlBind Integer where ! fromSqlValue SqlInteger s = Just (read s) fromSqlValue SqlSmallInt s = Just (read s) ! fromSqlValue SqlBigInt s = Just (read s) ! fromSqlValue _ _ = Nothing toSqlValue s = show s --- 286,303 ---- class SqlBind a where fromSqlValue :: SqlType -> String -> Maybe a ! toSqlValue :: a -> String instance SqlBind Int where ! fromSqlValue SqlInteger s = Just (read s) fromSqlValue SqlSmallInt s = Just (read s) ! fromSqlValue _ _ = Nothing toSqlValue s = show s instance SqlBind Integer where ! fromSqlValue SqlInteger s = Just (read s) fromSqlValue SqlSmallInt s = Just (read s) ! fromSqlValue SqlBigInt s = Just (read s) ! fromSqlValue _ _ = Nothing toSqlValue s = show s *************** *** 332,340 **** unsafePerformIO $ do allocaBytes (#const sizeof(struct tm)) $ \ p_tm -> do ! (#poke struct tm,tm_sec ) p_tm (fromIntegral sec :: CInt) ! (#poke struct tm,tm_min ) p_tm (fromIntegral min :: CInt) (#poke struct tm,tm_hour ) p_tm (fromIntegral hour :: CInt) ! (#poke struct tm,tm_mday) p_tm (fromIntegral mday :: CInt) ! (#poke struct tm,tm_mon ) p_tm (fromIntegral (mon-1) :: CInt) (#poke struct tm,tm_year ) p_tm (fromIntegral (year-1900) :: CInt) (#poke struct tm,tm_isdst) p_tm (-1 :: CInt) --- 332,340 ---- unsafePerformIO $ do allocaBytes (#const sizeof(struct tm)) $ \ p_tm -> do ! (#poke struct tm,tm_sec ) p_tm (fromIntegral sec :: CInt) ! (#poke struct tm,tm_min ) p_tm (fromIntegral min :: CInt) (#poke struct tm,tm_hour ) p_tm (fromIntegral hour :: CInt) ! (#poke struct tm,tm_mday ) p_tm (fromIntegral mday :: CInt) ! (#poke struct tm,tm_mon ) p_tm (fromIntegral (mon-1) :: CInt) (#poke struct tm,tm_year ) p_tm (fromIntegral (year-1900) :: CInt) (#poke struct tm,tm_isdst) p_tm (-1 :: CInt) *************** *** 358,362 **** getTime :: ReadP ClockTime getTime = do ! hour <- readS_to_P reads char ':' minutes <- readS_to_P reads --- 358,362 ---- getTime :: ReadP ClockTime getTime = do ! hour <- readS_to_P reads char ':' minutes <- readS_to_P reads *************** *** 370,374 **** getTime :: ReadP ClockTime getTime = do ! hour <- readS_to_P reads char ':' minutes <- readS_to_P reads --- 370,374 ---- getTime :: ReadP ClockTime getTime = do ! hour <- readS_to_P reads char ':' minutes <- readS_to_P reads *************** *** 381,389 **** getDate :: ReadP ClockTime getDate = do ! year <- readS_to_P reads satisfy (=='-') month <- readS_to_P reads ! satisfy (=='-') ! day <- readS_to_P reads return (mkClockTime year month day 0 0 0 currTZ) --- 381,389 ---- getDate :: ReadP ClockTime getDate = do ! year <- readS_to_P reads satisfy (=='-') month <- readS_to_P reads ! satisfy (=='-') ! day <- readS_to_P reads return (mkClockTime year month day 0 0 0 currTZ) *************** *** 392,407 **** getTimeStamp :: ReadP ClockTime getTimeStamp = do ! year <- readS_to_P reads satisfy (=='-') month <- readS_to_P reads ! satisfy (=='-') ! day <- readS_to_P reads skipSpaces ! hour <- readS_to_P reads ! satisfy (==':') minutes <- readS_to_P reads satisfy (==':') seconds <- readS_to_P reads ! tz <- parseTZ return (mkClockTime year month day hour minutes seconds (tz*3600)) --- 392,407 ---- getTimeStamp :: ReadP ClockTime getTimeStamp = do ! year <- readS_to_P reads satisfy (=='-') month <- readS_to_P reads ! satisfy (=='-') ! day <- readS_to_P reads skipSpaces ! hour <- readS_to_P reads ! satisfy (==':') minutes <- readS_to_P reads satisfy (==':') seconds <- readS_to_P reads ! tz <- parseTZ return (mkClockTime year month day hour minutes seconds (tz*3600)) *************** *** 581,585 **** findFieldInfo name (fieldDef@(name',sqlType):fields) colNumber | name == name' = (sqlType,colNumber) ! | otherwise = findFieldInfo name fields (colNumber+1) --- 581,585 ---- findFieldInfo name (fieldDef@(name',sqlType):fields) colNumber | name == name' = (sqlType,colNumber) ! | otherwise = findFieldInfo name fields (colNumber+1) |
|
From: <kr_...@us...> - 2003-09-06 22:44:33
|
Update of /cvsroot/htoolkit/HSQL/ODBC
In directory sc8-pr-cvs1:/tmp/cvs-serv10736/ODBC
Modified Files:
HSQL.hsc
Log Message:
Add better support for sql types
Index: HSQL.hsc
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/ODBC/HSQL.hsc,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** HSQL.hsc 5 Sep 2003 21:44:10 -0000 1.1
--- HSQL.hsc 6 Sep 2003 22:44:13 -0000 1.2
***************
*** 102,110 ****
data SqlType
! = SqlChar Int
! | SqlVarChar Int
! | SqlLongVarChar Int
! | SqlDecimal Int Int
! | SqlNumeric Int Int
| SqlSmallInt
| SqlInteger
--- 102,110 ----
data SqlType
! = SqlChar Int
! | SqlVarChar Int
! | SqlLongVarChar Int
! | SqlDecimal Int Int
! | SqlNumeric Int Int
| SqlSmallInt
| SqlInteger
***************
*** 114,120 ****
| SqlTinyInt
| SqlBigInt
! | SqlBinary Int
! | SqlVarBinary Int
! | SqlLongVarBinary Int
| SqlDate
| SqlTime
--- 114,120 ----
| SqlTinyInt
| SqlBigInt
! | SqlBinary Int
! | SqlVarBinary Int
! | SqlLongVarBinary Int
| SqlDate
| SqlTime
***************
*** 124,130 ****
data SqlError
= SqlError
! { seState :: String
! , seNativeError :: Int
! , seErrorMsg :: String
}
| SqlNoData
--- 124,130 ----
data SqlError
= SqlError
! { seState :: String
! , seNativeError :: Int
! , seErrorMsg :: String
}
| SqlNoData
***************
*** 132,136 ****
| SqlStillExecuting
| SqlNeedData
! deriving Show
-----------------------------------------------------------------------------------------
--- 132,143 ----
| SqlStillExecuting
| SqlNeedData
! | SqlBadTypeCast
! { seFieldName :: String
! , seFieldType :: SqlType
! }
! | SqlFetchNull
! { seFieldName :: String
! }
! deriving (Show, Typeable)
-----------------------------------------------------------------------------------------
***************
*** 138,147 ****
-----------------------------------------------------------------------------------------
- {-# NOINLINE sqlErrorTy #-}
- sqlErrorTy = mkAppTy (mkTyCon "SqlError") []
-
- instance Typeable SqlError where
- typeOf x = sqlErrorTy
-
catchSql :: IO a -> (SqlError -> IO a) -> IO a
catchSql = catchDyn
--- 145,148 ----
***************
*** 332,367 ****
class SqlBind a where
! getSqlValue :: SqlType -> Ptr () -> Int -> IO a
instance SqlBind Int where
! getSqlValue SqlInteger ptr size = peek (castPtr ptr)
! getSqlValue SqlSmallInt ptr size = do
(n :: Int16) <- peek (castPtr ptr)
! return (fromIntegral n)
instance SqlBind Integer where
! getSqlValue SqlInteger ptr size = do
(n :: Int32) <- peek (castPtr ptr)
! return (fromIntegral n)
! getSqlValue SqlSmallInt ptr size = do
(n :: Int16) <- peek (castPtr ptr)
! return (fromIntegral n)
! getSqlValue SqlBigInt ptr size = do
str <- peekCStringLen (castPtr ptr, size)
! return (read str)
instance SqlBind String where
! getSqlValue (SqlChar _) ptr size = peekCStringLen (castPtr ptr, size)
! getSqlValue (SqlVarChar _) ptr size = peekCStringLen (castPtr ptr, size)
! getSqlValue (SqlLongVarChar _) ptr size = peekCStringLen (castPtr ptr, size)
instance SqlBind Double where
! getSqlValue (SqlDecimal _ _) ptr size = peek (castPtr ptr)
! getSqlValue (SqlNumeric _ _) ptr size = peek (castPtr ptr)
! getSqlValue SqlDouble ptr size = peek (castPtr ptr)
! getSqlValue SqlReal ptr size = peek (castPtr ptr)
instance SqlBind ClockTime where
! getSqlValue SqlDate ptr size = allocaBytes (#const sizeof(struct tm)) $ \p_tm -> do
(year :: SQLSMALLINT) <- (#peek TIMESTAMP_STRUCT, year) ptr
(#poke struct tm,tm_year ) p_tm (fromIntegral (year-1900) :: CInt)
--- 333,384 ----
class SqlBind a where
! fromSqlValue :: SqlType -> Ptr () -> Int -> IO (Maybe a)
! toSqlValue :: a -> String
instance SqlBind Int where
! fromSqlValue SqlInteger ptr size = fmap Just $ peek (castPtr ptr)
! fromSqlValue SqlSmallInt ptr size = do
(n :: Int16) <- peek (castPtr ptr)
! return (Just (fromIntegral n))
! fromSqlValue _ _ _ = return Nothing
!
! toSqlValue val = show val
instance SqlBind Integer where
! fromSqlValue SqlInteger ptr size = do
(n :: Int32) <- peek (castPtr ptr)
! return (Just (fromIntegral n))
! fromSqlValue SqlSmallInt ptr size = do
(n :: Int16) <- peek (castPtr ptr)
! return (Just (fromIntegral n))
! fromSqlValue SqlBigInt ptr size = do
str <- peekCStringLen (castPtr ptr, size)
! return (Just (read str))
! fromSqlValue _ _ _ = return Nothing
!
! toSqlValue val = show val
instance SqlBind String where
! fromSqlValue (SqlChar _) ptr size = fmap Just $ peekCStringLen (castPtr ptr, size)
! fromSqlValue (SqlVarChar _) ptr size = fmap Just $ peekCStringLen (castPtr ptr, size)
! fromSqlValue (SqlLongVarChar _) ptr size = fmap Just $ peekCStringLen (castPtr ptr, size)
! fromSqlValue _ _ _ = return Nothing
!
! toSqlValue s = '\'' : foldr mapChar "'" s
! where
! mapChar '\'' s = '\'':'\'':s
! mapChar c s = c:s
instance SqlBind Double where
! fromSqlValue (SqlDecimal _ _) ptr size = fmap Just $ peek (castPtr ptr)
! fromSqlValue (SqlNumeric _ _) ptr size = fmap Just $ peek (castPtr ptr)
! fromSqlValue SqlDouble ptr size = fmap Just $ peek (castPtr ptr)
! fromSqlValue SqlReal ptr size = fmap Just $ peek (castPtr ptr)
! fromSqlValue _ _ _ = return Nothing
!
! toSqlValue val = show val
instance SqlBind ClockTime where
! fromSqlValue SqlDate ptr size = allocaBytes (#const sizeof(struct tm)) $ \p_tm -> do
(year :: SQLSMALLINT) <- (#peek TIMESTAMP_STRUCT, year) ptr
(#poke struct tm,tm_year ) p_tm (fromIntegral (year-1900) :: CInt)
***************
*** 379,384 ****
(#poke struct tm,tm_isdst) p_tm (-1 :: CInt)
t <- mktime p_tm
! return (TOD (fromIntegral t) (fromIntegral fraction*1000))
! foreign import ccall unsafe mktime :: Ptr () -> IO CTime
getFieldValueMB :: SqlBind a => Statement -> String -> IO (Maybe a)
--- 396,420 ----
(#poke struct tm,tm_isdst) p_tm (-1 :: CInt)
t <- mktime p_tm
! return (Just (TOD (fromIntegral t) (fromIntegral fraction*1000)))
! fromSqlValue _ _ _ = return Nothing
!
! toSqlValue ct = '\'' : (shows (ctYear t) .
! score .
! shows (ctMonth t) .
! score .
! shows (ctDay t) .
! space .
! shows (ctHour t) .
! colon .
! shows (ctMin t) .
! colon .
! shows (ctSec t)) "'"
! where
! t = toUTCTime ct
! score = showChar '-'
! space = showChar ' '
! colon = showChar ':'
!
! foreign import ccall unsafe mktime :: Ptr () -> IO CTime
getFieldValueMB :: SqlBind a => Statement -> String -> IO (Maybe a)
***************
*** 390,397 ****
if len_or_ind == (#const SQL_NULL_DATA)
then return Nothing
! else fmap Just $
! (if res == (#const SQL_SUCCESS_WITH_INFO)
then getLongData len_or_ind
! else getSqlValue sqlType dataBuffer (fromIntegral len_or_ind))
where
(sqlType,nullable,colNumber) = findFieldInfo name fields 1
--- 426,436 ----
if len_or_ind == (#const SQL_NULL_DATA)
then return Nothing
! else do
! mb_value <- (if res == (#const SQL_SUCCESS_WITH_INFO)
then getLongData len_or_ind
! else fromSqlValue sqlType dataBuffer (fromIntegral len_or_ind))
! case mb_value of
! Just value -> return (Just value)
! Nothing -> throwDyn (SqlBadTypeCast name sqlType)
where
(sqlType,nullable,colNumber) = findFieldInfo name fields 1
***************
*** 404,408 ****
handleSqlResult (#const SQL_HANDLE_STMT) hSTMT res
(len_or_ind :: SQLINTEGER) <- peek (castPtr buffer)
! r <- getSqlValue sqlType dataBuffer (fromIntegral len_or_ind)
free buffer
return r
--- 443,447 ----
handleSqlResult (#const SQL_HANDLE_STMT) hSTMT res
(len_or_ind :: SQLINTEGER) <- peek (castPtr buffer)
! r <- fromSqlValue sqlType dataBuffer (fromIntegral len_or_ind)
free buffer
return r
***************
*** 432,437 ****
mb_v <- getFieldValueMB stmt name
case mb_v of
! Nothing -> fail ("Column \"" ++ name ++ "\" has null value")
! Just a -> return a
getFieldValue' :: SqlBind a => Statement -> String -> a -> IO a
--- 471,476 ----
mb_v <- getFieldValueMB stmt name
case mb_v of
! Nothing -> throwDyn (SqlFetchNull name)
! Just a -> return a
getFieldValue' :: SqlBind a => Statement -> String -> a -> IO a
|
|
From: <kr_...@us...> - 2003-09-06 21:52:51
|
Update of /cvsroot/htoolkit/HSQL In directory sc8-pr-cvs1:/tmp/cvs-serv1545 Modified Files: Makefile Log Message: bugfix: force ghc-pkg to rebuild GHCi libraries each time when install new *.a library Index: Makefile =================================================================== RCS file: /cvsroot/htoolkit/HSQL/Makefile,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Makefile 6 Sep 2003 19:59:06 -0000 1.3 --- Makefile 6 Sep 2003 21:52:42 -0000 1.4 *************** *** 58,61 **** --- 58,62 ---- $(INSTALL) -c $$i $(prefix)/imports/Database/`dirname $$i`; \ done + rm -f $(prefix)/HSsql.o $(GHC_PKG) -u -g -i hsql.pkg if test -f doc/index.html; then \ |
|
From: <kr_...@us...> - 2003-09-06 21:50:45
|
Update of /cvsroot/htoolkit/HSQL/PostgreSQL
In directory sc8-pr-cvs1:/tmp/cvs-serv1131/PostgreSQL
Modified Files:
HSQL.hsc
Log Message:
Add support for inet, cidr and macaddr sql types
Index: HSQL.hsc
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/PostgreSQL/HSQL.hsc,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** HSQL.hsc 6 Sep 2003 19:59:06 -0000 1.1
--- HSQL.hsc 6 Sep 2003 21:50:28 -0000 1.2
***************
*** 33,36 ****
--- 33,37 ----
, collectRows -- :: (Statement -> IO s) -> Statement -> IO [s]
, Point(..), Line(..), Path(..), Box(..), Circle(..), Polygon(..)
+ , INetAddr(..), MacAddr(..)
) where
***************
*** 38,41 ****
--- 39,43 ----
import Data.Dynamic
import Data.IORef
+ import Data.Char
import Foreign
import Foreign.C
***************
*** 46,49 ****
--- 48,52 ----
import Text.ParserCombinators.ReadP
import Text.Read
+ import Numeric
# include <time.h>
***************
*** 418,422 ****
where
t = toUTCTime ct
! score = showChar '.'
space = showChar ' '
colon = showChar ':'
--- 421,425 ----
where
t = toUTCTime ct
! score = showChar '-'
space = showChar ' '
colon = showChar ':'
***************
*** 477,480 ****
--- 480,545 ----
toSqlValue (Circle (Point x y) r) = "'<" ++ show (x,y) ++ "," ++ show r ++ "'>"
+
+ data INetAddr = INetAddr Int Int Int Int Int deriving (Eq,Show)
+
+ instance SqlBind INetAddr where
+ fromSqlValue t s
+ | t == SqlINetAddr || t == SqlCIDRAddr =
+ case readNum s of
+ (x1,s) -> case readNum s of
+ (x2,s) -> case readNum s of
+ (x3,s) -> case readNum s of
+ (x4,s) -> case readNum s of
+ (mask,_) -> Just (INetAddr x1 x2 x3 x4 mask)
+ | otherwise = Nothing
+ where
+ readNum s = case readDec s of
+ [(x,'.':s)] -> (x,s)
+ [(x,'/':s)] -> (x,s)
+ [(x,"")] -> (x,"")
+ _ -> (0,"")
+
+ toSqlValue (INetAddr x1 x2 x3 x4 mask) = '\'' :
+ (shows x1 .
+ dot .
+ shows x2.
+ dot .
+ shows x3 .
+ dot .
+ shows x4 .
+ slash .
+ shows mask) "'"
+ where
+ dot = showChar '.'
+ slash = showChar '/'
+
+ data MacAddr = MacAddr Int Int Int Int Int Int deriving (Eq,Show)
+
+ instance SqlBind MacAddr where
+ fromSqlValue SqlMacAddr s =
+ case readHex s of
+ [(x1,':':s)] -> case readHex s of
+ [(x2,':':s)] -> case readHex s of
+ [(x3,':':s)] -> case readHex s of
+ [(x4,':':s)] -> case readHex s of
+ [(x5,':':s)] -> case readHex s of
+ [(x6,_)] -> Just (MacAddr x1 x2 x3 x4 x5 x6)
+ fromSqlValue _ _ = Nothing
+
+ toSqlValue (MacAddr x1 x2 x3 x4 x5 x6) = '\'' :
+ (showHex x1 .
+ colon .
+ showHex x2 .
+ colon .
+ showHex x3 .
+ colon .
+ showHex x4 .
+ colon .
+ showHex x5 .
+ colon .
+ showHex x6) "'"
+ where
+ colon = showChar ':'
+ showHex = showIntAtBase 16 intToDigit
getFieldValueMB :: SqlBind a => Statement -> String -> IO (Maybe a)
|
|
From: <kr_...@us...> - 2003-09-06 19:59:10
|
Update of /cvsroot/htoolkit/HSQL/PostgreSQL
In directory sc8-pr-cvs1:/tmp/cvs-serv11008/PostgreSQL
Added Files:
HSQL.hsc
Log Message:
Support for PostgreSQL. The new implementation has better support for Sql<->Haskell data translation
--- NEW FILE: HSQL.hsc ---
-----------------------------------------------------------------------------------------
{-| Module : Database.PostgreSQL.HSQL
Copyright : (c) Krasimir Angelov 2003
License : BSD-style
Maintainer : ka2...@ya...
Stability : provisional
Portability : portable
The module provides interface to PostgreSQL database
-}
-----------------------------------------------------------------------------------------
module Database.PostgreSQL.HSQL
( SqlBind(..), SqlError(..), SqlType(..), Connection, Statement
, catchSql -- :: IO a -> (SqlError -> IO a) -> IO a
, handleSql -- :: (SqlError -> IO a) -> IO a -> IO a
, sqlExceptions -- :: Exception -> Maybe SqlError
, connect -- :: String -> String -> String -> IO Connection
, disconnect -- :: Connection -> IO ()
, execute -- :: Connection -> String -> IO Statement
, query -- :: Connection -> String -> IO ()
, closeStatement -- :: Statement -> IO ()
, fetch -- :: Statement -> IO Bool
, inTransaction -- :: Connection -> (Connection -> IO a) -> IO a
, getFieldValueMB -- :: SqlBind a => Statement -> String -> IO (Maybe a)
, getFieldValue -- :: SqlBind a => Statement -> String -> IO a
, getFieldValue' -- :: SqlBind a => Statement -> String -> a -> IO a
, getFieldValueType -- :: Statement -> String -> (SqlType, Bool)
, getFieldsTypes -- :: Statement -> [(String, SqlType, Bool)]
, forEachRow -- :: (Statement -> s -> IO s) -> Statement -> s -> IO s
, forEachRow' -- :: (Statement -> IO ()) -> Statement -> IO ()
, collectRows -- :: (Statement -> IO s) -> Statement -> IO [s]
, Point(..), Line(..), Path(..), Box(..), Circle(..), Polygon(..)
) where
import Data.Dynamic
import Data.IORef
import Foreign
import Foreign.C
import Control.Exception (throwDyn, catchDyn, dynExceptions, Exception(..))
import Control.Monad(when,unless,mplus)
import System.Time
import System.IO.Unsafe
import Text.ParserCombinators.ReadP
import Text.Read
# include <time.h>
#include <libpq-fe.h>
#include <postgres.h>
#include <catalog/pg_type.h>
type PGconn = Ptr ()
type PGresult = Ptr ()
type ConnStatusType = #type ConnStatusType
type ExecStatusType = #type ExecStatusType
type Oid = #type Oid
foreign import ccall "libpq-fe.h PQsetdbLogin" pqSetdbLogin :: CString -> CString -> CString -> CString -> CString -> CString -> CString -> IO PGconn
foreign import ccall "libpq-fe.h PQstatus" pqStatus :: PGconn -> IO ConnStatusType
foreign import ccall "libpq-fe.h PQerrorMessage" pqErrorMessage :: PGconn -> IO CString
foreign import ccall "libpq-fe.h PQfinish" pqFinish :: PGconn -> IO ()
foreign import ccall "libpq-fe.h PQexec" pqExec :: PGconn -> CString -> IO PGresult
foreign import ccall "libpq-fe.h PQresultStatus" pqResultStatus :: PGresult -> IO ExecStatusType
foreign import ccall "libpq-fe.h PQresStatus" pqResStatus :: ExecStatusType -> IO CString
foreign import ccall "libpq-fe.h PQresultErrorMessage" pqResultErrorMessage :: PGresult -> IO CString
foreign import ccall "libpq-fe.h PQnfields" pgNFields :: PGresult -> IO Int
foreign import ccall "libpq-fe.h PQntuples" pqNTuples :: PGresult -> IO Int
foreign import ccall "libpq-fe.h PQfname" pgFName :: PGresult -> Int -> IO CString
foreign import ccall "libpq-fe.h PQftype" pqFType :: PGresult -> Int -> IO Oid
foreign import ccall "libpq-fe.h PQfmod" pqFMod :: PGresult -> Int -> IO Int
foreign import ccall "libpq-fe.h PQfnumber" pqFNumber :: PGresult -> CString -> IO Int
foreign import ccall "libpq-fe.h PQgetvalue" pqGetvalue :: PGresult -> Int -> Int -> IO CString
foreign import ccall "libpq-fe.h PQgetisnull" pqGetisnull :: PGresult -> Int -> Int -> IO Int
newtype Connection = Connection PGconn
data Statement
= Statement
{ pRes :: !PGresult
, tupleIndex :: IORef Int
, countTuples:: !Int
, connection :: !Connection
, fields :: ![FieldDef]
}
type FieldDef = (String, SqlType)
data SqlType
= SqlChar Int
| SqlVarChar Int
| SqlText
| SqlNumeric Int Int
| SqlSmallInt
| SqlInteger
| SqlReal
| SqlDouble
| SqlBool
| SqlBit Int
| SqlVarBit Int
| SqlTinyInt
| SqlBigInt
| SqlDate
| SqlTime
| SqlAbsTime
| SqlRelTime
| SqlTimeTZ
| SqlTimeInterval
| SqlAbsTimeInterval
| SqlTimeStamp
| SqlMoney
| SqlINetAddr
| SqlCIDRAddr
| SqlMacAddr
| SqlPoint
| SqlLSeg
| SqlPath
| SqlBox
| SqlPolygon
| SqlLine
| SqlCircle
| SqlUnknown
deriving (Eq, Show)
data SqlError
= SqlError
{ seState :: String
, seNativeError :: Int
, seErrorMsg :: String
}
| SqlNoData
| SqlBadTypeCast
{ seFieldName :: String
, seFieldType :: SqlType
}
| SqlFetchNull
{ seFieldName :: String
}
deriving (Show, Typeable)
-----------------------------------------------------------------------------------------
-- routines for handling exceptions
-----------------------------------------------------------------------------------------
catchSql :: IO a -> (SqlError -> IO a) -> IO a
catchSql = catchDyn
handleSql :: (SqlError -> IO a) -> IO a -> IO a
handleSql h f = catchDyn f h
sqlExceptions :: Exception -> Maybe SqlError
sqlExceptions e = dynExceptions e >>= fromDynamic
-----------------------------------------------------------------------------------------
-- Connect/Disconnect
-----------------------------------------------------------------------------------------
connect :: String -> String -> String -> String -> IO Connection
connect server database user authentication = do
pServer <- newCString server
pDatabase <- newCString database
pUser <- newCString user
pAuthentication <- newCString authentication
pConn <- pqSetdbLogin pServer nullPtr nullPtr nullPtr pDatabase pUser pAuthentication
free pServer
free pUser
free pAuthentication
status <- pqStatus pConn
unless (status == (#const CONNECTION_OK)) (do
errMsg <- pqErrorMessage pConn >>= peekCString
pqFinish pConn
throwDyn (SqlError {seState="C", seNativeError=fromIntegral status, seErrorMsg=errMsg}))
return (Connection pConn)
disconnect :: Connection -> IO ()
disconnect (Connection pConn) = pqFinish pConn
-----------------------------------------------------------------------------------------
-- queries
-----------------------------------------------------------------------------------------
execute :: Connection -> String -> IO ()
execute conn@(Connection pConn) sqlExpr = do
pRes <- withCString sqlExpr (pqExec pConn)
when (pRes==nullPtr) (do
errMsg <- pqErrorMessage pConn >>= peekCString
throwDyn (SqlError {seState="E", seNativeError=(#const PGRES_FATAL_ERROR), seErrorMsg=errMsg}))
status <- pqResultStatus pRes
unless (status == (#const PGRES_COMMAND_OK) || status == (#const PGRES_TUPLES_OK)) (do
errMsg <- pqResultErrorMessage pRes >>= peekCString
throwDyn (SqlError {seState="E", seNativeError=fromIntegral status, seErrorMsg=errMsg}))
return ()
query :: Connection -> String -> IO Statement
query conn@(Connection pConn) query = do
pRes <- withCString query (pqExec pConn)
when (pRes==nullPtr) (do
errMsg <- pqErrorMessage pConn >>= peekCString
throwDyn (SqlError {seState="E", seNativeError=(#const PGRES_FATAL_ERROR), seErrorMsg=errMsg}))
status <- pqResultStatus pRes
unless (status == (#const PGRES_COMMAND_OK) || status == (#const PGRES_TUPLES_OK)) (do
errMsg <- pqResultErrorMessage pRes >>= peekCString
throwDyn (SqlError {seState="E", seNativeError=fromIntegral status, seErrorMsg=errMsg}))
defs <- if status == (#const PGRES_TUPLES_OK) then pgNFields pRes >>= getFieldDefs pRes 0 else return []
countTuples <- pqNTuples pRes;
tupleIndex <- newIORef (-1)
return (Statement {pRes=pRes, connection=conn, fields=defs, countTuples=countTuples, tupleIndex=tupleIndex})
where
getFieldDefs pRes i n
| i >= n = return []
| otherwise = do
name <- pgFName pRes i >>= peekCString
dataType <- pqFType pRes i
modifier <- pqFMod pRes i
defs <- getFieldDefs pRes (i+1) n
return ((name,mkSqlType dataType modifier):defs)
mkSqlType :: Oid -> Int -> SqlType
mkSqlType (#const BPCHAROID) size = SqlChar (size-4)
mkSqlType (#const VARCHAROID) size = SqlVarChar (size-4)
mkSqlType (#const NAMEOID) size = SqlVarChar 31
mkSqlType (#const TEXTOID) size = SqlText
mkSqlType (#const NUMERICOID) size = SqlNumeric ((size-4) `div` 0x10000) ((size-4) `mod` 0x10000)
mkSqlType (#const INT2OID) size = SqlSmallInt
mkSqlType (#const INT4OID) size = SqlInteger
mkSqlType (#const FLOAT4OID) size = SqlReal
mkSqlType (#const FLOAT8OID) size = SqlDouble
mkSqlType (#const BOOLOID) size = SqlBool
mkSqlType (#const BITOID) size = SqlBit size
mkSqlType (#const VARBITOID) size = SqlVarBit size
mkSqlType (#const BYTEAOID) size = SqlTinyInt
mkSqlType (#const INT8OID) size = SqlBigInt
mkSqlType (#const DATEOID) size = SqlDate
mkSqlType (#const TIMEOID) size = SqlTime
mkSqlType (#const TIMETZOID) size = SqlTimeTZ
mkSqlType (#const ABSTIMEOID) size = SqlAbsTime
mkSqlType (#const RELTIMEOID) size = SqlRelTime
mkSqlType (#const INTERVALOID) size = SqlTimeInterval
mkSqlType (#const TINTERVALOID) size = SqlAbsTimeInterval
mkSqlType (#const TIMESTAMPOID) size = SqlTimeStamp
mkSqlType (#const CASHOID) size = SqlMoney
mkSqlType (#const INETOID) size = SqlINetAddr
mkSqlType (#const 829) size = SqlMacAddr -- hack
mkSqlType (#const CIDROID) size = SqlCIDRAddr
mkSqlType (#const POINTOID) size = SqlPoint
mkSqlType (#const LSEGOID) size = SqlLSeg
mkSqlType (#const PATHOID) size = SqlPath
mkSqlType (#const BOXOID) size = SqlBox
mkSqlType (#const POLYGONOID) size = SqlPolygon
mkSqlType (#const LINEOID) size = SqlLine
mkSqlType (#const CIRCLEOID) size = SqlCircle
mkSqlType (#const UNKNOWNOID) size = SqlUnknown
fetch :: Statement -> IO Bool
fetch (Statement {countTuples=countTuples, tupleIndex=tupleIndex}) = do
index <- readIORef tupleIndex
let index' = index+1
if (index' >= countTuples)
then return False
else writeIORef tupleIndex index' >> return True
closeStatement :: Statement -> IO ()
closeStatement _ = return ()
-----------------------------------------------------------------------------------------
-- transactions
-----------------------------------------------------------------------------------------
inTransaction :: Connection -> (Connection -> IO a) -> IO a
inTransaction conn action = do
execute conn "begin"
r <- catchSql (action conn) (\err -> execute conn "rollback" >>= throwDyn err)
execute conn "commit"
return r
-----------------------------------------------------------------------------------------
-- binding
-----------------------------------------------------------------------------------------
class SqlBind a where
fromSqlValue :: SqlType -> String -> Maybe a
toSqlValue :: a -> String
instance SqlBind Int where
fromSqlValue SqlInteger s = Just (read s)
fromSqlValue SqlSmallInt s = Just (read s)
fromSqlValue _ _ = Nothing
toSqlValue s = show s
instance SqlBind Integer where
fromSqlValue SqlInteger s = Just (read s)
fromSqlValue SqlSmallInt s = Just (read s)
fromSqlValue SqlBigInt s = Just (read s)
fromSqlValue _ _ = Nothing
toSqlValue s = show s
instance SqlBind String where
fromSqlValue _ = Just
toSqlValue s = '\'' : foldr mapChar "'" s
where
mapChar '\'' s = '\\':'\'':s
mapChar '\n' s = '\\':'n':s
mapChar '\r' s = '\\':'r':s
mapChar '\t' s = '\\':'t':s
mapChar c s = c:s
instance SqlBind Bool where
fromSqlValue SqlBool s = Just (s == "t")
fromSqlValue _ _ = Nothing
toSqlValue True = "'t'"
toSqlValue False = "'f'"
instance SqlBind Double where
fromSqlValue (SqlNumeric _ _) s = Just (read s)
fromSqlValue SqlDouble s = Just (read s)
fromSqlValue SqlReal s = Just (read s)
fromSqlValue _ _ = Nothing
toSqlValue d = show d
mkClockTime :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> ClockTime
mkClockTime year mon mday hour min sec tz =
unsafePerformIO $ do
allocaBytes (#const sizeof(struct tm)) $ \ p_tm -> do
(#poke struct tm,tm_sec ) p_tm (fromIntegral sec :: CInt)
(#poke struct tm,tm_min ) p_tm (fromIntegral min :: CInt)
(#poke struct tm,tm_hour ) p_tm (fromIntegral hour :: CInt)
(#poke struct tm,tm_mday) p_tm (fromIntegral mday :: CInt)
(#poke struct tm,tm_mon ) p_tm (fromIntegral (mon-1) :: CInt)
(#poke struct tm,tm_year ) p_tm (fromIntegral (year-1900) :: CInt)
(#poke struct tm,tm_isdst) p_tm (-1 :: CInt)
t <- mktime p_tm
return (TOD (fromIntegral t + fromIntegral (tz-currTZ)) 0)
foreign import ccall unsafe mktime :: Ptr () -> IO CTime
{-# NOINLINE currTZ #-}
currTZ :: Int
currTZ = ctTZ (unsafePerformIO (getClockTime >>= toCalendarTime)) -- Hack
parseTZ :: ReadP Int
parseTZ = (char '+' >> readS_to_P reads) `mplus` (char '-' >> fmap negate (readS_to_P reads))
f_read :: ReadP a -> String -> Maybe a
f_read f s = case readP_to_S f s of {[(x,_)] -> Just x}
instance SqlBind ClockTime where
fromSqlValue SqlTimeTZ s = f_read getTime s
where
getTime :: ReadP ClockTime
getTime = do
hour <- readS_to_P reads
char ':'
minutes <- readS_to_P reads
char ':'
seconds <- readS_to_P reads
tz <- parseTZ
return (mkClockTime 1970 0 1 hour minutes seconds (tz*3600))
fromSqlValue SqlTime s = f_read getTime s
where
getTime :: ReadP ClockTime
getTime = do
hour <- readS_to_P reads
char ':'
minutes <- readS_to_P reads
char ':'
seconds <- readS_to_P reads
return (mkClockTime 1970 0 1 hour minutes seconds currTZ)
fromSqlValue SqlDate s = f_read getDate s
where
getDate :: ReadP ClockTime
getDate = do
year <- readS_to_P reads
satisfy (=='-')
month <- readS_to_P reads
satisfy (=='-')
day <- readS_to_P reads
return (mkClockTime year month day 0 0 0 currTZ)
fromSqlValue SqlTimeStamp s = f_read getTimeStamp s
where
getTimeStamp :: ReadP ClockTime
getTimeStamp = do
year <- readS_to_P reads
satisfy (=='-')
month <- readS_to_P reads
satisfy (=='-')
day <- readS_to_P reads
skipSpaces
hour <- readS_to_P reads
satisfy (==':')
minutes <- readS_to_P reads
satisfy (==':')
seconds <- readS_to_P reads
tz <- parseTZ
return (mkClockTime year month day hour minutes seconds (tz*3600))
fromSqlValue _ _ = Nothing
toSqlValue ct = '\'' : (shows (ctYear t) .
score .
shows (ctMonth t) .
score .
shows (ctDay t) .
space .
shows (ctHour t) .
colon .
shows (ctMin t) .
colon .
shows (ctSec t)) "'"
where
t = toUTCTime ct
score = showChar '.'
space = showChar ' '
colon = showChar ':'
data Point = Point Double Double deriving (Eq, Show)
data Line = Line Point Point deriving (Eq, Show)
data Path = OpenPath [Point] | ClosedPath [Point] deriving (Eq, Show)
data Box = Box Double Double Double Double deriving (Eq, Show)
data Circle = Circle Point Double deriving (Eq, Show)
data Polygon = Polygon [Point] deriving (Eq, Show)
instance SqlBind Point where
fromSqlValue SqlPoint s = case read s of
(x,y) -> Just (Point x y)
fromSqlValue _ _ = Nothing
toSqlValue (Point x y) = '\'' : shows (x,y) "'"
instance SqlBind Line where
fromSqlValue SqlLSeg s = case read s of
[(x1,y1),(x2,y2)] -> Just (Line (Point x1 y1) (Point x2 y2))
fromSqlValue _ _ = Nothing
toSqlValue (Line (Point x1 y1) (Point x2 y2)) = '\'' : shows [(x1,y1),(x2,y2)] "'"
instance SqlBind Path where
fromSqlValue SqlPath ('(':s) = case read ("["++init s++"]") of -- closed path
ps -> Just (ClosedPath (map (\(x,y) -> Point x y) ps))
fromSqlValue SqlPath s = case read s of -- closed path -- open path
ps -> Just (OpenPath (map (\(x,y) -> Point x y) ps))
fromSqlValue SqlLSeg s = case read s of
[(x1,y1),(x2,y2)] -> Just (OpenPath [(Point x1 y1), (Point x2 y2)])
fromSqlValue SqlPoint s = case read s of
(x,y) -> Just (ClosedPath [Point x y])
fromSqlValue _ _ = Nothing
toSqlValue (OpenPath ps) = '\'' : shows ps "'"
toSqlValue (ClosedPath ps) = "'(" ++ init (tail (show ps)) ++ "')"
instance SqlBind Box where
fromSqlValue SqlBox s = case read ("("++s++")") of
((x1,y1),(x2,y2)) -> Just (Box x1 y1 x2 y2)
fromSqlValue _ _ = Nothing
toSqlValue (Box x1 y1 x2 y2) = '\'' : shows ((x1,y1),(x2,y2)) "'"
instance SqlBind Polygon where
fromSqlValue SqlPolygon s = case read ("["++init (tail s)++"]") of
ps -> Just (Polygon (map (\(x,y) -> Point x y) ps))
fromSqlValue _ _ = Nothing
toSqlValue (Polygon ps) = "'(" ++ init (tail (show ps)) ++ "')"
instance SqlBind Circle where
fromSqlValue SqlCircle s = case read ("("++init (tail s)++")") of
((x,y),r) -> Just (Circle (Point x y) r)
fromSqlValue _ _ = Nothing
toSqlValue (Circle (Point x y) r) = "'<" ++ show (x,y) ++ "," ++ show r ++ "'>"
getFieldValueMB :: SqlBind a => Statement -> String -> IO (Maybe a)
getFieldValueMB (Statement {pRes=pRes, connection=conn, fields=fieldDefs, countTuples=countTuples, tupleIndex=tupleIndex}) name = do
index <- readIORef tupleIndex
when (index >= countTuples) (throwDyn SqlNoData)
let (sqlType,colNumber) = findFieldInfo name fieldDefs 0
isnull <- pqGetisnull pRes index colNumber
if isnull == 1
then return Nothing
else do
value <- pqGetvalue pRes index colNumber >>= peekCString
case fromSqlValue sqlType value of
Just v -> return (Just v)
Nothing -> throwDyn (SqlBadTypeCast name sqlType)
getFieldValue :: SqlBind a => Statement -> String -> IO a
getFieldValue stmt name = do
mb_v <- getFieldValueMB stmt name
case mb_v of
Nothing -> throwDyn (SqlFetchNull name)
Just a -> return a
getFieldValue' :: SqlBind a => Statement -> String -> a -> IO a
getFieldValue' stmt name def = do
mb_v <- getFieldValueMB stmt name
return (case mb_v of { Nothing -> def; Just a -> a })
getFieldValueType :: Statement -> String -> SqlType
getFieldValueType stmt name = sqlType
where
(sqlType,colNumber) = findFieldInfo name (fields stmt) 1
getFieldsTypes :: Statement -> [(String, SqlType)]
getFieldsTypes = fields
findFieldInfo :: String -> [FieldDef] -> Int -> (SqlType,Int)
findFieldInfo name [] colNumber = error ("Undefined column name \"" ++ name ++ "\"")
findFieldInfo name (fieldDef@(name',sqlType):fields) colNumber
| name == name' = (sqlType,colNumber)
| otherwise = findFieldInfo name fields (colNumber+1)
-----------------------------------------------------------------------------------------
-- helpers
-----------------------------------------------------------------------------------------
forEachRow :: (Statement -> s -> IO s) -> Statement -> s -> IO s
forEachRow f stmt s = do
success <- fetch stmt
if success then f stmt s >>= forEachRow f stmt else closeStatement stmt >> return s
forEachRow' :: (Statement -> IO ()) -> Statement -> IO ()
forEachRow' f stmt = do
success <- fetch stmt
if success then f stmt >> forEachRow' f stmt else closeStatement stmt
collectRows :: (Statement -> IO a) -> Statement -> IO [a]
collectRows f stmt = loop
where
loop = do
success <- fetch stmt
if success
then do
x <- f stmt
xs <- loop
return (x:xs)
else closeStatement stmt >> return []
|
|
From: <kr_...@us...> - 2003-09-06 19:59:10
|
Update of /cvsroot/htoolkit/HSQL
In directory sc8-pr-cvs1:/tmp/cvs-serv11008
Modified Files:
Makefile configure.ac
Log Message:
Support for PostgreSQL. The new implementation has better support for Sql<->Haskell data translation
Index: Makefile
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/Makefile,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** Makefile 5 Sep 2003 21:44:09 -0000 1.2
--- Makefile 6 Sep 2003 19:59:06 -0000 1.3
***************
*** 1,64 ****
! include config.mk
!
! ifeq "$(WithODBC)" "YES"
! HS_SRC += ODBC/HSQL.hs
! endif
!
! ifeq "$(WithPostgreSQL)" "YES"
! HS_SRC += PostgreSQL/HSQL.hs
! endif
!
! ifeq "$(WithMySQL)" "YES"
! HS_SRC += MySQL/HSQL.hs
! endif
!
! OBJS = $(patsubst %.hs,%.o, $(HS_SRC))
! HI_SRC = $(patsubst %.hs,%.hi,$(HS_SRC))
!
! ifneq "$(HADDOCK)" ""
! HS_PPS = $(addsuffix .raw-hs, $(basename $(HS_SRC)))
! endif
!
! %.o : %.hs
! mkdir -p $(basename $^)_split
! $(GHC) $< -O -c -fglasgow-exts -split-objs $(CPPFLAGS) -package-name hsql
! $(LD) -r -o $@ $(basename $^)_split/*.o
! %.hs : %.hsc
! $(HSC2HS) $< $(CPPFLAGS)
! %.raw-hs : %.hs
! $(GHC) -Iincludes $(CPPFLAGS) -D__HADDOCK__ -E -cpp $< -o $<.tmp && sed -e 's/^#.*//' <$<.tmp >$@
!
! all: libHSsql.a
!
! libHSsql.a: $(OBJS)
! rm -f libHSsql.a
! for i in $(patsubst %.o,%_split, $(OBJS)); do \
! $(AR) -q libHSsql.a $$i/*.o; \
! done
!
! depend: $(HS_SRC)
! $(GHC) -M $^
!
! clean:
! rm -f $(OBJS)
! rm -f $(HI_SRC)
! rm -f $(HS_PPS)
!
! doc : $(HS_PPS)
! mkdir -p doc
! $(HADDOCK) -h -o doc $(HS_PPS)
!
! install: libHSsql.a $(HI_SRC) doc
! $(INSTALL) libHSsql.a $(prefix)/libHSsql.a
! $(INSTALL) -d $(prefix)/imports/Database
! for i in $(HI_SRC); do \
! $(INSTALL) -d $(prefix)/imports/Database/`dirname $$i`; \
! $(INSTALL) -c $$i $(prefix)/imports/Database/`dirname $$i`; \
! done
! if test -d doc; then \
! $(INSTALL) -d $(prefix)/doc/html/hsql; \
! $(INSTALL) -c doc/* $(prefix)/doc/html/hsql; \
! fi
! $(GHC_PKG) -u -g -i hsql.pkg
!
! ODBC/HSQL.hs : ODBC/HSQLStructs.h
--- 1,66 ----
! include config.mk
!
! ifeq "$(WithODBC)" "YES"
! HS_SRC += ODBC/HSQL.hs
! endif
!
! ifeq "$(WithPostgreSQL)" "YES"
! HS_SRC += PostgreSQL/HSQL.hs
! endif
!
! ifeq "$(WithMySQL)" "YES"
! HS_SRC += MySQL/HSQL.hs
! endif
!
! OBJS = $(patsubst %.hs,%.o, $(HS_SRC))
! HI_SRC = $(patsubst %.hs,%.hi,$(HS_SRC))
!
! ifneq "$(HADDOCK)" ""
! HS_PPS = $(addsuffix .raw-hs, $(basename $(HS_SRC)))
! HADDOCK = echo
! endif
!
! %.o : %.hs
! mkdir -p $(basename $^)_split
! rm -f $(basename $^)_split/*
! $(GHC) $< -O -c -fglasgow-exts -split-objs $(CPPFLAGS) -package-name hsql
! $(LD) -r -o $@ $(basename $^)_split/*.o
! %.hs : %.hsc
! $(HSC2HS) $< $(CPPFLAGS)
! %.raw-hs : %.hs
! $(GHC) -Iincludes $(CPPFLAGS) -D__HADDOCK__ -E -cpp $< -o $<.tmp && sed -e 's/^#.*//' <$<.tmp >$@
!
! all: libHSsql.a
!
! libHSsql.a: $(OBJS)
! rm -f libHSsql.a
! for i in $(patsubst %.o,%_split, $(OBJS)); do \
! $(AR) -q libHSsql.a $$i/*.o; \
! done
!
! depend: $(HS_SRC)
! $(GHC) -M $^
!
! clean:
! rm -f $(OBJS)
! rm -f $(HI_SRC)
! rm -f $(HS_PPS)
!
! doc : $(HS_PPS)
! mkdir -p doc
! $(HADDOCK) -h -o doc $(HS_PPS)
!
! install: libHSsql.a $(HI_SRC) doc
! $(INSTALL) libHSsql.a $(prefix)/libHSsql.a
! $(INSTALL) -d $(prefix)/imports/Database
! for i in $(HI_SRC); do \
! $(INSTALL) -d $(prefix)/imports/Database/`dirname $$i`; \
! $(INSTALL) -c $$i $(prefix)/imports/Database/`dirname $$i`; \
! done
! $(GHC_PKG) -u -g -i hsql.pkg
! if test -f doc/index.html; then \
! $(INSTALL) -d $(prefix)/doc/html/hsql; \
! $(INSTALL) -c doc/* $(prefix)/doc/html/hsql; \
! fi
!
! ODBC/HSQL.hs : ODBC/HSQLStructs.h
Index: configure.ac
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/configure.ac,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** configure.ac 5 Sep 2003 21:44:10 -0000 1.2
--- configure.ac 6 Sep 2003 19:59:06 -0000 1.3
***************
*** 1,234 ****
! AC_INIT([HSQL],[1.0],[hto...@li...],[hsql])
!
! AC_CONFIG_FILES([config.mk:config.mk.in hsql.pkg:hsql.pkg.in])
!
! AC_CANONICAL_SYSTEM
!
! dnl ***********************************************
! dnl Enable/Disable ODBC binding
! dnl ***********************************************
! AC_ARG_ENABLE(odbc,
! [ --enable-odbc
! Build an ODBC binding for Haskell.
! ],
! [WithODBC=YES],
! [WithODBC=NO]
! )
! AC_SUBST(WithODBC)
!
! dnl ***********************************************
! dnl Enable/Disable PostgreSQL binding
! dnl ***********************************************
! AC_ARG_ENABLE(postgres,
! [ --enable-postgres
! Build a PostgreSQL binding for Haskell.
! ],
! [WithPostgreSQL=YES],
! [WithPostgreSQL=NO]
! )
! AC_SUBST(WithPostgreSQL)
!
! dnl ***********************************************
! dnl Enable/Disable MySQL binding
! dnl ***********************************************
! AC_ARG_ENABLE(mysql,
! [ --enable-mysql
! Build a MySQL binding for Haskell.
! ],
! [WithMySQL=YES],
! [WithMySQL=NO]
! )
! AC_SUBST(WithMySQL)
!
! dnl ***********************************************
! dnl GHC
! dnl ***********************************************
! AC_ARG_WITH(ghc,
! [ --with-ghc=<ghc command>
! Use a different command instead of 'ghc' for the Haskell compiler.
! ],
! [GHC="$withval"],
! [AC_PATH_PROG(GHC,ghc)]
! )
!
! if test "$GHC" = "" || test ! -f $GHC; then
! AC_MSG_ERROR([GHC is required to build the package])
! fi
!
! AC_SUBST(GHC)
!
! if test "$prefix" = "NONE"; then
! prefix=`$GHC --print-libdir`
! fi
!
! dnl ***********************************************
! dnl hsc2hs
! dnl ***********************************************
! AC_ARG_WITH(hsc2hs,
! [ --with-hsc2hs=<hsc2hs command>
! Use a different command instead of 'hsc2hs'
! ],
! [HSC2HS="$withval"],
! [AC_PATH_PROG(HSC2HS,hsc2hs)]
! )
!
! if test "$HSC2HS" = "" || test ! -f $HSC2HS; then
! AC_MSG_ERROR([HSC2HS is required to build the package])
! fi
!
! AC_SUBST(HSC2HS)
!
! dnl ***********************************************
! dnl ghc-pkg
! dnl ***********************************************
! AC_ARG_WITH(ghc-pkg,
! [ --with-ghc-pkg=<ghc-pkg command>
! Use a different command instead of 'ghc-pkg'
! ],
! [GHC_PKG="$withval"],
! [AC_PATH_PROG(GHC_PKG,ghc-pkg)]
! )
!
! if test "$GHC_PKG" = "" || test ! -f $GHC_PKG; then
! AC_MSG_ERROR([ghc-pkg is required to build the package])
! fi
!
! AC_SUBST(GHC_PKG)
!
! dnl ***********************************************
! dnl HADDOCK
! dnl ***********************************************
! AC_ARG_WITH(haddock,
! [ --with-haddock=<haddock command>
! Use a different command instead of 'haddock' for the documentation builder.
! ],
! [HADDOCK="$withval"],
! [AC_PATH_PROG(HADDOCK,haddock)]
! )
!
! if test "$HADDOCK" = "" || test ! -f $HADDOCK; then
! echo HADDOCK is required to build the documentations
! fi
!
! AC_SUBST(HADDOCK)
!
! dnl ***********************************************
! dnl other progs
! dnl ***********************************************
!
AC_PROG_CC
! AC_PROG_CPP
! AC_PROG_INSTALL
!
! AC_PATH_PROG(AR,ar)
! AC_SUBST(AR)
!
! AC_PATH_PROG(LD,ld)
! AC_SUBST(LD)
!
! dnl ***********************************************
! dnl check for headers and libraries for ODBC
! dnl ***********************************************
!
! if test $WithODBC = YES; then
! case $ac_cv_target_alias in
! i[[3456]]86-*-cygwin*|i[[3456]]86-*-mingw32*)
! AC_COMPILE_IFELSE(
! [
! #include <windows.h>
! #include <sqlext.h>
!
! int main()
! {
! SQLAllocEnv (NULL);
! return 0;
! }
! ],
! [LIBS="${LIBS} -lodbc32"],
! AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
! ;;
! *) AC_CHECK_HEADER(sqlext.h,,AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
! AC_CHECK_LIB(odbc,SQLAllocEnv,,AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
! ;;
! esac
!
! CPPFLAGS="$CPPFLAGS -IODBC"
! fi
!
! dnl ***********************************************
! dnl check for headers and libraries for PostgreSQL
! dnl ***********************************************
!
! if test $WithPostgreSQL = YES; then
! AC_PATH_PROG(PG_CONFIG, pg_config)
!
! if test "$PG_CONFIG" = "" || test ! -f $PG_CONFIG; then
! AC_MSG_ERROR([pg_config is required to build PostgreSQL binding])
! fi
!
! case $ac_cv_target_alias in
! i[[3456]]86-*-cygwin*|i[[3456]]86-*-mingw32*)
! LDFLAGS="$LDFLAGS -L$(cygpath -m `$PG_CONFIG --libdir`)"
! CPPFLAGS="$CPPFLAGS -I$(cygpath -m /usr/include) -I$(cygpath -m `$PG_CONFIG --includedir`)"
! ;;
! *) LDFLAGS="$LDFLAGS -L`$PG_CONFIG --libdir`"
! CPPFLAGS="$CPPFLAGS -I`$PG_CONFIG --includedir`"
! ;;
! esac
!
! AC_CHECK_HEADER(libpq-fe.h,,AC_MSG_ERROR([libpq-fe.h header not found]))
! AC_CHECK_LIB(pq,PQsetdbLogin,,AC_MSG_ERROR([libpq.a library not found]))
! fi
!
! dnl ***********************************************
! dnl check for headers and libraries for MySQL
! dnl ***********************************************
!
! if test $WithMySQL = YES; then
! AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
!
! if test "$MYSQL_CONFIG" = "" || test ! -f $MYSQL_CONFIG; then
! AC_MSG_ERROR([mysql_config is required to build PostgreSQL binding])
! fi
!
! LDFLAGS="$LDFLAGS `$MYSQL_CONFIG --libs`"
! CPPFLAGS="$CPPFLAGS `$MYSQL_CONFIG --cflags`"
!
! AC_CHECK_HEADER(mysql/mysql.h,, AC_MSG_ERROR([mysql.h header not found]))
!
! fi
!
! dnl ***********************************************
! dnl subst
! dnl ***********************************************
!
! LL="$LIBS $LDFLAGS"
!
! if test "x$prefix" != xNONE; then
! LIB_DIRS='"'${prefix}'"'
! else
! LIB_DIRS='"'${ac_default_prefix}'"'
! fi
!
! for lib_opt in ${LL}
! do
! case $lib_opt in
! -l*)
! if test x$DEP_LIBS = x; then
! DEP_LIBS='"'`echo ${lib_opt} | sed s,-l,,`'"'
! else
! DEP_LIBS=$DEP_LIBS,'"'`echo ${lib_opt} | sed s,-l,,`'"'
! fi;;
! -L*)
! LIB_DIRS=$LIB_DIRS,'"'`echo ${lib_opt} | sed s,-L,, | sed s,"'",, | sed s,"'",,`'"'
! esac
! done
!
! AC_SUBST(CPPFLAGS)
! AC_SUBST(DEP_LIBS)
! AC_SUBST(LIB_DIRS)
! AC_SUBST(prefix)
! AC_SUBST(exec_prefix)
! AC_SUBST(libdir)
!
! AC_OUTPUT
--- 1,234 ----
! AC_INIT([HSQL],[1.0],[hto...@li...],[hsql])
!
! AC_CONFIG_FILES([config.mk:config.mk.in hsql.pkg:hsql.pkg.in])
!
! AC_CANONICAL_SYSTEM
!
! dnl ***********************************************
! dnl Enable/Disable ODBC binding
! dnl ***********************************************
! AC_ARG_ENABLE(odbc,
! [ --enable-odbc
! Build an ODBC binding for Haskell.
! ],
! [WithODBC=YES],
! [WithODBC=NO]
! )
! AC_SUBST(WithODBC)
!
! dnl ***********************************************
! dnl Enable/Disable PostgreSQL binding
! dnl ***********************************************
! AC_ARG_ENABLE(postgres,
! [ --enable-postgres
! Build a PostgreSQL binding for Haskell.
! ],
! [WithPostgreSQL=YES],
! [WithPostgreSQL=NO]
! )
! AC_SUBST(WithPostgreSQL)
!
! dnl ***********************************************
! dnl Enable/Disable MySQL binding
! dnl ***********************************************
! AC_ARG_ENABLE(mysql,
! [ --enable-mysql
! Build a MySQL binding for Haskell.
! ],
! [WithMySQL=YES],
! [WithMySQL=NO]
! )
! AC_SUBST(WithMySQL)
!
! dnl ***********************************************
! dnl GHC
! dnl ***********************************************
! AC_ARG_WITH(ghc,
! [ --with-ghc=<ghc command>
! Use a different command instead of 'ghc' for the Haskell compiler.
! ],
! [GHC="$withval"],
! [AC_PATH_PROG(GHC,ghc)]
! )
!
! if test "$GHC" = "" || test ! -f $GHC; then
! AC_MSG_ERROR([GHC is required to build the package])
! fi
!
! AC_SUBST(GHC)
!
! if test "$prefix" = "NONE"; then
! prefix=`$GHC --print-libdir`
! fi
!
! dnl ***********************************************
! dnl hsc2hs
! dnl ***********************************************
! AC_ARG_WITH(hsc2hs,
! [ --with-hsc2hs=<hsc2hs command>
! Use a different command instead of 'hsc2hs'
! ],
! [HSC2HS="$withval"],
! [AC_PATH_PROG(HSC2HS,hsc2hs)]
! )
!
! if test "$HSC2HS" = "" || test ! -f $HSC2HS; then
! AC_MSG_ERROR([HSC2HS is required to build the package])
! fi
!
! AC_SUBST(HSC2HS)
!
! dnl ***********************************************
! dnl ghc-pkg
! dnl ***********************************************
! AC_ARG_WITH(ghc-pkg,
! [ --with-ghc-pkg=<ghc-pkg command>
! Use a different command instead of 'ghc-pkg'
! ],
! [GHC_PKG="$withval"],
! [AC_PATH_PROG(GHC_PKG,ghc-pkg)]
! )
!
! if test "$GHC_PKG" = "" || test ! -f $GHC_PKG; then
! AC_MSG_ERROR([ghc-pkg is required to build the package])
! fi
!
! AC_SUBST(GHC_PKG)
!
! dnl ***********************************************
! dnl HADDOCK
! dnl ***********************************************
! AC_ARG_WITH(haddock,
! [ --with-haddock=<haddock command>
! Use a different command instead of 'haddock' for the documentation builder.
! ],
! [HADDOCK="$withval"],
! [AC_PATH_PROG(HADDOCK,haddock)]
! )
!
! if test "$HADDOCK" = "" || test ! -f $HADDOCK; then
! echo HADDOCK is required to build the documentations
! fi
!
! AC_SUBST(HADDOCK)
!
! dnl ***********************************************
! dnl other progs
! dnl ***********************************************
!
AC_PROG_CC
! AC_PROG_CPP
! AC_PROG_INSTALL
!
! AC_PATH_PROG(AR,ar)
! AC_SUBST(AR)
!
! AC_PATH_PROG(LD,ld)
! AC_SUBST(LD)
!
! dnl ***********************************************
! dnl check for headers and libraries for ODBC
! dnl ***********************************************
!
! if test $WithODBC = YES; then
! case $ac_cv_target_alias in
! i[[3456]]86-*-cygwin*|i[[3456]]86-*-mingw32*)
! AC_COMPILE_IFELSE(
! [
! #include <windows.h>
! #include <sqlext.h>
!
! int main()
! {
! SQLAllocEnv (NULL);
! return 0;
! }
! ],
! [LIBS="${LIBS} -lodbc32"],
! AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
! ;;
! *) AC_CHECK_HEADER(sqlext.h,,AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
! AC_CHECK_LIB(odbc,SQLAllocEnv,,AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
! ;;
! esac
!
! CPPFLAGS="$CPPFLAGS -IODBC"
! fi
!
! dnl ***********************************************
! dnl check for headers and libraries for PostgreSQL
! dnl ***********************************************
!
! if test $WithPostgreSQL = YES; then
! AC_PATH_PROG(PG_CONFIG, pg_config)
!
! if test "$PG_CONFIG" = "" || test ! -f $PG_CONFIG; then
! AC_MSG_ERROR([pg_config is required to build PostgreSQL binding])
! fi
!
! case $ac_cv_target_alias in
! i[[3456]]86-*-cygwin*|i[[3456]]86-*-mingw32*)
! LDFLAGS="$LDFLAGS -L$(cygpath -m `$PG_CONFIG --libdir`)"
! CPPFLAGS="$CPPFLAGS -I$(cygpath -m /usr/include) -I$(cygpath -m `$PG_CONFIG --includedir`)"
! ;;
! *) LDFLAGS="$LDFLAGS -L`$PG_CONFIG --libdir`"
! CPPFLAGS="$CPPFLAGS -I`$PG_CONFIG --includedir` -I`$PG_CONFIG --includedir`/server"
! ;;
! esac
!
! AC_CHECK_HEADER(libpq-fe.h,,AC_MSG_ERROR([libpq-fe.h header not found]))
! AC_CHECK_LIB(pq,PQsetdbLogin,,AC_MSG_ERROR([libpq.a library not found]))
! fi
!
! dnl ***********************************************
! dnl check for headers and libraries for MySQL
! dnl ***********************************************
!
! if test $WithMySQL = YES; then
! AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
!
! if test "$MYSQL_CONFIG" = "" || test ! -f $MYSQL_CONFIG; then
! AC_MSG_ERROR([mysql_config is required to build PostgreSQL binding])
! fi
!
! LDFLAGS="$LDFLAGS `$MYSQL_CONFIG --libs`"
! CPPFLAGS="$CPPFLAGS `$MYSQL_CONFIG --cflags`"
!
! AC_CHECK_HEADER(mysql/mysql.h,, AC_MSG_ERROR([mysql.h header not found]))
!
! fi
!
! dnl ***********************************************
! dnl subst
! dnl ***********************************************
!
! LL="$LIBS $LDFLAGS"
!
! if test "x$prefix" != xNONE; then
! LIB_DIRS='"'${prefix}'"'
! else
! LIB_DIRS='"'${ac_default_prefix}'"'
! fi
!
! for lib_opt in ${LL}
! do
! case $lib_opt in
! -l*)
! if test x$DEP_LIBS = x; then
! DEP_LIBS='"'`echo ${lib_opt} | sed s,-l,,`'"'
! else
! DEP_LIBS=$DEP_LIBS,'"'`echo ${lib_opt} | sed s,-l,,`'"'
! fi;;
! -L*)
! LIB_DIRS=$LIB_DIRS,'"'`echo ${lib_opt} | sed s,-L,, | sed s,"'",, | sed s,"'",,`'"'
! esac
! done
!
! AC_SUBST(CPPFLAGS)
! AC_SUBST(DEP_LIBS)
! AC_SUBST(LIB_DIRS)
! AC_SUBST(prefix)
! AC_SUBST(exec_prefix)
! AC_SUBST(libdir)
!
! AC_OUTPUT
|
|
From: <kr_...@us...> - 2003-09-05 22:54:41
|
Update of /cvsroot/htoolkit/HSQL/PostgreSQL In directory sc8-pr-cvs1:/tmp/cvs-serv21491/PostgreSQL Log Message: Directory /cvsroot/htoolkit/HSQL/PostgreSQL added to the repository |
|
From: <kr_...@us...> - 2003-09-05 21:44:17
|
Update of /cvsroot/htoolkit/HSQL
In directory sc8-pr-cvs1:/tmp/cvs-serv9791
Modified Files:
Makefile configure.ac hsql.pkg.in
Log Message:
Full redesign of build system
Index: Makefile
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/Makefile,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** Makefile 5 Sep 2003 11:37:55 -0000 1.1
--- Makefile 5 Sep 2003 21:44:09 -0000 1.2
***************
*** 2,34 ****
ifeq "$(WithODBC)" "YES"
! HS_SRC += src/ODBC/HSQL.hs
! CPPFLAGS += -Isrc/ODBC
endif
ifeq "$(WithPostgreSQL)" "YES"
! HS_SRC += src/PostgreSQL/HSQL.hs
endif
ifeq "$(WithMySQL)" "YES"
! HS_SRC += src/MySQL/HSQL.hs
endif
OBJS = $(patsubst %.hs,%.o, $(HS_SRC))
HI_SRC = $(patsubst %.hs,%.hi,$(HS_SRC))
HS_PPS = $(addsuffix .raw-hs, $(basename $(HS_SRC)))
%.o : %.hs
! $(GHC) $< $($*_HC_OPTS) -O -c -fglasgow-exts -Iincludes $(CPPFLAGS) -package-name HToolkit
%.hs : %.hsc
! $(HSC2HS) $< -Iincludes $(CPPFLAGS)
! %.hi : %.o
! @
%.raw-hs : %.hs
$(GHC) -Iincludes $(CPPFLAGS) -D__HADDOCK__ -E -cpp $< -o $<.tmp && sed -e 's/^#.*//' <$<.tmp >$@
! all: $(OBJS)
! echo $(HS_SRC)
rm -f libHSsql.a
! $(AR) -q libHSsql.a $^
depend: $(HS_SRC)
--- 2,39 ----
ifeq "$(WithODBC)" "YES"
! HS_SRC += ODBC/HSQL.hs
endif
ifeq "$(WithPostgreSQL)" "YES"
! HS_SRC += PostgreSQL/HSQL.hs
endif
ifeq "$(WithMySQL)" "YES"
! HS_SRC += MySQL/HSQL.hs
endif
OBJS = $(patsubst %.hs,%.o, $(HS_SRC))
HI_SRC = $(patsubst %.hs,%.hi,$(HS_SRC))
+
+ ifneq "$(HADDOCK)" ""
HS_PPS = $(addsuffix .raw-hs, $(basename $(HS_SRC)))
+ endif
%.o : %.hs
! mkdir -p $(basename $^)_split
! $(GHC) $< -O -c -fglasgow-exts -split-objs $(CPPFLAGS) -package-name hsql
! $(LD) -r -o $@ $(basename $^)_split/*.o
%.hs : %.hsc
! $(HSC2HS) $< $(CPPFLAGS)
%.raw-hs : %.hs
$(GHC) -Iincludes $(CPPFLAGS) -D__HADDOCK__ -E -cpp $< -o $<.tmp && sed -e 's/^#.*//' <$<.tmp >$@
! all: libHSsql.a
!
! libHSsql.a: $(OBJS)
rm -f libHSsql.a
! for i in $(patsubst %.o,%_split, $(OBJS)); do \
! $(AR) -q libHSsql.a $$i/*.o; \
! done
depend: $(HS_SRC)
***************
*** 44,53 ****
$(HADDOCK) -h -o doc $(HS_PPS)
! install: libHSsql.a $(HI_SRC)
$(INSTALL) libHSsql.a $(prefix)/libHSsql.a
! $(INSTALL) -d $(prefix)/imports/hsql
for i in $(HI_SRC); do \
! $(INSTALL) -d $(prefix)/imports/hsql/`dirname $$i`; \
! $(INSTALL) -c $$i $(prefix)/imports/hsql/`dirname $$i`; \
done
! $(GHC_PKG) -u -g -i hsql.pkg.in
--- 49,64 ----
$(HADDOCK) -h -o doc $(HS_PPS)
! install: libHSsql.a $(HI_SRC) doc
$(INSTALL) libHSsql.a $(prefix)/libHSsql.a
! $(INSTALL) -d $(prefix)/imports/Database
for i in $(HI_SRC); do \
! $(INSTALL) -d $(prefix)/imports/Database/`dirname $$i`; \
! $(INSTALL) -c $$i $(prefix)/imports/Database/`dirname $$i`; \
done
! if test -d doc; then \
! $(INSTALL) -d $(prefix)/doc/html/hsql; \
! $(INSTALL) -c doc/* $(prefix)/doc/html/hsql; \
! fi
! $(GHC_PKG) -u -g -i hsql.pkg
!
! ODBC/HSQL.hs : ODBC/HSQLStructs.h
Index: configure.ac
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/configure.ac,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** configure.ac 5 Sep 2003 11:37:55 -0000 1.1
--- configure.ac 5 Sep 2003 21:44:10 -0000 1.2
***************
*** 1,3 ****
! AC_INIT([HSQL],[1.0],[ka2...@ya...],[hsql])
AC_CONFIG_FILES([config.mk:config.mk.in hsql.pkg:hsql.pkg.in])
--- 1,3 ----
! AC_INIT([HSQL],[1.0],[hto...@li...],[hsql])
AC_CONFIG_FILES([config.mk:config.mk.in hsql.pkg:hsql.pkg.in])
***************
*** 58,61 ****
--- 58,65 ----
AC_SUBST(GHC)
+ if test "$prefix" = "NONE"; then
+ prefix=`$GHC --print-libdir`
+ fi
+
dnl ***********************************************
dnl hsc2hs
***************
*** 114,117 ****
--- 118,122 ----
AC_PROG_CC
+ AC_PROG_CPP
AC_PROG_INSTALL
***************
*** 127,152 ****
if test $WithODBC = YES; then
! case $ac_cv_target_alias in
! i[[3456]]86-*-cygwin*|i[[3456]]86-*-mingw32*)
! AC_COMPILE_IFELSE(
! [
! #include <windows.h>
! #include <sqlext.h>
!
! int main()
! {
! SQLAllocEnv (NULL);
! return 0;
! }
! ],
! [LIBS="${LIBS} -lodbc32"],
! AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
! ;;
! *) AC_CHECK_HEADER(sqlext.h,,AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
! AC_CHECK_LIB(odbc,SQLAllocEnv,,AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
! ;;
! esac
!
fi
--- 132,157 ----
if test $WithODBC = YES; then
+ case $ac_cv_target_alias in
+ i[[3456]]86-*-cygwin*|i[[3456]]86-*-mingw32*)
+ AC_COMPILE_IFELSE(
+ [
+ #include <windows.h>
+ #include <sqlext.h>
+
+ int main()
+ {
+ SQLAllocEnv (NULL);
+ return 0;
+ }
+ ],
+ [LIBS="${LIBS} -lodbc32"],
+ AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
+ ;;
+ *) AC_CHECK_HEADER(sqlext.h,,AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
+ AC_CHECK_LIB(odbc,SQLAllocEnv,,AC_MSG_ERROR([sqlext.h and libodbc required to build ODBC building.]))
+ ;;
+ esac
! CPPFLAGS="$CPPFLAGS -IODBC"
fi
***************
*** 156,174 ****
if test $WithPostgreSQL = YES; then
! AC_PATH_PROG(PG_CONFIG, pg_config)
!
! if test x$PG_CONFIG = x || test ! -f $PG_CONFIG; then
! AC_MSG_ERROR([pg_config is required to build PostgreSQL binding])
! fi
!
! LDFLAGS="$LDFLAGS -L`$PG_CONFIG --libdir`"
! CPPFLAGS="$CPPFLAGS -I`$PG_CONFIG --includedir`"
! AC_CHECK_HEADER(libpq-fe.h,[
! AC_CHECK_HEADER(postgres.h,, AC_MSG_ERROR([catalog/postgres.h header not found]))
! ], AC_MSG_ERROR([libpq-fe.h header not found]))
! AC_CHECK_LIB(pq,PQsetdbLogin,,AC_MSG_ERROR([libpq.a library not found]))
fi
--- 161,182 ----
if test $WithPostgreSQL = YES; then
! AC_PATH_PROG(PG_CONFIG, pg_config)
! if test "$PG_CONFIG" = "" || test ! -f $PG_CONFIG; then
! AC_MSG_ERROR([pg_config is required to build PostgreSQL binding])
! fi
! case $ac_cv_target_alias in
! i[[3456]]86-*-cygwin*|i[[3456]]86-*-mingw32*)
! LDFLAGS="$LDFLAGS -L$(cygpath -m `$PG_CONFIG --libdir`)"
! CPPFLAGS="$CPPFLAGS -I$(cygpath -m /usr/include) -I$(cygpath -m `$PG_CONFIG --includedir`)"
! ;;
! *) LDFLAGS="$LDFLAGS -L`$PG_CONFIG --libdir`"
! CPPFLAGS="$CPPFLAGS -I`$PG_CONFIG --includedir`"
! ;;
! esac
+ AC_CHECK_HEADER(libpq-fe.h,,AC_MSG_ERROR([libpq-fe.h header not found]))
+ AC_CHECK_LIB(pq,PQsetdbLogin,,AC_MSG_ERROR([libpq.a library not found]))
fi
***************
*** 180,184 ****
AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
! if test x$MYSQL_CONFIG = x || test ! -f $MYSQL_CONFIG; then
AC_MSG_ERROR([mysql_config is required to build PostgreSQL binding])
fi
--- 188,192 ----
AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
! if test "$MYSQL_CONFIG" = "" || test ! -f $MYSQL_CONFIG; then
AC_MSG_ERROR([mysql_config is required to build PostgreSQL binding])
fi
Index: hsql.pkg.in
===================================================================
RCS file: /cvsroot/htoolkit/HSQL/hsql.pkg.in,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** hsql.pkg.in 5 Sep 2003 11:37:55 -0000 1.1
--- hsql.pkg.in 5 Sep 2003 21:44:10 -0000 1.2
***************
*** 2,6 ****
{name = "hsql",
auto=True,
! import_dirs = ["@prefix@/imports/hsql"],
source_dirs = [],
library_dirs = [@LIB_DIRS@],
--- 2,6 ----
{name = "hsql",
auto=True,
! import_dirs = ["@prefix@/imports"],
source_dirs = [],
library_dirs = [@LIB_DIRS@],
|
|
From: <kr_...@us...> - 2003-09-05 21:44:16
|
Update of /cvsroot/htoolkit/HSQL/ODBC
In directory sc8-pr-cvs1:/tmp/cvs-serv9791/ODBC
Added Files:
HSQL.hsc HSQLStructs.h
Log Message:
Full redesign of build system
--- NEW FILE: HSQL.hsc ---
-----------------------------------------------------------------------------------------
{-| Module : Database.ODBC.HSQL
Copyright : (c) Krasimir Angelov 2003
License : BSD-style
Maintainer : ka2...@ya...
Stability : provisional
Portability : portable
The module provides interface to ODBC
-}
-----------------------------------------------------------------------------------------
module Database.ODBC.HSQL
( SqlBind(..), SqlError(..), SqlType(..), Connection, Statement
, catchSql -- :: IO a -> (SqlError -> IO a) -> IO a
, handleSql -- :: (SqlError -> IO a) -> IO a -> IO a
, sqlExceptions -- :: Exception -> Maybe SqlError
, connect -- :: String -> String -> String -> IO Connection
, disconnect -- :: Connection -> IO ()
, execute -- :: Connection -> String -> IO ()
, query -- :: Connection -> String -> IO Statement
, closeStatement -- :: Statement -> IO ()
, fetch -- :: Statement -> IO Bool
, inTransaction -- :: Connection -> (Connection -> IO a) -> IO a
, getFieldValueMB -- :: SqlBind a => Statement -> String -> IO (Maybe a)
, getFieldValue -- :: SqlBind a => Statement -> String -> IO a
, getFieldValue' -- :: SqlBind a => Statement -> String -> a -> IO a
, getFieldValueType -- :: Statement -> String -> (SqlType, Bool)
, getFieldsTypes -- :: Statement -> [(String, SqlType, Bool)]
, forEachRow -- :: (Statement -> s -> IO s) -> Statement -> s -> IO s
, forEachRow' -- :: (Statement -> IO ()) -> Statement -> IO ()
, collectRows -- :: (Statement -> IO s) -> Statement -> IO [s]
) where
import Data.Word(Word32, Word16)
import Data.Int(Int32, Int16)
import Data.IORef
import Data.Dynamic
import Foreign
import Foreign.C
import qualified Foreign.Concurrent as C
import Control.Monad(when,unless)
import Control.Exception (throwDyn, catchDyn, dynExceptions, Exception(..))
import System.IO.Unsafe
import System.Time
#include <time.h>
#include <HSQLStructs.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
foreign import stdcall "sqlext.h SQLAllocEnv" sqlAllocEnv :: Ptr HENV -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLFreeEnv" sqlFreeEnv :: HENV -> IO ()
foreign import stdcall "sqlext.h SQLAllocConnect" sqlAllocConnect :: HENV -> Ptr HDBC -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLFreeConnect" sqlFreeConnect:: HDBC -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLConnect" sqlConnect :: HDBC -> CString -> Int -> CString -> Int -> CString -> Int -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLDisconnect" sqlDisconnect :: HDBC -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLAllocStmt" sqlAllocStmt :: HDBC -> Ptr HSTMT -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLFreeStmt" sqlFreeStmt :: HSTMT -> SQLUSMALLINT -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLNumResultCols" sqlNumResultCols :: HSTMT -> Ptr SQLUSMALLINT -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLDescribeCol" sqlDescribeCol :: HSTMT -> SQLUSMALLINT -> CString -> SQLSMALLINT -> Ptr SQLSMALLINT -> Ptr SQLSMALLINT -> Ptr SQLULEN -> Ptr SQLSMALLINT -> Ptr SQLSMALLINT -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLBindCol" sqlBindCol :: HSTMT -> SQLUSMALLINT -> SQLSMALLINT -> Ptr a -> SQLLEN -> Ptr SQLINTEGER -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLFetch" sqlFetch :: HSTMT -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLGetDiagRec" sqlGetDiagRec :: SQLSMALLINT -> SQLHANDLE -> SQLSMALLINT -> CString -> Ptr SQLINTEGER -> CString -> SQLSMALLINT -> Ptr SQLSMALLINT -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLExecDirect" sqlExecDirect :: HSTMT -> CString -> Int -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLSetConnectOption" sqlSetConnectOption :: HDBC -> SQLUSMALLINT -> SQLULEN -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLTransact" sqlTransact :: HENV -> HDBC -> SQLUSMALLINT -> IO SQLRETURN
foreign import stdcall "sqlext.h SQLGetData" sqlGetData :: HSTMT -> SQLUSMALLINT -> SQLSMALLINT -> Ptr () -> SQLINTEGER -> Ptr SQLINTEGER -> IO SQLRETURN
-- | A 'Connection' type represents a connection to a data source, through which you can operate on the data source.
-- A data source is a specific instance of data hosted by some database management system.
data Connection
= Connection
{ hDBC :: HDBC
, environment :: HENVRef
}
data Statement
= Statement
{ hSTMT :: !HSTMT
, connection :: !Connection
, fields :: ![FieldDef]
, fetchBuffer :: !(Ptr ())
, fetchBufferSize :: !SQLINTEGER
}
type FieldDef = (String, SqlType, Bool)
data SqlType
= SqlChar Int
| SqlVarChar Int
| SqlLongVarChar Int
| SqlDecimal Int Int
| SqlNumeric Int Int
| SqlSmallInt
| SqlInteger
| SqlReal
| SqlDouble
| SqlBit
| SqlTinyInt
| SqlBigInt
| SqlBinary Int
| SqlVarBinary Int
| SqlLongVarBinary Int
| SqlDate
| SqlTime
| SqlTimeStamp
deriving (Eq, Show)
data SqlError
= SqlError
{ seState :: String
, seNativeError :: Int
, seErrorMsg :: String
}
| SqlNoData
| SqlInvalidHandle
| SqlStillExecuting
| SqlNeedData
deriving Show
-----------------------------------------------------------------------------------------
-- routines for handling exceptions
-----------------------------------------------------------------------------------------
{-# NOINLINE sqlErrorTy #-}
sqlErrorTy = mkAppTy (mkTyCon "SqlError") []
instance Typeable SqlError where
typeOf x = sqlErrorTy
catchSql :: IO a -> (SqlError -> IO a) -> IO a
catchSql = catchDyn
handleSql :: (SqlError -> IO a) -> IO a -> IO a
handleSql h f = catchDyn f h
sqlExceptions :: Exception -> Maybe SqlError
sqlExceptions e = dynExceptions e >>= fromDynamic
sqlSuccess :: SQLRETURN -> Bool
sqlSuccess res =
(res == (#const SQL_SUCCESS)) || (res == (#const SQL_SUCCESS_WITH_INFO)) || (res == (#const SQL_NO_DATA))
handleSqlResult :: SQLSMALLINT -> SQLHANDLE -> SQLRETURN -> IO ()
handleSqlResult handleType handle res
| sqlSuccess res = return ()
| res == (#const SQL_INVALID_HANDLE) = throwDyn SqlInvalidHandle
| res == (#const SQL_STILL_EXECUTING) = throwDyn SqlStillExecuting
| res == (#const SQL_NEED_DATA) = throwDyn SqlNeedData
| res == (#const SQL_ERROR) = do
pState <- mallocBytes 256
pNative <- malloc
pMsg <- mallocBytes 256
pTextLen <- malloc
sqlGetDiagRec handleType handle 1 pState pNative pMsg 256 pTextLen
state <- peekCString pState
free pState
native <- peek pNative
free pNative
msg <- peekCString pMsg
free pMsg
free pTextLen
throwDyn (SqlError {seState=state, seNativeError=fromIntegral native, seErrorMsg=msg})
| otherwise = error (show res)
-----------------------------------------------------------------------------------------
-- keeper of HENV
-----------------------------------------------------------------------------------------
{-# NOINLINE myEnvironment #-}
myEnvironment :: HENVRef
myEnvironment = unsafePerformIO $ do
(phEnv :: Ptr HENV) <- malloc
res <- sqlAllocEnv phEnv
hEnv <- peek phEnv
free phEnv
handleSqlResult 0 nullPtr res
C.newForeignPtr hEnv (sqlFreeEnv hEnv)
-----------------------------------------------------------------------------------------
-- Connect/Disconnect
-----------------------------------------------------------------------------------------
connect :: String -> String -> String -> IO Connection
connect server user authentication = withForeignPtr myEnvironment $ \hEnv -> do
(phDBC :: Ptr HDBC) <- malloc
res <- sqlAllocConnect hEnv phDBC
hDBC <- peek phDBC
free phDBC
handleSqlResult (#const SQL_HANDLE_ENV) hEnv res
pServer <- newCString server
pUser <- newCString user
pAuthentication <- newCString authentication
res <- sqlConnect hDBC pServer (length server) pUser (length user) pAuthentication (length authentication)
free pServer
free pUser
free pAuthentication
handleSqlResult (#const SQL_HANDLE_ENV) hEnv res
return (Connection {hDBC=hDBC, environment=myEnvironment})
disconnect :: Connection -> IO ()
disconnect (Connection {hDBC=hDBC}) = do
sqlDisconnect hDBC >>= handleSqlResult (#const SQL_HANDLE_DBC) hDBC
sqlFreeConnect hDBC >>= handleSqlResult (#const SQL_HANDLE_DBC) hDBC
return ()
-----------------------------------------------------------------------------------------
-- queries
-----------------------------------------------------------------------------------------
execute :: Connection -> String -> IO ()
execute conn@(Connection {hDBC=hDBC}) query = do
pFIELD <- mallocBytes (#const sizeof(FIELD))
res <- sqlAllocStmt hDBC ((#ptr FIELD, hSTMT) pFIELD)
unless (sqlSuccess res) (free pFIELD)
handleSqlResult (#const SQL_HANDLE_DBC) hDBC res
hSTMT <- (#peek FIELD, hSTMT) pFIELD
let handleResult res = do
unless (sqlSuccess res) (free pFIELD)
handleSqlResult (#const SQL_HANDLE_STMT) hSTMT res
pQuery <- newCString query
res <- sqlExecDirect hSTMT pQuery (length query)
free pQuery
handleResult res
sqlFreeStmt hSTMT 0 >>= handleSqlResult (#const SQL_HANDLE_STMT) hSTMT
free pFIELD
query :: Connection -> String -> IO Statement
query conn@(Connection {hDBC=hDBC}) query = do
pFIELD <- mallocBytes (#const sizeof(FIELD))
res <- sqlAllocStmt hDBC ((#ptr FIELD, hSTMT) pFIELD)
unless (sqlSuccess res) (free pFIELD)
handleSqlResult (#const SQL_HANDLE_DBC) hDBC res
hSTMT <- (#peek FIELD, hSTMT) pFIELD
let handleResult res = do
unless (sqlSuccess res) (free pFIELD)
handleSqlResult (#const SQL_HANDLE_STMT) hSTMT res
pQuery <- newCString query
res <- sqlExecDirect hSTMT pQuery (length query)
free pQuery
handleResult res
sqlNumResultCols hSTMT ((#ptr FIELD, fieldsCount) pFIELD) >>= handleResult
count <- (#peek FIELD, fieldsCount) pFIELD
(fields, bufSize) <- getFieldDefs hSTMT pFIELD 1 count
free pFIELD
buffer <- mallocBytes (fromIntegral (bufSize+(#const sizeof(SQLINTEGER))))
let statement = Statement {hSTMT=hSTMT, connection=conn, fields=fields, fetchBuffer=buffer, fetchBufferSize=bufSize}
return statement
where
getFieldDefs :: HSTMT -> Ptr a -> SQLUSMALLINT -> SQLUSMALLINT -> IO ([FieldDef], SQLINTEGER)
getFieldDefs hSTMT pFIELD n count
| n > count = return ([], 0)
| otherwise = do
res <- sqlDescribeCol hSTMT n ((#ptr FIELD, fieldName) pFIELD) (#const FIELD_NAME_LENGTH) ((#ptr FIELD, NameLength) pFIELD) ((#ptr FIELD, DataType) pFIELD) ((#ptr FIELD, ColumnSize) pFIELD) ((#ptr FIELD, DecimalDigits) pFIELD) ((#ptr FIELD, Nullable) pFIELD)
unless (sqlSuccess res) (free pFIELD)
handleSqlResult (#const SQL_HANDLE_STMT) hSTMT res
name <- peekCString ((#ptr FIELD, fieldName) pFIELD)
dataType <- (#peek FIELD, DataType) pFIELD
columnSize <- (#peek FIELD, ColumnSize) pFIELD
decimalDigits <- (#peek FIELD, DecimalDigits) pFIELD
(nullable :: SQLSMALLINT) <- (#peek FIELD, Nullable) pFIELD
let (sqlType, bufSize) = mkSqlType dataType columnSize decimalDigits
(fields, fullBufSize) <- getFieldDefs hSTMT pFIELD (n+1) count
return ((name,sqlType,toBool nullable):fields, max bufSize fullBufSize)
mkSqlType :: SQLSMALLINT -> SQLULEN -> SQLSMALLINT -> (SqlType, SQLINTEGER)
mkSqlType (#const SQL_CHAR) size _ = (SqlChar (fromIntegral size), (#const sizeof(SQLCHAR))*(fromIntegral size+1))
mkSqlType (#const SQL_VARCHAR) size _ = (SqlVarChar (fromIntegral size), (#const sizeof(SQLCHAR))*(fromIntegral size+1))
mkSqlType (#const SQL_LONGVARCHAR) size _ = (SqlLongVarChar (fromIntegral size), 1) -- dummy bufSize
mkSqlType (#const SQL_DECIMAL) size prec = (SqlDecimal (fromIntegral size) (fromIntegral prec), (#const sizeof(SQLDOUBLE)))
mkSqlType (#const SQL_NUMERIC) size prec = (SqlNumeric (fromIntegral size) (fromIntegral prec), (#const sizeof(SQLDOUBLE)))
mkSqlType (#const SQL_SMALLINT) _ _ = (SqlSmallInt, (#const sizeof(SQLSMALLINT)))
mkSqlType (#const SQL_INTEGER) _ _ = (SqlInteger, (#const sizeof(SQLINTEGER)))
mkSqlType (#const SQL_REAL) _ _ = (SqlReal, (#const sizeof(SQLDOUBLE)))
mkSqlType (#const SQL_DOUBLE) _ _ = (SqlDouble, (#const sizeof(SQLDOUBLE)))
mkSqlType (#const SQL_BIT) _ _ = (SqlBit, (#const sizeof(SQLINTEGER)))
mkSqlType (#const SQL_TINYINT) _ _ = (SqlTinyInt, (#const sizeof(SQLSMALLINT)))
mkSqlType (#const SQL_BIGINT) _ _ = (SqlBigInt, (#const sizeof(SQLINTEGER)))
mkSqlType (#const SQL_BINARY) size _ = (SqlBinary (fromIntegral size), (#const sizeof(SQLCHAR))*(fromIntegral size+1))
mkSqlType (#const SQL_VARBINARY) size _ = (SqlVarBinary (fromIntegral size), (#const sizeof(SQLCHAR))*(fromIntegral size+1))
mkSqlType (#const SQL_LONGVARBINARY)size _ = (SqlLongVarBinary (fromIntegral size), 1) -- dummy bufSize
mkSqlType (#const SQL_DATE) _ _ = (SqlDate, (#const sizeof(SQL_DATE_STRUCT)))
mkSqlType (#const SQL_TIME) _ _ = (SqlTime, (#const sizeof(SQL_TIME_STRUCT)))
mkSqlType (#const SQL_TIMESTAMP) _ _ = (SqlTimeStamp, (#const sizeof(SQL_TIMESTAMP_STRUCT)))
{-# NOINLINE fetch #-}
fetch :: Statement -> IO Bool
fetch stmt = do
res <- sqlFetch (hSTMT stmt)
handleSqlResult (#const SQL_HANDLE_STMT) (hSTMT stmt) res
return (res /= (#const SQL_NO_DATA))
closeStatement :: Statement -> IO ()
closeStatement stmt = do
free (fetchBuffer stmt)
sqlFreeStmt (hSTMT stmt) 0 >>= handleSqlResult (#const SQL_HANDLE_STMT) (hSTMT stmt)
-----------------------------------------------------------------------------------------
-- transactions
-----------------------------------------------------------------------------------------
inTransaction :: Connection -> (Connection -> IO a) -> IO a
inTransaction conn@(Connection {hDBC=hDBC, environment=envRef}) action = withForeignPtr envRef $ \hEnv -> do
sqlSetConnectOption hDBC (#const SQL_AUTOCOMMIT) (#const SQL_AUTOCOMMIT_OFF)
r <- catchSql (action conn) (\err -> do
sqlTransact hEnv hDBC (#const SQL_ROLLBACK)
sqlSetConnectOption hDBC (#const SQL_AUTOCOMMIT) (#const SQL_AUTOCOMMIT_ON)
throwDyn err)
sqlTransact hEnv hDBC (#const SQL_COMMIT)
sqlSetConnectOption hDBC (#const SQL_AUTOCOMMIT) (#const SQL_AUTOCOMMIT_ON)
return r
-----------------------------------------------------------------------------------------
-- binding
-----------------------------------------------------------------------------------------
class SqlBind a where
getSqlValue :: SqlType -> Ptr () -> Int -> IO a
instance SqlBind Int where
getSqlValue SqlInteger ptr size = peek (castPtr ptr)
getSqlValue SqlSmallInt ptr size = do
(n :: Int16) <- peek (castPtr ptr)
return (fromIntegral n)
instance SqlBind Integer where
getSqlValue SqlInteger ptr size = do
(n :: Int32) <- peek (castPtr ptr)
return (fromIntegral n)
getSqlValue SqlSmallInt ptr size = do
(n :: Int16) <- peek (castPtr ptr)
return (fromIntegral n)
getSqlValue SqlBigInt ptr size = do
str <- peekCStringLen (castPtr ptr, size)
return (read str)
instance SqlBind String where
getSqlValue (SqlChar _) ptr size = peekCStringLen (castPtr ptr, size)
getSqlValue (SqlVarChar _) ptr size = peekCStringLen (castPtr ptr, size)
getSqlValue (SqlLongVarChar _) ptr size = peekCStringLen (castPtr ptr, size)
instance SqlBind Double where
getSqlValue (SqlDecimal _ _) ptr size = peek (castPtr ptr)
getSqlValue (SqlNumeric _ _) ptr size = peek (castPtr ptr)
getSqlValue SqlDouble ptr size = peek (castPtr ptr)
getSqlValue SqlReal ptr size = peek (castPtr ptr)
instance SqlBind ClockTime where
getSqlValue SqlDate ptr size = allocaBytes (#const sizeof(struct tm)) $ \p_tm -> do
(year :: SQLSMALLINT) <- (#peek TIMESTAMP_STRUCT, year) ptr
(#poke struct tm,tm_year ) p_tm (fromIntegral (year-1900) :: CInt)
(month :: SQLUSMALLINT) <- (#peek TIMESTAMP_STRUCT, month) ptr
(#poke struct tm,tm_mon ) p_tm (fromIntegral (month-1) :: CInt)
(day :: SQLUSMALLINT) <- (#peek TIMESTAMP_STRUCT, day) ptr
(#poke struct tm,tm_mday) p_tm (fromIntegral day :: CInt)
(hour :: SQLUSMALLINT) <- (#peek TIMESTAMP_STRUCT, hour) ptr
(#poke struct tm,tm_hour ) p_tm (fromIntegral hour :: CInt)
(minute :: SQLUSMALLINT) <- (#peek TIMESTAMP_STRUCT, minute) ptr
(#poke struct tm,tm_min ) p_tm (fromIntegral minute :: CInt)
(second :: SQLUSMALLINT) <- (#peek TIMESTAMP_STRUCT, second) ptr
(#poke struct tm,tm_sec ) p_tm (fromIntegral second :: CInt)
(fraction :: SQLUINTEGER) <- (#peek TIMESTAMP_STRUCT, fraction) ptr
(#poke struct tm,tm_isdst) p_tm (-1 :: CInt)
t <- mktime p_tm
return (TOD (fromIntegral t) (fromIntegral fraction*1000))
foreign import ccall unsafe mktime :: Ptr () -> IO CTime
getFieldValueMB :: SqlBind a => Statement -> String -> IO (Maybe a)
getFieldValueMB (Statement {hSTMT=hSTMT, fields=fields, fetchBuffer=buffer, fetchBufferSize=bufferSize}) name = do
let dataBuffer = buffer `plusPtr` (#const sizeof(SQLINTEGER))
res <- sqlGetData hSTMT colNumber targetType dataBuffer bufferSize (castPtr buffer)
handleSqlResult (#const SQL_HANDLE_STMT) hSTMT res
(len_or_ind :: SQLINTEGER) <- peek (castPtr buffer)
if len_or_ind == (#const SQL_NULL_DATA)
then return Nothing
else fmap Just $
(if res == (#const SQL_SUCCESS_WITH_INFO)
then getLongData len_or_ind
else getSqlValue sqlType dataBuffer (fromIntegral len_or_ind))
where
(sqlType,nullable,colNumber) = findFieldInfo name fields 1
getLongData len = do
buffer <- mallocBytes (fromIntegral (len+(#const sizeof(SQLINTEGER))+1))
let dataBuffer = buffer `plusPtr` (#const sizeof(SQLINTEGER))
res <- sqlGetData hSTMT colNumber targetType dataBuffer (len+1) (castPtr buffer)
unless (sqlSuccess res) (free buffer)
handleSqlResult (#const SQL_HANDLE_STMT) hSTMT res
(len_or_ind :: SQLINTEGER) <- peek (castPtr buffer)
r <- getSqlValue sqlType dataBuffer (fromIntegral len_or_ind)
free buffer
return r
targetType = case sqlType of
SqlBit -> (#const SQL_C_BIT)
SqlTinyInt -> (#const SQL_C_UTINYINT)
SqlSmallInt -> (#const SQL_C_SSHORT)
SqlInteger -> (#const SQL_C_SLONG)
SqlReal -> (#const SQL_C_FLOAT)
SqlDouble -> (#const SQL_C_DOUBLE)
SqlDate -> (#const SQL_C_TIMESTAMP)
SqlTime -> (#const SQL_C_TIMESTAMP)
SqlTimeStamp -> (#const SQL_C_TIMESTAMP)
SqlNumeric _ _ -> (#const SQL_C_DOUBLE)
SqlDecimal _ _ -> (#const SQL_C_DOUBLE)
SqlBigInt -> (#const SQL_C_CHAR)
SqlChar _ -> (#const SQL_C_CHAR)
SqlVarChar _ -> (#const SQL_C_CHAR)
SqlBinary _ -> (#const SQL_C_BINARY)
SqlVarBinary _ -> (#const SQL_C_BINARY)
SqlLongVarChar _ -> (#const SQL_C_CHAR)
SqlLongVarBinary _ -> (#const SQL_C_BINARY)
getFieldValue :: SqlBind a => Statement -> String -> IO a
getFieldValue stmt name = do
mb_v <- getFieldValueMB stmt name
case mb_v of
Nothing -> fail ("Column \"" ++ name ++ "\" has null value")
Just a -> return a
getFieldValue' :: SqlBind a => Statement -> String -> a -> IO a
getFieldValue' stmt name def = do
mb_v <- getFieldValueMB stmt name
return (case mb_v of { Nothing -> def; Just a -> a })
getFieldValueType :: Statement -> String -> (SqlType, Bool)
getFieldValueType stmt name = (sqlType, nullable)
where
(sqlType,nullable,colNumber) = findFieldInfo name (fields stmt) 1
getFieldsTypes :: Statement -> [(String, SqlType, Bool)]
getFieldsTypes = fields
findFieldInfo :: String -> [FieldDef] -> SQLUSMALLINT -> (SqlType,Bool,SQLUSMALLINT)
findFieldInfo name [] colNumber = error ("Undefined column name \"" ++ name ++ "\"")
findFieldInfo name (fieldDef@(name',sqlType,nullable):fields) colNumber
| name == name' = (sqlType,nullable,colNumber)
| otherwise = findFieldInfo name fields (colNumber+1)
-----------------------------------------------------------------------------------------
-- helpers
-----------------------------------------------------------------------------------------
forEachRow :: (Statement -> s -> IO s) -> Statement -> s -> IO s
forEachRow f stmt s = do
success <- fetch stmt
if success then f stmt s >>= forEachRow f stmt else closeStatement stmt >> return s
forEachRow' :: (Statement -> IO ()) -> Statement -> IO ()
forEachRow' f stmt = do
success <- fetch stmt
if success then f stmt >> forEachRow' f stmt else closeStatement stmt
collectRows :: (Statement -> IO a) -> Statement -> IO [a]
collectRows f stmt = loop
where
loop = do
success <- fetch stmt
if success
then do
x <- f stmt
xs <- loop
return (x:xs)
else closeStatement stmt >> return []
--- NEW FILE: HSQLStructs.h ---
#ifdef WIN32
#include <windows.h>
#endif
#include <sqlext.h>
#define FIELD_NAME_LENGTH 255
typedef struct
{
HSTMT hSTMT;
SQLUSMALLINT fieldsCount;
SQLCHAR fieldName[FIELD_NAME_LENGTH];
SQLSMALLINT NameLength;
SQLSMALLINT DataType;
SQLULEN ColumnSize;
SQLSMALLINT DecimalDigits;
SQLSMALLINT Nullable;
} FIELD;
#ifdef WIN32
void sqlFreeEnv(HENV hEnv);
#else
#define sqlFreeEnv SQLFreeEnv
#endif
|
|
From: <kr_...@us...> - 2003-09-05 21:40:40
|
Update of /cvsroot/htoolkit/HSQL/ODBC In directory sc8-pr-cvs1:/tmp/cvs-serv9129/ODBC Log Message: Directory /cvsroot/htoolkit/HSQL/ODBC added to the repository |
|
From: <kr_...@us...> - 2003-09-05 11:38:02
|
Update of /cvsroot/htoolkit/HSQL
In directory sc8-pr-cvs1:/tmp/cvs-serv12029
Added Files:
Makefile config.guess config.mk.in config.sub configure.ac
hsql.pkg.in install-sh
Log Message:
Basic build system for HSQL
--- NEW FILE: Makefile ---
include config.mk
ifeq "$(WithODBC)" "YES"
HS_SRC += src/ODBC/HSQL.hs
CPPFLAGS += -Isrc/ODBC
endif
ifeq "$(WithPostgreSQL)" "YES"
HS_SRC += src/PostgreSQL/HSQL.hs
endif
ifeq "$(WithMySQL)" "YES"
HS_SRC += src/MySQL/HSQL.hs
endif
OBJS = $(patsubst %.hs,%.o, $(HS_SRC))
HI_SRC = $(patsubst %.hs,%.hi,$(HS_SRC))
HS_PPS = $(addsuffix .raw-hs, $(basename $(HS_SRC)))
%.o : %.hs
$(GHC) $< $($*_HC_OPTS) -O -c -fglasgow-exts -Iincludes $(CPPFLAGS) -package-name HToolkit
%.hs : %.hsc
$(HSC2HS) $< -Iincludes $(CPPFLAGS)
%.hi : %.o
@
%.raw-hs : %.hs
$(GHC) -Iincludes $(CPPFLAGS) -D__HADDOCK__ -E -cpp $< -o $<.tmp && sed -e 's/^#.*//' <$<.tmp >$@
all: $(OBJS)
echo $(HS_SRC)
rm -f libHSsql.a
$(AR) -q libHSsql.a $^
depend: $(HS_SRC)
$(GHC) -M $^
clean:
rm -f $(OBJS)
rm -f $(HI_SRC)
rm -f $(HS_PPS)
doc : $(HS_PPS)
mkdir -p doc
$(HADDOCK) -h -o doc $(HS_PPS)
install: libHSsql.a $(HI_SRC)
$(INSTALL) libHSsql.a $(prefix)/libHSsql.a
$(INSTALL) -d $(prefix)/imports/hsql
for i in $(HI_SRC); do \
$(INSTALL) -d $(prefix)/imports/hsql/`dirname $$i`; \
$(INSTALL) -c $$i $(prefix)/imports/hsql/`dirname $$i`; \
done
$(GHC_PKG) -u -g -i hsql.pkg.in
--- NEW FILE: config.guess ---
#! /bin/sh
# Attempt to guess a canonical system name.
# Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Written by Per Bothner <bo...@cy...>.
# The master version of this file is at the FSF in /home/gd/gnu/lib.
#
# This script attempts to guess a canonical system name similar to
# config.sub. If it succeeds, it prints the system name on stdout, and
# exits with 0. Otherwise, it exits with 1.
#
# The plan is that this can be called by configure scripts if you
# don't specify an explicit system type (host/target name).
#
# Only a few systems have been added to this list; please add others
# (but try to keep the structure clean).
#
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
# (gh...@no... 8/24/94.)
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
PATH=$PATH:/.attbin ; export PATH
fi
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
# Note: order is significant - the case branches are not exclusive.
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
alpha:OSF1:*:*)
if test $UNAME_RELEASE = "V4.0"; then
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
fi
# A Vn.n version is a released version.
# A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
cat <<EOF >dummy.s
.globl main
.ent main
main:
.frame \$30,0,\$26,0
.prologue 0
.long 0x47e03d80 # implver $0
lda \$2,259
.long 0x47e20c21 # amask $2,$1
srl \$1,8,\$2
sll \$2,2,\$2
sll \$0,3,\$0
addl \$1,\$0,\$0
addl \$2,\$0,\$0
ret \$31,(\$26),1
.end main
EOF
${CC-cc} dummy.s -o dummy 2>/dev/null
if test "$?" = 0 ; then
./dummy
case "$?" in
7)
UNAME_MACHINE="alpha"
;;
15)
UNAME_MACHINE="alphaev5"
;;
14)
UNAME_MACHINE="alphaev56"
;;
10)
UNAME_MACHINE="alphapca56"
;;
16)
UNAME_MACHINE="alphaev6"
;;
esac
fi
rm -f dummy.s dummy
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
exit 0 ;;
21064:Windows_NT:50:3)
echo alpha-dec-winnt3.5
exit 0 ;;
Amiga*:UNIX_System_V:4.0:*)
echo m68k-cbm-sysv4
exit 0;;
amiga:NetBSD:*:*)
echo m68k-cbm-netbsd${UNAME_RELEASE}
exit 0 ;;
amiga:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
*:[Aa]miga[Oo][Ss]:*:*)
echo ${UNAME_MACHINE}-unknown-amigaos
exit 0 ;;
arc64:OpenBSD:*:*)
echo mips64el-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
arc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
hkmips:OpenBSD:*:*)
echo mips-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
pmax:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
sgi:OpenBSD:*:*)
echo mips-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
wgrisc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE}
exit 0;;
arm32:NetBSD:*:*)
echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
exit 0 ;;
SR2?01:HI-UX/MPP:*:*)
echo hppa1.1-hitachi-hiuxmpp
exit 0;;
Pyramid*:OSx*:*:*|MIS*:OSx*:*:*|MIS*:SMP_DC-OSx*:*:*)
# ak...@wp... (Earle F. Ake) contributed MIS and NILE.
if test "`(/bin/universe) 2>/dev/null`" = att ; then
echo pyramid-pyramid-sysv3
else
echo pyramid-pyramid-bsd
fi
exit 0 ;;
NILE:*:*:dcosx)
echo pyramid-pyramid-svr4
exit 0 ;;
sun4H:SunOS:5.*:*)
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
i86pc:SunOS:5.*:*)
echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
sun4*:SunOS:6*:*)
# According to config.sub, this is the proper way to canonicalize
# SunOS6. Hard to guess exactly what SunOS6 will be like, but
# it's likely to be more like Solaris than SunOS4.
echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
sun4*:SunOS:*:*)
case "`/usr/bin/arch -k`" in
Series*|S4*)
UNAME_RELEASE=`uname -v`
;;
esac
# Japanese Language versions have a version number like `4.1.3-JL'.
echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
exit 0 ;;
sun3*:SunOS:*:*)
echo m68k-sun-sunos${UNAME_RELEASE}
exit 0 ;;
sun*:*:4.2BSD:*)
UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
case "`/bin/arch`" in
sun3)
echo m68k-sun-sunos${UNAME_RELEASE}
;;
sun4)
echo sparc-sun-sunos${UNAME_RELEASE}
;;
esac
exit 0 ;;
aushp:SunOS:*:*)
echo sparc-auspex-sunos${UNAME_RELEASE}
exit 0 ;;
atari*:NetBSD:*:*)
echo m68k-atari-netbsd${UNAME_RELEASE}
exit 0 ;;
atari*:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
sun3*:NetBSD:*:*)
echo m68k-sun-netbsd${UNAME_RELEASE}
exit 0 ;;
sun3*:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mac68k:NetBSD:*:*)
echo m68k-apple-netbsd${UNAME_RELEASE}
exit 0 ;;
mac68k:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mvme68k:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mvme88k:OpenBSD:*:*)
echo m88k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
powerpc:machten:*:*)
echo powerpc-apple-machten${UNAME_RELEASE}
exit 0 ;;
Power*:Darwin:*:*)
echo powerpc-apple-macosx${UNAME_RELEASE}
exit 0 ;;
macppc:NetBSD:*:*)
echo powerpc-apple-netbsd${UNAME_RELEASE}
exit 0 ;;
RISC*:Mach:*:*)
echo mips-dec-mach_bsd4.3
exit 0 ;;
RISC*:ULTRIX:*:*)
echo mips-dec-ultrix${UNAME_RELEASE}
exit 0 ;;
VAX*:ULTRIX*:*:*)
echo vax-dec-ultrix${UNAME_RELEASE}
exit 0 ;;
2020:CLIX:*:*)
echo clipper-intergraph-clix${UNAME_RELEASE}
exit 0 ;;
mips:*:*:UMIPS | mips:*:*:RISCos)
sed 's/^ //' << EOF >dummy.c
int main (argc, argv) int argc; char **argv; {
#if defined (host_mips) && defined (MIPSEB)
#if defined (SYSTYPE_SYSV)
printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
#endif
#if defined (SYSTYPE_SVR4)
printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
#endif
#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
#endif
#endif
exit (-1);
}
EOF
${CC-cc} dummy.c -o dummy \
&& ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
&& rm dummy.c dummy && exit 0
rm -f dummy.c dummy
echo mips-mips-riscos${UNAME_RELEASE}
exit 0 ;;
Night_Hawk:Power_UNIX:*:*)
echo powerpc-harris-powerunix
exit 0 ;;
m88k:CX/UX:7*:*)
echo m88k-harris-cxux7
exit 0 ;;
m88k:*:4*:R4*)
echo m88k-motorola-sysv4
exit 0 ;;
m88k:*:3*:R3*)
echo m88k-motorola-sysv3
exit 0 ;;
AViiON:dgux:*:*)
# DG/UX returns AViiON for all architectures
UNAME_PROCESSOR=`/usr/bin/uname -p`
if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
-o ${TARGET_BINARY_INTERFACE}x = x ] ; then
echo m88k-dg-dgux${UNAME_RELEASE}
else
echo m88k-dg-dguxbcs${UNAME_RELEASE}
fi
else echo i586-dg-dgux${UNAME_RELEASE}
fi
exit 0 ;;
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
echo m88k-dolphin-sysv3
exit 0 ;;
M88*:*:R3*:*)
# Delta 88k system running SVR3
echo m88k-motorola-sysv3
exit 0 ;;
XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
echo m88k-tektronix-sysv3
exit 0 ;;
Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
echo m68k-tektronix-bsd
exit 0 ;;
*:IRIX*:*:*)
echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
exit 0 ;;
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
i?86:AIX:*:*)
echo i386-ibm-aix
exit 0 ;;
*:AIX:2:3)
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
sed 's/^ //' << EOF >dummy.c
#include <sys/systemcfg.h>
main()
{
if (!__power_pc())
exit(1);
puts("powerpc-ibm-aix3.2.5");
exit(0);
}
EOF
${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
rm -f dummy.c dummy
echo rs6000-ibm-aix3.2.5
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
echo rs6000-ibm-aix3.2.4
else
echo rs6000-ibm-aix3.2
fi
exit 0 ;;
*:AIX:*:4)
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
IBM_ARCH=rs6000
else
IBM_ARCH=powerpc
fi
if [ -x /usr/bin/oslevel ] ; then
IBM_REV=`/usr/bin/oslevel`
else
IBM_REV=4.${UNAME_RELEASE}
fi
echo ${IBM_ARCH}-ibm-aix${IBM_REV}
exit 0 ;;
*:AIX:*:*)
echo rs6000-ibm-aix
exit 0 ;;
ibmrt:4.4BSD:*|romp-ibm:BSD:*)
echo romp-ibm-bsd4.4
exit 0 ;;
ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
exit 0 ;; # report: romp-ibm BSD 4.3
*:BOSX:*:*)
echo rs6000-bull-bosx
exit 0 ;;
DPX/2?00:B.O.S.:*:*)
echo m68k-bull-sysv3
exit 0 ;;
9000/[34]??:4.3bsd:1.*:*)
echo m68k-hp-bsd
exit 0 ;;
hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
echo m68k-hp-bsd4.4
exit 0 ;;
9000/[34678]??:HP-UX:*:*)
case "${UNAME_MACHINE}" in
9000/31? ) HP_ARCH=m68000 ;;
9000/[34]?? ) HP_ARCH=m68k ;;
9000/6?? | 9000/7?? | 9000/80[24] | 9000/8?[13679] | 9000/892 )
sed 's/^ //' << EOF >dummy.c
#include <stdlib.h>
#include <unistd.h>
int main ()
{
#if defined(_SC_KERNEL_BITS)
long bits = sysconf(_SC_KERNEL_BITS);
#endif
long cpu = sysconf (_SC_CPU_VERSION);
switch (cpu)
{
case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
case CPU_PA_RISC2_0:
#if defined(_SC_KERNEL_BITS)
switch (bits)
{
case 64: puts ("hppa2.0w"); break;
case 32: puts ("hppa2.0n"); break;
default: puts ("hppa2.0"); break;
} break;
#else /* !defined(_SC_KERNEL_BITS) */
puts ("hppa2.0"); break;
#endif
default: puts ("hppa1.0"); break;
}
exit (0);
}
EOF
(${CC-cc} dummy.c -o dummy 2>/dev/null ) && HP_ARCH=`./dummy`
rm -f dummy.c dummy
esac
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
echo ${HP_ARCH}-hp-hpux${HPUX_REV}
exit 0 ;;
3050*:HI-UX:*:*)
sed 's/^ //' << EOF >dummy.c
#include <unistd.h>
int
main ()
{
long cpu = sysconf (_SC_CPU_VERSION);
/* The order matters, because CPU_IS_HP_MC68K erroneously returns
true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
results, however. */
if (CPU_IS_PA_RISC (cpu))
{
switch (cpu)
{
case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
default: puts ("hppa-hitachi-hiuxwe2"); break;
}
}
else if (CPU_IS_HP_MC68K (cpu))
puts ("m68k-hitachi-hiuxwe2");
else puts ("unknown-hitachi-hiuxwe2");
exit (0);
}
EOF
${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
rm -f dummy.c dummy
echo unknown-hitachi-hiuxwe2
exit 0 ;;
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
echo hppa1.1-hp-bsd
exit 0 ;;
9000/8??:4.3bsd:*:*)
echo hppa1.0-hp-bsd
exit 0 ;;
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
echo hppa1.1-hp-osf
exit 0 ;;
hp8??:OSF1:*:*)
echo hppa1.0-hp-osf
exit 0 ;;
i?86:OSF1:*:*)
if [ -x /usr/sbin/sysversion ] ; then
echo ${UNAME_MACHINE}-unknown-osf1mk
else
echo ${UNAME_MACHINE}-unknown-osf1
fi
exit 0 ;;
parisc*:Lites*:*:*)
echo hppa1.1-hp-lites
exit 0 ;;
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
echo c1-convex-bsd
exit 0 ;;
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
exit 0 ;;
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
echo c34-convex-bsd
exit 0 ;;
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
echo c38-convex-bsd
exit 0 ;;
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
echo c4-convex-bsd
exit 0 ;;
CRAY*X-MP:*:*:*)
echo xmp-cray-unicos
exit 0 ;;
CRAY*Y-MP:*:*:*)
echo ymp-cray-unicos${UNAME_RELEASE}
exit 0 ;;
CRAY*[A-Z]90:*:*:*)
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
exit 0 ;;
CRAY*TS:*:*:*)
echo t90-cray-unicos${UNAME_RELEASE}
exit 0 ;;
CRAY-2:*:*:*)
echo cray2-cray-unicos
exit 0 ;;
F300:UNIX_System_V:*:*)
FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit 0 ;;
F301:UNIX_System_V:*:*)
echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
exit 0 ;;
hp3[0-9][05]:NetBSD:*:*)
echo m68k-hp-netbsd${UNAME_RELEASE}
exit 0 ;;
hp300:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
sparc*:BSD/OS:*:*)
echo sparc-unknown-bsdi${UNAME_RELEASE}
exit 0 ;;
i?86:BSD/386:*:* | *:BSD/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
exit 0 ;;
*:FreeBSD:*:*)
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
exit 0 ;;
*:NetBSD:*:*)
echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
exit 0 ;;
*:OpenBSD:*:*)
echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
exit 0 ;;
i*:CYGWIN*:*)
echo ${UNAME_MACHINE}-pc-cygwin
exit 0 ;;
i*:MINGW*:*)
echo ${UNAME_MACHINE}-pc-mingw32
exit 0 ;;
p*:CYGWIN*:*)
echo powerpcle-unknown-cygwin
exit 0 ;;
prep*:SunOS:5.*:*)
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;;
*:GNU:*:*)
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
exit 0 ;;
*:Linux:*:*)
# uname on the ARM produces all sorts of strangeness, and we need to
# filter it out.
case "$UNAME_MACHINE" in
arm* | sa110*) UNAME_MACHINE="arm" ;;
esac
# The BFD linker knows what the default object file format is, so
# first see if it will tell us.
ld_help_string=`ld --help 2>&1`
ld_supported_emulations=`echo $ld_help_string \
| sed -ne '/supported emulations:/!d
s/[ ][ ]*/ /g
s/.*supported emulations: *//
s/ .*//
p'`
case "$ld_supported_emulations" in
i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;;
i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;;
sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
elf32ppc) echo "powerpc-unknown-linux-gnu" ; exit 0 ;;
esac
if test "${UNAME_MACHINE}" = "alpha" ; then
sed 's/^ //' <<EOF >dummy.s
.globl main
.ent main
main:
.frame \$30,0,\$26,0
.prologue 0
.long 0x47e03d80 # implver $0
lda \$2,259
.long 0x47e20c21 # amask $2,$1
srl \$1,8,\$2
sll \$2,2,\$2
sll \$0,3,\$0
addl \$1,\$0,\$0
addl \$2,\$0,\$0
ret \$31,(\$26),1
.end main
EOF
LIBC=""
${CC-cc} dummy.s -o dummy 2>/dev/null
if test "$?" = 0 ; then
./dummy
case "$?" in
7)
UNAME_MACHINE="alpha"
;;
15)
UNAME_MACHINE="alphaev5"
;;
14)
UNAME_MACHINE="alphaev56"
;;
10)
UNAME_MACHINE="alphapca56"
;;
16)
UNAME_MACHINE="alphaev6"
;;
esac
objdump --private-headers dummy | \
grep ld.so.1 > /dev/null
if test "$?" = 0 ; then
LIBC="libc1"
fi
fi
rm -f dummy.s dummy
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
elif test "${UNAME_MACHINE}" = "mips" ; then
cat >dummy.c <<EOF
main(argc, argv)
int argc;
char *argv[];
{
#ifdef __MIPSEB__
printf ("%s-unknown-linux-gnu\n", argv[1]);
#endif
#ifdef __MIPSEL__
printf ("%sel-unknown-linux-gnu\n", argv[1]);
#endif
return 0;
}
EOF
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
rm -f dummy.c dummy
else
# Either a pre-BFD a.out linker (linux-gnuoldld)
# or one that does not give us useful --help.
# GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
# If ld does not provide *any* "supported emulations:"
# that means it is gnuoldld.
echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
case "${UNAME_MACHINE}" in
i?86)
VENDOR=pc;
;;
*)
VENDOR=unknown;
;;
esac
# Determine whether the default compiler is a.out or elf
cat >dummy.c <<EOF
#include <features.h>
main(argc, argv)
int argc;
char *argv[];
{
#ifdef __ELF__
# ifdef __GLIBC__
# if __GLIBC__ >= 2
printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
# else
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
# endif
# else
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
# endif
#else
printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
#endif
return 0;
}
EOF
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
rm -f dummy.c dummy
fi ;;
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
# are messed up and put the nodename in both sysname and nodename.
i?86:DYNIX/ptx:4*:*)
echo i386-sequent-sysv4
exit 0 ;;
i?86:UNIX_SV:4.2MP:2.*)
# Unixware is an offshoot of SVR4, but it has its own version
# number series starting with 2...
# I am not positive that other SVR4 systems won't match this,
# I just have to hope. -- rms.
# Use sysv4.2uw... so that sysv4* matches it.
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
exit 0 ;;
i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
else
echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
fi
exit 0 ;;
i?86:*:3.2:*)
if test -f /usr/options/cb.name; then
UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
elif /bin/uname -X 2>/dev/null >/dev/null ; then
UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
&& UNAME_MACHINE=i586
echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
else
echo ${UNAME_MACHINE}-pc-sysv32
fi
exit 0 ;;
i?86:UnixWare:*:*)
if /bin/uname -X 2>/dev/null >/dev/null ; then
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
&& UNAME_MACHINE=i586
fi
echo ${UNAME_MACHINE}-unixware-${UNAME_RELEASE}-${UNAME_VERSION}
exit 0 ;;
pc:*:*:*)
# uname -m prints for DJGPP always 'pc', but it prints nothing about
# the processor, so we play safe by assuming i386.
echo i386-pc-msdosdjgpp
exit 0 ;;
Intel:Mach:3*:*)
echo i386-pc-mach3
exit 0 ;;
paragon:*:*:*)
echo i860-intel-osf1
exit 0 ;;
i860:*:4.*:*) # i860-SVR4
if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
else # Add other i860-SVR4 vendors below as they are discovered.
echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
fi
exit 0 ;;
mini*:CTIX:SYS*5:*)
# "miniframe"
echo m68010-convergent-sysv
exit 0 ;;
M68*:*:R3V[567]*:*)
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
OS_REL=''
test -r /etc/.relid \
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
&& echo i486-ncr-sysv4.3${OS_REL} && exit 0
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
&& echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
&& echo i486-ncr-sysv4 && exit 0 ;;
m68*:LynxOS:2.*:*)
echo m68k-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
mc68030:UNIX_System_V:4.*:*)
echo m68k-atari-sysv4
exit 0 ;;
i?86:LynxOS:2.*:*)
echo i386-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
TSUNAMI:LynxOS:2.*:*)
echo sparc-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
echo rs6000-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
SM[BE]S:UNIX_SV:*:*)
echo mips-dde-sysv${UNAME_RELEASE}
exit 0 ;;
RM*:SINIX-*:*:*)
echo mips-sni-sysv4
exit 0 ;;
*:SINIX-*:*:*)
if uname -p 2>/dev/null >/dev/null ; then
UNAME_MACHINE=`(uname -p) 2>/dev/null`
echo ${UNAME_MACHINE}-sni-sysv4
else
echo ns32k-sni-sysv
fi
exit 0 ;;
PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
# says <Ric...@cc...>
echo i586-unisys-sysv4
exit 0 ;;
*:UNIX_System_V:4*:FTX*)
# From Gerald Hewes <he...@op...>.
# How about differentiating between stratus architectures? -djm
echo hppa1.1-stratus-sysv4
exit 0 ;;
*:*:*:FTX*)
# From se...@sw....
echo i860-stratus-sysv4
exit 0 ;;
mc68*:A/UX:*:*)
echo m68k-apple-aux${UNAME_RELEASE}
exit 0 ;;
news*:NEWS-OS:*:6*)
echo mips-sony-newsos6
exit 0 ;;
R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R4000:UNIX_SV:*:*)
if [ -d /usr/nec ]; then
echo mips-nec-sysv${UNAME_RELEASE}
else
echo mips-unknown-sysv${UNAME_RELEASE}
fi
exit 0 ;;
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
echo powerpc-be-beos
exit 0 ;;
BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
echo powerpc-apple-beos
exit 0 ;;
BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
echo i586-pc-beos
exit 0 ;;
esac
#echo '(No uname command or uname output not recognized.)' 1>&2
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
cat >dummy.c <<EOF
#ifdef _SEQUENT_
# include <sys/types.h>
# include <sys/utsname.h>
#endif
main ()
{
#if defined (sony)
#if defined (MIPSEB)
/* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
I don't know.... */
printf ("mips-sony-bsd\n"); exit (0);
#else
#include <sys/param.h>
printf ("m68k-sony-newsos%s\n",
#ifdef NEWSOS4
"4"
#else
""
#endif
); exit (0);
#endif
#endif
#if defined (__arm) && defined (__acorn) && defined (__unix)
printf ("arm-acorn-riscix"); exit (0);
#endif
#if defined (hp300) && !defined (hpux)
printf ("m68k-hp-bsd\n"); exit (0);
#endif
#if defined (NeXT)
#if !defined (__ARCHITECTURE__)
#define __ARCHITECTURE__ "m68k"
#endif
int version;
version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
exit (0);
#endif
#if defined (MULTIMAX) || defined (n16)
#if defined (UMAXV)
printf ("ns32k-encore-sysv\n"); exit (0);
#else
#if defined (CMU)
printf ("ns32k-encore-mach\n"); exit (0);
#else
printf ("ns32k-encore-bsd\n"); exit (0);
#endif
#endif
#endif
#if defined (__386BSD__)
printf ("i386-pc-bsd\n"); exit (0);
#endif
#if defined (sequent)
#if defined (i386)
printf ("i386-sequent-dynix\n"); exit (0);
#endif
#if defined (ns32000)
printf ("ns32k-sequent-dynix\n"); exit (0);
#endif
#endif
#if defined (_SEQUENT_)
struct utsname un;
uname(&un);
if (strncmp(un.version, "V2", 2) == 0) {
printf ("i386-sequent-ptx2\n"); exit (0);
}
if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
printf ("i386-sequent-ptx1\n"); exit (0);
}
printf ("i386-sequent-ptx\n"); exit (0);
#endif
#if defined (vax)
#if !defined (ultrix)
printf ("vax-dec-bsd\n"); exit (0);
#else
printf ("vax-dec-ultrix\n"); exit (0);
#endif
#endif
#if defined (alliant) && defined (i860)
printf ("i860-alliant-bsd\n"); exit (0);
#endif
exit (1);
}
EOF
${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
rm -f dummy.c dummy
# Apollos put the system type in the environment.
test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
# Convex versions that predate uname can use getsysinfo(1)
if [ -x /usr/convex/getsysinfo ]
then
case `getsysinfo -f cpu_type` in
c1*)
echo c1-convex-bsd
exit 0 ;;
c2*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
exit 0 ;;
c34*)
echo c34-convex-bsd
exit 0 ;;
c38*)
echo c38-convex-bsd
exit 0 ;;
c4*)
echo c4-convex-bsd
exit 0 ;;
esac
fi
#echo '(Unable to guess system type)' 1>&2
exit 1
--- NEW FILE: config.mk.in ---
WithODBC=@WithODBC@
WithPostgreSQL=@WithPostgreSQL@
WithMySQL=@WithMySQL@
GHC = @GHC@
HSC2HS = @HSC2HS@
AR = @AR@
LD = @LD@
INSTALL = @INSTALL@
GHC_PKG = @GHC_PKG@
prefix = @prefix@
exec_prefix = @exec_prefix@
CPPFLAGS = @CPPFLAGS@
HADDOCK = @HADDOCK@
--- NEW FILE: config.sub ---
#! /bin/sh
#---------------------------------------------------------------------
# Modified and adapted for the Lazy Virtual Machine by Daan Leijen.
# + added better "windows" support
#---------------------------------------------------------------------
# $Id: config.sub,v 1.1 2003/09/05 11:37:55 kr_angelov Exp $
# Configuration validation subroutine script, version 1.1.
# Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
# can handle that machine. It does not imply ALL GNU software can.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Configuration subroutine to validate and canonicalize a configuration type.
# Supply the specified configuration type as an argument.
# If it is invalid, we print an error message on stderr and exit with code 1.
# Otherwise, we print the canonical config type on stdout and succeed.
# This file is supposed to be the same for all GNU packages
# and recognize all the CPU types, system types and aliases
# that are meaningful with *any* GNU software.
# Each package is responsible for reporting which valid configurations
# it does not support. The user should be able to distinguish
# a failure to support a valid configuration from a meaningless
# configuration.
# The goal of this file is to map all the various variations of a given
# machine specification into a single specification in the form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
# or in some cases, the newer four-part form:
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
# It is wrong to echo any other type of specification.
if [ x$1 = x ]
then
echo Configuration name missing. 1>&2
echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
echo "or $0 ALIAS" 1>&2
echo where ALIAS is a recognized configuration type. 1>&2
exit 1
fi
# First pass through any local machine types.
case $1 in
*local*)
echo $1
exit 0
;;
*)
;;
esac
# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
linux-gnu*)
os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;;
*)
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
if [ $basic_machine != $1 ]
then os=`echo $1 | sed 's/.*-/-/'`
else os=; fi
;;
esac
### Let's recognize common machines as not being operating systems so
### that things like config.sub decstation-3100 work. We also
### recognize some manufacturers as not being operating systems, so we
### can provide default operating systems below.
case $os in
-sun*os*)
# Prevent following clause from handling this invalid input.
;;
-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-apple)
os=
basic_machine=$1
;;
-hiux*)
os=-hiuxwe2
;;
-sco5)
os=sco3.2v5
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco4)
os=-sco3.2v4
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco3.2.[4-9]*)
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco3.2v[4-9]*)
# Don't forget version if it is 3.2v4 or newer.
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco*)
os=-sco3.2v2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-isc)
os=-isc2.2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-clix*)
basic_machine=clipper-intergraph
;;
-isc*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-lynx*)
os=-lynxos
;;
-ptx*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
;;
-windowsnt*)
os=`echo $os | sed -e 's/windowsnt/winnt/'`
;;
-psos*)
os=-psos
;;
esac
# Decode aliases for certain CPU-COMPANY combinations.
case $basic_machine in
# Recognize the basic CPU types without company name.
# Some are omitted here because they have special meanings below.
tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
| arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
| 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 | hppa2.0 \
| alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
| i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
| mips64 | mipsel | mips64el | mips64orion | mips64orionel \
| mipstx39 | mipstx39el \
| sparc | sparclet | sparclite | sparc64 | v850)
basic_machine=$basic_machine-unknown
;;
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users.
i[34567]86)
basic_machine=$basic_machine-pc
;;
# Object if more than one company name word.
*-*-*)
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1
;;
# Recognize the basic CPU types with company name.
vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
| power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
| xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* \
| alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
| ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
| sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
| sparc64-* | mips64-* | mipsel-* \
| mips64el-* | mips64orion-* | mips64orionel-* \
| mipstx39-* | mipstx39el-* \
| f301-*)
;;
# Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS.
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
basic_machine=m68000-att
;;
3b*)
basic_machine=we32k-att
;;
alliant | fx80)
basic_machine=fx80-alliant
;;
altos | altos3068)
basic_machine=m68k-altos
;;
am29k)
basic_machine=a29k-none
os=-bsd
;;
amdahl)
basic_machine=580-amdahl
os=-sysv
;;
amiga | amiga-*)
basic_machine=m68k-cbm
;;
amigaos | amigados)
basic_machine=m68k-cbm
os=-amigaos
;;
amigaunix | amix)
basic_machine=m68k-cbm
os=-sysv4
;;
apollo68)
basic_machine=m68k-apollo
os=-sysv
;;
aux)
basic_machine=m68k-apple
os=-aux
;;
balance)
basic_machine=ns32k-sequent
os=-dynix
;;
convex-c1)
basic_machine=c1-convex
os=-bsd
;;
convex-c2)
basic_machine=c2-convex
os=-bsd
;;
convex-c32)
basic_machine=c32-convex
os=-bsd
;;
convex-c34)
basic_machine=c34-convex
os=-bsd
;;
convex-c38)
basic_machine=c38-convex
os=-bsd
;;
cray | ymp)
basic_machine=ymp-cray
os=-unicos
;;
cray2)
basic_machine=cray2-cray
os=-unicos
;;
[ctj]90-cray)
basic_machine=c90-cray
os=-unicos
;;
crds | unos)
basic_machine=m68k-crds
;;
da30 | da30-*)
basic_machine=m68k-da30
;;
decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
basic_machine=mips-dec
;;
delta | 3300 | motorola-3300 | motorola-delta \
| 3300-motorola | delta-motorola)
basic_machine=m68k-motorola
;;
delta88)
basic_machine=m88k-motorola
os=-sysv3
;;
dpx20 | dpx20-*)
basic_machine=rs6000-bull
os=-bosx
;;
dpx2* | dpx2*-bull)
basic_machine=m68k-bull
os=-sysv3
;;
ebmon29k)
basic_machine=a29k-amd
os=-ebmon
;;
elxsi)
basic_machine=elxsi-elxsi
os=-bsd
;;
encore | umax | mmax)
basic_machine=ns32k-encore
;;
fx2800)
basic_machine=i860-alliant
;;
genix)
basic_machine=ns32k-ns
;;
gmicro)
basic_machine=tron-gmicro
os=-sysv
;;
h3050r* | hiux*)
basic_machine=hppa1.1-hitachi
os=-hiuxwe2
;;
h8300hms)
basic_machine=h8300-hitachi
os=-hms
;;
harris)
basic_machine=m88k-harris
os=-sysv3
;;
hp300-*)
basic_machine=m68k-hp
;;
hp300bsd)
basic_machine=m68k-hp
os=-bsd
;;
hp300hpux)
basic_machine=m68k-hp
os=-hpux
;;
hp9k2[0-9][0-9] | hp9k31[0-9])
basic_machine=m68000-hp
;;
hp9k3[2-9][0-9])
basic_machine=m68k-hp
;;
hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
basic_machine=hppa1.1-hp
;;
hp9k8[0-9][0-9] | hp8[0-9][0-9])
basic_machine=hppa1.0-hp
;;
hppa-next)
os=-nextstep3
;;
i370-ibm* | ibm*)
basic_machine=i370-ibm
os=-mvs
;;
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
i[34567]86v32)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv32
;;
i[34567]86v4*)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv4
;;
i[34567]86v)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv
;;
i[34567]86sol2)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-solaris2
;;
iris | iris4d)
basic_machine=mips-sgi
case $os in
-irix*)
;;
*)
os=-irix4
;;
esac
;;
isi68 | isi)
basic_machine=m68k-isi
os=-sysv
;;
m88k-omron*)
basic_machine=m88k-omron
;;
magnum | m3230)
basic_machine=mips-mips
os=-sysv
;;
merlin)
basic_machine=ns32k-utek
os=-sysv
;;
miniframe)
basic_machine=m68000-convergent
;;
mipsel*-linux*)
basic_machine=mipsel-unknown
os=-linux-gnu
;;
mips*-linux*)
basic_machine=mips-unknown
os=-linux-gnu
;;
mips3*-*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
;;
mips3*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
;;
ncr3000)
basic_machine=i486-ncr
os=-sysv4
;;
news | news700 | news800 | news900)
basic_machine=m68k-sony
os=-newsos
;;
news1000)
basic_machine=m68030-sony
os=-newsos
;;
news-3600 | risc-news)
basic_machine=mips-sony
os=-newsos
;;
next | m*-next )
basic_machine=m68k-next
case $os in
-nextstep* )
;;
-ns2*)
os=-nextstep2
;;
*)
os=-nextstep3
;;
esac
;;
nh3000)
basic_machine=m68k-harris
os=-cxux
;;
nh[45]000)
basic_machine=m88k-harris
os=-cxux
;;
nindy960)
basic_machine=i960-intel
os=-nindy
;;
np1)
basic_machine=np1-gould
;;
pa-hitachi)
basic_machine=hppa1.1-hitachi
os=-hiuxwe2
;;
paragon)
basic_machine=i860-intel
os=-osf
;;
pbd)
basic_machine=sparc-tti
;;
pbb)
basic_machine=m68k-tti
;;
pc532 | pc532-*)
basic_machine=ns32k-pc532
;;
pentium | p5 | k5 | nexen)
basic_machine=i586-pc
;;
pentiumpro | p6 | k6 | 6x86)
basic_machine=i686-pc
;;
pentiumii | pentium2)
basic_machine=i786-pc
;;
pentium-* | p5-* | k5-* | nexen-*)
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentiumpro-* | p6-* | k6-* | 6x86-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentiumii-* | pentium2-*)
basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pn)
basic_machine=pn-gould
;;
power) basic_machine=rs6000-ibm
;;
ppc) basic_machine=powerpc-unknown
;;
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown
;;
ppcle-* | powerpclittle-*)
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ps2)
basic_machine=i386-ibm
;;
rm[46]00)
basic_machine=mips-siemens
;;
rtpc | rtpc-*)
basic_machine=romp-ibm
;;
sequent)
basic_machine=i386-sequent
;;
sh)
basic_machine=sh-hitachi
os=-hms
;;
sps7)
basic_machine=m68k-bull
os=-sysv2
;;
spur)
basic_machine=spur-unknown
;;
sun2)
basic_machine=m68000-sun
;;
sun2os3)
basic_machine=m68000-sun
os=-sunos3
;;
sun2os4)
basic_machine=m68000-sun
os=-sunos4
;;
sun3os3)
basic_machine=m68k-sun
os=-sunos3
;;
sun3os4)
basic_machine=m68k-sun
os=-sunos4
;;
sun4os3)
basic_machine=sparc-sun
os=-sunos3
;;
sun4os4)
basic_machine=sparc-sun
os=-sunos4
;;
sun4sol2)
basic_machine=sparc-sun
os=-solaris2
;;
sun3 | sun3-*)
basic_machine=m68k-sun
;;
sun4)
basic_machine=sparc-sun
;;
sun386 | sun386i | roadrunner)
basic_machine=i386-sun
;;
symmetry)
basic_machine=i386-sequent
os=-dynix
;;
tx39)
basic_machine=mipstx39-unknown
;;
tx39el)
basic_machine=mipstx39el-unknown
;;
tower | tower-32)
basic_machine=m68k-ncr
;;
udi29k)
basic_machine=a29k-amd
os=-udi
;;
ultra3)
basic_machine=a29k-nyu
os=-sym1
;;
vaxv)
basic_machine=vax-dec
os=-sysv
;;
vms)
basic_machine=vax-dec
os=-vms
;;
vpp*|vx|vx-*)
basic_machine=f301-fujitsu
;;
vxworks960)
basic_machine=i960-wrs
os=-vxworks
;;
vxworks68)
basic_machine=m68k-wrs
os=-vxworks
;;
vxworks29k)
basic_machine=a29k-wrs
os=-vxworks
;;
xmp)
basic_machine=xmp-cray
os=-unicos
;;
xps | xps100)
basic_machine=xps100-honeywell
;;
none)
basic_machine=none-none
os=-none
;;
# Here we handle the default manufacturer of certain CPU types. It is in
# some cases the only manufacturer, in others, it is the most popular.
mips)
if [ x$os = x-linux-gnu ]; then
basic_machine=mips-unknown
else
basic_machine=mips-mips
fi
;;
romp)
basic_machine=romp-ibm
;;
rs6000)
basic_machine=rs6000-ibm
;;
vax)
basic_machine=vax-dec
;;
pdp11)
basic_machine=pdp11-dec
;;
we32k)
basic_machine=we32k-att
;;
sparc)
basic_machine=sparc-sun
;;
cydra)
basic_machine=cydra-cydrome
;;
orion)
basic_machine=orion-highlevel
;;
orion105)
basic_machine=clipper-highlevel
;;
*)
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1
;;
esac
# Here we canonicalize certain aliases for manufacturers.
case $basic_machine in
*-digital*)
basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
;;
*-commodore*)
basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
;;
*)
;;
esac
# Decode manufacturer-specific aliases for certain operating systems.
if [ x"$os" != x"" ]
then
case $os in
# First match some system type aliases
# that might get confused with valid system types.
# -solaris* is a basic system type, with this one exception.
-solaris1 | -solaris1.*)
os=`echo $os | sed -e 's|solaris1|sunos4|'`
;;
-solaris)
os=-solaris2
;;
-svr4*)
os=-sysv4
;;
-unixware*)
os=-sysv4.2uw
;;
-gnu/linux*)
os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
;;
# First accept the basic system types.
# The portable systems comes first.
# Each alternative MUST END IN A *, to match a version number.
# -sysv* is not here because it comes later, after sysvr4.
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
| -aos* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -linux-gnu* | -uxpv* | -beos* | -windows*)
# LVM: added windows
# Remember, each alternative MUST END IN *, to match a version number.
;;
-linux*)
os=`echo $os | sed -e 's|linux|linux-gnu|'`
;;
-sunos5*)
os=`echo $os | sed -e 's|sunos5|solaris2|'`
;;
-sunos6*)
os=`echo $os | sed -e 's|sunos6|solaris3|'`
;;
-osfrose*)
os=-osfrose
;;
-osf*)
os=-osf
;;
-utek*)
os=-bsd
;;
-dynix*)
os=-bsd
;;
-acis*)
os=-aos
;;
-ctix* | -uts*)
os=-sysv
;;
-ns2 )
os=-nextstep2
;;
# Preserve the version number of sinix5.
-sinix5.*)
os=`echo $os | sed -e 's|sinix|sysv|'`
;;
-sinix*)
os=-sysv4
;;
-triton*)
os=-sysv3
;;
-oss*)
os=-sysv3
;;
-svr4)
os=-sysv4
;;
-svr3)
os=-sysv3
;;
-sysvr4)
os=-sysv4
;;
# This must come after -sysvr4.
-sysv*)
;;
-xenix)
os=-xenix
;;
-macosx*)
os=-macosx
;;
-none)
;;
*)
# Get rid of the `-' at the beginning of $os.
os=`echo $os | sed 's/[^-]*-//'`
echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
exit 1
;;
esac
else
# Here we handle the default operating systems that come with various machines.
# The value should be what the vendor currently ships out the door with their
# machine or put another way, the most popular os provided with the machine.
# Note that if you're going to try to match "-MANUFACTURER" here (say,
# "-sun"), then you have to tell the case statement up towards the top
# that MANUFACTURER isn't an operating system. Otherwise, code above
# will signal an error saying that MANUFACTURER isn't an operating
# system, and we'll never get to this point.
case $basic_machine in
*-acorn)
os=-riscix1.2
;;
arm*-semi)
os=-aout
;;
pdp11-*)
os=-none
;;
*-dec | vax-*)
os=-ultrix4.2
;;
m68*-apollo)
os=-domain
;;
i386-sun)
os=-sunos4.0.2
;;
m68000-sun)
os=-sunos3
# This also exists in the configure program, but was not the
# default.
# os=-sunos4
;;
*-tti) # must be before sparc entry or we get the wrong os.
...
[truncated message content] |
|
From: <kr_...@us...> - 2003-09-05 11:38:00
|
Update of /cvsroot/htoolkit/HSQL/src/MySQL In directory sc8-pr-cvs1:/tmp/cvs-serv12029/src/MySQL Modified Files: HSQL.hsc Log Message: Basic build system for HSQL Index: HSQL.hsc =================================================================== RCS file: /cvsroot/htoolkit/HSQL/src/MySQL/HSQL.hsc,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** HSQL.hsc 24 Jan 2003 00:08:58 -0000 1.1 --- HSQL.hsc 5 Sep 2003 11:37:55 -0000 1.2 *************** *** 21,27 **** , forEachRow' -- :: (Statement -> IO ()) -> Statement -> IO () , collectRows -- :: (Statement -> IO s) -> Statement -> IO [s] - #ifdef ENABLED_GUI - , fillitems -- :: HasItems w => Connection -> String -> Config (w Int) - #endif ) where --- 21,24 ---- *************** *** 389,405 **** return (x:xs) else closeStatement stmt >> return [] - - - ----------------------------------------------------------------------------------------- - -- fillitems - ----------------------------------------------------------------------------------------- - - #ifdef ENABLED_GUI - fillitems :: HasItems w => Connection -> String -> Config (w Int) - fillitems conn sqlExpr widget = query conn sqlExpr >>= forEachRow' addItemToWidget - where - addItemToWidget stmt = do - (id :: Int) <- getFieldValue stmt "id" - (title :: Title) <- getFieldValue stmt "Name" - addItem id title widget - #endif \ No newline at end of file --- 386,387 ---- |