* harbour/contrib/hbwin/hbwinole.h
* harbour/contrib/hbwin/olecore.c
+ functions hb_oleParam(), hb_oleItemToVariant() made public
* harbour/contrib/rddsql/hbrddsql.h
* harbour/contrib/rddsql/sqlbase.c
+ added NULL SDD driver. It allows to use SQLBASE, SQLMIX RDD
without any real SDD driver. It could be usefull to implement
memory/array RDD
* unspecified SDD methods are "inherited" from NULL SDD
+ harbour/contrib/rddsql/tests/arrayrdd.prg
+ "Array RDD" example added
* harbour/contrib/rddsql/sddfb/fbirddd.c
* harbour/contrib/rddsql/sddmy/mysqldd.c
* harbour/contrib/rddsql/sddodbc/odbcdd.c
* harbour/contrib/rddsql/sddpg/pgsqldd.c
* deleted empty or default SDD methods. They are inherited from
NULL SDD now
* harbour/contrib/rddsql/sddodbc/tests/test1.prg
+ added svn:keywords header
* extended to show SQLMIX index features
363 lines
12 KiB
C
363 lines
12 KiB
C
/*
|
|
* $Id$
|
|
*/
|
|
|
|
/*
|
|
* SQL Database Driver include file
|
|
*
|
|
* Copyright 2007 Mindaugas Kavaliauskas <dbtopas at dbtopas.lt>
|
|
* 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.
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef HBSQLDD_H_
|
|
#define HBSQLDD_H_
|
|
|
|
#include "hbapirdd.h"
|
|
#include "hbdbferr.h"
|
|
#include "hbapierr.h"
|
|
#include "hbapilng.h"
|
|
#include "hbapi.h"
|
|
|
|
|
|
/* New ...INFO_ constants */
|
|
#define DBI_QUERY 1001
|
|
|
|
#define RDDI_CONNECT 1001
|
|
#define RDDI_DISCONNECT 1002
|
|
#define RDDI_EXECUTE 1003
|
|
#define RDDI_ERROR 1004
|
|
#define RDDI_ERRORNO 1005
|
|
#define RDDI_NEWID 1006
|
|
#define RDDI_AFFECTEDROWS 1007
|
|
#define RDDI_QUERY 1008
|
|
|
|
|
|
/*
|
|
====================================================================
|
|
SQLBASE
|
|
====================================================================
|
|
*/
|
|
|
|
#define MAX_FIELD_NAME 64
|
|
|
|
#define SQLDD_ROWSET_INIT 256
|
|
#define SQLDD_ROWSET_RESIZE 64
|
|
|
|
#define SQLDD_FLAG_DELETED 1
|
|
#define SQLDD_FLAG_CACHED 2
|
|
|
|
|
|
typedef struct _SQLBASEAREA
|
|
{
|
|
struct _RDDFUNCS * lprfsHost; /* Virtual method table for this workarea */
|
|
USHORT uiArea; /* The number assigned to this workarea */
|
|
void * atomAlias; /* Pointer to the alias symbol for this workarea */
|
|
USHORT uiFieldExtent; /* Total number of fields allocated */
|
|
USHORT uiFieldCount; /* Total number of fields used */
|
|
LPFIELD lpFields; /* Pointer to an array of fields */
|
|
void * lpFieldExtents; /* Void ptr for additional field properties */
|
|
PHB_ITEM valResult; /* All purpose result holder */
|
|
BOOL fTop; /* TRUE if "top" */
|
|
BOOL fBottom; /* TRUE if "bottom" */
|
|
BOOL fBof; /* TRUE if "bof" */
|
|
BOOL fEof; /* TRUE if "eof" */
|
|
BOOL fFound; /* TRUE if "found" */
|
|
DBSCOPEINFO dbsi; /* Info regarding last LOCATE */
|
|
DBFILTERINFO dbfi; /* Filter in effect */
|
|
LPDBORDERCONDINFO lpdbOrdCondInfo;
|
|
LPDBRELINFO lpdbRelations; /* Parent/Child relationships used */
|
|
USHORT uiParents; /* Number of parents for this area */
|
|
USHORT heap;
|
|
USHORT heapSize;
|
|
USHORT rddID;
|
|
USHORT uiMaxFieldNameLength;
|
|
PHB_CODEPAGE cdPage; /* Area's codepage pointer */
|
|
|
|
/*
|
|
* SQLBASE additions to the workarea structure
|
|
*/
|
|
|
|
LPDBRELINFO lpdbPendingRel;
|
|
|
|
ULONG ulConnection;
|
|
struct _SQLDDCONNECTION* pConnection;
|
|
struct _SDDNODE* pSDD;
|
|
|
|
char* szQuery; /* SQL query */
|
|
|
|
ULONG ulRecNo; /* Current record number */
|
|
ULONG ulRecCount; /* Total records */
|
|
ULONG ulRecMax; /* Size of pRow, pRowFlags buffer */
|
|
|
|
void** pRow; /* array of native pointers or cached PHB_ITEM */
|
|
BYTE* pRowFlags;
|
|
|
|
void* pRecord;
|
|
BYTE bRecordFlags;
|
|
|
|
void* pResult; /* SQL result */
|
|
void* pStmt; /* SQL statement */
|
|
void* pTrans; /* SQL transaction */
|
|
|
|
void* pNatRecord;
|
|
void* pNatLength;
|
|
|
|
BOOL fFetched;
|
|
BOOL fPositioned;
|
|
BOOL fAppend;
|
|
BOOL fRecordChanged;
|
|
} SQLBASEAREA, *SQLBASEAREAP;
|
|
|
|
|
|
typedef struct _SQLDDCONNECTION
|
|
{
|
|
struct _SDDNODE * pSDD;
|
|
void* hConnection;
|
|
void* hCargo;
|
|
int iError;
|
|
char* szError;
|
|
char* szQuery;
|
|
PHB_ITEM pNewID;
|
|
ULONG ulAffectedRows;
|
|
} SQLDDCONNECTION;
|
|
|
|
|
|
/*
|
|
====================================================================
|
|
SQLMIX
|
|
====================================================================
|
|
*/
|
|
|
|
#define MIX_MAXKEYLEN 1024
|
|
#define MIX_MAXTAGNAMELEN 16
|
|
|
|
|
|
#define MIX_NODE_ORDER 2 /* >=2 */
|
|
|
|
|
|
typedef struct _MIXKEY
|
|
{
|
|
ULONG rec;
|
|
BYTE notnul;
|
|
BYTE val[ 1 ];
|
|
} MIXKEY, *PMIXKEY;
|
|
|
|
|
|
typedef struct _MIXNODE
|
|
{
|
|
UINT Leaf;
|
|
UINT KeyCount;
|
|
struct _MIXNODE* Parent;
|
|
struct _MIXNODE* Child[ MIX_NODE_ORDER + 1 ];
|
|
} MIXNODE, *PMIXNODE;
|
|
|
|
|
|
typedef struct _MIXNODELEAF
|
|
{
|
|
UINT Leaf;
|
|
UINT KeyCount;
|
|
struct _MIXNODE* Parent;
|
|
} MIXNODELEAF, *PMIXNODELEAF;
|
|
|
|
|
|
typedef struct _MIXTAG
|
|
{
|
|
struct _MIXTAG* pNext;
|
|
struct _SQLMIXAREA* pArea;
|
|
char* szName;
|
|
char* szKeyExpr;
|
|
char* szForExpr;
|
|
PHB_ITEM pKeyItem;
|
|
PHB_ITEM pForItem;
|
|
|
|
BYTE bType;
|
|
UINT uiKeyLen; /* Length of key */
|
|
UINT uiTotalLen; /* Total length of key structure */
|
|
|
|
BOOL fEof;
|
|
BOOL fBof;
|
|
BOOL fCustom;
|
|
|
|
PMIXNODE Root;
|
|
|
|
PMIXKEY CurKey;
|
|
PMIXNODE CurNode;
|
|
UINT CurPos;
|
|
|
|
PMIXKEY HotKey;
|
|
BOOL HotFor;
|
|
|
|
BYTE* pSortTable; /* National sorttable for character key tags, NULL otherwise */
|
|
} MIXTAG, *PMIXTAG;
|
|
|
|
|
|
typedef struct _SQLMIXAREA
|
|
{
|
|
struct _RDDFUNCS * lprfsHost; /* Virtual method table for this workarea */
|
|
USHORT uiArea; /* The number assigned to this workarea */
|
|
void * atomAlias; /* Pointer to the alias symbol for this workarea */
|
|
USHORT uiFieldExtent; /* Total number of fields allocated */
|
|
USHORT uiFieldCount; /* Total number of fields used */
|
|
LPFIELD lpFields; /* Pointer to an array of fields */
|
|
void * lpFieldExtents; /* Void ptr for additional field properties */
|
|
PHB_ITEM valResult; /* All purpose result holder */
|
|
BOOL fTop; /* TRUE if "top" */
|
|
BOOL fBottom; /* TRUE if "bottom" */
|
|
BOOL fBof; /* TRUE if "bof" */
|
|
BOOL fEof; /* TRUE if "eof" */
|
|
BOOL fFound; /* TRUE if "found" */
|
|
DBSCOPEINFO dbsi; /* Info regarding last LOCATE */
|
|
DBFILTERINFO dbfi; /* Filter in effect */
|
|
LPDBORDERCONDINFO lpdbOrdCondInfo;
|
|
LPDBRELINFO lpdbRelations; /* Parent/Child relationships used */
|
|
USHORT uiParents; /* Number of parents for this area */
|
|
USHORT heap;
|
|
USHORT heapSize;
|
|
USHORT rddID;
|
|
USHORT uiMaxFieldNameLength;
|
|
PHB_CODEPAGE cdPage; /* Area's codepage pointer */
|
|
|
|
/*
|
|
* SQLBASE additions to the workarea structure
|
|
*/
|
|
|
|
LPDBRELINFO lpdbPendingRel;
|
|
|
|
ULONG ulConnection;
|
|
struct _SQLDDCONNECTION* pConnection;
|
|
struct _SDDNODE* pSDD;
|
|
|
|
char* szQuery; /* SQL query */
|
|
|
|
ULONG ulRecNo; /* Current record number */
|
|
ULONG ulRecCount; /* Total records */
|
|
ULONG ulRecMax; /* Size of pRow, pRowFlags buffer */
|
|
|
|
void** pRow; /* array of native pointers or cached PHB_ITEM */
|
|
BYTE* pRowFlags;
|
|
|
|
void* pRecord;
|
|
BYTE bRecordFlags;
|
|
|
|
void* pResult; /* SQL result */
|
|
void* pStmt; /* SQL statement */
|
|
void* pTrans; /* SQL transaction */
|
|
|
|
void* pNatRecord;
|
|
void* pNatLength;
|
|
|
|
BOOL fFetched;
|
|
BOOL fPositioned;
|
|
BOOL fAppend;
|
|
BOOL fRecordChanged;
|
|
|
|
/*
|
|
* SQLMIX additions to the workarea structure
|
|
*/
|
|
|
|
PMIXTAG pTagList;
|
|
PMIXTAG pTag;
|
|
BYTE* pSortTable;
|
|
|
|
} SQLMIXAREA, *SQLMIXAREAP;
|
|
|
|
|
|
|
|
/*
|
|
====================================================================
|
|
SQLDD
|
|
====================================================================
|
|
*/
|
|
|
|
typedef HB_ERRCODE (* SDDFUNC_CONNECT )( SQLDDCONNECTION* pConnection, PHB_ITEM pItem );
|
|
typedef HB_ERRCODE (* SDDFUNC_DISCONNECT )( SQLDDCONNECTION* pConnection );
|
|
typedef HB_ERRCODE (* SDDFUNC_EXECUTE )( SQLDDCONNECTION* pConnection, PHB_ITEM pItem );
|
|
typedef HB_ERRCODE (* SDDFUNC_OPEN )( SQLBASEAREAP pArea );
|
|
typedef HB_ERRCODE (* SDDFUNC_CLOSE )( SQLBASEAREAP pArea );
|
|
typedef HB_ERRCODE (* SDDFUNC_GOTO )( SQLBASEAREAP pArea, ULONG ulRecNo );
|
|
typedef HB_ERRCODE (* SDDFUNC_GETVALUE )( SQLBASEAREAP pArea, USHORT uiIndex, PHB_ITEM pItem );
|
|
typedef HB_ERRCODE (* SDDFUNC_GETVARLEN )( SQLBASEAREAP pArea, USHORT uiIndex, ULONG * pLength );
|
|
|
|
|
|
typedef struct _SDDNODE
|
|
{
|
|
struct _SDDNODE * pNext;
|
|
|
|
const char* Name;
|
|
SDDFUNC_CONNECT Connect;
|
|
SDDFUNC_DISCONNECT Disconnect;
|
|
SDDFUNC_EXECUTE Execute;
|
|
SDDFUNC_OPEN Open;
|
|
SDDFUNC_CLOSE Close;
|
|
SDDFUNC_GOTO GoTo;
|
|
SDDFUNC_GETVALUE GetValue;
|
|
SDDFUNC_GETVARLEN GetVarLen;
|
|
} SDDNODE, * PSDDNODE;
|
|
|
|
|
|
int hb_sddRegister( PSDDNODE pSdd );
|
|
|
|
|
|
|
|
/*
|
|
====================================================================
|
|
Misc
|
|
====================================================================
|
|
*/
|
|
|
|
/* Error subcodes */
|
|
#define ESQLDD_NOTCONNECTED 1901
|
|
#define ESQLDD_INVALIDFIELD 1902
|
|
#define ESQLDD_INVALIDQUERY 1903
|
|
#define ESQLDD_START 1904
|
|
#define ESQLDD_COMMIT 1905
|
|
#define ESQLDD_STMTALLOC 1906
|
|
#define ESQLDD_STMTDESCR 1907
|
|
#define ESQLDD_STMTFREE 1908
|
|
#define ESQLDD_FETCH 1909
|
|
#define ESQLDD_LOWMEMORY 1910
|
|
#define ESQLDD_NULLSDD 1911
|
|
|
|
#endif
|