{*********************************************************} {* FlashFiler: Network messaging types & constants *} {*********************************************************} (* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is TurboPower FlashFiler * * The Initial Developer of the Original Code is * TurboPower Software * * Portions created by the Initial Developer are Copyright (C) 1996-2002 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * ***** END LICENSE BLOCK ***** *) {$I ffdefine.inc} unit ffnetmsg; interface uses Windows, Messages, SysUtils, ffllbase; {===Network message constants===} const ffm_LostConnection = WM_USER + $0FF1; ffm_StartTblReindex = WM_USER + $0FF2; ffm_StartTblPack = WM_USER + $0FF3; ffm_StartTblRestructure = WM_USER + $0FF4; ffm_CopyData = WM_USER + $0FF5; ffm_CallSingleUserServer = WM_USER + $0FF6; ffm_KeepAlive = WM_USER + $0FF7; ffmtRequest = 1; { Request sent from client to server } ffmtReply = 2; { Reply sent from server to client } const {general or non-BDE type} ffnmDetachServer = $0002; ffnmEndOfStream = $0003; ffnmDetachServerJIC = $0004; ffnmACK = $0005; ffnmRequestServerName = $0006; ffnmServerNameReply = $0007; ffnmNewServerAdvert = $0008; ffnmCheckSecureComms = $0009; ffnmCheckConnection = $000A; {!!!!} ffnmGetServerDateTime = $000C; ffnmCallServer = $000D; ffnmClientSetTimeout = $000E; ffnmAttachServer = $000F; ffnmGetServerSystemTime = $0010; {!!.10} ffnmGetServerGUID = $0011; {!!.10} ffnmGetServerID = $0012; {!!.10} ffnmMultiPartMessage = $00FF; {database related} ffnmDatabaseOpen = $0100; ffnmDatabaseClose = $0101; ffnmDatabaseAliasList = $0102; ffnmDatabaseTableList = $0103; ffnmDatabaseAddAlias = $0104; ffnmDatabaseOpenNoAlias = $0105; ffnmDatabaseDeleteAlias = $0107; ffnmDatabaseChgAliasPath = $0108; ffnmDatabaseSetTimeout = $0109; ffnmDatabaseGetFreeSpace = $010A; ffnmDatabaseModifyAlias = $010B; ffnmDatabaseGetAliasPath = $010C; ffnmDatabaseTableExists = $010D; ffnmDatabaseTableLockedExclusive = $010E; {session related} ffnmSessionAdd = $0200; ffnmSessionClose = $0201; ffnmSessionGetCurrent = $0202; ffnmSessionSetCurrent = $0203; ffnmSessionSetTimeout = $0204; ffnmSessionCloseInactTbl = $0205; {!!.06} {rebuild processes} ffnmReindexTable = $0300; ffnmPackTable = $0301; ffnmRestructureTable = $0302; ffnmGetRebuildStatus = $0303; {transaction stuff} ffnmStartTransaction = $0400; ffnmEndTransaction = $0401; ffnmStartTransactionWith = $0402; {!!.10} {table stuff} ffnmOpenTable = $0500; ffnmAcqTableLock = $0510; ffnmRelTableLock = $0511; ffnmIsTableLocked = $0512; ffnmGetTableDictionary = $0513; ffnmBuildTable = $0514; ffnmDeleteTable = $0515; ffnmRenameTable = $0516; ffnmGetTableRecCount = $0517; ffnmEmptyTable = $0518; ffnmAddIndex = $0519; ffnmDropIndex = $051A; ffnmSetTableAutoIncValue = $051B; ffnmGetTableAutoIncValue = $051C; ffnmGetTableRecCountAsync= $051D; {!!.10} ffnmGetTableVersion = $051E; {!!.11} {BLOB stuff} ffnmCreateBLOB = $0600; ffnmDeleteBLOB = $0601; ffnmReadBLOB = $0602; ffnmGetBLOBLength = $0603; ffnmTruncateBLOB = $0604; ffnmWriteBLOB = $0605; ffnmAddFileBLOB = $0607; ffnmFreeBLOB = $0608; ffnmListBLOBFreeSpace = $0609; {!!.03} ffnmListBLOBSegments = $060A; {!!.03} {cursor stuff} ffnmCursorSetToBegin = $0700; ffnmCursorSetToEnd = $0701; ffnmCursorClose = $0702; ffnmCursorGetBookmark = $0703; ffnmCursorSetToBookmark = $0704; ffnmCursorSetToKey = $0705; ffnmCursorSwitchToIndex = $0706; ffnmCursorSetRange = $0707; ffnmCursorResetRange = $0708; ffnmCursorCompareBMs = $0709; ffnmCursorClone = $070A; ffnmCursorSetToCursor = $070B; ffnmCursorSetFilter = $070C; ffnmCursorOverrideFilter = $070D; ffnmCursorRestoreFilter = $070E; ffnmCursorSetTimeout = $070F; ffnmCursorCopyRecords = $0710; {!!.02} ffnmCursorDeleteRecords = $0711; {!!.06} {record stuff} ffnmRecordGet = $0800; ffnmRecordGetNext = $0801; ffnmRecordGetPrev = $0802; ffnmRecordRelLock = $0803; ffnmRecordDelete = $0804; ffnmRecordInsert = $0805; ffnmRecordModify = $0806; ffnmRecordExtractKey = $0807; ffnmRecordGetForKey = $0808; ffnmRecordGetBatch = $0809; ffnmRecordInsertBatch = $080A; ffnmRecordGetForKey2 = $080C; ffnmRecordDeleteBatch = $080D; ffnmRecordIsLocked = $080E; {SQL stuff} ffnmSQLAlloc = $0900; ffnmSQLExec = $0901; ffnmSQLExecDirect = $0902; ffnmSQLFree = $0903; ffnmSQLPrepare = $0904; ffnmSQLSetParams = $0905; {Server Operations} ffnmServerRestart = $0A00; ffnmServerShutdown = $0A01; ffnmServerStartup = $0A02; ffnmServerStop = $0A03; { Server Info } ffnmServerIsReadOnly = $0B00; ffnmServerStatistics = $0B01; {!!.10} ffnmCmdHandlerStatistics = $0B02; {!!.10} ffnmTransportStatistics = $0B03; {!!.10} ffnmUser = $4000; {===Network message types===} type PffnmHeader = ^TffnmHeader; TffnmHeader = packed record {General message header} nmhMsgID : longint; {..message identifier} nmhMsgLen : longint; {..size of this message, incl. header} nmhTotalSize: longint; {..total size of data over all messages} nmhClientID : TffClientID;{..client ID (either from or to)} nmhRequestID : longInt; {..client's requestID} nmhErrorCode: TffResult; {..BDE error code, or 0 for success} nmhTimeout : longInt; {..timeout in milliseconds} nmhFirstPart: boolean; {..is this the 1st part of the message?} nmhLastPart : boolean; {..is this the last part of the message?} nmhDataType : TffNetMsgDataType; {..is message bytearray or stream?} nmhMsgType : byte; {..is this a request or a reply? Declared as byte so that you may create additional msg types. } nmhData : byte; {..data marker} end; PffsmHeader = ^TffsmHeader; TffsmHeader = packed record {Sub-message header} smhMsgID : longint; {..message identifier} smhReplyLen : longint; {..size of this reply (header + data)} smhErrorCode: TffWord16; {..BDE error code, or 0 for success} smhDataType : TffNetMsgDataType; {..is message bytearray or stream?} smhFiller : byte; {..filler} smhData : byte; {..data marker} end; const ffc_NetMsgHeaderSize = sizeof(TffnmHeader) - sizeof(byte); ffc_SubMsgHeaderSize = sizeof(TffsmHeader) - sizeof(byte); {NOTE: all message crackers are in two parts: the request data record and the reply data record. If a message cracker has only a request record, then all the data for the reply is contained in the message header (and is generally just the error code). Similarly if cracker only has a reply record then all the data for the request is contained in the header (and is generally the client ID and the message number). If neither is present, the the data for the request and reply is entirely contained in the message header. } {===general or non-BDE type==========================================} type {attach to server} PffnmAttachServerReq = ^TffnmAttachServerReq; TffnmAttachServerReq = packed record {Begin !!.03} {$IFDEF IsDelphi} ClientName : TffNetName; {$ELSE} ClientName : TffNetNameShr; {$ENDIF} {End !!.03} UserID : TffName; Timeout : longInt; ClientVersion : longInt; end; PffnmAttachServerRpy = ^TffnmAttachServerRpy; TffnmAttachServerRpy = packed record ClientID : TffClientID; VersionNumber : longint; Code : longint; LastMsgIntvl : longint; KAIntvl : longint; KARetries : longint; IsSecure : boolean; end; {request server name - DATAGRAM ONLY} PffnmRequestServerName = ^TffnmRequestServerName; TffnmRequestServerName = packed record MsgID : longint; {always ffnmRequestServerName} end; {server name reply - DATAGRAM ONLY} PffnmServerNameReply = ^TffnmServerNameReply; TffnmServerNameReply = packed record MsgID : longint; {always ffnmServerNameReply} {Begin !!.03} {$IFDEF IsDelphi} ServerLocalName : TffNetName; ServerNetName : TffNetName; {$ELSE} ServerLocalName : TffNetNameShr; ServerNetName : TffNetNameShr; {$ENDIF} {End !!.03} end; PffnmGetServerDateTimeRpy = ^TffnmGetServerDateTimeRpy; TffnmGetServerDateTimeRpy = packed record ServerNow : TDateTime; end; PffnmGetServerSystemTimeRpy = ^TffnmGetServerSystemTimeRpy; {begin !!.10} TffnmGetServerSystemTimeRpy = packed record ServerNow : TSystemTime; end; PffnmGetServerGUIDRpy = ^TffnmGetServerGUIDRpy; TffnmGetServerGUIDRpy = packed record GUID : TGUID; end; PffnmGetServerIDRpy = ^TffnmGetServerIDRpy; TffnmGetServerIDRpy = packed record UniqueID : TGUID; end; {end !!.10} PffnmCallServerReq = ^TffnmCallServerReq; TffnmCallServerReq = packed record {Begin !!.03} {$IFDEF IsDelphi} ServerName : TffNetName; {$ELSE} ServerName : TffNetNameShr; {$ENDIF} {End !!.03} end; PffnmCallServerRpy = ^TffnmCallServerRpy; TffnmCallServerRpy = packed record ClientID : TffClientID; end; { Set a client's timeout value.} PffnmClientSetTimeoutReq = ^TffnmClientSetTimeoutReq; TffnmClientSetTimeoutReq = packed record Timeout : longInt; end; { Reply as an error in message header. } {===database related=================================================} type {open database} PffnmDatabaseOpenReq = ^TffnmDatabaseOpenReq; TffnmDatabaseOpenReq = packed record Alias : TffName; OpenMode : TffOpenMode; ShareMode : TffShareMode; Timeout : longInt; end; PffnmDatabaseOpenRpy = ^TffnmDatabaseOpenRpy; TffnmDatabaseOpenRpy = packed record DatabaseID : TffDatabaseID; end; {close database (reply packet contained in header)} PffnmDatabaseCloseReq = ^TffnmDatabaseCloseReq; TffnmDatabaseCloseReq = packed record DatabaseID : TffDatabaseID; end; {get list of tables in database (reply packet is a stream)} PffnmDatabaseTableListReq = ^TffnmDatabaseTableListReq; TffnmDatabaseTableListReq = packed record DatabaseID : TffDatabaseID; Mask : TffFileNameExt; end; {add new alias database} PffnmDatabaseAddAliasReq = ^TffnmDatabaseAddAliasReq; TffnmDatabaseAddAliasReq = packed record Alias : TffName; Path : TffPath; {Begin !!.11} CheckDisk : Boolean; end; {reply as error in message header} PffnmOldDatabaseAddAliasReq = ^TffnmOldDatabaseAddAliasReq; TffnmOldDatabaseAddAliasReq = packed record Alias : TffName; Path : TffPath; end; { Used for backwards compatibility. } {End !!.11} {open database without alias} PffnmDatabaseOpenNoAliasReq = ^TffnmDatabaseOpenNoAliasReq; TffnmDatabaseOpenNoAliasReq = packed record Path : TffPath; OpenMode : TffOpenMode; ShareMode : TffShareMode; Timeout : longInt; end; PffnmDatabaseOpenNoAliasRpy = ^TffnmDatabaseOpenNoAliasRpy; TffnmDatabaseOpenNoAliasRpy = packed record DatabaseID : TffDatabaseID; end; {delete an alias} PffnmDatabaseDeleteAliasReq = ^TffnmDatabaseDeleteAliasReq; TffnmDatabaseDeleteAliasReq = packed record Alias : TffName; end; {reply as error in message header} {retrieve the alias' path} PffnmDatabaseGetAliasPathReq = ^TffnmDatabaseGetAliasPathReq; TffnmDatabaseGetAliasPathReq = packed record Alias : TffName; end; PffnmDatabaseGetAliasPathRpy = ^TffnmDatabaseGetAliasPathRpy; TffnmDatabaseGetAliasPathRpy = packed record Path : TffPath; end; PffnmDatabaseChgAliasPathReq = ^TffnmDatabaseChgAliasPathReq; TffnmDatabaseChgAliasPathReq = packed record Alias : TffName; NewPath : TffPath; {Begin !!.11} CheckDisk : Boolean; end; {reply as error in message header} PffnmOldDatabaseChgAliasPathReq = ^TffnmOldDatabaseChgAliasPathReq; TffnmOldDatabaseChgAliasPathReq = packed record Alias : TffName; NewPath : TffPath; end; { Used for backwards compatibility. } {End !!.11} PffnmDatabaseSetTimeoutReq = ^TffnmDatabaseSetTimeoutReq; TffnmDatabaseSetTimeoutReq = packed record DatabaseID : TffDatabaseID; Timeout : longInt; end; { Reply as error in message header. } PffnmDatabaseGetFreeSpaceReq = ^TffnmDatabaseGetFreeSpaceReq; TffnmDatabaseGetFreeSpaceReq = packed record DatabaseID : TffDatabaseID; end; PffnmDatabaseGetFreeSpaceRpy = ^TffnmDatabaseGetFreeSpaceRpy; TffnmDatabaseGetFreeSpaceRpy = packed record FreeSpace : Longint; end; PffnmDatabaseModifyAliasReq = ^TffnmDatabaseModifyAliasReq; TffnmDatabaseModifyAliasReq = packed record ClientID : TffClientID; Alias : TffName; NewName : TffName; NewPath : TffPath; {Begin !!.11} CheckDisk : Boolean; end; {reply as error in message header} PffnmOldDatabaseModifyAliasReq = ^TffnmOldDatabaseModifyAliasReq; TffnmOldDatabaseModifyAliasReq = packed record ClientID : TffClientID; Alias : TffName; NewName : TffName; NewPath : TffPath; end; { Used for backwards compatibility. } {End !!.11} PffnmDatabaseTableExistsReq = ^TffnmDatabaseTableExistsReq; TffnmDatabaseTableExistsReq = packed record DatabaseID : TffDatabaseID; TableName : TffTableName; end; PffnmDatabaseTableExistsRpy = ^TffnmDatabaseTableExistsRpy; TffnmDatabaseTableExistsRpy = packed record Exists : Boolean; end; PffnmDatabaseTableLockedExclusiveReq = ^TffnmDatabaseTableLockedExclusiveReq; TffnmDatabaseTableLockedExclusiveReq = packed record DatabaseID : TffDatabaseID; TableName : TffTableName; end; PffnmDatabaseTableLockedExclusiveRpy = ^TffnmDatabaseTableLockedExclusiveRpy; TffnmDatabaseTableLockedExclusiveRpy = packed record Locked : Boolean; end; {===session related==================================================} type {add session} PffnmSessionAddReq = ^TffnmSessionAddReq; TffnmSessionAddReq = packed record Timeout : longInt; end; PffnmSessionAddRpy = ^TffnmSessionAddRpy; TffnmSessionAddRpy = packed record SessionID : TffSessionID; end; {close session (reply packet contained in header)} PffnmSessionCloseReq = ^TffnmSessionCloseReq; TffnmSessionCloseReq = packed record SessionID : TffSessionID; end; {Begin !!.06} { Close unused tables } PffnmSessionCloseInactiveTblReq = ^TffnmSessionCloseInactiveTblReq; TffnmSessionCloseInactiveTblReq = packed record SessionID : TffSessionID; end; {End !!.06} {get current session ID (request packet contained in header)} PffnmSessionGetCurrentRpy = ^TffnmSessionGetCurrentRpy; TffnmSessionGetCurrentRpy = packed record SessionID : TffSessionID; end; {set current session ID (reply packet contained in header)} PffnmSessionSetCurrentReq = ^TffnmSessionSetCurrentReq; TffnmSessionSetCurrentReq = packed record SessionID : TffSessionID; end; { Set session's timeout value. } PffnmSessionSetTimeoutReq = ^TffnmSessionSetTimeoutReq; TffnmSessionSetTimeoutReq = packed record SessionID : TffSessionID; Timeout : longInt; end; { Reply as error in message header. } {===rebuild processes================================================} type {reindex table} PffnmReindexTableReq = ^TffnmReindexTableReq; TffnmReindexTableReq = packed record DatabaseID : TffDatabaseID; TableName : TffTableName; IndexName : TffDictItemName; IndexNumber: longint; end; PffnmReindexTableRpy = ^TffnmReindexTableRpy; TffnmReindexTableRpy = packed record RebuildID : longint; end; {pack table} PffnmPackTableReq = ^TffnmPackTableReq; TffnmPackTableReq = packed record DatabaseID : TffDatabaseID; TableName : TffTableName; end; PffnmPackTableRpy = ^TffnmPackTableRpy; TffnmPackTableRpy = packed record RebuildID : longint; end; {restructure table} PffnmRestructureTableRpy = ^TffnmRestructureTableRpy; TffnmRestructureTableRpy = packed record RebuildID : longint; end; {get rebuild status} PffnmGetRebuildStatusReq = ^TffnmGetRebuildStatusReq; TffnmGetRebuildStatusReq = packed record RebuildID : longint; end; PffnmGetRebuildStatusRpy = ^TffnmGetRebuildStatusRpy; TffnmGetRebuildStatusRpy = packed record Status : TffRebuildStatus; IsPresent : boolean; end; {===transaction stuff================================================} type PffnmStartTransactionReq = ^TffnmStartTransactionReq; TffnmStartTransactionReq = packed record DatabaseID : TffDatabaseID; FailSafe : boolean; end; PffnmEndTransactionReq = ^TffnmEndTransactionReq; TffnmEndTransactionReq = packed record DatabaseID : TffTransID; ToBeCommitted : boolean; end; {===table stuff======================================================} type PffnmOpenTableReq = ^TffnmOpenTableReq; TffnmOpenTableReq = packed record DatabaseID : TffDatabaseID; TableName : TffTableName; IndexName : TffDictItemName; IndexNumber: longint; OpenMode : TffOpenMode; ShareMode : TffShareMode; Timeout : longInt; end; {open table replies with a stream} PffnmAcqTableLockReq = ^TffnmAcqTableLockReq; TffnmAcqTableLockReq = packed record CursorID : TffCursorID; LockType : TffLockType; end; {reply as error in message header} PffnmRelTableLockReq = ^TffnmRelTableLockReq; TffnmRelTableLockReq = packed record CursorID : TffCursorID; AllLocks : boolean; LockType : TffLockType; end; {reply as error in message header} PffnmIsTableLockedReq = ^TffnmIsTableLockedReq; TffnmIsTableLockedReq = packed record CursorID : TffCursorID; LockType : TffLockType; end; PffnmIsTableLockedRpy = ^TffnmIsTableLockedRpy; TffnmIsTableLockedRpy = packed record IsLocked : boolean; end; PffnmGetTableDictionaryReq = ^TffnmGetTableDictionaryReq; TffnmGetTableDictionaryReq = packed record DatabaseID : TffDatabaseID; TableName : TffTableName; end; {reply is a stream containing the dictionary} PffnmDeleteTableReq = ^TffnmDeleteTableReq; TffnmDeleteTableReq = packed record DatabaseID : TffDatabaseID; TableName : TffTableName; end; {reply as error in message header} PffnmRenameTableReq = ^TffnmRenameTableReq; TffnmrenameTableReq = packed record DatabaseID : TffDatabaseID; OldTableName : TffTableName; NewTableName : TffTableName; end; {reply as error in message header} PffnmGetTableRecCountReq = ^TffnmGetTableRecCountReq; TffnmGetTableRecCountReq = packed record CursorID : TffCursorID; end; PffnmGetTableRecCountRpy = ^TffnmGetTableRecCountRpy; TffnmGetTableRecCountRpy = packed record RecCount : longint; end; {Begin !!.10} PffnmGetTableRecCountAsyncReq = ^TffnmGetTableRecCountAsyncReq; TffnmGetTableRecCountAsyncReq = packed record CursorID : longint; end; PffnmGetTableRecCountAsyncRpy = ^TffnmGetTableRecCountAsyncRpy; TffnmGetTableRecCountAsyncRpy = packed record RebuildID : longint; end; {End !!.10} PffnmEmptyTableReq = ^TffnmEmptyTableReq; TffnmEmptyTableReq = packed record DatabaseID : TffDatabaseID; CursorID : TffCursorID; TableName : TffTableName; end; {reply as error in message header} PffnmAddIndexReq = ^TffnmAddIndexReq; TffnmAddIndexReq = packed record DatabaseID : TffDatabaseID; CursorID : TffCursorID; TableName : TffTableName; IndexDesc : TffIndexDescriptor; end; PffnmAddIndexRpy = ^TffnmAddIndexRpy; TffnmAddIndexRpy = packed record RebuildID : longint; end; PffnmDropIndexReq = ^TffnmDropIndexReq; TffnmDropIndexReq = packed record DatabaseID : TffDatabaseID; CursorID : TffCursorID; TableName : TffTableName; IndexName : TffDictItemName; IndexNumber: longint; end; {reply as error in message header} PffnmSetTableAutoIncValueReq = ^TffnmSetTableAutoIncValueReq; TffnmSetTableAutoIncValueReq = packed record CursorID : TffCursorID; AutoIncValue : TffWord32; end; {reply as error in message header} PffnmGetTableAutoIncValueReq = ^TffnmGetTableAutoIncValueReq; TffnmGetTableAutoIncValueReq = packed record CursorID : TffCursorID; end; PffnmGetTableAutoIncValueRpy = ^TffnmGetTableAutoIncValueRpy; TffnmGetTableAutoIncValueRpy = packed record AutoIncValue : TffWord32; end; {Begin !!.11} { Get table version. } PffnmGetTableVersionReq = ^TffnmGetTableVersionReq; TffnmGetTableVersionReq = packed record DatabaseID : TffDatabaseID; TableName : TffTableName; end; PffnmGetTableVersionRpy = ^TffnmGetTableVersionRpy; TffnmGetTableVersionRpy = packed record Version : Longint; end; {End !!.11} {===BLOB stuff=======================================================} type PffnmCreateBLOBReq = ^TffnmCreateBLOBReq; TffnmCreateBLOBReq = packed record CursorID : TffCursorID; end; PffnmCreateBLOBRpy = ^TffnmCreateBLOBRpy; TffnmCreateBLOBRpy = packed record BLOBNr : TffInt64; end; PffnmDeleteBLOBReq = ^TffnmDeleteBLOBReq; TffnmDeleteBLOBReq = packed record CursorID : TffCursorID; BLOBNr : TffInt64; end; {reply as error in message header} PffnmGetBLOBLengthReq = ^TffnmGetBLOBLengthReq; TffnmGetBLOBLengthReq = packed record CursorID : TffCursorID; BLOBNr : TffInt64; end; PffnmGetBLOBLengthRpy = ^TffnmGetBLOBLengthRpy; TffnmGetBLOBLengthRpy = packed record BLOBLength : longint; end; PffnmTruncateBLOBReq = ^TffnmTruncateBLOBReq; TffnmTruncateBLOBReq = packed record CursorID : TffCursorID; BLOBNr : TffInt64; BLOBLength : longint; end; {reply as error in message header} PffnmReadBLOBReq = ^TffnmReadBLOBReq; TffnmReadBLOBReq = packed record CursorID : TffCursorID; BLOBNr : TffInt64; Offset : longint; Len : longint; end; PffnmReadBLOBRpy = ^TffnmReadBLOBRpy; TffnmReadBLOBRpy = packed record BytesRead : TffWord32; {!!.06} BLOB : TffVarMsgField; end; PffnmWriteBLOBReq = ^TffnmWriteBLOBReq; TffnmWriteBLOBReq = packed record CursorID : TffCursorID; BLOBNr : TffInt64; Offset : longint; Len : longint; BLOB : TffVarMsgField; end; {reply as error in message header} PffnmFreeBLOBReq = ^TffnmFreeBLOBReq; TffnmFreeBLOBReq = packed record CursorID : longint; BLOBNr : TffInt64; ReadOnly : boolean; end; {reply as error in message header} PffnmAddFileBLOBReq = ^TffnmAddFileBLOBReq; TffnmAddFileBLOBReq = packed record CursorID : TffCursorID; FileName : TffFullFileName; end; PffnmAddFileBLOBRpy = ^TffnmAddFileBLOBRpy; TffnmAddFileBLOBRpy = packed record BLOBNr : TffInt64; end; {Begin !!.03} {get list of free BLOB segments - reply is stream} PffnmGetBLOBFreeSpaceReq = ^TffnmGetBLOBFreeSpaceReq; TffnmGetBLOBFreeSpaceReq = packed record CursorID : TffCursorID; InMemory : Boolean; end; {get list of segments used by BLOB - reply is stream} PffnmListBLOBSegmentsReq = ^TffnmListBLOBSegmentsReq; TffnmListBLOBSegmentsReq = packed record CursorID : TffCursorID; BLOBNr : TffInt64; end; {End !!.03} {===Cursor stuff=====================================================} type PffnmCursorSetToBeginReq = ^TffnmCursorSetToBeginReq; TffnmCursorSetToBeginReq = packed record CursorID : TffCursorID; end; {reply as error in message header} PffnmCursorSetToEndReq = ^TffnmCursorSetToEndReq; TffnmCursorSetToEndReq = packed record CursorID : TffCursorID; end; {reply as error in message header} PffnmCursorCloseReq = ^TffnmCursorCloseReq; TffnmCursorCloseReq = packed record CursorID : TffCursorID; end; {reply as error in message header} PffnmCursorGetBookmarkReq = ^TffnmCursorGetBookmarkReq; TffnmCursorGetBookmarkReq = packed record CursorID : TffCursorID; BookmarkSize : longint; end; {reply is a byte Array} PffnmCursorSetToBookmarkReq = ^TffnmCursorSetToBookmarkReq; TffnmCursorSetToBookmarkReq = packed record CursorID : TffCursorID; BookmarkSize : longint; Bookmark : TffVarMsgField; end; {reply as error in message header} PffnmCursorCompareBMsReq = ^TffnmCursorCompareBMsReq; TffnmCursorCompareBMsReq = packed record CursorID : TffCursorID; BookmarkSize : longint; Bookmark1 : TffVarMsgField; Bookmark2 : TffVarMsgField; end; PffnmCursorCompareBMsRpy = ^TffnmCursorCompareBMsRpy; TffnmCursorCompareBMsRpy = packed record CompareResult : longint; end; PffnmCursorSetToKeyReq = ^TffnmCursorSetToKeyReq; TffnmCursorSetToKeyReq = packed record CursorID : TffCursorID; Action : TffSearchKeyAction; DirectKey : boolean; FieldCount : longint; PartialLen : longint; KeyDataLen : longint; KeyData : TffVarMsgField; end; {reply as error in message header} PffnmCursorSwitchToIndexReq = ^TffnmCursorSwitchToIndexReq; TffnmCursorSwitchToIndexReq = packed record CursorID : TffCursorID; IndexName : TffDictItemName; IndexNumber: longint; PosnOnRec : boolean; end; {reply as error in message header} PffnmCursorResetRangeReq = ^TffnmCursorResetRangeReq; TffnmCursorResetRangeReq = packed record CursorID : TffCursorID; end; {reply as error in message header} PffnmCursorSetRangeReq = ^TffnmCursorSetRangeReq; TffnmCursorSetRangeReq = packed record CursorID : TffCursorID; DirectKey : boolean; FieldCount1 : longint; PartialLen1 : longint; KeyLen1 : longint; KeyIncl1 : boolean; FieldCount2 : longint; PartialLen2 : longint; KeyLen2 : longint; KeyIncl2 : boolean; KeyData1 : TffVarMsgField; {key or record data depending on Direct Key} KeyData2 : TffVarMsgField; {key or record data depending on Direct Key} end; {reply as an error in message header} PffnmCursorCloneReq = ^TffnmCursorCloneReq; TffnmCursorCloneReq = packed record CursorID : TffCursorID; OpenMode : TffOpenMode; end; PffnmCursorCloneRpy = ^TffnmCursorCloneRpy; TffnmCursorCloneRpy = packed record CursorID : TffCursorID; end; PffnmCursorSetToCursorReq = ^TffnmCursorSetToCursorReq; TffnmCursorSetToCursorReq = packed record DestCursorID : TffCursorID; SrcCursorID : TffCursorID; end; {reply as an error in message header} PffnmCursorSetFilterReq = ^TffnmCursorSetFilterReq; TffnmCursorSetFilterReq = packed record CursorID : TffCursorID; Timeout : TffWord32; ExprTree : TffVarMsgField; end; PffnmCursorOverrideFilterReq = ^TffnmCursorOverrideFilterReq; TffnmCursorOverrideFilterReq = packed record CursorID : longint; Timeout : TffWord32; ExprTree : TffVarMsgField; end; PffnmCursorRestoreFilterReq = ^TffnmCursorRestoreFilterReq; TffnmCursorRestoreFilterReq = packed record CursorID : longint; end; { Set a cursor's timeout value. } PffnmCursorSetTimeoutReq = ^TffnmCursorSetTimeoutReq; TffnmCursorSetTimeoutReq = packed record CursorID : TffCursorID; Timeout : longInt; end; { Reply as an error in message header. } {Begin !!.02} { Copy records from one cursor to another. } PffnmCursorCopyRecordsReq = ^TffnmCursorCopyRecordsReq; TffnmCursorCopyRecordsReq = packed record SrcCursorID : TffCursorID; DestCursorID : TffCursorID; CopyBLOBs : Boolean; end; { Reply as an error in message header. } {End !!.02} {Begin !!.06} { Delete records from cursor. } PffnmCursorDeleteRecordsReq = ^TffnmCursorDeleteRecordsReq; TffnmCursorDeleteRecordsReq = packed record CursorID : TffCursorID; end; { Reply as an error in message header. } {End !!.06} {===Record stuff=====================================================} type PffnmRecordGetReq = ^TffnmRecordGetReq; TffnmRecordGetReq = packed record CursorID : TffCursorID; RecLen : longint; BookmarkSize : longint; LockType : TffLockType; end; {reply is a byte Array} PffnmRecordGetNextReq = ^TffnmRecordGetNextReq; TffnmRecordGetNextReq = packed record CursorID : TffCursorID; RecLen : longint; BookmarkSize : longint; LockType : TffLockType; end; {reply is a byte Array} PffnmRecordGetPrevReq = ^TffnmRecordGetPrevReq; TffnmRecordGetPrevReq = packed record CursorID : TffCursorID; RecLen : longint; BookmarkSize : longint; LockType : TffLockType; end; {reply is a Byte Array} PffnmRecordRelLockReq = ^TffnmRecordRelLockReq; TffnmRecordRelLockReq = packed record CursorID : TffCursorID; AllLocks : Boolean; end; {reply as error in message header} PffnmRecordDeleteReq = ^TffnmRecordDeleteReq; TffnmRecordDeleteReq = packed record CursorID : TffCursorID; RecLen : longint; {if non 0, record is returned} end; {reply is a Byte Array} PffnmRecordInsertReq = ^TffnmRecordInsertReq; TffnmRecordInsertReq = packed record CursorID : TffCursorID; RecLen : longint; BookmarkSize : longint; LockType : TffLockType; Data : TffVarMsgField; end; {reply as error in message header} PffnmRecordModifyReq = ^TffnmRecordModifyReq; TffnmRecordModifyReq = packed record CursorID : TffCursorID; RecLen : longint; BookmarkSize : longint; RelLock : Boolean; Data : TffVarMsgField; end; {reply as error in message header} PffnmRecordExtractKeyReq = ^TffnmRecordExtractKeyReq; TffnmRecordExtractKeyReq = packed record CursorID : TffCursorID; KeyLen : longint; ForCurrentRecord : boolean; Data : TffVarMsgField; end; {reply is a byte array} PffnmRecordGetForKeyReq = ^TffnmRecordGetForKeyReq; TffnmRecordGetForKeyReq = packed record CursorID : TffCursorID; DirectKey : boolean; FieldCount : longint; PartialLen : longint; RecLen : longint; KeyDataLen : longint; BookmarkSize : longint; KeyData : TffVarMsgField; end; {reply is a byte array} PffnmRecordGetForKeyReq2 = ^TffnmRecordGetForKeyReq2; TffnmRecordGetForKeyReq2 = packed record CursorID : longint; DirectKey : boolean; FieldCount : longint; PartialLen : longint; RecLen : longint; KeyDataLen : longint; BookmarkSize : longint; FirstCall : Boolean; KeyData : TffVarMsgField; end; {reply is a byte array} PffnmRecordGetBatchReq = ^TffnmRecordGetBatchReq; TffnmRecordGetBatchReq = packed record CursorID : TffCursorID; RecLen : longint; RecCount : longint; {count of records requested} {note: RecLen*RecCount < 64K} end; PffnmRecordGetBatchRpy = ^TffnmRecordGetBatchRpy; TffnmRecordGetBatchRpy = packed record RecCount : longint; {count of records read} Error : TffResult; {Result of the last GetRecord call} RecArray : TffVarMsgField; {place holder for array of records} end; PffnmRecordDeleteBatchReq = ^TffnmRecordDeleteBatchReq; TffnmRecordDeleteBatchReq = packed record CursorID : TffCursorID; BMCount : Longint; BMLen : Longint; BMArray : TffVarMsgField; end; {reply as a longint array with BMCount elements} PffnmRecordIsLockedReq = ^TffnmRecordIsLockedReq; TffnmRecordIsLockedReq = packed record CursorID : TffCursorID; LockType : TffLockType; end; PffnmRecordIsLockedRpy = ^TffnmRecordIsLockedRpy; TffnmRecordIsLockedRpy = packed record IsLocked : Boolean; end; PffnmRecordInsertBatchReq = ^TffnmRecordInsertBatchReq; TffnmRecordInsertBatchReq = packed record CursorID : TffCursorID; RecLen : longint; RecCount : longint; {count of records requested} {note: RecLen*RecCount < 64K} RecArray : TffVarMsgField; {place holder for array of records} end; {reply is a longint array with RecCount elements} {===SQL stuff========================================================} type PffnmSQLAllocReq = ^TffnmSQLAllocReq; TffnmSQLAllocReq = packed record DatabaseID : TffDatabaseID; Timeout : longInt; end; PffnmSQLAllocRpy = ^TffnmSQLAllocRpy; TffnmSQLAllocRpy = packed record StmtID : TffSqlStmtID; end; PffnmSQLExecReq = ^TffnmSQLExecReq; TffnmSQLExecReq = packed record StmtID : TffSqlStmtID; OpenMode : TffOpenMode; end; {Exec replies with a stream. If the execution succeeded, the first item in the stream is the server's cursorID & the second item is the cursor's data dictionary. If the execution failed, the first item in the stream is the integer length of an error message. The second item in the stream is the error message. } PffnmSQLExecDirectReq = ^TffnmSQLExecDirectReq; TffnmSQLExecDirectReq = packed record DatabaseID : TffDatabaseID; {!!.03 - Start} Timeout : longInt; OpenMode : TffOpenMode; Query : TffVarMsgField; {place holder for ZString query text} end; {!!.03 - End} {ExecDirect replies with a stream containing a cursorID, a data dictionary, and an optional error message. If cursorID is zero then no data dictionary. Error message is preceded by its length. If length is zero then no error message. } PffnmSQLFreeReq = ^TffnmSQLFreeReq; TffnmSQLFreeReq = packed record StmtID : TffSqlStmtID; end; {reply as error in message header} PffnmSQLPrepareReq = ^TffnmSQLPrepareReq; TffnmSQLPrepareReq = packed record StmtID : TffSqlStmtID; Query : TffVarMsgField; { place holder for ZString query text } end; {Prepare replies with an error code and a stream. If the error code is DBIERR_NONE then the stream is empty. Otherwise the stream contains an error message. The error message is preceded by its length. } { Note: There is no data structure for SetParams. The parameters are transmitted in stream format. } {SetParams replies with an error code and a stream. If the error code is DBIERR_NONE then the stream is empty. Otherwise the stream contains an error message. The error message is preceded by its length. } {===Server Info stuff================================================} { Server Info } PffnmServerIsReadOnlyRpy = ^TffnmServerIsReadOnlyRpy; TffnmServerIsReadOnlyRpy = packed record IsReadOnly : boolean; end; PffnmServerStatisticsRpy = ^TffnmServerStatisticsRpy; {begin !!.10} TffnmServerStatisticsRpy = packed record Stats : TffServerStatistics; end; PffnmCmdHandlerStatisticsReq = ^TffnmCmdHandlerStatisticsReq; TffnmCmdHandlerStatisticsReq = packed record CmdHandlerIdx : Integer; end; PffnmCmdHandlerStatisticsRpy = ^TffnmCmdHandlerStatisticsRpy; TffnmCmdHandlerStatisticsRpy = packed record Stats : TffCommandHandlerStatistics; end; PffnmTransportStatisticsReq = ^TffnmTransportStatisticsReq; TffnmTransportStatisticsReq = packed record CmdHandlerIdx : Integer; TransportIdx : Integer; end; PffnmTransportStatisticsRpy = ^TffnmTransportStatisticsRpy; TffnmTransportStatisticsRpy = packed record Stats : TffTransportStatistics; end; {end !!.10} implementation end.