home *** CD-ROM | disk | FTP | other *** search
-
- {*******************************************************}
- { }
- { Delphi Visual Component Library }
- { }
- { Copyright (c) 1995 Borland International }
- { }
- {*******************************************************}
-
- unit DB;
-
- {$N+,P+,S-}
-
- interface
-
- uses SysUtils, WinTypes, WinProcs, DbiTypes, DbiProcs, DbiErrs, Classes;
-
- const
-
- { TDBDataSet flags }
-
- dbfOpened = 0;
- dbfPrepared = 1;
- dbfExecSQL = 2;
- dbfTable = 3;
- dbfFieldList = 4;
- dbfIndexList = 5;
- dbfStoredProc = 6;
- dbfExecProc = 7;
-
- type
-
- { Forward declarations }
-
- TDBError = class;
- TSession = class;
- TDatabase = class;
- TFieldDefs = class;
- TDataset = class;
- TDBDataset = class;
- TField = class;
- TDataSource = class;
- TDataLink = class;
-
- { Generic types }
-
- TSymbolStr = string[DBIMAXNAMELEN];
- TMessageStr = string[DBIMAXMSGLEN];
-
- PFieldDescList = ^TFieldDescList;
- TFieldDescList = array[0..1023] of FLDDesc;
-
- PIndexDescList = ^TIndexDescList;
- TIndexDescList = array[0..63] of IDXDesc;
-
- { Exception classes }
-
- EDatabaseError = class(Exception);
-
- EDBEngineError = class(EDatabaseError)
- public
- constructor Create(ErrorCode: DBIResult);
- destructor Destroy; override;
- property ErrorCount: Integer;
- property Errors[Index: Integer]: TDBError;
- end;
-
- { BDE error information type }
-
- TDBError = class
- public
- constructor Create(Owner: EDBEngineError; ErrorCode: DBIResult;
- NativeError: Longint; Message: PChar);
- property Category: Byte;
- property ErrorCode: DBIResult;
- property SubCode: Byte;
- property Message: TMessageStr;
- property NativeError: Longint;
- end;
-
- { TLocale }
-
- TLocale = Pointer;
-
- { TSession }
-
- TPasswordEvent = procedure(Sender: TObject; var Continue: Boolean);
-
- TCallBack = record
- Data: Longint;
- BufLen: Word;
- Buffer: Pointer;
- ChainedFunc: Pointer;
- end;
-
- TSession = class(TComponent)
- public
- constructor Create(AOwner: TComponent);
- destructor Destroy; override;
- procedure AddPassword(const Password: string);
- procedure CloseDatabase(Database: TDatabase);
- procedure DropConnections;
- function FindDatabase(const DatabaseName: string): TDatabase;
- procedure GetAliasNames(List: TStrings);
- procedure GetAliasParams(const AliasName: string; List: TStrings);
- procedure GetDatabaseNames(List: TStrings);
- procedure GetDriverNames(List: TStrings);
- procedure GetDriverParams(const DriverName: string; List: TStrings);
- function GetPassword: Boolean;
- procedure GetTableNames(const DatabaseName, Pattern: string;
- Extensions, SystemTables: Boolean; List: TStrings);
- procedure GetStoredProcNames(const DatabaseName: string; List: TStrings);
- function OpenDatabase(const DatabaseName: string): TDatabase;
- procedure RemoveAllPasswords;
- procedure RemovePassword(const Password: string);
- property DatabaseCount: Integer;
- property Databases[Index: Integer]: TDatabase;
- property Handle: HDBISES;
- property KeepConnections: Boolean default True;
- property Locale: TLocale;
- property NetFileDir: string;
- property PrivateDir: string;
- property OnPassword: TPasswordEvent;
- end;
-
- { TParamList }
-
- TParamList = class(TObject)
- public
- constructor Create(Params: TStrings);
- destructor Destroy; override;
- property Buffer: PChar;
- property FieldCount: Integer;
- property FieldDescs: PFieldDescList;
- end;
-
- { TDatabase }
-
- TTransIsolation = (tiDirtyRead, tiReadCommitted, tiRepeatableRead);
-
- TLoginEvent = procedure(Database: TDatabase;
- LoginParams: TStrings) of object;
-
- TDatabase = class(TComponent)
- protected
- procedure Loaded; override;
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure Close;
- procedure CloseDatasets;
- procedure Commit;
- procedure Open;
- procedure Rollback;
- procedure StartTransaction;
- procedure ValidateName(const Name: string);
- property DatasetCount: Integer;
- property Datasets[Index: Integer]: TDBDataset;
- property Handle: HDBIDB;
- property IsSQLBased: Boolean;
- property Locale: TLocale;
- property Temporary: Boolean;
- published
- property AliasName: TSymbolStr;
- property Connected: Boolean default False;
- property DatabaseName: TFileName;
- property DriverName: TSymbolStr;
- property KeepConnection: Boolean default True;
- property LoginPrompt: Boolean default True;
- property Params: TStrings;
- property TransIsolation: TTransIsolation default tiReadCommitted;
- property OnLogin: TLoginEvent;
- end;
-
- { TDataSetDesigner }
-
- TDataEvent = (deFieldChange, deRecordChange, deDataSetChange,
- deDataSetScroll, deLayoutChange, deUpdateRecord, deUpdateState,
- deCheckBrowseMode, dePropertyChange, deFieldListChange,
- deFocusControl);
-
- TDataSetDesigner = class(TObject)
- public
- constructor Create(DataSet: TDataSet);
- destructor Destroy; override;
- procedure BeginDesign;
- procedure DataEvent(Event: TDataEvent; Info: Longint); virtual;
- procedure EndDesign;
- property DataSet: TDataSet;
- end;
-
- { TFieldDef }
-
- TFieldClass = class of TField;
-
- TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord,
- ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime,
- ftBytes, ftVarBytes, ftBlob, ftMemo, ftGraphic);
-
- TFieldDef = class
- public
- constructor Create(Owner: TFieldDefs; const Name: string;
- DataType: TFieldType; Size: Word; Required: Boolean; FieldNo: Integer);
- destructor Destroy; override;
- function CreateField(Owner: TComponent): TField;
- property DataType: TFieldType;
- property FieldClass: TFieldClass;
- property FieldNo: Integer;
- property Name: string;
- property Required: Boolean;
- property Size: Word;
- end;
-
- { TFieldDefs }
-
- TFieldDefs = class
- public
- constructor Create(DataSet: TDataSet);
- destructor Destroy; override;
- procedure Add(const Name: string; DataType: TFieldType; Size: Word;
- Required: Boolean);
- procedure AddFieldDesc(FieldDesc: FLDDesc; Required: Boolean;
- FieldNo: Word);
- procedure Assign(FieldDefs: TFieldDefs);
- procedure Clear;
- function Find(const Name: string): TFieldDef;
- function IndexOf(const Name: string): Integer;
- procedure Update;
- property Count: Integer;
- property Items[Index: Integer]: TFieldDef; default;
- end;
-
- { TDataSet }
-
- TBookmark = Pointer;
-
- PBufferList = ^TBufferList;
- TBufferList = array[0..dsMaxBufferCount - 1] of PChar;
-
- TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert,
- dsSetKey, dsCalcFields);
-
- TGetMode = (gmCurrent, gmNext, gmPrior);
-
- TKeyIndex = (kiLookup, kiRangeStart, kiRangeEnd, kiCurRangeStart,
- kiCurRangeEnd, kiSave);
-
- PKeyBuffer = ^TKeyBuffer;
- TKeyBuffer = record
- Modified: Boolean;
- Exclusive: Boolean;
- FieldCount: Integer;
- Data: record end;
- end;
-
- TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;
-
- TDataSet = class(TComponent)
- procedure BeginInsertAppend;
- procedure BindFields(Binding: Boolean);
- procedure CheckCanModify;
- procedure CheckFieldName(const FieldName: string);
- procedure CheckRequiredFields;
- procedure CheckSetKeyMode;
- procedure CopyBuffer(SourceIndex, DestIndex: Integer);
- procedure CreateFields;
- procedure DestroyFields;
- procedure EndInsertAppend;
- function FieldByNumber(FieldNo: Integer): TField;
- procedure FreeFieldBuffers;
- function GetActive: Boolean;
- procedure GetCalcFields(Index: Integer);
- function GetField(Index: Integer): TField;
- function GetFieldCount: Integer;
- procedure GetIndexInfo;
- function GetNextRecord: Boolean;
- function GetNextRecords: Integer;
- function GetPriorRecord: Boolean;
- function GetPriorRecords: Integer;
- function GetRecord(Index: Integer; GetMode: TGetMode): DBIResult;
- function GetRecordCount: Longint;
- function InitKeyBuffer(Buffer: PKeyBuffer): PKeyBuffer;
- procedure InitRecord(Buffer: PChar);
- procedure InternalClose;
- procedure InternalOpen;
- procedure MoveBuffer(CurIndex, NewIndex: Integer);
- procedure PostKeyBuffer(Commit: Boolean);
- procedure RemoveDataSource(DataSource: TDataSource);
- procedure RemoveField(Field: TField);
- procedure SetActive(Value: Boolean);
- procedure SetBufferCount(Value: Integer);
- procedure SetBufListSize(Value: Integer);
- procedure SetCurrentRecord(Index: Integer);
- procedure SetField(Index: Integer; Value: TField);
- procedure SetFieldDefs(Value: TFieldDefs);
- procedure SetState(Value: TDataSetState);
- procedure UpdateBufferCount;
- procedure UpdateFieldDefs;
- protected
- procedure CheckInactive;
- procedure ClearBuffers;
- procedure CloseCursor; virtual;
- function CreateHandle: HDBICur; virtual;
- procedure DataEvent(Event: TDataEvent; Info: Longint); virtual;
- procedure DoAfterCancel; virtual;
- procedure DoAfterClose; virtual;
- procedure DoAfterDelete; virtual;
- procedure DoAfterEdit; virtual;
- procedure DoAfterInsert; virtual;
- procedure DoAfterOpen; virtual;
- procedure DoAfterPost; virtual;
- procedure DoBeforeCancel; virtual;
- procedure DoBeforeClose; virtual;
- procedure DoBeforeDelete; virtual;
- procedure DoBeforeEdit; virtual;
- procedure DoBeforeInsert; virtual;
- procedure DoBeforeOpen; virtual;
- procedure DoBeforePost; virtual;
- procedure DoOnCalcFields; virtual;
- procedure DoOnNewRecord; virtual;
- function GetDataSource: TDataSource; virtual;
- function GetIndexField(Index: Integer): TField;
- function GetIndexFieldCount: Integer;
- function GetKeyBuffer(KeyIndex: TKeyIndex): PKeyBuffer;
- function GetKeyExclusive: Boolean;
- function GetKeyFieldCount: Integer;
- procedure InitFieldDefs; virtual;
- procedure Loaded; override;
- procedure OpenCursor; virtual;
- procedure PrepareCursor; virtual;
- function ResetCursorRange: Boolean;
- function SetCursorRange: Boolean;
- procedure SetIndexField(Index: Integer; Value: TField);
- procedure SetKeyBuffer(KeyIndex: TKeyIndex; Clear: Boolean);
- procedure SetKeyExclusive(Value: Boolean);
- procedure SetKeyFieldCount(Value: Integer);
- procedure SetKeyFields(KeyIndex: TKeyIndex;
- const Values: array of const);
- procedure SetLinkRanges(MasterFields: TList);
- procedure SetName(const Value: TComponentName); override;
- procedure SwitchToIndex(IndexName, TagName: PChar);
- procedure WriteComponents(Writer: TWriter); override;
- property InfoQueryMode: Boolean;
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- function ActiveBuffer: PChar;
- procedure Append;
- procedure AppendRecord(const Values: array of const);
- procedure Cancel;
- procedure CheckBrowseMode;
- procedure ClearFields;
- procedure Close;
- procedure CursorPosChanged;
- procedure Delete;
- procedure DisableControls;
- procedure Edit;
- procedure EnableControls;
- function FieldByName(const FieldName: string): TField;
- function FindField(const FieldName: string): TField;
- procedure First;
- procedure FreeBookmark(Bookmark: TBookmark);
- function GetBookmark: TBookmark;
- function GetCurrentRecord(Buffer: PChar): Boolean;
- procedure GetFieldNames(List: TStrings);
- procedure GotoBookmark(Bookmark: TBookmark);
- procedure Insert;
- procedure InsertRecord(const Values: array of const);
- function IsLinkedTo(DataSource: TDataSource): Boolean;
- procedure Last;
- procedure MoveBy(Distance: Integer);
- procedure Next;
- procedure Open;
- procedure Post;
- procedure Prior;
- procedure Refresh;
- procedure Resync(Mode: TResyncMode);
- procedure SetFields(const Values: array of const);
- procedure UpdateCursorPos;
- procedure UpdateRecord;
- property BOF: Boolean;
- property CanModify: Boolean;
- property DataSource: TDataSource;
- property DefaultFields: Boolean;
- property Designer: TDataSetDesigner;
- property EOF: Boolean;
- property FieldCount: Integer;
- property FieldDefs: TFieldDefs;
- property Fields[Index: Integer]: TField;
- property Handle: HDBICur;
- property Modified: Boolean;
- property RecordCount: Longint;
- property RecordSize: Word;
- property State: TDataSetState;
- property Locale: TLocale;
- published
- property Active: Boolean default False;
- property AutoCalcFields: Boolean default True;
- property BeforeOpen: TDataSetNotifyEvent;
- property AfterOpen: TDataSetNotifyEvent;
- property BeforeClose: TDataSetNotifyEvent;
- property AfterClose: TDataSetNotifyEvent;
- property BeforeInsert: TDataSetNotifyEvent;
- property AfterInsert: TDataSetNotifyEvent;
- property BeforeEdit: TDataSetNotifyEvent;
- property AfterEdit: TDataSetNotifyEvent;
- property BeforePost: TDataSetNotifyEvent;
- property AfterPost: TDataSetNotifyEvent;
- property BeforeCancel: TDataSetNotifyEvent;
- property AfterCancel: TDataSetNotifyEvent;
- property BeforeDelete: TDataSetNotifyEvent;
- property AfterDelete: TDataSetNotifyEvent;
- property OnNewRecord: TDataSetNotifyEvent;
- property OnCalcFields: TDataSetNotifyEvent;
- end;
-
- { TDBDataSet }
-
- TUpdateMode = (upWhereAll, upWhereChanged, upWhereKeyOnly);
- TDBFlags = set of 0..15;
-
- TDBDataSet = class(TDataSet)
- protected
- procedure CloseCursor; override;
- procedure Disconnect; virtual;
- procedure OpenCursor; override;
- procedure SetDBFlag(Flag: Integer; Value: Boolean); virtual;
- property DBFlags: TDBFlags;
- property UpdateMode: TUpdateMode default upWhereAll;
- public
- property Database: TDatabase;
- property DBHandle: HDBIDB;
- property DBLocale: TLocale;
- published
- property DatabaseName: TFileName;
- end;
-
- { TDataSource }
-
- TDataChangeEvent = procedure(Sender: TObject; Field: TField) of object;
-
- TDataSource = class(TComponent)
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure Edit;
- function IsLinkedTo(DataSet: TDataSet): Boolean;
- property State: TDataSetState;
- published
- property AutoEdit: Boolean default True;
- property DataSet: TDataSet;
- property Enabled: Boolean default True;
- property OnStateChange: TNotifyEvent;
- property OnDataChange: TDataChangeEvent;
- property OnUpdateData: TNotifyEvent;
- end;
-
- { TField }
-
- TFieldNotifyEvent = procedure(Sender: TField) of object;
- TFieldGetTextEvent = procedure(Sender: TField; var Text: string;
- DisplayText: Boolean) of object;
- TFieldSetTextEvent = procedure(Sender: TField; const Text: string) of object;
- TFieldRef = ^TField;
-
- TField = class(TComponent)
- protected
- procedure AccessError(const TypeName: string);
- procedure CheckInactive;
- procedure Change; virtual;
- procedure DataChanged;
- procedure FreeBuffers; virtual;
- function GetAsBoolean: Boolean; virtual;
- function GetAsDateTime: TDateTime; virtual;
- function GetAsFloat: Double; virtual;
- function GetAsInteger: Longint; virtual;
- function GetAsString: string; virtual;
- function GetCanModify: Boolean;
- function GetDefaultWidth: Integer; virtual;
- procedure GetText(var Text: string; DisplayText: Boolean); virtual;
- function HasParent: Boolean; override;
- procedure PropertyChanged(LayoutAffected: Boolean);
- procedure ReadState(Reader: TReader); override;
- procedure SetAsBoolean(Value: Boolean); virtual;
- procedure SetAsDateTime(Value: TDateTime); virtual;
- procedure SetAsFloat(Value: Double); virtual;
- procedure SetAsInteger(Value: Longint); virtual;
- procedure SetAsString(const Value: string); virtual;
- procedure SetDataType(Value: TFieldType);
- procedure SetSize(Value: Word);
- procedure SetText(const Value: string); virtual;
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure Assign(Source: TPersistent); override;
- procedure AssignValue(const Value: TVarRec);
- procedure Clear; virtual;
- procedure FocusControl;
- function GetData(Buffer: Pointer): Boolean;
- procedure SetData(Buffer: Pointer);
- function IsValidChar(InputChar: Char): Boolean; virtual;
- property AsBoolean: Boolean;
- property AsDateTime: TDateTime;
- property AsFloat: Double;
- property AsInteger: Longint;
- property AsString: string;
- property CanModify: Boolean;
- property DataSet: TDataSet;
- property DataSize: Word;
- property DataType: TFieldType;
- property DisplayName: PString;
- property DisplayText: string;
- property EditMask: string;
- property EditMaskPtr: PString;
- property FieldNo: Integer;
- property IsIndexField: Boolean;
- property IsNull: Boolean;
- property Size: Word;
- property Text: string;
- published
- property Alignment: TAlignment default taLeftJustify;
- property Calculated: Boolean default False;
- property DisplayLabel: string;
- property DisplayWidth: Integer;
- property FieldName: string;
- property Index: Integer;
- property ReadOnly: Boolean default False;
- property Required: Boolean default False;
- property Visible: Boolean default True;
- property OnChange: TFieldNotifyEvent;
- property OnGetText: TFieldGetTextEvent;
- property OnSetText: TFieldSetTextEvent;
- property OnValidate: TFieldNotifyEvent;
- end;
-
- { TDataLink }
-
- TDataLink = class(TPersistent)
- protected
- procedure ActiveChanged; virtual;
- procedure CheckBrowseMode; virtual;
- procedure DataSetChanged; virtual;
- procedure DataSetScrolled(Distance: Integer); virtual;
- procedure FocusControl(Field: TFieldRef); virtual;
- procedure EditingChanged; virtual;
- procedure LayoutChanged; virtual;
- procedure RecordChanged(Field: TField); virtual;
- procedure UpdateData; virtual;
- public
- constructor Create;
- destructor Destroy; override;
- function Edit: Boolean;
- procedure UpdateRecord;
- property Active: Boolean;
- property ActiveRecord: Integer;
- property BufferCount: Integer;
- property DataSet: TDataSet;
- property DataSource: TDataSource;
- property Editing: Boolean;
- property ReadOnly: Boolean;
- property RecordCount: Integer;
- end;
-
- const
- Null = TField(nil);
-
- procedure AnsiToNativeBuf(Locale: TLocale; Source, Dest: PChar; Len: Word);
- procedure NativeToAnsiBuf(Locale: TLocale; Source, Dest: PChar; Len: Word);
- function ExtractFieldName(const Fields: string; var Pos: Integer): string;
-
- procedure RegisterFields(const FieldClasses: array of TFieldClass);
-
- procedure DatabaseError(const Message: string);
- procedure DBError(Ident: Word);
- procedure DBErrorFmt(Ident: Word; const Args: array of const);
- procedure DbiError(ErrorCode: DBIResult);
- procedure Check(Status: DBIResult);
-
- var
- Session: TSession;
-
- const
- RegisterFieldsProc: procedure(const FieldClassess: array of TFieldClass) = nil;
-
- implementation
-