From 37135ca341e95764611ff78b4c1d2ceb7b01cb86 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Fri, 26 Feb 2010 20:47:35 +0000 Subject: [PATCH] 2010-02-26 21:44 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * INSTALL * bin/hb-mkimp.bat + contrib/rddsql/sddoci + contrib/rddsql/sddoci/Makefile + contrib/rddsql/sddoci/ocidd.c + contrib/rddsql/sddoci/sddoci.hbc + contrib/rddsql/sddoci/tests + contrib/rddsql/sddoci/tests/hbmk.hbm + contrib/rddsql/sddoci/tests/test1.prg * contrib/rddsql/Makefile + Added support for direct connection to Oracle databases via OCILIB library. UNICODE, ANSI (default) and MIXED modes are supported. For mingw targets, the library will be linked statically, for the rest dynamically. You need to have Oracle client (oci.dll and the rest of the package) installed to use it. ; TODO: Finish type conversion and mapping. * contrib/rddsql/sddmy/mysqldd.c * contrib/rddsql/sddpg/pgsqldd.c * contrib/rddsql/sddfb/fbirddd.c * contrib/rddsql/sddodbc/odbcdd.c ! HB_ULONG -> HB_SIZE ; TOFIX: To Mindaugas: Current SDD architecture will crash with GPF if dbUseArea() is attempted after a failed RDDI_CONNECT call. You can check it f.e. with sddodbc's test1.prg, by modifying test.mdb to test_.mdb, and simply run it. --- harbour/ChangeLog | 31 + harbour/INSTALL | 4 + harbour/bin/hb-mkimp.bat | 21 + harbour/contrib/rddsql/Makefile | 1 + harbour/contrib/rddsql/sddfb/fbirddd.c | 2 +- harbour/contrib/rddsql/sddmy/mysqldd.c | 4 +- harbour/contrib/rddsql/sddoci/Makefile | 38 + harbour/contrib/rddsql/sddoci/ocidd.c | 651 ++++++++++++++++++ harbour/contrib/rddsql/sddoci/sddoci.hbc | 10 + harbour/contrib/rddsql/sddoci/tests/hbmk.hbm | 5 + harbour/contrib/rddsql/sddoci/tests/test1.prg | 38 + harbour/contrib/rddsql/sddodbc/odbcdd.c | 14 +- harbour/contrib/rddsql/sddpg/pgsqldd.c | 4 +- 13 files changed, 811 insertions(+), 12 deletions(-) create mode 100644 harbour/contrib/rddsql/sddoci/Makefile create mode 100644 harbour/contrib/rddsql/sddoci/ocidd.c create mode 100644 harbour/contrib/rddsql/sddoci/sddoci.hbc create mode 100644 harbour/contrib/rddsql/sddoci/tests/hbmk.hbm create mode 100644 harbour/contrib/rddsql/sddoci/tests/test1.prg diff --git a/harbour/ChangeLog b/harbour/ChangeLog index dc45526c13..73752b9234 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,37 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-02-26 21:44 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) + * INSTALL + * bin/hb-mkimp.bat + + contrib/rddsql/sddoci + + contrib/rddsql/sddoci/Makefile + + contrib/rddsql/sddoci/ocidd.c + + contrib/rddsql/sddoci/sddoci.hbc + + contrib/rddsql/sddoci/tests + + contrib/rddsql/sddoci/tests/hbmk.hbm + + contrib/rddsql/sddoci/tests/test1.prg + * contrib/rddsql/Makefile + + Added support for direct connection to Oracle + databases via OCILIB library. + UNICODE, ANSI (default) and MIXED modes are supported. + For mingw targets, the library will be linked + statically, for the rest dynamically. + You need to have Oracle client (oci.dll and the + rest of the package) installed to use it. + ; TODO: Finish type conversion and mapping. + + * contrib/rddsql/sddmy/mysqldd.c + * contrib/rddsql/sddpg/pgsqldd.c + * contrib/rddsql/sddfb/fbirddd.c + * contrib/rddsql/sddodbc/odbcdd.c + ! HB_ULONG -> HB_SIZE + + ; TOFIX: To Mindaugas: Current SDD architecture will crash with GPF + if dbUseArea() is attempted after a failed RDDI_CONNECT + call. You can check it f.e. with sddodbc's test1.prg, by + modifying test.mdb to test_.mdb, and simply run it. + 2010-02-26 11:13 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbxpp/Makefile + contrib/hbxpp/thread.ch diff --git a/harbour/INSTALL b/harbour/INSTALL index 4bfc870348..521eea7de7 100644 --- a/harbour/INSTALL +++ b/harbour/INSTALL @@ -308,6 +308,7 @@ HARBOUR HB_WITH_JPEG=C:\jpeglib (defaults to locally hosted version if not found) HB_WITH_LIBHARU=C:\libharu\include (defaults to locally hosted version) HB_WITH_MYSQL=C:\mysql\include + HB_WITH_OCILIB=C:\ocilib\include HB_WITH_ODBC= (may only be needed on non-Windows systems) HB_WITH_OPENSSL=C:\openssl\inc32 OR C:\openssl\include HB_WITH_PCRE=C:\pcre (defaults to locally hosted version if not found) @@ -903,6 +904,7 @@ HARBOUR set HB_WITH_FREEIMAGE=C:\FreeImage\Dist set HB_WITH_GD=C:\gd\include set HB_WITH_MYSQL=C:\mysql\include + set HB_WITH_OCILIB=C:\ocilib\include set HB_WITH_OPENSSL=C:\openssl\inc32 set HB_WITH_PGSQL=C:\pgsql\include set HB_WITH_QT=C:\Qt\include @@ -1335,6 +1337,8 @@ HARBOUR http://libharu.org/ HB_WITH_MYSQL - MySQL [multiplatform, free, open-source] http://dev.mysql.com/downloads/ + HB_WITH_OCILIB - OCILIB (C Driver for Oracle) [multiplatform, free, open-source] + http://orclib.sourceforge.net/ HB_WITH_OPENSSL - OpenSSL [multiplatform, free, open-source] http://www.openssl.org/ HB_WITH_PCRE - Perl Compatible Regular Expressions [multiplatform, free, open-source] diff --git a/harbour/bin/hb-mkimp.bat b/harbour/bin/hb-mkimp.bat index 1ca5f85e6e..56a434d022 100644 --- a/harbour/bin/hb-mkimp.bat +++ b/harbour/bin/hb-mkimp.bat @@ -43,6 +43,9 @@ if not "%HB_LIB_INSTALL%" == "" ( if exist "%HB_WITH_LIBHARU%\..\libhpdf.dll" implib "%HB_LIB_INSTALL%\libhpdf.lib" "%HB_WITH_LIBHARU%\..\libhpdf.dll" if exist "%HB_WITH_LIBHARU%\..\lib_dll\libhpdf.dll" implib "%HB_LIB_INSTALL%\libhpdf.lib" "%HB_WITH_LIBHARU%\..\lib_dll\libhpdf.dll" if exist "%HB_WITH_MYSQL%\..\bin\libmySQL.dll" implib "%HB_LIB_INSTALL%\libmysql.lib" "%HB_WITH_MYSQL%\..\bin\libmySQL.dll" + if exist "%HB_WITH_OCILIB%\..\lib32\ociliba.dll" implib "%HB_LIB_INSTALL%\ociliba.lib" "%HB_WITH_OCILIB%\..\lib32\ociliba.dll" + if exist "%HB_WITH_OCILIB%\..\lib32\ocilibm.dll" implib "%HB_LIB_INSTALL%\ocilibm.lib" "%HB_WITH_OCILIB%\..\lib32\ocilibm.dll" + if exist "%HB_WITH_OCILIB%\..\lib32\ocilibw.dll" implib "%HB_LIB_INSTALL%\ocilibw.lib" "%HB_WITH_OCILIB%\..\lib32\ocilibw.dll" if exist "%HB_WITH_OPENSSL%\..\out32dll\libeay32.dll" implib -a "%HB_LIB_INSTALL%\libeay32.lib" "%HB_WITH_OPENSSL%\..\out32dll\libeay32.dll" if exist "%HB_WITH_OPENSSL%\..\out32dll\ssleay32.dll" implib -a "%HB_LIB_INSTALL%\ssleay32.lib" "%HB_WITH_OPENSSL%\..\out32dll\ssleay32.dll" if exist "%HB_WITH_OPENSSL%\..\dll\libeay32.dll" implib -a "%HB_LIB_INSTALL%\libeay32.lib" "%HB_WITH_OPENSSL%\..\dll\libeay32.dll" @@ -72,6 +75,9 @@ if not "%HB_LIB_INSTALL%" == "" ( if exist "%HB_WITH_LIBHARU%\..\libhpdf.lib" copy /b /y "%HB_WITH_LIBHARU%\..\libhpdf.lib" "%HB_LIB_INSTALL%\libhpdf.lib" if exist "%HB_WITH_LIBHARU%\..\lib_dll\libhpdf.lib" copy /b /y "%HB_WITH_LIBHARU%\..\lib_dll\libhpdf.lib" "%HB_LIB_INSTALL%\libhpdf.lib" if exist "%HB_WITH_MYSQL%\..\lib\opt\libmySQL.lib" copy /b /y "%HB_WITH_MYSQL%\..\lib\opt\libmySQL.lib" "%HB_LIB_INSTALL%\libmySQL.lib" + if exist "%HB_WITH_OCILIB%\..\lib32\ociliba.lib" copy /b /y "%HB_WITH_OCILIB%\..\lib32\ociliba.lib" "%HB_LIB_INSTALL%\ociliba.lib" + if exist "%HB_WITH_OCILIB%\..\lib32\ocilibm.lib" copy /b /y "%HB_WITH_OCILIB%\..\lib32\ocilibm.lib" "%HB_LIB_INSTALL%\ocilibm.lib" + if exist "%HB_WITH_OCILIB%\..\lib32\ocilibw.lib" copy /b /y "%HB_WITH_OCILIB%\..\lib32\ocilibw.lib" "%HB_LIB_INSTALL%\ocilibw.lib" if exist "%HB_WITH_OPENSSL%\..\out32dll\libeay32.lib" copy /b /y "%HB_WITH_OPENSSL%\..\out32dll\libeay32.lib" "%HB_LIB_INSTALL%\libeay32.lib" if exist "%HB_WITH_OPENSSL%\..\out32dll\ssleay32.lib" copy /b /y "%HB_WITH_OPENSSL%\..\out32dll\ssleay32.lib" "%HB_LIB_INSTALL%\ssleay32.lib" if exist "%HB_WITH_OPENSSL%\..\dll\libeay32.lib" copy /b /y "%HB_WITH_OPENSSL%\..\dll\libeay32.lib" "%HB_LIB_INSTALL%\libeay32.lib" @@ -92,6 +98,9 @@ if not "%HB_LIB_INSTALL%" == "" ( if exist "%HB_WITH_CURL%\..\bin\libcurl.dll" call :P_MSVC_IMPLIB x64 "%HB_WITH_CURL%\..\bin\libcurl.dll" "%HB_LIB_INSTALL%\libcurl.lib" if exist "%HB_WITH_FIREBIRD%\..\lib\fbclient_ms.lib" copy /b /y "%HB_WITH_FIREBIRD%\..\lib\fbclient_ms.lib" "%HB_LIB_INSTALL%\fbclient.lib" if exist "%HB_WITH_MYSQL%\..\lib\opt\libmySQL.lib" copy /b /y "%HB_WITH_MYSQL%\..\lib\opt\libmySQL.lib" "%HB_LIB_INSTALL%\libmySQL.lib" + if exist "%HB_WITH_OCILIB%\..\lib64\ociliba.lib" copy /b /y "%HB_WITH_OCILIB%\..\lib64\ociliba.lib" "%HB_LIB_INSTALL%\ociliba.lib" + if exist "%HB_WITH_OCILIB%\..\lib64\ocilibm.lib" copy /b /y "%HB_WITH_OCILIB%\..\lib64\ocilibm.lib" "%HB_LIB_INSTALL%\ocilibm.lib" + if exist "%HB_WITH_OCILIB%\..\lib64\ocilibw.lib" copy /b /y "%HB_WITH_OCILIB%\..\lib64\ocilibw.lib" "%HB_LIB_INSTALL%\ocilibw.lib" goto END ) @@ -112,6 +121,9 @@ if not "%HB_LIB_INSTALL%" == "" ( if exist "%HB_WITH_LIBHARU%\..\libhpdf.lib" copy /b /y "%HB_WITH_LIBHARU%\..\libhpdf.lib" "%HB_LIB_INSTALL%\liblibhpdf.a" if exist "%HB_WITH_LIBHARU%\..\lib_dll\libhpdf.lib" copy /b /y "%HB_WITH_LIBHARU%\..\lib_dll\libhpdf.lib" "%HB_LIB_INSTALL%\liblibhpdf.a" if exist "%HB_WITH_MYSQL%\..\lib\opt\libmySQL.lib" copy /b /y "%HB_WITH_MYSQL%\..\lib\opt\libmySQL.lib" "%HB_LIB_INSTALL%\liblibmysql.a" + if exist "%HB_WITH_OCILIB%\..\lib32\libociliba.a" copy /b /y "%HB_WITH_OCILIB%\..\lib32\libociliba.a" "%HB_LIB_INSTALL%\libociliba.a" + if exist "%HB_WITH_OCILIB%\..\lib32\libocilibm.a" copy /b /y "%HB_WITH_OCILIB%\..\lib32\libocilibm.a" "%HB_LIB_INSTALL%\libocilibm.a" + if exist "%HB_WITH_OCILIB%\..\lib32\libocilibw.a" copy /b /y "%HB_WITH_OCILIB%\..\lib32\libocilibw.a" "%HB_LIB_INSTALL%\libocilibw.a" if exist "%HB_WITH_OPENSSL%\..\out32dll\libeay32.lib" copy /b /y "%HB_WITH_OPENSSL%\..\out32dll\libeay32.lib" "%HB_LIB_INSTALL%\liblibeay32.a" if exist "%HB_WITH_OPENSSL%\..\out32dll\ssleay32.lib" copy /b /y "%HB_WITH_OPENSSL%\..\out32dll\ssleay32.lib" "%HB_LIB_INSTALL%\libssleay32.a" if exist "%HB_WITH_OPENSSL%\..\dll\libeay32.lib" copy /b /y "%HB_WITH_OPENSSL%\..\dll\libeay32.lib" "%HB_LIB_INSTALL%\liblibeay32.a" @@ -131,6 +143,9 @@ if not "%HB_LIB_INSTALL%" == "" ( if exist "%HB_WITH_CURL%\..\lib\libcurldll.a" copy /b /y "%HB_WITH_CURL%\..\lib\libcurldll.a" "%HB_LIB_INSTALL%\libcurldll.a" if exist "%HB_WITH_FIREBIRD%\..\lib\fbclient_ms.lib" copy /b /y "%HB_WITH_FIREBIRD%\..\lib\fbclient_ms.lib" "%HB_LIB_INSTALL%\libfbclient.a" if exist "%HB_WITH_MYSQL%\..\lib\opt\libmySQL.lib" copy /b /y "%HB_WITH_MYSQL%\..\lib\opt\libmySQL.lib" "%HB_LIB_INSTALL%\liblibmysql.a" + if exist "%HB_WITH_OCILIB%\..\lib64\ociliba.lib" copy /b /y "%HB_WITH_OCILIB%\..\lib64\ociliba.lib" "%HB_LIB_INSTALL%\libociliba.a" + if exist "%HB_WITH_OCILIB%\..\lib64\ocilibm.lib" copy /b /y "%HB_WITH_OCILIB%\..\lib64\ocilibm.lib" "%HB_LIB_INSTALL%\libocilibm.a" + if exist "%HB_WITH_OCILIB%\..\lib64\ocilibw.lib" copy /b /y "%HB_WITH_OCILIB%\..\lib64\ocilibw.lib" "%HB_LIB_INSTALL%\libocilibw.a" goto END ) @@ -153,6 +168,9 @@ if not "%HB_LIB_INSTALL%" == "" ( if exist "%HB_WITH_LIBHARU%\..\libhpdf.lib" copy /b /y "%HB_WITH_LIBHARU%\..\libhpdf.lib" "%HB_LIB_INSTALL%\libhpdf.lib" if exist "%HB_WITH_LIBHARU%\..\lib_dll\libhpdf.lib" copy /b /y "%HB_WITH_LIBHARU%\..\lib_dll\libhpdf.lib" "%HB_LIB_INSTALL%\libhpdf.lib" if exist "%HB_WITH_MYSQL%\..\lib\opt\libmySQL.lib" copy /b /y "%HB_WITH_MYSQL%\..\lib\opt\libmySQL.lib" "%HB_LIB_INSTALL%\libmySQL.lib" + if exist "%HB_WITH_OCILIB%\..\lib32\ociliba.lib" copy /b /y "%HB_WITH_OCILIB%\ociliba.lib" "%HB_LIB_INSTALL%\ociliba.lib" + if exist "%HB_WITH_OCILIB%\..\lib32\ocilibm.lib" copy /b /y "%HB_WITH_OCILIB%\ocilibm.lib" "%HB_LIB_INSTALL%\ocilibm.lib" + if exist "%HB_WITH_OCILIB%\..\lib32\ocilibw.lib" copy /b /y "%HB_WITH_OCILIB%\ocilibw.lib" "%HB_LIB_INSTALL%\ocilibw.lib" if exist "%HB_WITH_OPENSSL%\..\out32dll\libeay32.lib" copy /b /y "%HB_WITH_OPENSSL%\..\out32dll\libeay32.lib" "%HB_LIB_INSTALL%\libeay32.lib" if exist "%HB_WITH_OPENSSL%\..\out32dll\ssleay32.lib" copy /b /y "%HB_WITH_OPENSSL%\..\out32dll\ssleay32.lib" "%HB_LIB_INSTALL%\ssleay32.lib" if exist "%HB_WITH_OPENSSL%\..\dll\libeay32.lib" copy /b /y "%HB_WITH_OPENSSL%\..\dll\libeay32.lib" "%HB_LIB_INSTALL%\libeay32.lib" @@ -184,6 +202,9 @@ if not "%HB_LIB_INSTALL%" == "" ( if exist "%HB_WITH_LIBHARU%\..\libhpdf.dll" wlib.exe -q -o="%HB_LIB_INSTALL%\libhpdf.lib" "%HB_WITH_LIBHARU%\..\libhpdf.dll" if exist "%HB_WITH_LIBHARU%\..\lib_dll\libhpdf.dll" wlib.exe -q -o="%HB_LIB_INSTALL%\libhpdf.lib" "%HB_WITH_LIBHARU%\..\lib_dll\libhpdf.dll" if exist "%HB_WITH_MYSQL%\..\bin\libmySQL.dll" wlib.exe -q -o="%HB_LIB_INSTALL%\libmySQL.lib" "%HB_WITH_MYSQL%\..\bin\libmySQL.dll" + if exist "%HB_WITH_OCILIB%\..\lib32\ociliba.dll" wlib.exe -q -o="%HB_LIB_INSTALL%\ociliba.lib" "%HB_WITH_OCILIB%\..\lib32\ociliba.dll" + if exist "%HB_WITH_OCILIB%\..\lib32\ocilibm.dll" wlib.exe -q -o="%HB_LIB_INSTALL%\ocilibm.lib" "%HB_WITH_OCILIB%\..\lib32\ocilibm.dll" + if exist "%HB_WITH_OCILIB%\..\lib32\ocilibw.dll" wlib.exe -q -o="%HB_LIB_INSTALL%\ocilibw.lib" "%HB_WITH_OCILIB%\..\lib32\ocilibw.dll" if exist "%HB_WITH_OPENSSL%\..\out32dll\libeay32.dll" wlib.exe -q -o="%HB_LIB_INSTALL%\libeay32.lib" "%HB_WITH_OPENSSL%\..\out32dll\libeay32.dll" if exist "%HB_WITH_OPENSSL%\..\out32dll\ssleay32.dll" wlib.exe -q -o="%HB_LIB_INSTALL%\ssleay32.lib" "%HB_WITH_OPENSSL%\..\out32dll\ssleay32.dll" if exist "%HB_WITH_OPENSSL%\..\dll\libeay32.dll" wlib.exe -q -o="%HB_LIB_INSTALL%\libeay32.lib" "%HB_WITH_OPENSSL%\..\dll\libeay32.dll" diff --git a/harbour/contrib/rddsql/Makefile b/harbour/contrib/rddsql/Makefile index cbe0f68615..ba6f3fcc11 100644 --- a/harbour/contrib/rddsql/Makefile +++ b/harbour/contrib/rddsql/Makefile @@ -17,6 +17,7 @@ DIRS := \ sddmy \ sddpg \ sddfb \ + sddoci \ sddodbc \ include $(TOP)$(ROOT)config/header.mk diff --git a/harbour/contrib/rddsql/sddfb/fbirddd.c b/harbour/contrib/rddsql/sddfb/fbirddd.c index dcfabce849..472808605a 100644 --- a/harbour/contrib/rddsql/sddfb/fbirddd.c +++ b/harbour/contrib/rddsql/sddfb/fbirddd.c @@ -144,7 +144,7 @@ static HB_ERRCODE fbConnect( SQLDDCONNECTION * pConnection, PHB_ITEM pItem ) isc_db_handle db = ( isc_db_handle ) 0; char parambuf[ 520 ]; int i; - HB_ULONG ul; + HB_SIZE ul; i = 0; parambuf[ i++ ] = isc_dpb_version1; diff --git a/harbour/contrib/rddsql/sddmy/mysqldd.c b/harbour/contrib/rddsql/sddmy/mysqldd.c index e28bf981b8..e5920834c2 100644 --- a/harbour/contrib/rddsql/sddmy/mysqldd.c +++ b/harbour/contrib/rddsql/sddmy/mysqldd.c @@ -461,7 +461,7 @@ static HB_ERRCODE mysqlGetValue( SQLBASEAREAP pArea, HB_USHORT uiIndex, PHB_ITEM char szBuffer[ 64 ]; HB_BOOL bError; PHB_ITEM pError; - HB_ULONG ulLen; + HB_SIZE ulLen; bError = HB_FALSE; uiIndex--; @@ -489,7 +489,7 @@ static HB_ERRCODE mysqlGetValue( SQLBASEAREAP pArea, HB_USHORT uiIndex, PHB_ITEM if ( pValue ) memcpy( pStr, pValue, ulLen ); - if ( ( HB_ULONG )pField->uiLen > ulLen ) + if ( ( HB_SIZE ) pField->uiLen > ulLen ) memset( pStr + ulLen, ' ', pField->uiLen - ulLen ); pStr[ pField->uiLen ] = '\0'; diff --git a/harbour/contrib/rddsql/sddoci/Makefile b/harbour/contrib/rddsql/sddoci/Makefile new file mode 100644 index 0000000000..c61e999ba9 --- /dev/null +++ b/harbour/contrib/rddsql/sddoci/Makefile @@ -0,0 +1,38 @@ +# +# $Id$ +# + +ROOT := ../../../ + +include $(TOP)$(ROOT)config/global.mk + +LIBNAME := sddoci + +C_SOURCES := \ + ocidd.c \ + +_DET_DSP_NAME := ocilib +_DET_VAR_INC_ := HB_INC_OCILIB +_DET_VAR_HAS_ := HB_HAS_OCILIB +_DET_FLT_PLAT := !dos !os2 !wce +_DET_FLT_COMP := +_DET_INC_DEFP := /usr/include /usr/local/include +_DET_INC_HEAD := /ocilib.h +include $(TOP)$(ROOT)config/detfun.mk + +ifneq ($(HB_HAS_OCILIB),) + HB_CFLAGS += $(foreach d,$(HB_HAS_OCILIB),-I$(d)) + # Using prebuilt static libs with MinGW + ifeq ($(HB_COMPILER),mingw) + HB_CFLAGS += -DOCI_API=_stdcall + endif + ifneq ($(HB_WITH_OCILIB_UNICODE),) + HB_CFLAGS += -DOCI_CHARSET_UNICODE + else ifneq ($(HB_WITH_OCILIB_MIXED),) + HB_CFLAGS += -DOCI_CHARSET_MIXED + endif + include $(TOP)$(ROOT)config/lib.mk +else + HB_SKIP_REASON := $(_DET_RES_TEXT) + include $(TOP)$(ROOT)config/none.mk +endif diff --git a/harbour/contrib/rddsql/sddoci/ocidd.c b/harbour/contrib/rddsql/sddoci/ocidd.c new file mode 100644 index 0000000000..8ca1cfec3c --- /dev/null +++ b/harbour/contrib/rddsql/sddoci/ocidd.c @@ -0,0 +1,651 @@ +/* + * $Id$ + */ + +/* + * Oracle (via OCILIB) Database Driver + * + * Copyright 2010 Viktor Szakats (harbour.01 syenar.hu) + * www - http://www.harbour-project.org + * + * This program 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, 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 software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ + +#include "hbapi.h" +#include "hbapiitm.h" +#include "hbdate.h" +#include "hbvm.h" + +#if defined( __XCC__ ) || defined( __LCC__ ) +# include "hbrddsql.h" +#else +# include "../hbrddsql.h" +#endif + +#include + +#if defined( OCI_CHARSET_UNICODE ) + #define HB_MTEXT_CPTO(d,s,l) hb_mbtowccpy(d,s,l) + #define HB_MTEXT_GETFROM(d,s,l) hb_wctombget(d,s,l) + #define HB_MTEXT_SETTO(d,s,l) hb_mbtowcset(d,s,l) + #define HB_MTEXT_CONVTO(s) hb_mbtowc(s) + #define HB_MTEXT_CONVFROM(s) hb_wctomb(s) + #define HB_MTEXT_CONVNTO(s,l) hb_mbntowc(s,l) + #define HB_MTEXT_CONVNFROM(s,l) hb_wcntomb(s,l) + #define HB_MTEXT_CONVNREV(d,s,l) do { hb_wctombget(d,s,l); hb_xfree(s); } while( 0 ) + #define HB_MTEXT_FREE(s) hb_xfree(s) +#else + #define HB_MTEXT_CPTO(d,s,l) hb_strncpy(d,s,l) + #define HB_MTEXT_SETTO(d,s,l) memcpy(d,s,l) + #define HB_MTEXT_GETFROM(d,s,l) memcpy(d,s,l) + #define HB_MTEXT_CONVTO(s) ((char *)(s)) + #define HB_MTEXT_CONVFROM(s) ((char *)(s)) + #define HB_MTEXT_CONVNTO(s,l) ((char *)(s)) + #define HB_MTEXT_CONVNFROM(s,l) ((char *)(s)) + #define HB_MTEXT_CONVNREV(d,s,l) do { ; } while( 0 ) + #define HB_MTEXT_FREE(s) HB_SYMBOL_UNUSED(s) +#endif + +#if defined( OCI_CHARSET_UNICODE ) || defined( OCI_CHARSET_MIXED ) + #define HB_DTEXT_CPTO(d,s,l) hb_mbtowccpy(d,s,l) + #define HB_DTEXT_GETFROM(d,s,l) hb_wctombget(d,s,l) + #define HB_DTEXT_SETTO(d,s,l) hb_mbtowcset(d,s,l) + #define HB_DTEXT_CONVTO(s) hb_mbtowc(s) + #define HB_DTEXT_CONVFROM(s) hb_wctomb(s) + #define HB_DTEXT_CONVNTO(s,l) hb_mbntowc(s,l) + #define HB_DTEXT_CONVNFROM(s,l) hb_wcntomb(s,l) + #define HB_DTEXT_CONVNREV(d,s,l) do { hb_wctombget(d,s,l); hb_xfree(s); } while( 0 ) + #define HB_DTEXT_FREE(s) hb_xfree(s) +#else + #define HB_DTEXT_CPTO(d,s,l) hb_strncpy(d,s,l) + #define HB_DTEXT_SETTO(d,s,l) memcpy(d,s,l) + #define HB_DTEXT_GETFROM(d,s,l) memcpy(d,s,l) + #define HB_DTEXT_CONVTO(s) ((char *)(s)) + #define HB_DTEXT_CONVFROM(s) ((char *)(s)) + #define HB_DTEXT_CONVNTO(s,l) ((char *)(s)) + #define HB_DTEXT_CONVNFROM(s,l) ((char *)(s)) + #define HB_DTEXT_CONVNREV(d,s,l) do { ; } while( 0 ) + #define HB_DTEXT_FREE(s) HB_SYMBOL_UNUSED(s) +#endif + +static HB_ERRCODE ocilibConnect( SQLDDCONNECTION * pConnection, PHB_ITEM pItem ); +static HB_ERRCODE ocilibDisconnect( SQLDDCONNECTION * pConnection ); +static HB_ERRCODE ocilibExecute( SQLDDCONNECTION * pConnection, PHB_ITEM pItem ); +static HB_ERRCODE ocilibOpen( SQLBASEAREAP pArea ); +static HB_ERRCODE ocilibClose( SQLBASEAREAP pArea ); +static HB_ERRCODE ocilibGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ); + + +static SDDNODE ocidd = +{ + NULL, + "OCILIB", + ( SDDFUNC_CONNECT ) ocilibConnect, + ( SDDFUNC_DISCONNECT ) ocilibDisconnect, + ( SDDFUNC_EXECUTE ) ocilibExecute, + ( SDDFUNC_OPEN ) ocilibOpen, + ( SDDFUNC_CLOSE ) ocilibClose, + ( SDDFUNC_GOTO ) ocilibGoTo, + ( SDDFUNC_GETVALUE ) NULL, + ( SDDFUNC_GETVARLEN ) NULL +}; + + +HB_FUNC_EXTERN( SQLBASE ); + +static void hb_ocidd_init( void * cargo ) +{ + HB_SYMBOL_UNUSED( cargo ); + + OCI_Initialize( NULL, NULL, OCI_ENV_DEFAULT ); + + if( ! hb_sddRegister( &ocidd ) ) + { + hb_errInternal( HB_EI_RDDINVALID, NULL, NULL, NULL ); + HB_FUNC_EXEC( SQLBASE ); /* force SQLBASE linking */ + } +} + +static void hb_ocidd_exit( void * cargo ) +{ + HB_SYMBOL_UNUSED( cargo ); + + OCI_Cleanup(); + +printf( "CLEANUP!\n" ); +} + +HB_FUNC( SDDOCI ) {;} + +HB_INIT_SYMBOLS_BEGIN( ocidd__InitSymbols ) +{ "SDDOCI", {HB_FS_PUBLIC}, {HB_FUNCNAME( SDDOCI )}, NULL }, +HB_INIT_SYMBOLS_END( ocidd__InitSymbols ) + +HB_CALL_ON_STARTUP_BEGIN( _hb_ocidd_init_ ) + hb_vmAtInit( hb_ocidd_init, NULL ); + hb_vmAtExit( hb_ocidd_exit, NULL ); +HB_CALL_ON_STARTUP_END( _hb_ocidd_init_ ) + +#if defined( HB_PRAGMA_STARTUP ) + #pragma startup ocidd__InitSymbols + #pragma startup _hb_ocidd_init_ +#elif defined( HB_DATASEG_STARTUP ) + #define HB_DATASEG_BODY HB_DATASEG_FUNC( ocidd__InitSymbols ) \ + HB_DATASEG_FUNC( _hb_ocidd_init_ ) + #include "hbiniseg.h" +#endif + + +/*=====================================================================================*/ +static HB_USHORT hb_errRT_OCIDD( HB_ERRCODE errGenCode, HB_ERRCODE errSubCode, const char * szDescription, const char * szOperation, HB_ERRCODE errOsCode ) +{ + HB_USHORT uiAction; + PHB_ITEM pError; + + pError = hb_errRT_New( ES_ERROR, "SDDOCI", errGenCode, errSubCode, szDescription, szOperation, errOsCode, EF_NONE ); + uiAction = hb_errLaunch( pError ); + hb_itemRelease( pError ); + return uiAction; +} + + +static char * ocilibGetError( HB_ERRCODE * pErrCode ) +{ + OCI_Error * err = OCI_GetLastError(); + char * szRet; + + int iNativeErr = 9999; + + if( err ) + { + iNativeErr = OCI_ErrorGetOCICode( err ); + szRet = hb_strdup( OCI_ErrorGetString( err ) ); + } + else + szRet = hb_strdup( "HY000 Unable to get error message" ); + + if( pErrCode ) + *pErrCode = ( HB_ERRCODE ) iNativeErr; + + return szRet; +} + + +/*============= SDD METHODS =============================================================*/ + +static HB_ERRCODE ocilibConnect( SQLDDCONNECTION * pConnection, PHB_ITEM pItem ) +{ + OCI_Connection * cn; + + mtext * szConn = ( mtext * ) HB_MTEXT_CONVTO( hb_arrayGetCPtr( pItem, 2 ) ); + mtext * szUser = ( mtext * ) HB_MTEXT_CONVTO( hb_arrayGetCPtr( pItem, 3 ) ); + mtext * szPass = ( mtext * ) HB_MTEXT_CONVTO( hb_arrayGetCPtr( pItem, 4 ) ); + + cn = OCI_ConnectionCreate( szConn, szUser, szPass, OCI_SESSION_DEFAULT ); + + HB_MTEXT_FREE( szConn ); + HB_MTEXT_FREE( szUser ); + HB_MTEXT_FREE( szPass ); + + if( cn ) + { + pConnection->hConnection = ( void * ) cn; + return HB_SUCCESS; + } + else + pConnection->hConnection = NULL; + + return HB_FAILURE; +} + + +static HB_ERRCODE ocilibDisconnect( SQLDDCONNECTION * pConnection ) +{ + return OCI_ConnectionFree( ( OCI_Connection * ) pConnection->hConnection ) ? HB_SUCCESS : HB_FAILURE; +} + + +static HB_ERRCODE ocilibExecute( SQLDDCONNECTION * pConnection, PHB_ITEM pItem ) +{ + OCI_Statement * st = OCI_StatementCreate( ( OCI_Connection * ) pConnection->hConnection ); + mtext * szStatement; + char * szError; + HB_ERRCODE errCode; + + if( ! st ) + { + szError = ocilibGetError( &errCode ); + hb_errRT_OCIDD( EG_OPEN, ESQLDD_STMTALLOC, szError, hb_itemGetCPtr( pItem ), errCode ); + hb_xfree( szError ); + return HB_FAILURE; + } + + szStatement = ( mtext * ) HB_MTEXT_CONVTO( hb_itemGetCPtr( pItem ) ); + + if( OCI_ExecuteStmt( st, szStatement ) ) + { + HB_MTEXT_FREE( szStatement ); + + /* TODO: new id */ + hb_rddsqlSetError( 0, NULL, hb_itemGetCPtr( pItem ), NULL, ( unsigned long ) OCI_GetAffectedRows( st ) ); + OCI_StatementFree( st ); + return HB_SUCCESS; + } + else + HB_MTEXT_FREE( szStatement ); + + szError = ocilibGetError( &errCode ); + hb_rddsqlSetError( errCode, szError, hb_itemGetCPtr( pItem ), NULL, errCode ); + hb_xfree( szError ); + OCI_StatementFree( st ); + return HB_FAILURE; +} + + +static HB_ERRCODE ocilibOpen( SQLBASEAREAP pArea ) +{ + OCI_Statement * st = OCI_StatementCreate( ( OCI_Connection * ) pArea->pConnection->hConnection ); + OCI_Resultset * rs; + mtext * szQuery; + HB_USHORT uiFields, uiIndex; + PHB_ITEM pItemEof, pItem; + HB_ERRCODE errCode; + char * szError; + HB_BOOL bError; + + if( ! st ) + { + szError = ocilibGetError( &errCode ); + hb_errRT_OCIDD( EG_OPEN, ESQLDD_STMTALLOC, szError, pArea->szQuery, errCode ); + hb_xfree( szError ); + return HB_FAILURE; + } + + szQuery = ( mtext * ) HB_MTEXT_CONVTO( pArea->szQuery ); + + if( ! OCI_ExecuteStmt( st, szQuery ) ) + { + HB_MTEXT_FREE( szQuery ); + szError = ocilibGetError( &errCode ); + OCI_StatementFree( st ); + hb_errRT_OCIDD( EG_OPEN, ESQLDD_INVALIDQUERY, szError, pArea->szQuery, errCode ); + hb_xfree( szError ); + return HB_FAILURE; + } + else + HB_MTEXT_FREE( szQuery ); + + rs = OCI_GetResultset( st ); + + uiFields = ( HB_USHORT ) OCI_GetColumnCount( rs ); + SELF_SETFIELDEXTENT( ( AREAP ) pArea, uiFields ); + + pItemEof = hb_itemArrayNew( uiFields ); + + /* HB_TRACE( HB_TR_ALWAYS, ("fieldcount=%d", iNameLen) ); */ + + errCode = 0; + bError = HB_FALSE; + for( uiIndex = 0; uiIndex < uiFields; ++uiIndex ) + { + OCI_Column * col = OCI_GetColumn( rs, uiIndex + 1 ); + + const mtext * szName; + unsigned int uiDataType; + unsigned int uiSize; + int iDec; + HB_BOOL bNullable; + char * szOurName; + DBFIELDINFO pFieldInfo; + + if( ! col ) + { + hb_itemRelease( pItemEof ); + szError = ocilibGetError( NULL ); + OCI_StatementFree( st ); + hb_errRT_OCIDD( EG_OPEN, ESQLDD_STMTDESCR + 1001, szError, pArea->szQuery, 0 ); + hb_xfree( szError ); + return HB_FAILURE; + } + + szName = OCI_ColumnGetName( col ); + uiDataType = OCI_ColumnGetType( col ); + uiSize = OCI_ColumnGetSize( col ); + iDec = OCI_ColumnGetPrecision( col ); + bNullable = ( HB_BOOL ) OCI_ColumnGetNullable( col ); + + HB_SYMBOL_UNUSED( bNullable ); + + szOurName = ( char * ) hb_xgrab( ( 256 + 1 ) * sizeof( char ) ); + HB_MTEXT_CPTO( szOurName, szName, 256 ); + szOurName[ MAX_FIELD_NAME ] = '\0'; + hb_strUpper( szOurName, MAX_FIELD_NAME ); + pFieldInfo.atomName = szOurName; + + pFieldInfo.uiLen = ( HB_USHORT ) uiSize; + pFieldInfo.uiDec = ( HB_USHORT ) iDec; + + HB_TRACE( HB_TR_ALWAYS, ("field: name=%s type=%d len=%d dec=%d nullable=%d", pFieldInfo.atomName, uiDataType, uiSize, iDec, bNullable ) ); + + switch( uiDataType ) + { + /* TOFIX/TODO: Type mapping */ + case OCI_CDT_TEXT: + pFieldInfo.uiType = HB_FT_STRING; + break; + + case OCI_CDT_NUMERIC: + pFieldInfo.uiType = HB_FT_INTEGER; + break; + + case OCI_CDT_DATETIME: + case OCI_CDT_TIMESTAMP: + pFieldInfo.uiType = HB_FT_TIMESTAMP; + break; + + default: + /* HB_TRACE( HB_TR_ALWAYS, ("new sql type=%d", uiDataType) ); */ + bError = HB_TRUE; + errCode = ( HB_ERRCODE ) uiDataType; + pFieldInfo.uiType = 0; + pFieldInfo.uiType = HB_FT_STRING; + break; + } + + if( ! bError ) + { + switch( pFieldInfo.uiType ) + { + case HB_FT_STRING: + { + char * pStr; + + pStr = ( char * ) hb_xgrab( ( HB_SIZE ) pFieldInfo.uiLen + 1 ); + memset( pStr, ' ', pFieldInfo.uiLen ); + pStr[ pFieldInfo.uiLen ] = '\0'; + + pItem = hb_itemPutCL( NULL, pStr, pFieldInfo.uiLen ); + hb_xfree( pStr ); + break; + } + + case HB_FT_MEMO: + pItem = hb_itemPutC( NULL, NULL ); + break; + + case HB_FT_INTEGER: + pItem = hb_itemPutNI( NULL, 0 ); + break; + + case HB_FT_LONG: + if( pFieldInfo.uiDec == 0 ) + pItem = hb_itemPutNLLen( NULL, 0, pFieldInfo.uiLen ); + else + pItem = hb_itemPutNDLen( NULL, 0.0, pFieldInfo.uiLen, pFieldInfo.uiDec ); + break; + + case HB_FT_DOUBLE: + pItem = hb_itemPutNDLen( NULL, 0.0, pFieldInfo.uiLen, pFieldInfo.uiDec ); + break; + + case HB_FT_LOGICAL: + pItem = hb_itemPutL( NULL, HB_FALSE ); + break; + + case HB_FT_DATE: + pItem = hb_itemPutDL( NULL, 0 ); + break; + + case HB_FT_TIME: + pItem = hb_itemPutTDT( NULL, 0, 0 ); + break; + + case HB_FT_TIMESTAMP: + pItem = hb_itemPutTDT( NULL, 0, 0 ); + break; + + default: + pItem = hb_itemNew( NULL ); + bError = HB_TRUE; + break; + } + + hb_arraySetForward( pItemEof, uiIndex + 1, pItem ); + hb_itemRelease( pItem ); + + if( ! bError ) + bError = ( SELF_ADDFIELD( ( AREAP ) pArea, &pFieldInfo ) == HB_FAILURE ); + } + + if( bError ) + break; + } + + if( bError ) + { + hb_itemRelease( pItemEof ); + OCI_StatementFree( st ); + hb_errRT_OCIDD( EG_CORRUPTION, ESQLDD_INVALIDFIELD, "Invalid field type", pArea->szQuery, errCode ); + return HB_FAILURE; + } + + pArea->ulRecCount = 0; + pArea->ulRecMax = SQLDD_ROWSET_INIT; + + pArea->pRow = ( void ** ) hb_xgrab( SQLDD_ROWSET_INIT * sizeof( void * ) ); + memset( pArea->pRow, 0, SQLDD_ROWSET_INIT * sizeof( void * ) ); + pArea->pRowFlags = ( HB_BYTE * ) hb_xgrab( SQLDD_ROWSET_INIT * sizeof( HB_BYTE ) ); + memset( pArea->pRowFlags, 0, SQLDD_ROWSET_INIT * sizeof( HB_BYTE ) ); + + pArea->pRow[ 0 ] = pItemEof; + pArea->pRowFlags[ 0 ] = SQLDD_FLAG_CACHED; + + pArea->pStmt = ( void * ) st; + return HB_SUCCESS; +} + + +static HB_ERRCODE ocilibClose( SQLBASEAREAP pArea ) +{ + if( pArea->pStmt ) + { + OCI_StatementFree( ( OCI_Statement * ) pArea->pStmt ); + pArea->pStmt = NULL; + } + return HB_SUCCESS; +} + + +static HB_ERRCODE ocilibGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) +{ + OCI_Statement * st = ( OCI_Statement * ) pArea->pStmt; + OCI_Resultset * rs = OCI_GetResultset( st ); + PHB_ITEM pArray, pItem; + LPFIELD pField; + HB_USHORT ui; + + while( ulRecNo > pArea->ulRecCount && ! pArea->fFetched ) + { + if( ! OCI_FetchNext( rs ) ) + { + pArea->fFetched = HB_TRUE; + break; + } + + pArray = hb_itemArrayNew( pArea->area.uiFieldCount ); + for( ui = 1; ui <= pArea->area.uiFieldCount; ui++ ) + { + pItem = NULL; + + if( ! OCI_IsNull( rs, ui ) ) + { + pField = pArea->area.lpFields + ui - 1; + + switch( pField->uiType ) + { + case HB_FT_STRING: + { + const dtext * val; + if( ( val = OCI_GetString( rs, ui ) ) != NULL ) + { + HB_SIZE nLen = ( HB_SIZE ) dtslen( val ); + + char * szVal = ( char * ) hb_xgrab( ( nLen + 1 ) * sizeof( char ) ); + HB_MTEXT_CPTO( szVal, val, nLen ); + szVal[ nLen ] = '\0'; + + pItem = hb_itemPutCLPtr( NULL, szVal, nLen ); + } + break; + } + + case HB_FT_INTEGER: + { + pItem = hb_itemPutNLLen( NULL, OCI_GetInt( rs, ui ), pField->uiLen ); + break; + } +/* TODO: Type conversions */ +/* + case HB_FT_LONG: + if( pField->uiDec == 0 ) + { + long int val = 0; + if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_LONG, &val, sizeof( val ), &iLen ) ) ) + { + pItem = hb_itemPutNLLen( NULL, val, pField->uiLen ); + } + } + else + { + double val = 0.0; + if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_DOUBLE, &val, sizeof( val ), &iLen ) ) ) + { + pItem = hb_itemPutNDLen( NULL, val, pField->uiLen, pField->uiDec ); + } + } + break; + + case HB_FT_DOUBLE: + { + double val = 0.0; + if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_DOUBLE, &val, sizeof( val ), &iLen ) ) ) + { + pItem = hb_itemPutNDLen( NULL, val, pField->uiLen, pField->uiDec ); + } + break; + } + + case HB_FT_LOGICAL: + { + unsigned char val = 0; + if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_BIT, &val, sizeof( val ), &iLen ) ) ) + { + pItem = hb_itemPutL( NULL, val != 0 ); + } + break; + } + + case HB_FT_DATE: + { + DATE_STRUCT val = {0,0,0}; + if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_DATE, &val, sizeof( val ), &iLen ) ) ) + { + pItem = hb_itemPutD( NULL, val.year, val.month, val.day ); + } + break; + } + + case HB_FT_TIME: + { + TIME_STRUCT val = {0,0,0}; + if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_TIME, &val, sizeof( val ), &iLen ) ) ) + { + pItem = hb_itemPutTDT( NULL, 0, hb_timeEncode( val.hour, val.minute, val.second, 0 ) ); + } + break; + } + + case HB_FT_TIMESTAMP: + { + TIMESTAMP_STRUCT val = { 0, 0, 0, 0, 0, 0, 0 }; + if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_TIMESTAMP, &val, sizeof( val ), &iLen ) ) ) + { + pItem = hb_itemPutTDT( NULL, hb_dateEncode( val.year, val.month, val.day ), + hb_timeEncode( val.hour, val.minute, val.second, val.fraction / 1000000 ) ); + } + break; + } +*/ + } + } + + if( pItem ) + { + hb_arraySetForward( pArray, ui, pItem ); + hb_itemRelease( pItem ); + } + } + if( pArea->ulRecCount + 1 <= pArea->ulRecMax ) + { + pArea->pRow = ( void ** ) hb_xrealloc( pArea->pRow, ( pArea->ulRecMax + SQLDD_ROWSET_RESIZE ) * sizeof( void * ) ); + pArea->pRowFlags = ( HB_BYTE * ) hb_xrealloc( pArea->pRowFlags, ( pArea->ulRecMax + SQLDD_ROWSET_RESIZE ) * sizeof( HB_BYTE ) ); + pArea->ulRecMax += SQLDD_ROWSET_RESIZE; + } + + pArea->ulRecCount++; + pArea->pRow[ pArea->ulRecCount ] = pArray; + pArea->pRowFlags[ pArea->ulRecCount ] = SQLDD_FLAG_CACHED; + } + + if( ulRecNo == 0 || ulRecNo > pArea->ulRecCount ) + { + pArea->pRecord = pArea->pRow[ 0 ]; + pArea->bRecordFlags = pArea->pRowFlags[ 0 ]; + pArea->fPositioned = HB_FALSE; + } + else + { + pArea->pRecord = pArea->pRow[ ulRecNo ]; + pArea->bRecordFlags = pArea->pRowFlags[ ulRecNo ]; + pArea->fPositioned = HB_TRUE; + } + return HB_SUCCESS; +} diff --git a/harbour/contrib/rddsql/sddoci/sddoci.hbc b/harbour/contrib/rddsql/sddoci/sddoci.hbc new file mode 100644 index 0000000000..86e60e699d --- /dev/null +++ b/harbour/contrib/rddsql/sddoci/sddoci.hbc @@ -0,0 +1,10 @@ +# +# $Id$ +# + +libs=sddoci +{HB_WITH_OCILIB_UNICODE}libs=ocilibw +{HB_WITH_OCILIB_MIXED}libs=ocilibm +{!HB_WITH_OCILIB_UNICODE&!HB_WITH_OCILIB_MIXED}libs=ociliba + +libs=../rddsql.hbc diff --git a/harbour/contrib/rddsql/sddoci/tests/hbmk.hbm b/harbour/contrib/rddsql/sddoci/tests/hbmk.hbm new file mode 100644 index 0000000000..252d3357e4 --- /dev/null +++ b/harbour/contrib/rddsql/sddoci/tests/hbmk.hbm @@ -0,0 +1,5 @@ +# +# $Id$ +# + +../sddoci.hbc diff --git a/harbour/contrib/rddsql/sddoci/tests/test1.prg b/harbour/contrib/rddsql/sddoci/tests/test1.prg new file mode 100644 index 0000000000..d88b05ccbc --- /dev/null +++ b/harbour/contrib/rddsql/sddoci/tests/test1.prg @@ -0,0 +1,38 @@ +/* + * $Id$ + */ + +#include "simpleio.ch" +#include "hbrddsql.ch" + +REQUEST SDDOCI, SQLMIX + +PROCEDURE Main() + LOCAL tmp + + RDDSETDEFAULT( "SQLMIX" ) + SET( _SET_DATEFORMAT, "yyyy-mm-dd" ) + + AEVAL( rddList(), {| X | QOut( X ) } ) + + ? "-1-" + ? "Connect:", tmp := RDDINFO( RDDI_CONNECT, { "OCILIB", "ORCL", "scott", "tiger" } ) + IF tmp == 0 + ? "Unable connect to the server" + ENDIF + ? "-2-" + ? "Use:", DBUSEAREA( .T.,, "select * from emp", "emp" ) + ? "-3-" + ? "Alias:", ALIAS() + ? "-4-" + ? "DB struct:", HB_VALTOEXP( DBSTRUCT() ) + ? "-5-" + INKEY( 0 ) + BROWSE() + + INDEX ON FIELD->SAL TO salary + DBGOTOP() + BROWSE() + DBCLOSEAREA() + + RETURN diff --git a/harbour/contrib/rddsql/sddodbc/odbcdd.c b/harbour/contrib/rddsql/sddodbc/odbcdd.c index 91a8ec5fef..288acdbf02 100644 --- a/harbour/contrib/rddsql/sddodbc/odbcdd.c +++ b/harbour/contrib/rddsql/sddodbc/odbcdd.c @@ -339,7 +339,7 @@ static HB_ERRCODE odbcOpen( SQLBASEAREAP pArea ) errCode = 0; bError = HB_FALSE; - for ( uiIndex = 0; uiIndex < uiFields; uiIndex++ ) + for ( uiIndex = 0; uiIndex < uiFields; uiIndex++ ) { if ( ! SQL_SUCCEEDED( SQLDescribeCol( hStmt, ( SQLSMALLINT ) uiIndex + 1, ( SQLTCHAR* ) cName, HB_SIZEOFARRAY( cName ), &iNameLen, &iDataType, &uiSize, &iDec, &iNull ) ) ) { @@ -424,7 +424,7 @@ static HB_ERRCODE odbcOpen( SQLBASEAREAP pArea ) { char* pStr; - pStr = ( char * ) hb_xgrab( ( HB_ULONG ) pFieldInfo.uiLen + 1 ); + pStr = ( char * ) hb_xgrab( ( HB_SIZE ) pFieldInfo.uiLen + 1 ); memset( pStr, ' ', pFieldInfo.uiLen ); pStr[ pFieldInfo.uiLen ] = '\0'; @@ -487,10 +487,10 @@ static HB_ERRCODE odbcOpen( SQLBASEAREAP pArea ) if ( bError ) { - hb_itemRelease( pItemEof ); - SQLFreeStmt( hStmt, SQL_DROP ); - hb_errRT_ODBCDD( EG_CORRUPTION, ESQLDD_INVALIDFIELD, "Invalid field type", pArea->szQuery, errCode ); - return HB_FAILURE; + hb_itemRelease( pItemEof ); + SQLFreeStmt( hStmt, SQL_DROP ); + hb_errRT_ODBCDD( EG_CORRUPTION, ESQLDD_INVALIDFIELD, "Invalid field type", pArea->szQuery, errCode ); + return HB_FAILURE; } pArea->ulRecCount = 0; @@ -555,7 +555,7 @@ static HB_ERRCODE odbcGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) if( SQL_SUCCEEDED( res = SQLGetData( hStmt, ui, SQL_C_CHAR, ( SQLCHAR * ) val, 1024, &iLen ) ) ) { if( iLen > 0 ) - pItem = hb_itemPutCL( NULL, val, ( HB_ULONG ) iLen ); + pItem = hb_itemPutCL( NULL, val, ( HB_SIZE ) iLen ); } hb_xfree( val ); break; diff --git a/harbour/contrib/rddsql/sddpg/pgsqldd.c b/harbour/contrib/rddsql/sddpg/pgsqldd.c index cede20e312..35c6867b5b 100644 --- a/harbour/contrib/rddsql/sddpg/pgsqldd.c +++ b/harbour/contrib/rddsql/sddpg/pgsqldd.c @@ -475,7 +475,7 @@ static HB_ERRCODE pgsqlGetValue( SQLBASEAREAP pArea, HB_USHORT uiIndex, PHB_ITEM char* pValue; HB_BOOL bError; PHB_ITEM pError; - HB_ULONG ulLen; + HB_SIZE ulLen; bError = HB_FALSE; uiIndex--; @@ -485,7 +485,7 @@ static HB_ERRCODE pgsqlGetValue( SQLBASEAREAP pArea, HB_USHORT uiIndex, PHB_ITEM return HB_SUCCESS; pValue = PQgetvalue( ( PGresult * ) pArea->pResult, pArea->ulRecNo - 1, uiIndex ); - ulLen = ( HB_ULONG ) PQgetlength( ( PGresult * ) pArea->pResult, pArea->ulRecNo - 1, uiIndex ); + ulLen = ( HB_SIZE ) PQgetlength( ( PGresult * ) pArea->pResult, pArea->ulRecNo - 1, uiIndex ); /* printf( "fieldget recno:%d index:%d value:%s len:%d\n", pArea->ulRecNo, uiIndex, pValue, ulLen ); */