Updating preprocessor and odbc files

This commit is contained in:
Alexander S.Kresin
1999-10-20 19:20:22 +00:00
parent 1fcb2808c2
commit 31bd7f8443
13 changed files with 316 additions and 69 deletions

View File

@@ -1,3 +1,16 @@
19991020-22:58 GMT+3 Alexander Kresin
* source/pp/hbpp.c
* Fixed bugs, reported by Antonio Linares, Victor Szel and Guy Roussin
- contrib/odbc/bld32exe.bat
- contrib/odbc/hb32.bat
+ contrib/odbc/bld_b32.bat
+ contrib/odbc/odbccall.prg
+ contrib/odbc/odbcdemo.prg
* contrib/odbc/odbc.c
* contrib/odbc/harbour.mdb
* These files I got from Felipe Coury
19991020-20:23 GMT+1 Victor Szel <info@szelvesz.hu>
* source/rtl/alert.prg
source/rtl/browdb.prg
@@ -6,29 +19,29 @@
+ include/hbsetup.ch
include/hbsetup.h
include/Makefile
+ New header file added to setup things which are common to both
.PRG and .C source files, currently HARBOUR_STRICT_CLIPPER_COMPATIBILITY
+ New header file added to setup things which are common to both
.PRG and .C source files, currently HARBOUR_STRICT_CLIPPER_COMPATIBILITY
was moved from hbsetup.h
+ HB_COMPAT_C53
HB_COMPAT_XPP
HB_COMPAT_XPP
HB_COMPAT_VO
#defines added to be able to toggle inclusion of the new features
#defines added to be able to toggle inclusion of the new features
of these compilers. All these are turned on by default.
* source/rtl/browdb.prg
+ dbSkipper() function added, it's now guarded with
HARBOUR_COMPAT_XPP, so there is a possibility to switch to the
+ dbSkipper() function added, it's now guarded with
HARBOUR_COMPAT_XPP, so there is a possibility to switch to the
fully Clipper compliant, or the XBase++ compliant method.
+ NOTE added about dbSkipper.
* source/rtl/filesys.c
+ source/rtl/binnum.c (added)
* BIN2W(), BIN2I(), BIN2L(), I2BIN(), L2BIN() functions moved to
* BIN2W(), BIN2I(), BIN2L(), I2BIN(), L2BIN() functions moved to
a separate source file. Since these were not FileSys APi functions.
WARNING ! Please update non-GNU make systems.
- include/caundoc.api renamed to
+ include/hbundoc.api
include/Makefile
tests/extend2.c
* Include file name standardized, now the HBUNDOC.API file should
* Include file name standardized, now the HBUNDOC.API file should
contain all undocumented API calls (not only for CA-Cl*pper).
- include/harbour.ch renamed to
+ include/hbclip.ch
@@ -67,7 +80,7 @@
modules and standard OS makefiles.
MAX() -> HB_MAX_()
MIN() -> HB_MIN_()
(the additional underscore is need to avoid name collisions with
(the additional underscore is need to avoid name collisions with
Harbour functions HB_MIN() and HB_MAX())
LOBYTE() -> HB_LOBYTE()
HIBYTE() -> HB_HIBYTE()
@@ -90,7 +103,7 @@
include/hbextern.ch
source/runner/stdalone/external.prg
+ Public dbSkipper() function made STATIC, renamed to Skipped() to be
Clipper compatible. Clipper doesn't have any public dbSkipper(),
Clipper compatible. Clipper doesn't have any public dbSkipper(),
_dbSkipper() or Skipped() functions.
- Non-Clipper compatible function _dbSkipper() removed.
* Formatted.

View File

@@ -1,28 +0,0 @@
@echo off
IF A%1 == A GOTO :SINTAX
IF A%2 == A GOTO :NOOUTPUT
echo -O2 -e%2.exe -I..\..\include ..\..\source\vm\hvm.c %1.c > b32.bc
echo ..\..\libs\b32\harbour.lib ..\..\libs\b32\terminal.lib >> b32.bc
echo ..\..\libs\b32\hbgt.lib ..\..\libs\b32\hbpp.lib >> b32.bc
echo ..\..\libs\b32\hbodbc.lib ..\..\libs\b32\odbc32.lib >> b32.bc
bcc32 @b32.bc
del b32.bc
GOTO :END
:NOOUTPUT
echo -O2 -e%1.exe -I..\..\include ..\..\source\vm\hvm.c %1.c > b32.bc
echo ..\..\libs\b32\harbour.lib ..\..\libs\b32\terminal.lib >> b32.bc
echo ..\..\libs\b32\hbgt.lib ..\..\libs\b32\hbpp.lib >> b32.bc
echo ..\..\libs\b32\hbodbc.lib ..\..\libs\b32\odbc32.lib >> b32.bc
bcc32 @b32.bc
del b32.bc
GOTO :END
:SINTAX
ECHO syntax: BuildExe Harbour_Output_Filename [Exe_Output_Filename]
ECHO Use Harbour_Output_Filename and Exe_Output_Filename without extensions
ECHO\
:END

View File

@@ -0,0 +1,8 @@
@echo off
rem
rem $Id$
rem
..\..\bin\harbour %1 /n /i..\include %2
bcc32 -e%1.exe -O2 -I..\..\include -L..\..\lib\b32 -v harbour.lib terminal.lib hbpp.lib hbgt.lib rdd.lib hbodbc.lib odbc32.lib %1.c
rem del %1.c

View File

@@ -1,3 +1,3 @@
@echo off
make -fhbodbc.b32
implib ..\..\libs\b32\odbc32.lib odbc32.def
implib ..\..\lib\b32\odbc32.lib odbc32.def

Binary file not shown.

View File

@@ -1,10 +0,0 @@
@echo off
REM From .PRG to .C = Harbour
..\..\bin\harbour %1.prg /n /i..\..\include
if errorlevel 1 goto end
REM From .C to .EXE = BuildExe
call BLD32EXE %1 %2
:end

View File

@@ -1,15 +1,20 @@
# makefile for Borland C/C++ 32 bits
# ODBC Harbor Library and Import Library makefile
# ODBC Harbour Library and Import Library makefile
.path.c = .
.path.h = .;include
.path.lib = ..\..\libs\b32
.path.obj = obj
.path.h = .\;..\..\include;..\..\source\pp
.path.lib = ..\..\lib\b32
.path.obj = ..\..\obj
libs\b32\hbodbc.lib : odbc.obj
odbc.obj : odbc.c
lib\b32\hbodbc.lib : odbc.obj todbc.obj
odbc.obj : odbc.c
todbc.obj : todbc.c
todbc.c : todbc.prg
.c.obj :
bcc32 -c -O2 -I..\..\include;..\..\source\hbpp -o$@ $<
tlib ..\..\libs\b32\hbodbc.lib -+$@,,
implib ..\..\libs\b32\odbc32.lib odbc32.def
bcc32 -c -O2 -I.\;..\..\include;..\..\source\pp -o$@ $<
tlib ..\..\lib\b32\hbodbc.lib -+$@,,
implib ..\..\lib\b32\odbc32.lib odbc32.def
.prg.c :
..\bin\harbour $< /n /i..\..\include

View File

@@ -31,8 +31,23 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
their web site at http://www.gnu.org/).
*/
/*
* The following parts are Copyright of the individual authors.
* www - http://www.harbour-project.org
*
* Copyright 1999 Felipe G. Coury <fcoury@flexsys-ci.com>
* HB_SQLNUMRES()
* HB_SQLDESCRIB()
* HB_SQLEXTENDE()
*
* See doc/license.txt for licensing terms.
*
*/
#include <windows.h>
#include <limits.h>
#include <malloc.h>
@@ -41,9 +56,10 @@
#include <ctype.h>
#include "extend.h"
#include "itemapi.h"
#include "harb.h"
#include "hbdefs.h"
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
HARBOUR HB_SQLALLOCEN( void ) /* HB_SQLALLOCENV( @hEnv ) --> nRetCode */
{
@@ -128,3 +144,88 @@ HARBOUR HB_SQLGETDATA( void ) /* HB_SQLGETDATA( hStmt, nField, nType, nLen, @cBu
hb_xfree( ( PTR ) bBuffer );
hb_retni( wResult );
}
/* HB_NUMRESULTCOLS( hStmt, @nColCount ) */
HARBOUR HB_SQLNUMRES( void )
{
SQLSMALLINT nCols;
WORD wResult = SQLNumResultCols( ( HSTMT ) hb_parnl( 1 ), &nCols );
if( wResult == SQL_SUCCESS || wResult == SQL_SUCCESS_WITH_INFO )
hb_stornl( ( LONG ) nCols, 2 );
hb_retni( wResult );
}
/* HB_SQLDESCRIBECOL( hStmt, nCol, @cName, nLen, @nBufferLen, @nDataType, @nColSize, @nDec, @nNull ) --> nRetCode */
HARBOUR HB_SQLDESCRIB( void )
{
SDWORD lLen = ( SDWORD ) hb_parnl( 4 );
PTR bBuffer = hb_xgrab( lLen );
SQLSMALLINT wBufLen = hb_parni( 5 );
SQLSMALLINT wDataType = hb_parni( 6 );
SQLUINTEGER wColSize = hb_parni( 7 );
SQLSMALLINT wDecimals = hb_parni( 8 );
SQLSMALLINT wNullable = hb_parni( 9 );
WORD wResult = SQLDescribeCol( ( HSTMT ) hb_parnl( 1 ), hb_parni( 2 ),
( PTR ) bBuffer, hb_parni( 4 ), &wBufLen,
&wDataType, &wColSize, &wDecimals,
&wNullable );
if( wResult == SQL_SUCCESS || wResult == SQL_SUCCESS_WITH_INFO )
{
hb_storclen( ( LPSTR ) bBuffer,
( WORD ) wBufLen, 3 );
hb_stornl( ( LONG ) wBufLen, 5 );
hb_stornl( ( LONG ) wDataType, 6 );
hb_stornl( ( LONG ) wColSize, 7 );
hb_stornl( ( LONG ) wDecimals, 8 );
hb_stornl( ( LONG ) wNullable, 9 );
}
hb_xfree( ( PTR ) bBuffer );
hb_retni( wResult );
}
/* HB_SQLEXTENDEDFETCH( hStmt, nOrientation, nOffset, @nRows, @nRowStatus ) */
HARBOUR HB_SQLEXTENDE( void )
{
SQLUINTEGER uiRowCountPtr = hb_parni( 4 );
SQLUSMALLINT siRowStatus = hb_parni( 5 );
WORD wResult = SQLExtendedFetch( ( HSTMT ) hb_parnl( 1 ),
hb_parnl( 2 ),
hb_parnl( 3 ),
&uiRowCountPtr,
&siRowStatus );
if( wResult == SQL_SUCCESS || wResult == SQL_SUCCESS_WITH_INFO )
{
hb_stornl( ( LONG ) uiRowCountPtr, 4 );
hb_stornl( ( LONG ) siRowStatus, 5 );
}
hb_retni( wResult );
}
HARBOUR HB_SQLFETCHSC( void )
{
hb_retni( SQLFetchScroll( ( HSTMT ) hb_parnl( 1 ),
hb_parnl( 2 ), hb_parnl( 3 ) ) );
}
HARBOUR HB_SQLERROR() // hEnv, hDbc, hStmt, @ cErrorClass, @ nType, @ cErrorMsg
{
BYTE bBuffer1[ 256 ], szErrorMsg[ 256 ];
UDWORD lError;
SWORD wLen;
hb_retni( SQLError( ( HENV ) hb_parnl( 1 ), ( HDBC ) hb_parnl( 2 ),
( HSTMT ) hb_parnl( 3 ), bBuffer1, &lError,
szErrorMsg, 256, &wLen ) );
hb_storc( bBuffer1, 4 );
hb_stornl( lError, 5 );
hb_storc( szErrorMsg, 6 );
}

View File

@@ -0,0 +1,36 @@
#xcommand WITH <oObject> DO => Self := <oObject>
#xcommand ENDWITH => Self := NIL
FUNCTION Main()
LOCAL cExePath := substr( __argv(0), 1, rat( "\", __argv(0) ) - 1 )
LOCAL cConStr := ;
"DBQ=" + cExePath + "\harbour.mdb;" + ;
"Driver={Microsoft Access Driver (*.mdb)}"
LOCAL dsFunctions := TODBC():New( "xx" ) // cConStr )
WITH dsFunctions DO
::SetSQL( "SELECT * FROM Functions" )
::Open()
? ::FieldByName( "Code" ):Value
? ::Skip()
? ::FieldByName( "Code" ):Value
? ::GoTo( 1 )
? ::FieldByName( "Code" ):Value
? ::Prior()
? ::FieldByName( "Code" ):Value
? ::First()
? ::FieldByName( "Code" ):Value
? ::Last()
? ::FieldByName( "Code" ):Value
? ::Close()
ENDWITH
dsFunctions:Destroy()
RETURN( NIL )

View File

@@ -0,0 +1,85 @@
*+--------------------------------------------------------------------
*+
*+ Function Main()
*+
*+--------------------------------------------------------------------
*+
FUNCTION Main()
LOCAL aOrders
LOCAL nOp
LOCAL dsFunctions
// LOCAL cExePath := substr( cargv(), 1, rat( "\", cargv() ) - 1 )
LOCAL cConStr := ;
"DBQ=" + "harbour.mdb;" + ;
"Driver={Microsoft Access Driver (*.mdb)}"
dsFunctions := TODBC():New( cConStr )
set COLOR TO "W+/B"
CLS
WHILE .T.
@ 00, 00 SAY padc( "þ TODBC Demonstration þ", 80 ) COLOR "B/W"
dsFunctions:SetSQL( "SELECT * FROM Functions" )
dsFunctions:Open()
@ 03, 24 TO len( dsFunctions:Fields ) + 4, 55
aOrders := {}
FOR i := 1 TO len( dsFunctions:Fields )
aadd( aOrders, dsFunctions:Fields[ i ] :FieldName )
@ i + 3, 25 PROMPT padc( "ORDER BY " + aOrders[ i ], 30 )
NEXT
MENU TO nOp
IF nOp == 0
EXIT
ENDIF
dsFunctions:Close()
dsFunctions:SetSQL( "SELECT * FROM Functions ORDER BY " + aOrders[ nOp ] )
dsFunctions:Open()
FOR i := 11 TO 24
@ i, 00 SAY REPL( " ", 80 )
NEXT
@ 10, 00 TO 10, 79
@ 24, 00 TO 24, 79
@ 12, 00 TO 12, 79
@ 11, 00 SAY ""
@ 11, 02 SAY "Statement:" COLOR "GR+/B"
@ 11, col() + 1 SAY dsFunctions:cSQL
@ 14, 05 SAY " " + padr( dsFunctions:FieldByName( "Code" ) :FieldName, 3 ) + " " + ;
padr( dsFunctions:FieldByName( "Function" ) :FieldName, 15 ) + " " + ;
padr( dsFunctions:FieldByName( "State" ) :FieldName, 2 ) + " " + ;
padr( dsFunctions:FieldByName( "Comments" ) :FieldName, 40 ) ;
COLOR "B/W"
WHILE !dsFunctions:Eof()
? " " + padr( dsFunctions:FieldByName( "Code" ) :Value, 3 ), "³", ;
padr( dsFunctions:FieldByName( "Function" ) :Value, 15 ), "³", ;
padr( dsFunctions:FieldByName( "State" ) :Value, 2 ), "³", ;
padr( dsFunctions:FieldByName( "Comments" ) :Value, 40 )
dsFunctions:Skip()
ENDDO
dsFunctions:Close()
ENDDO
dsFunctions:Destroy()
RETURN ( NIL )
*+ EOF: ODBCDEMO.PRG

View File

@@ -92,4 +92,11 @@ nullablity of a column in a table. */
#define SQL_NULL_HDBC 0
#define SQL_NULL_HSTMT 0
#define SQL_FETCH_NEXT 1
#define SQL_FETCH_FIRST 2
#define SQL_FETCH_LAST 3
#define SQL_FETCH_PRIOR 4
#define SQL_FETCH_ABSOLUTE 5
#define SQL_FETCH_RELATIVE 6
#define SQL_FETCH_BOOKMARK 8

View File

@@ -1250,6 +1250,11 @@ SQLRETURN SQL_API SQLSetScrollOptions( /* Use SQLSetStmtOptions */
SQLINTEGER crowKeyset,
SQLUSMALLINT crowRowset);
SQLRETURN SQL_API SQLFetchScroll(
SQLHSTMT hstmt,
SQLSMALLINT fOrientation,
SQLINTEGER fOffset);
#endif /* RC_INVOKED */
#ifdef __cplusplus

View File

@@ -65,7 +65,7 @@ int WorkCommand ( char*, char*, COMMANDS* );
int WorkTranslate ( char*, char*, COMMANDS*, int* );
int CommandStuff ( char *, char *, char *, int*, int, int );
int RemoveSlash( char * );
int WorkMarkers( char**, char**, char*, int* );
int WorkMarkers( char**, char**, char*, int*, int );
int getExpReal ( char *, char **, int, int );
int isExpres ( char* );
int TestOptional( char*, char* );
@@ -88,7 +88,7 @@ int strocpy (char*, char* );
int stroncpy (char*, char*, int);
int strincpy (char*, char*);
int truncmp (char**, char**, int);
int strincmp (char*, char**);
int strincmp (char*, char**, int);
int strolen ( char* );
void stroupper ( char* );
int strotrim ( char* );
@@ -865,7 +865,7 @@ int CommandStuff ( char *ptrmp, char *inputLine, char * ptro, int *lenres, int c
aIsRepeate[ Repeate ] = 0;
lastopti[Repeate++] = ptrmp;
ptrmp++;
if( !CheckOptional( ptrmp, ptri, ptro, lenres, com_or_xcom, com_or_xcom ) )
if( !CheckOptional( ptrmp, ptri, ptro, lenres, com_or_tra, com_or_xcom ) )
SkipOptional( &ptrmp );
break;
case ']':
@@ -914,7 +914,7 @@ int CommandStuff ( char *ptrmp, char *inputLine, char * ptro, int *lenres, int c
break;
case '\1': /* Match marker */
if( !numBrackets ) strtopti = NULL;
if ( !WorkMarkers( &ptrmp, &ptri, ptro, lenres ) )
if ( !WorkMarkers( &ptrmp, &ptri, ptro, lenres, com_or_xcom ) )
{
if ( numBrackets )
{
@@ -1016,7 +1016,7 @@ int RemoveSlash( char *stroka )
return lenres;
}
int WorkMarkers( char **ptrmp, char **ptri, char *ptro, int *lenres )
int WorkMarkers( char **ptrmp, char **ptri, char *ptro, int *lenres, int com_or_xcom )
{
char expreal[MAX_NAME], exppatt[MAX_NAME];
int lenreal = 0, maxlenreal = STR_SIZE, lenpatt;
@@ -1123,7 +1123,7 @@ int WorkMarkers( char **ptrmp, char **ptri, char *ptro, int *lenres )
SKIPTABSPACES( ptr );
/* Comparing real parameter and restriction value */
ptrtemp = ptr;
if ( !strincmp ( *ptri, &ptr ) )
if ( !strincmp ( *ptri, &ptr, !com_or_xcom ) )
{
lenreal = stroncpy( expreal, *ptri, (ptr-ptrtemp) );
*ptri += lenreal;
@@ -1355,7 +1355,7 @@ int CheckOptional( char* ptrmp, char* ptri, char* ptro, int* lenres, int com_or_
}
break;
case '\1': /* Match marker */
if ( !WorkMarkers( &ptrmp, &ptri, ptro, lenres ) )
if ( !WorkMarkers( &ptrmp, &ptri, ptro, lenres, com_or_xcom ) )
{
if ( numBrackets - save_numBr > 0 )
{
@@ -1382,10 +1382,30 @@ int CheckOptional( char* ptrmp, char* ptri, char* ptro, int* lenres, int com_or_
}
SKIPTABSPACES( ptri );
};
if ( *ptri == '\0' )
{
do
{
SKIPTABSPACES( ptrmp );
if( *ptrmp == '[' )
{
ptrmp++;
SkipOptional( &ptrmp );
}
else if( *ptrmp == ']' )
break;
else
{
result = 0;
break;
}
}
while ( 1 );
}
Repeate = save_Repeate;
numBrackets = save_numBr;
lReplacePat = TRUE;
return result;
return result ;
}
void SkipOptional( char** ptri )
@@ -1930,9 +1950,9 @@ int truncmp (char** ptro, char** ptri, int lTrunc )
}
return 1;
}
int strincmp (char* ptro, char** ptri )
int strincmp (char* ptro, char** ptri, int lTrunc )
{
char co, ci;
char *ptrb = ptro, co, ci;
for ( ; **ptri != ',' && **ptri != '[' && **ptri != ']' &&
**ptri != '\1' && **ptri != '\0' && toupper(**ptri)==toupper(*ptro);
@@ -1944,6 +1964,11 @@ int strincmp (char* ptro, char** ptri )
( ( !ISNAME(*ptro) && ISNAME(co) ) ||
( !ISNAME(co) ) ) ) )
return 0;
else if ( lTrunc && ptro-ptrb >= 4 && ISNAME(ci) && !ISNAME(*ptro) && ISNAME(co) )
{
// while( ISNAME(**ptri) ) (*ptri)++;
return 0;
}
return 1;
}