mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-28 13:52:37 +00:00
351 lines
14 KiB
C
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;
|
||
|
|