mac-rom/Toolbox/DataAccessMgr/DatabaseAccessPriv.h
Elliot Nunn 4325cdcc78 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 09:52:23 +08:00

351 lines
14 KiB
C

/*
File: DatabaseAccessPriv.h
Contains: Private header for the Data Access Manager (codename SnarfMan).
Written by: Jeff Miller
Copyright: © 1989-1990, 1992 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<15> 3/13/92 JSM Renamed this file DatabaseAccessPriv.h from SnarfMan.h, keeping
all the old revisions.
<14> 7/26/91 stb remove glue for HOpenResFile. Inline is used now when
SystemSevenOrLater is defined.
<13> 7/15/91 dba get rid of MEMERR
<12> 6/14/91 JL Changed inclusion of DatabaseAccess to AppleEvents.
<11> 4/2/90 JSM Get rid of resArrayElem (same as ResListElem), add CURMAP, macro
version of pstrcpy, and glueless HOpenResFile.
<10> 3/28/90 JSM Add RESERR and MEMERR, remove TRUE and FALSE.
<9> 3/13/90 JSM Update interface to status functions, change endLastRowLen to
endLastRowInfo in asyncVars.
<8> 3/12/90 JSM Add support for separate completion routine 'proc', result
handlers now in 'proc' resource, remove some unneeded typedef
struct tags.
<7> 2/23/90 JSM Add support for separate results handlers ('rtt#' and 'rttc'
resources).
<6> 2/20/90 JSM Remove refNum from asyncVars.
<5> 2/5/90 JSM Include Folders.h.
<4> 1/18/90 JSM Add constants to get strings for results handlers from System
file.
<3> 1/4/90 JSM Change some variable names in response to suggestions from
documentation.
<2> 12/20/89 JSM Update to use public includes.
<2.4> 12/7/89 JSM Added support for buffering partial rows in DBGetQueryResults.
<2.3> 11/7/89 JSM Added status functions, keep track of ddevs with vRefNum and
dirID.
<2.2> 10/6/89 JSM Updated to make SnarfMan a PACK.
<2.1> 9/18/89 JSM Changed kStateDone to kAllDone, general cleanup.
<2.0> 8/29/89 JSM Updated for new version 2 API.
<1.9> 8/7/89 JSM Added block comments, support for kill and results-to-text.
<1.8> 7/26/89 JSM Added support for ddev flags.
<1.7> 7/19/89 JSM Changed 'type' to 'theType' in ResListElem, 'type' to 'dataType'
elsewhere.
<1.6> 7/15/89 JSM Async stuff works now.
<1.5> 6/22/89 JSM Updated async stuff.
<1.4> 6/9/89 JSM Added more stuff to support async, not quite working yet.
<1.3> 5/31/89 JSM Reduced fields in globals, change strings in DDEVElem to
pointers, added constants for offsets in query STR#.
<1.2> 5/18/89 JSM Added #defines for resource and file types, added version to
'qrsc' definition, changed ddev and qdef interface.
<1.1> 4/28/89 JSM Added high-level information.
<1.0> 4/11/89 JSM Added to EASE for the first time.
*/
/* include Mac header files */
#include <Types.h>
#include <stdio.h>
#include <Resources.h>
#include <OSUtils.h>
#include <ToolUtils.h>
#include <Memory.h>
#include <Errors.h>
#include <Files.h>
#include <Packages.h>
#include <SANE.h>
#include <Folders.h>
#include <AppleEvents.h> /* Snarf stuff */
#include <DDEV.h> /* Snarf stuff */
/* make it easy to call ddev */
typedef pascal OSErr (*DDEVPtr)(DDEVParams *op);
/* make it easy to call qdef */
typedef pascal OSErr (*QDEFPtr)(long *sessID, QueryHandle op);
/* make it easy to call status functions for DBStartQuery and DBGetQueryResults */
typedef pascal Boolean (*statusPtr)(short message, OSErr result, short dataLen,
short dataPlaces, short dataFlags, DBType dataType, Ptr dataPtr);
/* make it easy to call result handlers */
typedef pascal OSErr (*HandlerPtr)(DBType dataType, short theLen, short thePlaces,
short theFlags, Ptr theData, Handle theText);
/* macro to zero parameter block */
#define ClearParams(x) mymemclear((char*)&x, sizeof(DDEVParams))
/* macro to copy pascal strings */
#define pstrcpy(dest, src) BlockMove(src, dest, src[0]+1)
/* don't use the ResError() and CurResFile() traps */
#define RESERR *((short*)0xA60)
#define CURMAP *((short*)0xA5A)
#define DDEVTYPE 'ddev' /* file type of ddev file */
#define QDOCTYPE 'qery' /* file type of query documents */
#define DDEVRESTYPE 'ddev' /* resource type of ddev code */
#define DDEVFLAGRESTYPE 'dflg' /* resource type of ddev flags */
#define QRSCRESTYPE 'qrsc' /* resource type of query resource */
#define QDEFRESTYPE 'qdef' /* resource type of query def proc */
#define QUERYRESTYPE 'wstr' /* resource type of queries */
#define RTTLISTRESTYPE 'rtt#' /* results to text list */
#define RTTCODERESTYPE 'proc' /* results to text code */
#define COMPCODERESTYPE 'proc' /* completion routine code */
/* note - id -5728 is first owned resource for PACK 13 */
#define RTTLISTID -5728 /* 'rtt#' specifying default system handlers */
#define HANDLERSSTR -5728 /* STR# with strings for result handlers */
#define COMPCODERESID -5727 /* 'proc' resource with completion routine */
/* offsets into STR# for strings used by result handlers */
#define BOOLEANTRUESTR 1 /* typeBoolean - true */
#define BOOLEANFALSESTR 2 /* typeBoolean - false */
#define UNKNOWNSTR 3 /* typeUnknown */
#define COLBREAKSTR 4 /* typeColBreak */
#define ROWBREAKSTR 5 /* typeRowBreak */
/* offsets into STR# for ddevName, host, etc. in query document */
#define DDEVOFFSET 1 /* ddevName */
#define HOSTOFFSET 2 /* host */
#define USEROFFSET 3 /* user */
#define PASSWORDOFFSET 4 /* password */
#define CONNSTROFFSET 5 /* connStr */
/* arbitrary number for indicating an async high level call is done */
/* make sure this doesn't match any of the ddev messages! */
#define kAllDone 200
/************************************************/
/* Structure of package header. */
/* Used by InitDBPack to compare version nums. */
/************************************************/
typedef struct {
short bra; /* branch instruction to dispatcher */
ResType pack; /* 'PACK' */
short number; /* id of package */
short version; /* version */
}
PackHeader,
*PackHeaderPtr,
**PackHeaderHndl;
/************************************************/
/* Low memory global with a handle to our PACK. */
/* This is App2Packs (0xBC8) + 4 * (the package */
/* id - 8) = 0xBC8 + 4 * (13 - 8). */
/************************************************/
#define DataAccessMgrPack *((PackHeaderHndl*)(0xBC8 + 0x14))
/************************************************/
/* Structure for global variables. */
/* Under 7.0, a pointer to this structure is */
/* stored in the emSnarfGlobals low mem global. */
/************************************************/
typedef struct {
struct ddevElem **ddevRoot; /* root of ddev list */
struct snarfSessElem **snarfRoot; /* root of snarf ID list */
DBAsyncParmBlkPtr pbRoot; /* list of queued parameter blocks */
short numHandlers; /* number of handlers in array */
struct HandlerRecord **handlers; /* handle to array of result handlers */
Handle handlerRes; /* handle to 'proc' for result handlers */
Handle completionRes; /* handle to 'proc' for completion routine */
}
snarfGlob,
*snarfGlobPtr,
**snarfGlobHndl;
/************************************************/
/* Structure to keep track of ddevs. */
/* A list of handles to these structures is */
/* hung off ddevRoot in the globals. */
/************************************************/
typedef struct ddevElem {
struct ddevElem **next; /* next element in list */
Boolean exists; /* if ddev file deleted */
Boolean canAsync; /* true if can do async calls */
char *name; /* ddev name in STR resource */
char *fname; /* ddev file name */
short vRefNum; /* where located (System Folder) */
long dirID; /* dirID where located */
DDEVPtr *ddev; /* handle to (detached) ddev resource */
long ddevStorage; /* ddev private storage */
struct sessElem **sessRoot; /* list of active sessions */
}
ddevElem,
*ddevElemPtr,
**ddevElemHndl;
/************************************************/
/* Structure to keep track of sessions for an */
/* individual ddev. A list of handles to these */
/* structures is hung off sessRoot in each */
/* ddevElem. */
/************************************************/
typedef struct sessElem {
struct sessElem **next; /* next element in list */
struct ddevElem **parent; /* ddev who owns session */
long sessID; /* ID as seen by ddev */
}
sessElem,
*sessElemPtr,
**sessElemHndl;
/************************************************/
/* Structure to keep track of snarf IDs. */
/* A snarf ID is a unique identifier for */
/* sessions across all ddevs. A list of */
/* handles to these structures is hung off */
/* snarfRoot in the globals. */
/************************************************/
typedef struct snarfSessElem {
struct snarfSessElem **next; /* next element in list */
long snarfID; /* ID as seen by app */
long processID; /* parent process - not used yet! */
struct sessElem **sess; /* handle to session element */
ResultsRecord *oldResults; /* leftover results for DBGetQueryResults */
short currCol; /* number of cols in leftover results */
}
snarfSessElem,
*snarfSessElemPtr,
**snarfSessElemHndl;
/************************************************/
/* Partial structure of 'qrsc'. Since there */
/* are variable length arrays of 'wstr' IDs and */
/* resources, it only goes up to the start of */
/* the 'wstr' array. */
/************************************************/
typedef struct {
short version; /* version */
short qdefID; /* QDEF ID */
short strID; /* STR# with ddevName etc. */
short currQuery; /* current query */
short numQueries; /* number of queries that follow */
short queryArray[]; /* array of 'wstr' IDs */
/* After the variable 'wstr' array, it looks like (see resArrayList below):
short numRes;
resArrayElem res[numRes];
*/
}
queryRes,
*queryResPtr,
**queryResHndl;
/************************************************/
/* Structure of list of resource elements in a */
/* 'qrsc'. See queryRes structure above. */
/************************************************/
typedef struct {
short numRes; /* number of elements that follow */
ResListElem res[]; /* array of resource elements - same as in QueryRecord */
}
resArrayList,
*resArrayListPtr;
/************************************************/
/* Structure for async vars when making async */
/* calls to Data Access Mgr routines. A pointer*/
/* to this structure is hung off the reserved */
/* field in the DBAsyncParamBlockRec. Make */
/* sure this matches definition in */
/* DataAccessMgr.a. */
/************************************************/
typedef struct {
DBAsyncParmBlkPtr next; /* next pb in list */
DBAsyncParmBlkPtr asyncPB; /* async pb passed in to routine */
DDEVParamsPtr params; /* pointer to ddev parameters */
short currAction; /* current action - selector or kAllDone */
Boolean executing; /* true if call executing */
Boolean highlevel; /* true if this is a highlevel call */
ddevElemHndl ddevH; /* handle to ddev - need to keep for kill */
statusPtr statusProc; /* status function for high level stuff */
/* variables for DBInit */
Boolean firstsess; /* true if first session for ddev */
Boolean filler;
long *sessIDPtr; /* pointer to session ID */
/* variables for DBEnd */
snarfSessElemHndl snarf; /* handle to snarf session cell */
/* also used by DBGetQueryResults */
/* variables for DBGetConnInfo */
long *returnedIDPtr; /* pointer to returned sess ID */
long *versionPtr; /* pointer to version */
long *startPtr; /* pointer to start time */
OSErr *statePtr; /* pointer to state */
/* variables for DBGetSessionNum */
short *sessNumPtr; /* pointer to returned sess number */
/* variables for DBGetErr */
long *err1Ptr; /* pointer to error 1 */
long *err2Ptr; /* pointer to error 2 */
/* variables for DBGetItem */
DBType *dataTypePtr; /* pointer to type of data */
short *lenPtr; /* pointer to length of data */
short *placesPtr; /* pointer to places */
short *flagsPtr; /* pointer to flags */
/* variables for DBStartQuery */
QueryHandle query; /* query for DBSend */
Handle queryText; /* text for DBSend */
char queryState; /* state of query handle */
char textState; /* state of text handle */
/* variables for DBGetQueryResults */
long sessID; /* session ID */
ResultsRecord *results; /* to hold results */
ResultsRecord *oldResults; /* old results stored in snarf elem */
DBType dataType; /* data type of current column */
long timeout; /* timeout for DBGetItem */
short len, places, flags; /* stuff for current column */
long currOffset; /* current offset into data */
long oldCurrOffset; /* current offset into old data */
long endLastRowData; /* end of last row (data) */
long endLastRowInfo; /* end of last row (info) */
short currCol; /* current column */
Boolean firsttime; /* true if getting first column */
Boolean doingGetItemInfo; /* true if DBGetItem for info only */
}
asyncVars,
*asyncVarsPtr;
/************************************************/
/* Structure to keep track of result handlers. */
/* A handle to a dynamic array of these records */
/* is kept in the handlers field of the globals.*/
/* The array is sorted based on type. */
/************************************************/
typedef struct HandlerRecord {
DBType type; /* what data type this handler is for */
HandlerPtr theHandler; /* pointer to actual procedure */
struct HandlerRecord **next; /* for multiple handlers for one type */
THz hZone; /* current zone when InstallHandler called */
Boolean isSysHandler; /* TRUE if system handler */
char filler;
}
HandlerRecord,
*HandlerRecordPtr,
**HandlerRecordHandle;