home *** CD-ROM | disk | FTP | other *** search
/ Australian Personal Computer 2000 October / tst.iso / programs / borland / RUNIMAGE / DELPHI40 / DOC / DBTABLES.INT < prev    next >
Encoding:
Text File  |  1998-06-17  |  29.5 KB  |  796 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Borland Delphi Visual Component Library         }
  5. {       BDE Data Access                                 }
  6. {                                                       }
  7. {       Copyright (c) 1995,98 Inprise Corporation       }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit DBTables;
  12.  
  13. {$R-}
  14.  
  15. interface
  16.  
  17. uses Windows, SysUtils, Graphics, Classes, Controls, Db, DBCommon, Bde, SMIntf,
  18.   StdVCL;
  19.  
  20. const
  21.  
  22. { SQL Trace buffer size }
  23.  
  24.   smTraceBufSize = 32767 + SizeOf(TraceDesc);
  25.  
  26. { TDBDataSet flags }
  27.  
  28.   dbfOpened     = 0;
  29.   dbfPrepared   = 1;
  30.   dbfExecSQL    = 2;
  31.   dbfTable      = 3;
  32.   dbfFieldList  = 4;
  33.   dbfIndexList  = 5;
  34.   dbfStoredProc = 6;
  35.   dbfExecProc   = 7;
  36.   dbfProcDesc   = 8;
  37.   dbfDatabase   = 9;
  38.  
  39. type
  40.  
  41. { Forward declarations }
  42.  
  43.   TDBError = class;
  44.   TSession = class;
  45.   TDatabase = class;
  46.   TBDEDataSet = class;
  47.   TDBDataSet = class;
  48.   TTable = class;
  49.  
  50. { Exception classes }
  51.  
  52.   EDBEngineError = class(EDatabaseError)
  53.   public
  54.     constructor Create(ErrorCode: DBIResult);
  55.     destructor Destroy; override;
  56.     property ErrorCount: Integer;
  57.     property Errors[Index: Integer]: TDBError;
  58.   end;
  59.  
  60.   ENoResultSet = class(EDatabaseError);
  61.  
  62. { BDE error information type }
  63.  
  64.   TDBError = class
  65.   public
  66.     constructor Create(Owner: EDBEngineError; ErrorCode: DBIResult;
  67.       NativeError: Longint; Message: PChar);
  68.     property Category: Byte;
  69.     property ErrorCode: DBIResult;
  70.     property SubCode: Byte;
  71.     property Message: string;
  72.     property NativeError: Longint;
  73.   end;
  74.  
  75. { TLocale }
  76.  
  77.   TLocale = Pointer;
  78.  
  79. { TBDECallback }
  80.  
  81.   TBDECallbackEvent = function(CBInfo: Pointer): CBRType of Object;
  82.  
  83.   TBDECallback = class
  84.   protected
  85.     function Invoke(CallType: CBType; CBInfo: Pointer): CBRType;
  86.   public
  87.     constructor Create(AOwner: TObject; Handle: hDBICur; CBType: CBType;
  88.       CBBuf: Pointer; CBBufSize: Integer; CallbackEvent: TBDECallbackEvent;
  89.       Chain: Boolean);
  90.     destructor Destroy; override;
  91.   end;
  92.  
  93. { TSessionList }
  94.  
  95.   TSessionList = class(TObject)
  96.   public
  97.     constructor Create;
  98.     destructor Destroy; override;
  99.     property CurrentSession: TSession;
  100.     function FindSession(const SessionName: string): TSession;
  101.     procedure GetSessionNames(List: TStrings);
  102.     function OpenSession(const SessionName: string): TSession;
  103.     property Count: Integer;
  104.     property Sessions[Index: Integer]: TSession; default;
  105.     property List[const SessionName: string]: TSession;
  106.   end;
  107.  
  108. { TSession }
  109.  
  110.   TConfigModes = (cfmVirtual, cfmPersistent, cfmSession);
  111.   TConfigMode = set of TConfigModes;
  112.  
  113.   TPasswordEvent = procedure(Sender: TObject; var Continue: Boolean) of Object;
  114.  
  115.   TDatabaseEvent = (dbOpen, dbClose, dbAdd, dbRemove, dbAddAlias, dbDeleteAlias,
  116.     dbAddDriver, dbDeleteDriver);
  117.  
  118.   TDatabaseNotifyEvent = procedure(DBEvent: TDatabaseEvent; const Param) of object;
  119.  
  120.   TBDEInitProc = procedure(Session: TSession);
  121.  
  122.   TTraceFlag = (tfQPrepare, tfQExecute, tfError, tfStmt, tfConnect,
  123.     tfTransact, tfBlob, tfMisc, tfVendor, tfDataIn, tfDataOut);
  124.  
  125.   TTraceFlags = set of TTraceFlag;
  126.  
  127.   TSession = class(TComponent)
  128.   protected
  129.     procedure Loaded; override;
  130.     procedure ModifyConfigParams(const Path, Node: string; List: TStrings);
  131.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  132.     property OnDBNotify: TDatabaseNotifyEvent;
  133.     property BDEOwnsLoginCbDb: Boolean;
  134.     procedure SetName(const NewName: TComponentName); override;
  135.   public
  136.     constructor Create(AOwner: TComponent); override;
  137.     destructor Destroy; override;
  138.     procedure AddAlias(const Name, Driver: string; List: TStrings);
  139.     procedure AddDriver(const Name: string; List: TStrings);
  140.     procedure AddStandardAlias(const Name, Path, DefaultDriver: string);
  141.     property ConfigMode: TConfigMode;
  142.     procedure AddPassword(const Password: string);
  143.     procedure Close;
  144.     procedure CloseDatabase(Database: TDatabase);
  145.     procedure DeleteAlias(const Name: string);
  146.     procedure DeleteDriver(const Name: string);
  147.     procedure DropConnections;
  148.     function FindDatabase(const DatabaseName: string): TDatabase;
  149.     procedure GetAliasNames(List: TStrings);
  150.     procedure GetAliasParams(const AliasName: string; List: TStrings);
  151.     function GetAliasDriverName(const AliasName: string): string;
  152.     procedure GetConfigParams(const Path, Section: string; List: TStrings);
  153.     procedure GetDatabaseNames(List: TStrings);
  154.     procedure GetDriverNames(List: TStrings);
  155.     procedure GetDriverParams(const DriverName: string; List: TStrings);
  156.     function GetPassword: Boolean;
  157.     procedure GetTableNames(const DatabaseName, Pattern: string;
  158.       Extensions, SystemTables: Boolean; List: TStrings);
  159.     procedure GetStoredProcNames(const DatabaseName: string; List: TStrings);
  160.     function IsAlias(const Name: string): Boolean;
  161.     procedure ModifyAlias(Name: string; List: TStrings);
  162.     procedure ModifyDriver(Name: string; List: TStrings);
  163.     procedure Open;
  164.     function OpenDatabase(const DatabaseName: string): TDatabase;
  165.     procedure RemoveAllPasswords;
  166.     procedure RemovePassword(const Password: string);
  167.     procedure SaveConfigFile;
  168.     property DatabaseCount: Integer;
  169.     property Databases[Index: Integer]: TDatabase;
  170.     property Handle: HDBISES;
  171.     property Locale: TLocale;
  172.     property TraceFlags: TTraceFlags;
  173.   published
  174.     property Active: Boolean default False;
  175.     property AutoSessionName: Boolean default False;
  176.     property KeepConnections: Boolean default True;
  177.     property NetFileDir: string;
  178.     property PrivateDir: string;
  179.     property SessionName: string;
  180.     property SQLHourGlass: Boolean default True;
  181.     property OnPassword: TPasswordEvent;
  182.     property OnStartup: TNotifyEvent;
  183.   end;
  184.  
  185. { TParamList }
  186.  
  187.   TFieldDescList = array of FLDDesc;
  188.  
  189.   TParamList = class(TObject)
  190.   public
  191.     constructor Create(Params: TStrings);
  192.     destructor Destroy; override;
  193.     property Buffer: PChar;
  194.     property FieldCount: Integer;
  195.     property FieldDescs: TFieldDescList;
  196.   end;
  197.  
  198. { TDatabase }
  199.  
  200.   TTransIsolation = (tiDirtyRead, tiReadCommitted, tiRepeatableRead);
  201.  
  202.   TLoginEvent = procedure(Database: TDatabase;
  203.     LoginParams: TStrings) of object;
  204.  
  205.   TDatabase = class(TComponent)
  206.   protected
  207.     procedure Loaded; override;
  208.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  209.   public
  210.     constructor Create(AOwner: TComponent); override;
  211.     destructor Destroy; override;
  212.     procedure ApplyUpdates(const DataSets: array of TDBDataSet);
  213.     procedure Close;
  214.     procedure CloseDataSets;
  215.     procedure Commit;
  216.     procedure FlushSchemaCache(const TableName: string);
  217.     procedure Open;
  218.     procedure Rollback;
  219.     procedure StartTransaction;
  220.     procedure ValidateName(const Name: string);
  221.     property DataSetCount: Integer;
  222.     property DataSets[Index: Integer]: TDBDataSet;
  223.     property Directory: string;
  224.     property Handle: HDBIDB;
  225.     property IsSQLBased: Boolean;
  226.     property InTransaction: Boolean;
  227.     property Locale: TLocale;
  228.     property Session: TSession;
  229.     property Temporary: Boolean;
  230.     property SessionAlias: Boolean;
  231.     property TraceFlags: TTraceFlags;
  232.   published
  233.     property AliasName: string;
  234.     property Connected: Boolean default False;
  235.     property DatabaseName: string;
  236.     property DriverName: string;
  237.     property Exclusive: Boolean default False;
  238.     property HandleShared: Boolean default False;
  239.     property KeepConnection: Boolean default True;
  240.     property LoginPrompt: Boolean default True;
  241.     property Params: TStrings;
  242.     property ReadOnly: Boolean default False;
  243.     property SessionName: string;
  244.     property TransIsolation: TTransIsolation default tiReadCommitted;
  245.     property OnLogin: TLoginEvent;
  246.   end;
  247.  
  248. { TBDEDataSet }
  249.  
  250.   TRecNoStatus = (rnDbase, rnParadox, rnNotSupported);
  251.   TUpdateAction = (uaFail, uaAbort, uaSkip, uaRetry, uaApplied);
  252.   TUpdateRecordTypes = set of (rtModified, rtInserted, rtDeleted, rtUnmodified);
  253.   TUpdateErrorEvent = procedure(DataSet: TDataSet; E: EDatabaseError;
  254.     UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction) of object;
  255.   TUpdateRecordEvent = procedure(DataSet: TDataSet; UpdateKind: TUpdateKind;
  256.     var UpdateAction: TUpdateAction) of object;
  257.   TDataSetUpdateObject = class(TComponent)
  258.   protected
  259.     function GetDataSet: TBDEDataSet; virtual; abstract;
  260.     procedure SetDataSet(ADataSet: TBDEDataSet); virtual; abstract;
  261.     procedure Apply(UpdateKind: TUpdateKind); virtual; abstract;
  262.     property DataSet: TBDEDataSet;
  263.   end;
  264.  
  265.   TKeyIndex = (kiLookup, kiRangeStart, kiRangeEnd, kiCurRangeStart,
  266.     kiCurRangeEnd, kiSave);
  267.  
  268.   PKeyBuffer = ^TKeyBuffer;
  269.   TKeyBuffer = record
  270.     Modified: Boolean;
  271.     Exclusive: Boolean;
  272.     FieldCount: Integer;
  273.     Data: record end;
  274.   end;
  275.  
  276.   PRecInfo = ^TRecInfo;
  277.   TRecInfo = record
  278.     RecordNumber: Longint;
  279.     UpdateStatus: TUpdateStatus;
  280.     BookmarkFlag: TBookmarkFlag;
  281.   end;
  282.  
  283.   TBlobDataArray = array of TBlobData;
  284.  
  285.   TBDEDataSet = class(TDataSet)
  286.   protected
  287.     procedure ActivateFilters;
  288.     procedure AddFieldDesc(FieldDescs: TFieldDescList; var DescNo: Integer;
  289.       var FieldID: Integer; RequiredFields: TBits; FieldDefs: TFieldDefs);
  290.     procedure AllocCachedUpdateBuffers(Allocate: Boolean);
  291.     procedure AllocKeyBuffers;
  292.     function AllocRecordBuffer: PChar; override;
  293.     function BCDToCurr(BCD: Pointer; var Curr: Currency): Boolean; override;
  294.     function CachedUpdateCallBack(CBInfo: Pointer): CBRType;
  295.     procedure CheckCachedUpdateMode;
  296.     procedure CheckSetKeyMode;
  297.     procedure ClearCalcFields(Buffer: PChar); override;
  298.     procedure CloseCursor; override;
  299.     procedure CloseBlob(Field: TField); override;
  300.     function CreateExprFilter(const Expr: string;
  301.       Options: TFilterOptions; Priority: Integer): HDBIFilter;
  302.     function CreateFuncFilter(FilterFunc: Pointer;
  303.       Priority: Integer): HDBIFilter;
  304.     function CreateHandle: HDBICur; virtual;
  305.     function CreateLookupFilter(Fields: TList; const Values: Variant;
  306.       Options: TLocateOptions; Priority: Integer): HDBIFilter;
  307.     function CurrToBCD(const Curr: Currency; BCD: Pointer; Precision,
  308.       Decimals: Integer): Boolean; override;
  309.     procedure DataEvent(Event: TDataEvent; Info: Longint); override;
  310.     procedure DeactivateFilters;
  311.     procedure DestroyHandle; virtual;
  312.     procedure DestroyLookupCursor; virtual;
  313.     function FindRecord(Restart, GoForward: Boolean): Boolean; override;
  314.     function ForceUpdateCallback: Boolean;
  315.     procedure FreeKeyBuffers;
  316.     procedure FreeRecordBuffer(var Buffer: PChar); override;
  317.     procedure FreeStatementLocale(var Value: TLocale);
  318.     procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
  319.     function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
  320.     function GetCanModify: Boolean; override;
  321.     function GetFieldFullName(Field: TField): string; override;
  322.     function GetIndexField(Index: Integer): TField;
  323.     function GetIndexFieldCount: Integer;
  324.     function GetIsIndexField(Field: TField): Boolean; override;
  325.     function GetKeyBuffer(KeyIndex: TKeyIndex): PKeyBuffer;
  326.     function GetKeyExclusive: Boolean;
  327.     function GetKeyFieldCount: Integer;
  328.     function GetLookupCursor(const KeyFields: string;
  329.       CaseInsensitive: Boolean): HDBICur; virtual;
  330.     procedure GetParamData(Param: TParam; Buffer: Pointer; const DrvLocale: TLocale);
  331.     function GetParamDataSize(Param: TParam): Integer;
  332.     function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
  333.     function GetRecordCount: Integer; override;
  334.     function GetRecNo: Integer; override;
  335.     function GetRecordSize: Word; override;
  336.     function GetStateFieldValue(State: TDataSetState; Field: TField): Variant; override;
  337.     function GetStatementLocale(StmtHandle: HDBIStmt): TLocale;
  338.     procedure GetObjectTypeNames(Fields: TFields);
  339.     function GetUpdatesPending: Boolean;
  340.     function GetUpdateRecordSet: TUpdateRecordTypes;
  341.     function InitKeyBuffer(Buffer: PKeyBuffer): PKeyBuffer;
  342.     procedure InitRecord(Buffer: PChar); override;
  343.     procedure InternalAddRecord(Buffer: Pointer; Append: Boolean); override;
  344.     procedure InternalCancel; override;
  345.     procedure InternalClose; override;
  346.     procedure InternalDelete; override;
  347.     procedure InternalEdit; override;
  348.     procedure InternalFirst; override;
  349.     procedure InternalGotoBookmark(Bookmark: TBookmark); override;
  350.     procedure InternalHandleException; override;
  351.     procedure InternalInitFieldDefs; override;
  352.     procedure InternalInitRecord(Buffer: PChar); override;
  353.     procedure InternalInsert; override;
  354.     procedure InternalLast; override;
  355.     procedure InternalOpen; override;
  356.     procedure InternalPost; override;
  357.     procedure InternalRefresh; override;
  358.     procedure InternalSetToRecord(Buffer: PChar); override;
  359.     function IsCursorOpen: Boolean; override;
  360.     function LocateRecord(const KeyFields: string; const KeyValues: Variant;
  361.       Options: TLocateOptions; SyncCursor: Boolean): Boolean;
  362.     function MapsToIndex(Fields: TList; CaseInsensitive: Boolean): Boolean;
  363.     procedure OpenCursor(InfoQuery: Boolean); override;
  364.     procedure PostKeyBuffer(Commit: Boolean);
  365.     procedure PrepareCursor; virtual;
  366.     function ProcessUpdates(UpdCmd: DBIDelayedUpdCmd): DBIResult;
  367.     function ResetCursorRange: Boolean;
  368.     procedure BlockReadNext; override;
  369.     procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
  370.     procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
  371.     procedure SetCachedUpdates(Value: Boolean);
  372.     function SetCursorRange: Boolean;
  373.     procedure SetBlockReadSize(Value: Integer); override;
  374.     procedure SetFieldData(Field: TField; Buffer: Pointer); override;
  375.     procedure SetFilterData(const Text: string; Options: TFilterOptions);
  376.     procedure SetFilterHandle(var Filter: HDBIFilter; Value: HDBIFilter);
  377.     procedure SetFiltered(Value: Boolean); override;
  378.     procedure SetFilterOptions(Value: TFilterOptions); override;
  379.     procedure SetFilterText(const Value: string); override;
  380.     procedure SetIndexField(Index: Integer; Value: TField);
  381.     procedure SetKeyBuffer(KeyIndex: TKeyIndex; Clear: Boolean);
  382.     procedure SetKeyExclusive(Value: Boolean);
  383.     procedure SetKeyFieldCount(Value: Integer);
  384.     procedure SetKeyFields(KeyIndex: TKeyIndex; const Values: array of const);
  385.     procedure SetLinkRanges(MasterFields: TList);
  386.     procedure SetLocale(Value: TLocale);
  387.     procedure SetStateFieldValue(State: TDataSetState; Field: TField; const Value: Variant); override;
  388.     procedure SetOnFilterRecord(const Value: TFilterRecordEvent); override;
  389.     procedure SetOnUpdateError(UpdateEvent: TUpdateErrorEvent);
  390.     procedure SetRecNo(Value: Integer); override;
  391.     procedure SetupCallBack(Value: Boolean);
  392.     procedure SetUpdateRecordSet(RecordTypes: TUpdateRecordTypes);
  393.     procedure SetUpdateObject(Value: TDataSetUpdateObject);
  394.     procedure SwitchToIndex(const IndexName, TagName: string);
  395.     function UpdateCallbackRequired: Boolean;
  396.     property StmtHandle: HDBIStmt;
  397.   public
  398.     constructor Create(AOwner: TComponent); override;
  399.     destructor Destroy; override;
  400.     procedure ApplyUpdates;
  401.     function BookmarkValid(Bookmark: TBookmark): Boolean; override;
  402.     procedure Cancel; override;
  403.     procedure CancelUpdates;
  404.     property CacheBlobs: Boolean default True;
  405.     function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer; override;
  406.     procedure CommitUpdates;
  407.     function ConstraintCallBack(Req: DsInfoReq; var ADataSources: DataSources): DBIResult; stdcall;
  408.     function ConstraintsDisabled: Boolean;
  409.     function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
  410.     procedure DisableConstraints;
  411.     procedure EnableConstraints;
  412.     procedure FetchAll;
  413.     procedure FlushBuffers;
  414.     function GetCurrentRecord(Buffer: PChar): Boolean; override;
  415.     function GetBlobFieldData(FieldNo: Integer; var Buffer: TBlobByteData): Integer; override;
  416.     function GetFieldData(Field: TField; Buffer: Pointer): Boolean; overload; override;
  417.     function GetFieldData(FieldNo: Integer; Buffer: Pointer): Boolean; overload; override;
  418.     procedure GetIndexInfo;
  419.     function Locate(const KeyFields: string; const KeyValues: Variant;
  420.       Options: TLocateOptions): Boolean; override;
  421.     function Lookup(const KeyFields: string; const KeyValues: Variant;
  422.       const ResultFields: string): Variant; override;
  423.     function IsSequenced: Boolean; override;
  424.     procedure Post; override;
  425.     procedure RevertRecord;
  426.     function UpdateStatus: TUpdateStatus; override;
  427.     function Translate(Src, Dest: PChar; ToOem: Boolean): Integer;  override;
  428.     property ExpIndex: Boolean;
  429.     property Handle: HDBICur;
  430.     property KeySize: Word;
  431.     property Locale: TLocale;
  432.     property UpdateObject: TDataSetUpdateObject;
  433.     property UpdatesPending: Boolean;
  434.     property UpdateRecordTypes: TUpdateRecordTypes;
  435.   published
  436.     property Active;
  437.     property AutoCalcFields;
  438.     property CachedUpdates: Boolean default False;
  439.     property ObjectView default False;
  440.     property BeforeOpen;
  441.     property AfterOpen;
  442.     property BeforeClose;
  443.     property AfterClose;
  444.     property BeforeInsert;
  445.     property AfterInsert;
  446.     property BeforeEdit;
  447.     property AfterEdit;
  448.     property BeforePost;
  449.     property AfterPost;
  450.     property BeforeCancel;
  451.     property AfterCancel;
  452.     property BeforeDelete;
  453.     property AfterDelete;
  454.     property BeforeScroll;
  455.     property AfterScroll;
  456.     property OnCalcFields;
  457.     property OnDeleteError;
  458.     property OnEditError;
  459.     property OnNewRecord;
  460.     property OnPostError;
  461.     property OnUpdateError: TUpdateErrorEvent;
  462.     property OnUpdateRecord: TUpdateRecordEvent;
  463.   end;
  464.  
  465. { TNestedTable }
  466.  
  467.   TNestedTable = class(TBDEDataSet)
  468.   protected
  469.     function CreateHandle: HDBICur; override;
  470.     procedure DoAfterPost; override;
  471.     procedure DoBeforeInsert; override;
  472.     procedure InternalPost; override;
  473.   public
  474.     constructor Create(AOwner: TComponent); override;
  475.   published
  476.     property DataSetField;
  477.     property ObjectView default True;
  478.   end;
  479.   
  480. { TDBDataSet }
  481.  
  482.   TDBFlags = set of 0..15;
  483.  
  484.   TDBDataSet = class(TBDEDataSet)
  485.   protected
  486.     procedure CloseCursor; override;
  487.     function ConstraintsStored: Boolean;
  488.     procedure Disconnect; virtual;
  489.     function GetProvider: IProvider; virtual;
  490.     procedure OpenCursor(InfoQuery: Boolean); override;
  491.     function SetDBFlag(Flag: Integer; Value: Boolean): Boolean; virtual;
  492.     property DBFlags: TDBFlags;
  493.     property UpdateMode: TUpdateMode default upWhereAll;
  494.   public
  495.     function CheckOpen(Status: DBIResult): Boolean;
  496.     procedure CloseDatabase(Database: TDatabase);
  497.     procedure GetProviderAttributes(List: TList); override;
  498.     function OpenDatabase: TDatabase;
  499.     property Database: TDatabase;
  500.     property DBHandle: HDBIDB;
  501.     property DBLocale: TLocale;
  502.     property DBSession: TSession;
  503.     property Provider: IProvider;
  504.   published
  505.     property DatabaseName: string;
  506.     property Filter;
  507.     property Filtered;
  508.     property FilterOptions;
  509.     property SessionName: string;
  510.     property OnFilterRecord;
  511.   end;
  512.  
  513. { TTable }
  514.  
  515.   TBatchMode = (batAppend, batUpdate, batAppendUpdate, batDelete, batCopy);
  516.   TTableType = (ttDefault, ttParadox, ttDBase, ttFoxPro, ttASCII);
  517.   TLockType = (ltReadLock, ltWriteLock);
  518.   TIndexName = type string;
  519.  
  520.   TIndexDescList = array of IDXDesc;
  521.  
  522.   TValCheckList = array of VCHKDesc;
  523.  
  524.   TIndexFiles = class(TStringList)
  525.   public
  526.     constructor Create(AOwner: TTable);
  527.     function Add(const S: string): Integer; override;
  528.     procedure Clear; override;
  529.     procedure Delete(Index: Integer); override;
  530.     procedure Insert(Index: Integer; const S: string); override;
  531.   end;
  532.  
  533.   TTable = class(TDBDataSet)
  534.   protected
  535.     function CreateHandle: HDBICur; override;
  536.     procedure DataEvent(Event: TDataEvent; Info: Longint); override;
  537.     procedure DefChanged(Sender: TObject); override;
  538.     procedure DestroyHandle; override;
  539.     procedure DestroyLookupCursor; override;
  540.     procedure DoOnNewRecord; override;
  541.     procedure EncodeFieldDesc(var FieldDesc: FLDDesc;
  542.       const Name: string; DataType: TFieldType; Size, Precision: Word);
  543.     procedure EncodeIndexDesc(var IndexDesc: IDXDesc;
  544.       const Name, FieldExpression: string; Options: TIndexOptions;
  545.       const DescFields: string = '');
  546.     function GetCanModify: Boolean; override;
  547.     function GetDataSource: TDataSource; override;
  548.     function GetHandle(const IndexName, IndexTag: string): HDBICur;
  549.     function GetLanguageDriverName: string;
  550.     function GetLookupCursor(const KeyFields: string;
  551.       CaseInsensitive: Boolean): HDBICur; override;
  552.     procedure InitFieldDefs; override;
  553.     function GetFileName: string;
  554.     function GetTableType: TTableType;
  555.     function IsProductionIndex(const IndexName: string): Boolean;
  556.     function NativeTableName: PChar;
  557.     procedure PrepareCursor; override;
  558.     procedure UpdateIndexDefs; override;
  559.     property MasterLink: TMasterDataLink;
  560.   public
  561.     constructor Create(AOwner: TComponent); override;
  562.     destructor Destroy; override;
  563.     function BatchMove(ASource: TBDEDataSet; AMode: TBatchMode): Longint;
  564.     procedure AddIndex(const Name, Fields: string; Options: TIndexOptions;
  565.       const DescFields: string = '');
  566.     procedure ApplyRange;
  567.     procedure CancelRange;
  568.     procedure CloseIndexFile(const IndexFileName: string);
  569.     procedure CreateTable;
  570.     procedure DeleteIndex(const Name: string);
  571.     procedure DeleteTable;
  572.     procedure EditKey;
  573.     procedure EditRangeEnd;
  574.     procedure EditRangeStart;
  575.     procedure EmptyTable;
  576.     function FindKey(const KeyValues: array of const): Boolean;
  577.     procedure FindNearest(const KeyValues: array of const);
  578.     procedure GetDetailLinkFields(MasterFields, DetailFields: TList); override;
  579.     procedure GetIndexNames(List: TStrings);
  580.     procedure GetProviderAttributes(List: TList); override;
  581.     procedure GotoCurrent(Table: TTable);
  582.     function GotoKey: Boolean;
  583.     procedure GotoNearest;
  584.     procedure LockTable(LockType: TLockType);
  585.     procedure OpenIndexFile(const IndexName: string);
  586.     procedure RenameTable(const NewTableName: string);
  587.     procedure SetKey;
  588.     procedure SetRange(const StartValues, EndValues: array of const);
  589.     procedure SetRangeEnd;
  590.     procedure SetRangeStart;
  591.     procedure UnlockTable(LockType: TLockType);
  592.     property Exists: Boolean;
  593.     property IndexFieldCount: Integer;
  594.     property IndexFields[Index: Integer]: TField;
  595.     property KeyExclusive: Boolean;
  596.     property KeyFieldCount: Integer;
  597.     property TableLevel: Integer;
  598.   published
  599.     property Constraints stored ConstraintsStored;
  600.     property DefaultIndex: Boolean default True;
  601.     property Exclusive: Boolean default False;
  602.     property FieldDefs stored FieldDefsStored;
  603.     property IndexDefs: TIndexDefs;
  604.     property IndexFieldNames: string;
  605.     property IndexFiles: TStrings;
  606.     property IndexName: string;
  607.     property MasterFields: string;
  608.     property MasterSource: TDataSource;
  609.     property ReadOnly: Boolean default False;
  610.     property StoreDefs: Boolean default False;
  611.     property TableName: TFileName;
  612.     property TableType: TTableType default ttDefault;
  613.     property UpdateMode;
  614.     property UpdateObject;
  615.   end;
  616.  
  617. { TBatchMove }
  618.  
  619.   TBatchMove = class(TComponent)
  620.   protected
  621.     procedure Notification(AComponent: TComponent;
  622.       Operation: TOperation); override;
  623.   public
  624.     constructor Create(AOwner: TComponent); override;
  625.     destructor Destroy; override;
  626.     procedure Execute;
  627.   public
  628.     property ChangedCount: Longint;
  629.     property KeyViolCount: Longint;
  630.     property MovedCount: Longint;
  631.     property ProblemCount: Longint;
  632.   published
  633.     property AbortOnKeyViol: Boolean default True;
  634.     property AbortOnProblem: Boolean default True;
  635.     property CommitCount: Integer default 0;
  636.     property ChangedTableName: TFileName;
  637.     property Destination: TTable;
  638.     property KeyViolTableName: TFileName;
  639.     property Mappings: TStrings;
  640.     property Mode: TBatchMode default batAppend;
  641.     property ProblemTableName: TFileName;
  642.     property RecordCount: Longint default 0;
  643.     property Source: TBDEDataSet;
  644.     property Transliterate: Boolean default True;
  645.   end;
  646.  
  647. { TStoredProc }
  648.  
  649.   TParamBindMode = (pbByName, pbByNumber);
  650.  
  651.   TServerDesc = record
  652.     ParamName: string[DBIMAXSPNAMELEN];
  653.     BindType: TFieldType;
  654.   end;
  655.  
  656.   TServerDescList = array of TServerDesc;
  657.   TSPParamDescList = array of SPParamDesc;
  658.  
  659.   TStoredProc = class(TDBDataSet)
  660.   protected
  661.     function CreateHandle: HDBICur; override;
  662.     procedure Disconnect; override;
  663.     function GetParamsCount: Word;
  664.     function SetDBFlag(Flag: Integer; Value: Boolean): Boolean; override;
  665.     procedure SetOverLoad(Value: Word);
  666.     procedure SetProcName(const Value: string);
  667.     procedure SetPrepared(Value: Boolean);
  668.     procedure SetPrepare(Value: Boolean);
  669.   public
  670.     constructor Create(AOwner: TComponent); override;
  671.     destructor Destroy; override;
  672.     procedure CopyParams(Value: TParams);
  673.     function DescriptionsAvailable: Boolean;
  674.     procedure ExecProc;
  675.     function ParamByName(const Value: string): TParam;
  676.     procedure Prepare;
  677.     procedure GetResults;
  678.     procedure UnPrepare;
  679.     property ParamCount: Word;
  680.     property StmtHandle;
  681.     property Prepared: Boolean;
  682.   published
  683.     property StoredProcName: string;
  684.     property Overload: Word default 0;
  685.     property Params: TParams;
  686.     property ParamBindMode: TParamBindMode default pbByName;
  687.     property UpdateObject;
  688.   end;
  689.  
  690. { TQuery }
  691.  
  692.   TQuery = class(TDBDataSet)
  693.   protected
  694.     function CreateHandle: HDBICur; override;
  695.     procedure Disconnect; override;
  696.     procedure FreeStatement; virtual;
  697.     function GetDataSource: TDataSource; override;
  698.     function GetParamsCount: Word;
  699.     function SetDBFlag(Flag: Integer; Value: Boolean): Boolean; override;
  700.     procedure GetStatementHandle(SQLText: PChar); virtual;
  701.     property DataLink: TDataLink;
  702.   public
  703.     constructor Create(AOwner: TComponent); override;
  704.     destructor Destroy; override;
  705.     procedure ExecSQL;
  706.     procedure GetDetailLinkFields(MasterFields, DetailFields: TList); override;
  707.     procedure GetProviderAttributes(List: TList); override;
  708.     function ParamByName(const Value: string): TParam;
  709.     procedure Prepare;
  710.     procedure UnPrepare;
  711.     property Prepared: Boolean;
  712.     property ParamCount: Word;
  713.     property Local: Boolean;
  714.     property StmtHandle;
  715.     property Text: string;
  716.     property RowsAffected: Integer;
  717.     property SQLBinary: PChar;
  718.   published
  719.     property Constrained: Boolean default False;
  720.     property Constraints stored ConstraintsStored;
  721.     property DataSource: TDataSource;
  722.     property ParamCheck: Boolean default True;
  723.     property RequestLive: Boolean default False;
  724.     property SQL: TStrings;
  725.     { This property must be listed after the SQL property for Delphi 1.0 compatibility }
  726.     property Params: TParams;
  727.     property UniDirectional: Boolean default False;
  728.     property UpdateMode;
  729.     property UpdateObject;
  730. end;
  731.  
  732. { TUpdateSQL }
  733.  
  734.   TUpdateSQL = class(TDataSetUpdateObject)
  735.   protected
  736.     function GetDataSet: TBDEDataSet; override;
  737.     procedure SetDataSet(ADataSet: TBDEDataSet); override;
  738.     procedure SQLChanged(Sender: TObject);
  739.   public
  740.     constructor Create(AOwner: TComponent); override;
  741.     destructor Destroy; override;
  742.     procedure Apply(UpdateKind: TUpdateKind); override;
  743.     procedure ExecSQL(UpdateKind: TUpdateKind);
  744.     procedure SetParams(UpdateKind: TUpdateKind);
  745.     property DataSet;
  746.     property Query[UpdateKind: TUpdateKind]: TQuery;
  747.     property SQL[UpdateKind: TUpdateKind]: TStrings;
  748.   published
  749.     property ModifySQL: TStrings index 0;
  750.     property InsertSQL: TStrings index 1;
  751.     property DeleteSQL: TStrings index 2;
  752.   end;
  753.  
  754. { TBlobStream }
  755.  
  756.   TBlobStream = class(TStream)
  757.   public
  758.     constructor Create(Field: TBlobField; Mode: TBlobStreamMode);
  759.     destructor Destroy; override;
  760.     function Read(var Buffer; Count: Longint): Longint; override;
  761.     function Write(const Buffer; Count: Longint): Longint; override;
  762.     function Seek(Offset: Longint; Origin: Word): Longint; override;
  763.     procedure Truncate;
  764.   end;
  765.  
  766. function AnsiToNative(Locale: TLocale; const AnsiStr: string;
  767.   NativeStr: PChar; MaxLen: Integer): PChar;
  768. procedure NativeToAnsi(Locale: TLocale; NativeStr: PChar;
  769.   var AnsiStr: string);
  770. procedure AnsiToNativeBuf(Locale: TLocale; Source, Dest: PChar; Len: Integer);
  771. procedure NativeToAnsiBuf(Locale: TLocale; Source, Dest: PChar; Len: Integer);
  772.  
  773. function NativeCompareStr(Locale: TLocale; const S1, S2: string; Len: Integer): Integer;
  774. function NativeCompareStrBuf(Locale: TLocale; const S1, S2: PChar; Len: Integer): Integer;
  775. function NativeCompareText(Locale: TLocale; const S1, S2: string; Len: Integer): Integer;
  776. function NativeCompareTextBuf(Locale: TLocale; const S1, S2: PChar; Len: Integer): Integer;
  777.  
  778. procedure DbiError(ErrorCode: DBIResult);
  779. procedure Check(Status: DBIResult);
  780. procedure RegisterBDEInitProc(const InitProc: TBDEInitProc);
  781.  
  782. const
  783.   { Backward compatibility for TConfigMode }
  784.   cmVirtual = [cfmVirtual];
  785.   cmPersistent = [cfmPersistent];
  786.   cmSession = [cfmSession];
  787.   cmAll = [cfmVirtual, cfmPersistent, cfmSession];
  788.  
  789. var
  790.   Session: TSession;
  791.   Sessions: TSessionList;
  792.   CreateProviderProc: function(DataSet: TDBDataSet): IProvider = nil;
  793.   GetObjectContextProc: function: IUnknown;
  794.  
  795. implementation
  796.