From: <na...@us...> - 2006-10-20 14:30:27
|
Revision: 710 http://svn.sourceforge.net/instantobjects/revision/?rev=710&view=rev Author: nandod Date: 2006-10-20 07:30:12 -0700 (Fri, 20 Oct 2006) Log Message: ----------- * fixed indentation. Modified Paths: -------------- trunk/Source/Core/InstantBrokers.pas Modified: trunk/Source/Core/InstantBrokers.pas =================================================================== --- trunk/Source/Core/InstantBrokers.pas 2006-10-10 00:29:18 UTC (rev 709) +++ trunk/Source/Core/InstantBrokers.pas 2006-10-20 14:30:12 UTC (rev 710) @@ -4705,12 +4705,12 @@ begin if TranslatorClass <> nil then with TranslatorClass.Create(Self) do - try - CommandText := Self.Command; - Statement := StatementText; - finally - Free; - end; + try + CommandText := Self.Command; + Statement := StatementText; + finally + Free; + end; end; class function TInstantCustomRelationalQuery.TranslatorClass: TInstantRelationalTranslatorClass; |
From: <na...@us...> - 2006-11-29 10:53:05
|
Revision: 729 http://svn.sourceforge.net/instantobjects/revision/?rev=729&view=rev Author: nandod Date: 2006-11-29 02:53:06 -0800 (Wed, 29 Nov 2006) Log Message: ----------- * fixed [ 1605157 ] BlobStreamFormat not honored when building a database Modified Paths: -------------- trunk/Source/Core/InstantBrokers.pas Modified: trunk/Source/Core/InstantBrokers.pas =================================================================== --- trunk/Source/Core/InstantBrokers.pas 2006-11-29 10:42:28 UTC (rev 728) +++ trunk/Source/Core/InstantBrokers.pas 2006-11-29 10:53:06 UTC (rev 729) @@ -1448,9 +1448,15 @@ Model: TInstantModel): TInstantScheme; begin Result := TInstantScheme.Create; - Result.IdDataType := IdDataType; - Result.IdSize := IdSize; - Result.Catalog := TInstantModelCatalog.Create(Result, Model); + try + Result.IdDataType := IdDataType; + Result.IdSize := IdSize; + Result.BlobStreamFormat := BlobStreamFormat; + Result.Catalog := TInstantModelCatalog.Create(Result, Model); + except + FreeAndNil(Result); + raise; + end; end; constructor TInstantConnectionBasedConnector.Create(AOwner: TComponent); |
From: <jcm...@us...> - 2007-02-24 19:37:20
|
Revision: 761 http://svn.sourceforge.net/instantobjects/revision/?rev=761&view=rev Author: jcmoraisjr Date: 2007-02-24 11:37:18 -0800 (Sat, 24 Feb 2007) Log Message: ----------- Included svn eol-style and mime-type properties. Modified Paths: -------------- trunk/Source/Core/InstantBrokers.pas Property Changed: ---------------- trunk/Source/Core/InstantBrokers.pas Modified: trunk/Source/Core/InstantBrokers.pas =================================================================== --- trunk/Source/Core/InstantBrokers.pas 2007-02-24 19:35:00 UTC (rev 760) +++ trunk/Source/Core/InstantBrokers.pas 2007-02-24 19:37:18 UTC (rev 761) @@ -1,6067 +1,6067 @@ -(* - * InstantObjects - * Broker and Connector Classes - *) - -(* ***** 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: Seleqt InstantObjects - * - * The Initial Developer of the Original Code is: Seleqt - * - * Portions created by the Initial Developer are Copyright (C) 2001-2003 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Carlo Barazzetta, Andrea Petrelli, Nando Dessena, Steven Mitchell, - * Joao Morais, Cesar Coll, Uberto Barbini, David Taylor, Hanedi Salas, - * Riceball Lee, David Moorhouse - * - * ***** END LICENSE BLOCK ***** *) - -unit InstantBrokers; - -{$IFDEF LINUX} -{$I '../InstantDefines.inc'} -{$ELSE} -{$I '..\InstantDefines.inc'} -{$ENDIF} - -interface - -uses - SysUtils, Classes, Db, InstantPersistence, InstantTypes, InstantMetadata, - InstantConsts, InstantClasses, Contnrs, InstantCommand; - -type - TInstantBrokerCatalog = class; - TInstantConnectionBasedConnector = class; - TInstantCustomRelationalBroker = class; - TInstantCustomRelationalQuery = class; - TInstantCustomRelationalQueryClass = class of TInstantCustomRelationalQuery; - TInstantCustomResolver = class; - TInstantLinkResolver = class; - TInstantNavigationalBroker = class; - TInstantNavigationalLinkResolver = class; - TInstantNavigationalResolver = class; - TInstantNavigationalResolverClass = class of TInstantNavigationalResolver; - TInstantRelationalConnector = class; - TInstantRelationalTranslator = class; - TInstantRelationalTranslatorClass = class of TInstantRelationalTranslator; - TInstantSQLBroker = class; - TInstantSQLBrokerCatalog = class; - TInstantSQLGenerator = class; - TInstantSQLGeneratorClass = class of TInstantSQLGenerator; - TInstantSQLLinkResolver = class; - TInstantSQLResolver = class; - TInstantStatementCache = class; - - PObjectRow = ^TObjectRow; - TObjectRow = record - Row: Integer; - Instance: TObject; - end; - - PInstantOperationInfo = ^TInstantOperationInfo; - TInstantOperationInfo = record - Success: Boolean; - Conflict: Boolean; - end; - - TInstantBrokerOperation = procedure(AObject: TInstantObject; - const AObjectId: string; Map: TInstantAttributeMap; - ConflictAction: TInstantConflictAction = caFail; - Info: PInstantOperationInfo = nil) of object; - TInstantGetDataSetEvent = procedure(Sender: TObject; - const CommandText: string; var DataSet: TDataset) of object; - TInstantInitDataSetEvent = procedure(Sender: TObject; - const CommandText: string; DataSet: TDataSet) of object; - TInstantNavigationalResolverOperation = procedure(AObject: TInstantObject; - AttributeMetadata: TInstantAttributeMetadata) of object; - - - TInstantCustomRelationalBroker = class(TInstantBroker) - private - FStatementCache: TInstantStatementCache; - FStatementCacheCapacity: Integer; - procedure DisposeMap(AObject: TInstantObject; const AObjectId: string; - Map: TInstantAttributeMap; ConflictAction: TInstantConflictAction; - Info: PInstantOperationInfo); - function GetConnector: TInstantRelationalConnector; - function PerformOperation(AObject: TInstantObject; const AObjectId: string; - OperationType: TInstantOperationType; Operation: TInstantBrokerOperation; - ConflictAction: TInstantConflictAction): Boolean; - procedure RetrieveMap(AObject: TInstantObject; const AObjectId: string; - Map: TInstantAttributeMap; ConflictAction: TInstantConflictAction; - Info: PInstantOperationInfo); - procedure StoreMap(AObject: TInstantObject; const AObjectId: string; - Map: TInstantAttributeMap; ConflictAction: TInstantConflictAction; - Info: PInstantOperationInfo); - function GetStatementCache: TInstantStatementCache; - procedure SetStatementCacheCapacity(const Value: Integer); - protected - property StatementCache: TInstantStatementCache read GetStatementCache; - function EnsureResolver(Map: TInstantAttributeMap): TInstantCustomResolver; - virtual; abstract; - function GetDBMSName: string; virtual; - function GetSQLDelimiters: string; virtual; - function GetSQLQuote: Char; virtual; - function GetSQLWildcard: string; virtual; - function InternalDisposeObject(AObject: TInstantObject; - ConflictAction: TInstantConflictAction): Boolean; override; - function InternalRetrieveObject(AObject: TInstantObject; - const AObjectId: string; ConflictAction: TInstantConflictAction): Boolean; - override; - function InternalStoreObject(AObject: TInstantObject; - ConflictAction: TInstantConflictAction): Boolean; override; - public - constructor Create(AConnector: TInstantConnector); override; - destructor Destroy; override; - function Execute(const AStatement: string; AParams: TParams = nil): Integer; - virtual; - property Connector: TInstantRelationalConnector read GetConnector; - property DBMSName: string read GetDBMSName; - property SQLDelimiters: string read GetSQLDelimiters; - property SQLQuote: Char read GetSQLQuote; - property SQLWildcard: string read GetSQLWildCard; - property StatementCacheCapacity: Integer read FStatementCacheCapacity - write SetStatementCacheCapacity; - end; - - TInstantNavigationalBroker = class(TInstantCustomRelationalBroker) - private - FResolverList: TObjectList; - function GetResolverCount: Integer; - function GetResolverList: TObjectList; - function GetResolvers(Index: Integer): TInstantnavigationalResolver; - property ResolverList: TObjectList read GetResolverList; - protected - function CreateResolver(const TableName: string): - TInstantNavigationalResolver; virtual; abstract; - function EnsureResolver(Map: TInstantAttributeMap): TInstantCustomResolver; - override; - function FindResolver(const TableName: string): - TInstantNavigationalResolver; - property ResolverCount: Integer read GetResolverCount; - property Resolvers[Index: Integer]: TInstantNavigationalResolver - read GetResolvers; - public - destructor Destroy; override; - end; - - //Backwards compatibility - TInstantRelationalBroker = TInstantNavigationalBroker; - - TInstantSQLBroker = class(TInstantCustomRelationalBroker) - private - FGenerator: TInstantSQLGenerator; - FResolverList: TObjectList; - function GetResolverList: TObjectList; - function GetResolverCount: Integer; - function GetResolvers(Index: Integer): TInstantSQLResolver; - function GetGenerator: TInstantSQLGenerator; - protected - function CreateResolver(Map: TInstantAttributeMap): TInstantSQLResolver; - virtual; abstract; - function EnsureResolver(AMap: TInstantAttributeMap): TInstantCustomResolver; - override; - procedure InternalBuildDatabase(Scheme: TInstantScheme); override; - property ResolverList: TObjectList read GetResolverList; - procedure AssignDataSetParams(DataSet : TDataSet; AParams: TParams); - virtual; - function CreateDataSet(const AStatement: string; AParams: TParams = nil): - TDataSet; virtual; abstract; - public - destructor Destroy; override; - function AcquireDataSet(const AStatement: string; AParams: TParams = nil): - TDataSet; virtual; - procedure ReleaseDataSet(const ADataSet: TDataSet); virtual; - function DataTypeToColumnType(DataType: TInstantDataType; - Size: Integer): string; virtual; abstract; - function FindResolver(AMap: TInstantAttributeMap): TInstantSQLResolver; - class function GeneratorClass: TInstantSQLGeneratorClass; virtual; - property Generator: TInstantSQLGenerator read GetGenerator; - property ResolverCount: Integer read GetResolverCount; - property Resolvers[Index: Integer]: TInstantSQLResolver read GetResolvers; - end; - - TInstantRelationalConnector = class(TInstantConnector) - private - FOnGetDataSet: TInstantGetDataSetEvent; - FOnInitDataSet: TInstantInitDataSetEvent; - protected - procedure DoGetDataSet(const CommandText: string; var DataSet: TDataSet); - procedure DoInitDataSet(const CommandText: string; DataSet: TDataSet); - function GetBroker: TInstantCustomRelationalBroker; - procedure GetDataSet(const CommandText: string; var DataSet: TDataSet); - virtual; - function GetDBMSName: string; virtual; - procedure InitDataSet(const CommandText: string; DataSet: TDataSet); - virtual; - function InternalCreateScheme(Model: TInstantModel): TInstantScheme; - override; - public - property Broker: TInstantCustomRelationalBroker read GetBroker; - property DBMSName: string read GetDBMSName; - published - property OnGetDataSet: TInstantGetDataSetEvent read FOnGetDataSet - write FOnGetDataSet; - property OnInitDataSet: TInstantInitDataSetEvent read FOnInitDataSet - write FOnInitDataSet; - end; - - TInstantConnectionBasedConnector = class(TInstantRelationalConnector) - private - FConnection: TCustomConnection; - FLoginPrompt: Boolean; - procedure DoAfterConnectionChange; - procedure DoBeforeConnectionChange; - function GetConnection: TCustomConnection; - function GetLoginPrompt: Boolean; - procedure SetConnection(Value: TCustomConnection); - procedure SetLoginPrompt(const Value: Boolean); - protected - procedure AssignLoginOptions; virtual; - procedure AfterConnectionChange; virtual; - procedure BeforeConnectionChange; virtual; - procedure CheckConnection; - function GetConnected: Boolean; override; - procedure InternalConnect; override; - procedure InternalDisconnect; override; - procedure Notification(AComponent: TComponent; Operation: TOperation); - override; - public - property Connection: TCustomConnection read GetConnection - write SetConnection; - function HasConnection: Boolean; - constructor Create(AOwner: TComponent); override; - published - property LoginPrompt: Boolean read GetLoginPrompt write SetLoginPrompt - default True; - end; - - TInstantCustomResolver = class(TInstantStreamable) - private - FBroker: TInstantCustomRelationalBroker; - protected - function KeyViolation(AObject: TInstantObject; const AObjectId: string; - E: Exception): EInstantKeyViolation; - procedure InternalDisposeMap(AObject: TInstantObject; - Map: TInstantAttributeMap; ConflictAction: TInstantConflictAction; - Info: PInstantOperationInfo); virtual; - procedure InternalRetrieveMap(AObject: TInstantObject; - const AObjectId: string; Map: TInstantAttributeMap; - ConflictAction: TInstantConflictAction; Info: PInstantOperationInfo); - virtual; - procedure InternalStoreMap(AObject: TInstantObject; - Map: TInstantAttributeMap; ConflictAction: TInstantConflictAction; - Info: PInstantOperationInfo); virtual; - public - constructor Create(ABroker: TInstantCustomRelationalBroker); - procedure DisposeMap(AObject: TInstantObject; Map: TInstantAttributeMap; - ConflictAction: TInstantConflictAction; Info: PInstantOperationInfo); - procedure DisposeObject(AObject: TInstantObject; Conflict: - TInstantConflictAction); - procedure RetrieveMap(AObject: TInstantObject; const AObjectId: string; - Map: TInstantAttributeMap; ConflictAction: TInstantConflictAction; - Info: PInstantOperationInfo); - procedure StoreMap(AObject: TInstantObject; Map: TInstantAttributeMap; - ConflictAction: TInstantConflictAction; Info: PInstantOperationInfo); - procedure StoreObject(AObject: TInstantObject; Conflict: - TInstantConflictAction); - property Broker: TInstantCustomRelationalBroker read FBroker; - end; - - TInstantNavigationalResolver = class(TInstantCustomResolver) - private - FDataSet: TDataSet; - FFreeDataSet: Boolean; - FNavigationalLinkResolvers: TObjectList; - FTableName: string; - function CheckConflict(AObject: TInstantObject; const AObjectId: string; - ConflictAction: TInstantConflictAction): Boolean; - procedure ClearAttribute(AObject: TInstantObject; - AttributeMetadata: TInstantAttributeMetadata); - function FieldByName(const FieldName: string): TField; - procedure FreeDataSet; - function GetBroker: TInstantNavigationalBroker; - function GetDataSet: TDataSet; - function GetNavigationalLinkResolvers: TObjectList; - function GetObjectClassName: string; - function GetObjectId: string; - procedure PerformOperation(AObject: TInstantObject; - Map: TInstantAttributeMap; Operation: - TInstantNavigationalResolverOperation); - procedure ReadAttribute(AObject: TInstantObject; - AttributeMetadata: TInstantAttributeMetadata); - procedure ResetAttribute(AObject: TInstantObject; - AttributeMetadata: TInstantAttributeMetadata); - procedure SetDataSet(Value: TDataset); - procedure WriteAttribute(AObject: TInstantObject; - AttributeMetadata: TInstantAttributeMetadata); - protected - procedure Append; virtual; - procedure Cancel; virtual; - procedure ClearBlob(Attribute: TInstantBlob); virtual; - procedure ClearBoolean(Attribute: TInstantBoolean); virtual; - procedure ClearDateTime(Attribute: TInstantDateTime); virtual; - procedure ClearDate(Attribute: TInstantDate); virtual; - procedure ClearTime(Attribute: TInstantTime); virtual; - procedure ClearInteger(Attribute: TInstantInteger); virtual; - procedure ClearFloat(Attribute: TInstantFloat); virtual; - procedure ClearCurrency(Attribute: TInstantCurrency); virtual; - procedure ClearMemo(Attribute: TInstantMemo); virtual; - procedure ClearPart(Attribute: TInstantPart); virtual; - procedure ClearParts(Attribute: TInstantParts); virtual; - procedure ClearReference(Attribute: TInstantReference); virtual; - procedure ClearReferences(Attribute: TInstantReferences); virtual; - procedure ClearString(Attribute: TInstantString); virtual; - procedure Close; virtual; - function CreateDataSet: TDataSet; virtual; abstract; - function CreateNavigationalLinkResolver(const ATableName: string): - TInstantNavigationalLinkResolver; virtual; abstract; - function CreateLocateVarArray(const AObjectClassName, AObjectId: string): - Variant; - procedure Delete; virtual; - procedure Edit; virtual; - function GetLinkDatasetResolver(const ATableName: string): - TInstantNavigationalLinkResolver; - function FieldHasObjects(Field: TField): Boolean; virtual; - function FindLinkDatasetResolver(const ATableName: string): - TInstantNavigationalLinkResolver; - procedure InternalDisposeMap(AObject: TInstantObject; - Map: TInstantAttributeMap; ConflictAction: TInstantConflictAction; - Info: PInstantOperationInfo); override; - procedure InternalRetrieveMap(AObject: TInstantObject; - const AObjectId: string; Map: TInstantAttributeMap; - ConflictAction: TInstantConflictAction; - Info: PInstantOperationInfo); override; - procedure InternalStoreMap(AObject: TInstantObject; - Map: TInstantAttributeMap; - ConflictAction: TInstantConflictAction; Info: PInstantOperationInfo); - override; - function Locate(const AObjectClassName, AObjectId: string): Boolean; - virtual; abstract; - procedure Open; virtual; - procedure Post; virtual; - procedure ReadBlob(Attribute: TInstantBlob); virtual; - procedure ReadBoolean(Attribute: TInstantBoolean); virtual; - procedure ReadDateTime(Attribute: TInstantDateTime); virtual; - procedure ReadDate(Attribute: TInstantDate); virtual; - procedure ReadTime(Attribute: TInstantTime); virtual; - procedure ReadInteger(Attribute: TInstantInteger); virtual; - procedure ReadFloat(Attribute: TInstantFloat); virtual; - procedure ReadCurrency(Attribute: TInstantCurrency); virtual; - procedure ReadMemo(Attribute: TInstantMemo); virtual; - procedure ReadPart(Attribute: TInstantPart); virtual; - procedure ReadParts(Attribute: TInstantParts); virtual; - procedure ReadReference(Attribute: TInstantReference); virtual; - procedure ReadReferences(Attribute: TInstantReferences); virtual; - procedure ReadString(Attribute: TInstantString); virtual; - procedure ResetAttributes(AObject: TInstantObject; - Map: TInstantAttributeMap); - procedure SetObjectUpdateCount(AObject: TInstantObject; Value: Integer); - function TranslateError(AObject: TInstantObject; E: Exception): Exception; - virtual; - procedure WriteBlob(Attribute: TInstantBlob); virtual; - procedure WriteBoolean(Attribute: TInstantBoolean); virtual; - procedure WriteDateTime(Attribute: TInstantDateTime); virtual; - procedure WriteDate(Attribute: TInstantDate); virtual; - procedure WriteTime(Attribute: TInstantTime); virtual; - procedure WriteFloat(Attribute: TInstantFloat); virtual; - procedure WriteCurrency(Attribute: TInstantCurrency); virtual; - procedure WriteInteger(Attribute: TInstantInteger); virtual; - procedure WriteMemo(Attribute: TInstantMemo); virtual; - procedure WritePart(Attribute: TInstantPart); virtual; - procedure WriteParts(Attribute: TInstantParts); virtual; - procedure WriteReference(Attribute: TInstantReference); virtual; - procedure WriteReferences(Attribute: TInstantReferences); virtual; - procedure WriteString(Attribute: TInstantString); virtual; - property DataSet: TDataset read GetDataSet write SetDataSet; - property NavigationalLinkResolvers: TObjectList read - GetNavigationalLinkResolvers; - public - constructor Create(ABroker: TInstantNavigationalBroker; - const ATableName: string); - destructor Destroy; override; - property Broker: TInstantNavigationalBroker read GetBroker; - property ObjectClassName: string read GetObjectClassName; - property ObjectId: string read GetObjectId; - property TableName: string read FTableName; - end; - - //Backwards compatibility - TInstantResolver = TInstantNavigationalResolver; - - TInstantSQLResolver = class(TInstantCustomResolver) - private - FMap: TInstantAttributeMap; - FDeleteSQL: string; - FDeleteConcurrentSQL: string; - FInsertSQL: string; - FSelectSQL: string; - FUpdateSQL: string; - FUpdateConcurrentSQL: string; - FSelectExternalSQL: string; - FSelectExternalPartSQL: string; - FDeleteExternalSQL: string; - FInsertExternalSQL: string; - procedure AddIntegerParam(Params: TParams; const ParamName: string; - Value: Integer); - procedure AddStringParam(Params: TParams; const ParamName, Value: string); - // Adds an "Id" param, whose data type and size depends on connector - // settings. - procedure AddIdParam(Params: TParams; const ParamName, Value: string); - procedure CheckConflict(Info: PInstantOperationInfo; - AObject: TInstantObject); - function ExecuteStatement(const AStatement: string; AParams: TParams; - Info: PInstantOperationInfo; ConflictAction: TInstantConflictAction; - AObject: TInstantObject): Integer; - function GetDeleteConcurrentSQL: string; - function GetDeleteSQL: string; - function GetInsertSQL: string; - function GetSelectSQL: string; - function GetUpdateConcurrentSQL: string; - function GetUpdateSQL: string; - function GetBroker: TInstantSQLBroker; - function GetSelectExternalSQL: string; - function GetSelectExternalPartSQL: string; - function GetDeleteExternalSQL: string; - function GetInsertExternalSQL: string; - protected - procedure AddAttributeParam(Attribute: TInstantAttribute; - Params: TParams); virtual; - procedure AddAttributeParams(Params: TParams; AObject: TInstantObject; - Map: TInstantAttributeMap); - procedure AddBaseParams(Params: TParams; AClassName, AObjectId: string; - AUpdateCount: Integer = -1); - procedure AddConcurrencyParam(Params: TParams; AUpdateCount: Integer); - function AddParam(Params: TParams; const ParamName: string; - ADataType: TFieldType): TParam; - procedure AddPersistentIdParam(Params: TParams; APersistentId: string); - procedure InternalDisposeMap(AObject: TInstantObject; - Map: TInstantAttributeMap; ConflictAction: TInstantConflictAction; - Info: PInstantOperationInfo); override; - procedure InternalRetrieveMap(AObject: TInstantObject; - const AObjectId: string; Map: TInstantAttributeMap; - ConflictAction: TInstantConflictAction; Info: PInstantOperationInfo); - override; - procedure InternalStoreMap(AObject: TInstantObject; - Map: TInstantAttributeMap; ConflictAction: TInstantConflictAction; - Info: PInstantOperationInfo); override; - procedure ReadAttribute(AObject: TInstantObject; const AObjectId: string; - AttributeMetadata: TInstantAttributeMetadata; DataSet: TDataSet); virtual; - procedure ReadAttributes(AObject: TInstantObject; const AObjectId: string; - Map: TInstantAttributeMap; DataSet: TDataSet); - function ReadBlobField(DataSet: TDataSet; const FieldName: string): string; - virtual; - function ReadBooleanField(DataSet: TDataSet; const FieldName: string): - Boolean; virtual; - function ReadDateTimeField(DataSet: TDataSet; const FieldName: string): - TDateTime; virtual; - function ReadDateField(DataSet: TDataSet; const FieldName: string): - TDateTime; virtual; - function ReadTimeField(DataSet: TDataSet; const FieldName: string): - TDateTime; virtual; - function ReadFloatField(DataSet: TDataSet; const FieldName: string): Double; - virtual; - function ReadCurrencyField(DataSet: TDataSet; const FieldName: string): - Currency; virtual; - function ReadIntegerField(DataSet: TDataSet; const FieldName: string): - Integer; virtual; - function ReadMemoField(DataSet: TDataSet; const FieldName: string): string; - virtual; - function ReadStringField(DataSet: TDataSet; const FieldName: string): - string; virtual; - procedure RemoveConcurrencyParam(Params: TParams); - procedure RemovePersistentIdParam(Params: TParams); - function TranslateError(AObject: TInstantObject; - E: Exception): Exception; virtual; - public - constructor Create(ABroker: TInstantSQLBroker; AMap: TInstantAttributeMap); - property Broker: TInstantSQLBroker read GetBroker; - property DeleteConcurrentSQL: string read GetDeleteConcurrentSQL write FDeleteConcurrentSQL; - property DeleteSQL: string read GetDeleteSQL write FDeleteSQL; - property DeleteExternalSQL: string read GetDeleteExternalSQL write FDeleteExternalSQL; - property InsertSQL: string read GetInsertSQL write FInsertSQL; - property InsertExternalSQL: string read GetInsertExternalSQL - write FInsertExternalSQL; - property Map: TInstantAttributeMap read FMap; - property SelectSQL: string read GetSelectSQL write FSelectSQL; - property SelectExternalSQL: string read GetSelectExternalSQL - write FSelectExternalSQL; - property SelectExternalPartSQL: string read GetSelectExternalPartSQL - write FSelectExternalPartSQL; - property UpdateConcurrentSQL: string read GetUpdateConcurrentSQL - write FUpdateConcurrentSQL; - property UpdateSQL: string read GetUpdateSQL write FUpdateSQL; - end; - - // TInstantLinkResolver class defines common interface for handling - // access to container attributes with external storage - TInstantLinkResolver = class(TInstantStreamable) - private - FResolver: TInstantCustomResolver; - function GetBroker: TInstantCustomRelationalBroker; - function GetResolver: TInstantCustomResolver; - protected - procedure InternalStoreAttributeObjects(Attribute: TInstantContainer); - virtual; - procedure InternalClearAttributeLinkRecords; virtual; - procedure InternalDisposeDeletedAttributeObjects( - Attribute: TInstantContainer); virtual; - procedure InternalReadAttributeObjects(Attribute: TInstantContainer; - const AObjectId: string); virtual; - public - constructor Create(AResolver: TInstantCustomResolver); - procedure StoreAttributeObjects(Attribute: TInstantContainer); - procedure ClearAttributeLinkRecords; - procedure DisposeDeletedAttributeObjects(Attribute: TInstantContainer); - procedure ReadAttributeObjects(Attribute: TInstantContainer; - const AObjectId: string); - property Broker: TInstantCustomRelationalBroker read GetBroker; - property Resolver: TInstantCustomResolver read GetResolver; - end; - - // TInstantNavigationalLinkResolver is an abstract class that - // defines the interface for handling access to container attributes - // with external storage for navigational brokers. - // Each navigational broker needs to provide a concrete class descendent. - // See the BDE broker as an example. - TInstantNavigationalLinkResolver = class(TInstantLinkResolver) - private - FDataSet: TDataSet; - FFreeDataSet: Boolean; - FTableName: string; - function FieldByName(const FieldName: string): TField; - procedure FreeDataSet; - function GetBroker: TInstantNavigationalBroker; - function GetDataSet: TDataSet; - function GetResolver: TInstantNavigationalResolver; - procedure SetDataSet(Value: TDataset); - protected - procedure Append; virtual; - procedure Cancel; virtual; - procedure Close; virtual; - function CreateDataSet: TDataSet; virtual; abstract; - procedure Delete; virtual; - procedure Edit; virtual; - function Eof: Boolean; virtual; - procedure First; virtual; - procedure InternalStoreAttributeObjects(Attribute: TInstantContainer); override; - procedure InternalClearAttributeLinkRecords; override; - procedure InternalDisposeDeletedAttributeObjects( - Attribute: TInstantContainer); override; - procedure InternalReadAttributeObjects(Attribute: TInstantContainer; - const AObjectId: string); override; - procedure Next; virtual; - procedure Open; virtual; - procedure Post; virtual; - procedure SetDatasetParentRange(const AParentClass, AParentId: string); - virtual; abstract; - property DataSet: TDataset read GetDataSet write SetDataSet; - public - constructor Create(AResolver: TInstantNavigationalResolver; - const ATableName: string); - destructor Destroy; override; - property Broker: TInstantNavigationalBroker read GetBroker; - property Resolver: TInstantNavigationalResolver read GetResolver; - property TableName: string read FTableName; - end; - - // TInstantSQLLinkResolver class defines interface for handling - // access to container attributes with external storage for - // SQL brokers. Due to the generic nature of SQL this class is used - // directly and no descendant classes are needed for SQL brokers. - TInstantSQLLinkResolver = class(TInstantLinkResolver) - private - FAttributeOwner: TInstantObject; - FTableName: string; - function GetBroker: TInstantSQLBroker; - function GetResolver: TInstantSQLResolver; - property TableName: string read FTableName; - protected - procedure InternalStoreAttributeObjects(Attribute: TInstantContainer); - override; - procedure InternalClearAttributeLinkRecords; override; - procedure InternalDisposeDeletedAttributeObjects( - Attribute: TInstantContainer); override; - procedure InternalReadAttributeObjects(Attribute: TInstantContainer; const - AObjectId: string); override; - public - constructor Create(AResolver: TInstantSQLResolver; const ATableName: string; - AObject: TInstantObject); - property AttributeOwner: TInstantObject read FAttributeOwner; - property Broker: TInstantSQLBroker read GetBroker; - property Resolver: TInstantSQLResolver read GetResolver; - end; - - TInstantStatement = class - private - FStatementImplementation: TComponent; - public - constructor Create(const AStatementImplementation: TComponent); - destructor Destroy; override; - property StatementImplementation: TComponent read FStatementImplementation; - end; - - TInstantStatementCache = class(TComponent) - private - FStatements: TStringList; - FCapacity: Integer; - procedure DeleteStatement(const Index: Integer); - procedure DeleteAllStatements; - procedure Shrink; - procedure SetCapacity(const Value: Integer); - protected - procedure Notification(AComponent: TComponent; Operation: TOperation); - override; - public - constructor Create(AOwner: TComponent); override; - property Capacity: Integer read FCapacity write SetCapacity; - destructor Destroy; override; - function GetStatement(const StatementText: string): TInstantStatement; - function AddStatement(const StatementText: string; - const StatementImplementation: TComponent): Integer; - function RemoveStatement(const StatementText: string): Boolean; - end; - - // A TInstantCatalog that gathers its info from an existing database (through - // a TInstantBroker). The broker knows how to read the metadata information - // depending on which particular database is used as back-end. This is an - // abstract class. A concrete derived class for each supported back-end - // must be developed. - TInstantBrokerCatalog = class(TInstantCatalog) - private - FBroker: TInstantBroker; - function GetBroker: TInstantBroker; - public - // Creates an instance and binds it to the specified TInstantScheme object. - // ABroker is written to the Broker property. - constructor Create(const AScheme: TInstantScheme; - const ABroker: TInstantBroker); virtual; - // A reference to the broker through which the metadata info is read. - property Broker: TInstantBroker read GetBroker; - end; - - // A TInstantBrokerCatalog that works with a SQL broker only. - TInstantSQLBrokerCatalog = class(TInstantBrokerCatalog) - private - function GetBroker: TInstantSQLBroker; - public - property Broker: TInstantSQLBroker read GetBroker; - end; - - TInstantSQLGenerator = class(TObject) - private - FBroker: TInstantSQLBroker; - protected - function BuildList(Map: TInstantAttributeMap; Additional: array of string; - StringFunc: TInstantStringFunc = nil; const Delimiter: string = ','): - string; - function BuildAssignment(const AName: string): string; - function BuildAssignmentList(Map: TInstantAttributeMap; - Additional: array of string): string; - function BuildConcurrencyCriteria: string; - function BuildPersistentIdCriteria: string; - function BuildFieldList(Map: TInstantAttributeMap; - Additional: array of string): string; overload; - function BuildFieldList(const S: string): string; overload; - function BuildParam(const AName: string): string; virtual; - function BuildParamList(Map: TInstantAttributeMap; - Additional: array of string): string; - function BuildWhereStr(Fields: array of string): string; - function EmbraceField(const FieldName: string): string; virtual; - function EmbraceTable(const TableName: string): string; virtual; - function GetDelimiters: string; virtual; - function InternalGenerateAddFieldSQL(Metadata: TInstantFieldMetadata): - string; virtual; - function InternalGenerateAlterFieldSQL(OldMetadata, - NewMetadata: TInstantFieldMetadata): string; virtual; - function InternalGenerateCreateIndexSQL(Metadata: TInstantIndexMetadata): - string; virtual; - function InternalGenerateCreateTableSQL(Metadata: TInstantTableMetadata): - string; virtual; - function InternalGenerateDeleteConcurrentSQL(Map: TInstantAttributeMap): - string; virtual; - function InternalGenerateDeleteSQL(Map: TInstantAttributeMap): string; - virtual; - function InternalGenerateDeleteExternalSQL(Map: TInstantAttributeMap): - string; virtual; - function InternalGenerateDropFieldSQL(Metadata: TInstantFieldMetadata): - string; virtual; - function InternalGenerateDropIndexSQL(Metadata: TInstantIndexMetadata): - string; virtual; - function InternalGenerateDropTableSQL(Metadata: TInstantTableMetadata): - string; virtual; - function InternalGenerateInsertSQL(Map: TInstantAttributeMap): string; - virtual; - function InternalGenerateInsertExternalSQL(Map: TInstantAttributeMap): - string; virtual; - function InternalGenerateSelectSQL(Map: TInstantAttributeMap): string; - virtual; - function InternalGenerateSelectExternalSQL(Map: TInstantAttributeMap): - string; virtual; - function InternalGenerateSelectExternalPartSQL(Map: TInstantAttributeMap): - string; virtual; - function InternalGenerateSelectTablesSQL: string; virtual; - function InternalGenerateUpdateConcurrentSQL(Map: TInstantAttributeMap): - string; virtual; - function InternalGenerateUpdateFieldCopySQL(OldMetadata, NewMetadata: - TInstantFieldMetadata): string; virtual; - function InternalGenerateUpdateSQL(Map: TInstantAttributeMap): string; - virtual; - property Delimiters: string read GetDelimiters; - property Broker: TInstantSQLBroker read FBroker; - public - constructor Create(ABroker: TInstantSQLBroker); - function GenerateAddFieldSQL(Metadata: TInstantFieldMetadata): string; - function GenerateAlterFieldSQL(OldMetadata, - NewMetadata: TInstantFieldMetadata): string; - function GenerateCreateIndexSQL(Metadata: TInstantIndexMetadata): string; - function GenerateCreateTableSQL(Metadata: TInstantTableMetadata): string; - function GenerateDeleteConcurrentSQL(Map: TInstantAttributeMap): string; - function GenerateDeleteSQL(Map: TInstantAttributeMap): string; - function GenerateDeleteExternalSQL(Map: TInstantAttributeMap): string; - function GenerateDropFieldSQL(Metadata: TInstantFieldMetadata): string; - function GenerateDropIndexSQL(Metadata: TInstantIndexMetadata): string; - function GenerateDropTableSQL(Metadata: TInstantTableMetadata): string; - function GenerateInsertSQL(Map: TInstantAttributeMap): string; - function GenerateInsertExternalSQL(Map: TInstantAttributeMap): string; - function GenerateSelectSQL(Map: TInstantAttributeMap): string; - function GenerateSelectExternalSQL(Map: TInstantAttributeMap): string; - function GenerateSelectExternalPartSQL(Map: TInstantAttributeMap): string; - function GenerateSelectTablesSQL: string; - function GenerateUpdateConcurrentSQL(Map: TInstantAttributeMap): string; - function GenerateUpdateFieldCopySQL(OldMetadata, NewMetadata: - TInstantFieldMetadata): string; - function GenerateUpdateSQL(Map: TInstantAttributeMap): string; - end; - - TInstantCustomRelationalQuery = class(TInstantQuery) - private - function GetConnector: TInstantRelationalConnector; - protected - function GetStatement: string; virtual; - procedure InternalGetInstantObjectRefs(List: TInstantObjectReferenceList); - virtual; - procedure InternalRefreshObjects; override; - procedure SetStatement(const Value: string); virtual; - procedure TranslateCommand; override; - class function TranslatorClass: TInstantRelationalTranslatorClass; virtual; - public - function CreateTranslator: TInstantRelationalTranslator; - property Statement: string read GetStatement write SetStatement; - property Connector: TInstantRelationalConnector read GetConnector; - end; - - TInstantQueryTranslator = class(TInstantIQLTranslator) - private - FQuery: TInstantQuery; - function GetQuery: TInstantQuery; - protected - function CreateCommand: TInstantIQLCommand; override; - function GetResultClassName: string; override; - public - constructor Create(AQuery: TInstantQuery); - property Query: TInstantQuery read GetQuery; - end; - - TInstantRelationalTranslator = class(TInstantQueryTranslator) - private - FCriteriaList: TStringList; - FTablePathList: TStringList; - procedure AddJoin(const FromPath, FromField, ToPath, ToField: string); - function ConcatPath(const APathText, AttribName: string): string; - procedure DestroyCriteriaList; - procedure DestroyTablePathList; - function ExtractTarget(const PathStr: string): string; - function RootAttribToFieldName(const AttribName: string): string; - function GetClassTablePath: string; - function GetCriteriaCount: Integer; - function GetCriteriaList: TStringList; - function GetCriterias(Index: Integer): string; - function GetObjectClassMetadata: TInstantClassMetadata; - function GetQuery: TInstantCustomRelationalQuery; - function GetTablePathAliases(Index: Integer): string; - function GetTablePathCount: Integer; - function GetTablePathList: TStringList; - function GetTablePaths(Index: Integer): string; - function PathToTablePath(const PathText: string): string; - function PathToTarget(const PathText: string; - out TablePath, FieldName: string): TInstantAttributeMetadata; - function Qualify(const TablePath, FieldName: string): string; - function QualifyPath(const PathText: string): string; - function ReplaceWildcard(const Str: string): string; - function TablePathToAlias(const TablePath: string): string; - procedure WriteAnd(Writer: TInstantIQLWriter); - function WriteCriterias(Writer: TInstantIQLWriter; IncludeWhere: Boolean): - Boolean; - procedure WriteTables(Writer: TInstantIQLWriter); - property CriteriaList: TStringList read GetCriteriaList; - property TablePathList: TStringList read GetTablePathList; - function GetConnector: TInstantRelationalConnector; - protected - function AddCriteria(const Criteria: string): Integer; - function AddTablePath(const TablePath: string): Integer; - procedure BeforeTranslate; override; - procedure Clear; override; - procedure CollectObjects(AObject: TInstantIQLObject; - AClassType: TInstantIQLObjectClass; AList: TList); - procedure CollectPaths(AObject: TInstantIQLObject; APathList: TList); - function GetDelimiters: string; virtual; - function GetQuote: Char; virtual; - function GetWildcard: string; virtual; - function HasConnector: Boolean; - function IncludeOrderFields: Boolean; virtual; - function IndexOfCriteria(const Criteria: string): Integer; - function IndexOfTablePath(const TablePath: string): Integer; - function InternalGetObjectClassMetadata: TInstantClassMetadata; virtual; - function IsRootAttribute(const AttributeName: string): Boolean; - function IsPrimary(AObject: TInstantIQLObject): Boolean; - procedure MakeJoins(Path: TInstantIQLPath); - procedure MakeTablePaths(Path: TInstantIQLPath); - function TranslateClassRef(ClassRef: TInstantIQLClassRef; - Writer: TInstantIQLWriter): Boolean; virtual; - function TranslateClause(Clause: TInstantIQLClause; - Writer: TInstantIQLWriter): Boolean; virtual; - function TranslateConstant(Constant: TInstantIQLConstant; - Writer: TInstantIQLWriter): Boolean; virtual; - function TranslateFunction(AFunction: TInstantIQLFunction; - Writer: TInstantIQLWriter): Boolean; virtual; - function TranslateFunctionName(const FunctionName: string; - Writer: TInstantIQLWriter): Boolean; virtual; - function TranslateKeyword(const Keyword: string; Writer: TInstantIQLWriter): - Boolean; override; - function TranslateObject(AObject: TInstantIQLObject; - Writer: TInstantIQLWriter): Boolean; override; - function TranslatePath(Path: TInstantIQLPath; Writer: TInstantIQLWriter): - Boolean; virtual; - function TranslateSpecifier(Specifier: TInstantIQLSpecifier; - Writer: TInstantIQLWriter): Boolean; virtual; - property ClassTablePath: string read GetClassTablePath; - property Connector: TInstantRelationalConnector read GetConnector; - property CriteriaCount: Integer read GetCriteriaCount; - property Criterias[Index: Integer]: string read GetCriterias; - property Delimiters: string read GetDelimiters; - property ObjectClassMetadata: TInstantClassMetadata - read GetObjectClassMetadata; - property Quote: Char read GetQuote; - property TablePathAliases[Index: Integer]: string read GetTablePathAliases; - property TablePathCount: Integer read GetTablePathCount; - property TablePaths[Index: Integer]: string read GetTablePaths; - property Wildcard: string read GetWildcard; - public - destructor Destroy; override; - function QuoteString(const Str: string): string; - property Query: TInstantCustomRelationalQuery read GetQuery; - end; - - TInstantNavigationalQuery = class(TInstantCustomRelationalQuery) - private - FObjectRowList: TList; - function CreateObject(Row: Integer): TObject; - procedure DestroyObjectRowList; - function GetObjectRowList: TList; - function GetObjectRowCount: Integer; - function GetObjectRows(Index: Integer): PObjectRow; - procedure InitObjectRows(List: TList; FromIndex, ToIndex: Integer); - property ObjectRowList: TList read GetObjectRowList; - protected - function GetActive: Boolean; override; - function GetDataSet: TDataSet; virtual; - function GetRowCount: Integer; virtual; - function GetRowNumber: Integer; virtual; - function InternalAddObject(AObject: TObject): Integer; override; - procedure InternalClose; override; - procedure InternalGetInstantObjectRefs(List: TInstantObjectReferenceList); - override; - function InternalGetObjectCount: Integer; override; - function InternalGetObjects(Index: Integer): TObject; override; - function InternalIndexOfObject(AObject: TObject): Integer; override; - procedure InternalInsertObject(Index: Integer; AObject: TObject); override; - procedure InternalOpen; override; - procedure InternalRefreshObjects; override; - procedure InternalReleaseObject(AObject: TObject); override; - function InternalRemoveObject(AObject: TObject): Integer; override; - function IsSequenced: Boolean; virtual; - function ObjectFetched(Index: Integer): Boolean; override; - function RecNoOfObject(AObject: TInstantObject): Integer; virtual; - procedure SetRowNumber(Value: Integer); virtual; - property DataSet: TDataSet read GetDataSet; - property ObjectRowCount: Integer read GetObjectRowCount; - property ObjectRows[Index: Integer]: PObjectRow read GetObjectRows; - public - destructor Destroy; override; - property RowCount: Integer read GetRowCount; - property RowNumber: Integer read GetRowNumber write SetRowNumber; - end; - - //Backwards compatibility - TInstantRelationalQuery = TInstantNavigationalQuery; - - TInstantSQLQuery = class(TInstantCustomRelationalQuery) - private - FObjectReferenceList: TInstantObjectReferenceList; - FParamsObject: TParams; - FStatement: string; - procedure DestroyObjectReferenceList; - function GetObjectReferenceCount: Integer; - function GetObjectReferenceList: TInstantObjectReferenceList; - function GetParamsObject: TParams; - procedure InitObjectReferences(DataSet: TDataSet); - protected - function GetActive: Boolean; override; - function AcquireDataSet(const AStatement: string; AParams: TParams): - TDataSet; virtual; - procedure ReleaseDataSet(const DataSet: TDataSet); - function GetParams: TParams; override; - function GetStatement: string; override; - function InternalAddObject(AObject: TObject): Integer; override; - procedure InternalClose; override; - procedure InternalGetInstantObjectRefs(List: TInstantObjectReferenceList); - override; - function InternalGetObjectCount: Integer; override; - function InternalGetObjects(Index: Integer): TObject; override; - function InternalIndexOfObject(AObject: TObject): Integer; override; - procedure InternalInsertObject(Index: Integer; AObject: TObject); override; - procedure InternalOpen; override; - procedure InternalReleaseObject(AObject: TObject); override; - function InternalRemoveObject(AObject: TObject): Integer; override; - procedure SetParams(Value: TParams); override; - function ObjectFetched(Index: Integer): Boolean; override; - procedure SetStatement(const Value: string); override; - property ObjectReferenceCount: Integer read GetObjectReferenceCount; - property ObjectReferenceList: TInstantObjectReferenceList read - GetObjectReferenceList; - property ParamsObject: TParams read GetParamsObject; - public - destructor Destroy; override; - end; - - TInstantRelationalConnectionDef = class(TInstantConnectionDef) - end; - - TInstantConnectionBasedConnectionDef = class(TInstantRelationalConnectionDef) - private - FLoginPrompt: Boolean; - protected - function CreateConnection(AOwner: TComponent): TCustomConnection; virtual; - abstract; - procedure InitConnector(Connector: TInstantConnector); override; - public - constructor Create(Collection: TCollection); override; - published - property LoginPrompt: Boolean read FLoginPrompt write FLoginPrompt - default True; - end; - -var - InstantLogProc: procedure (const AString: string) of object; - -implementation - -uses -{$IFDEF MSWINDOWS} - Windows, -{$ENDIF} -{$IFDEF LINUX} - Types, -{$ENDIF} -{$IFDEF D6+} - Variants, - DateUtils, -{$ENDIF} - TypInfo, InstantUtils, InstantRtti; - -const - ConcurrencyParamName = 'IO_Concur'; - PersistentIdParamName = 'IO_PersId'; - -{$IFDEF IO_STATEMENT_LOGGING} -procedure InstantLogStatement(const Caption, AStatement: string; - AParams: TParams = nil); -var - S: string; - g: Integer; -begin - S := Caption + AStatement; - if Assigned(AParams) then - begin - for g := 0 to AParams.Count - 1 do begin - S := S + sLineBreak + ' ' + - AParams[g].Name + ': ' + GetEnumName(TypeInfo(TFieldType), - Ord(AParams[g].DataType)) + - ' = ' + AParams[g].AsString; - end; - end; -{$IFDEF MSWINDOWS} - OutputDebugString(PChar(S)); -{$ENDIF} - if Assigned(InstantLogProc) then - InstantLogProc(S); -end; -{$ENDIF} - -function CreateObjectFromDataSet(AClass: TClass; DataSet: TDataSet): TObject; -var - I: Integer; - FieldName: string; -begin - if AClass = nil then - raise Exception.Create(SUnassignedClass) - else if AClass.InheritsFrom(TInstantObject) then - Result := TInstantObjectClass(AClass).Create - else - Result := AClass.Create; - for I := 0 to Pred(DataSet.FieldCount) do - begin - FieldName := StringReplace( - DataSet.Fields[I].FieldName, '_', '.', [rfReplaceAll]); - InstantSetProperty(Result, FieldName, DataSet.Fields[I].Value); - end; -end; - -{ TInstantCustomRelationalBroker } - -constructor TInstantCustomRelationalBroker.Create(AConnector: TInstantConnector); -begin - inherited; - FStatementCacheCapacity := 0; -end; - -destructor TInstantCustomRelationalBroker.Destroy; -begin - FreeAndNil(FStatementCache); - inherited; -end; - -procedure TInstantCustomRelationalBroker.DisposeMap(AObject: TInstantObject; - const AObjectId: string; Map: TInstantAttributeMap; - ConflictAction: TInstantConflictAction; Info: PInstantOperationInfo); -begin - EnsureResolver(Map).DisposeMap(AObject, Map, ConflictAction, Info); -end; - -function TInstantCustomRelationalBroker.Execute(const AStatement: string; - AParams: TParams): Integer; -begin - Result := 0; -end; - -function TInstantCustomRelationalBroker.GetConnector: TInstantRelationalConnector; -begin - Result := inherited Connector as TInstantRelationalConnector; -end; - -function TInstantCustomRelationalBroker.GetDBMSName: string; -begin - Result := ''; -end; - -function TInstantCustomRelationalBroker.GetSQLDelimiters: string; -begin - Result := ''; -end; - -function TInstantCustomRelationalBroker.GetSQLQuote: Char; -begin - Result := '"'; -end; - -function TInstantCustomRelationalBroker.GetSQLWildcard: string; -begin - Result := '%'; -end; - -function TInstantCustomRelationalBroker.GetStatementCache: TInstantStatementCache; -begin - if not Assigned(FStatementCache) then - begin - FStatementCache := TInstantStatementCache.Create(nil); - FStatementCache.Capacity := FStatementCacheCapacity; - end; - Result := FStatementCache; -end; - -function TInstantCustomRelationalBroker.InternalDisposeObject( - AObject: TInstantObject; ConflictAction: TInstantConflictAction): Boolean; -begin - Result := PerformOperation(AObject, AObject.Id, otDispose, DisposeMap, - ConflictAction); -end; - -function TInstantCustomRelationalBroker.InternalRetrieveObject( - AObject: TInstantObject; const AObjectId: string; - ConflictAction: TInstantConflictAction): Boolean; -begin - Result := PerformOperation(AObject, AObjectId, otRetrieve, RetrieveMap, - ConflictAction); -end; - -function TInstantCustomRelationalBroker.InternalStoreObject( - AObject: TInstantObject; ConflictAction: TInstantConflictAction): Boolean; -begin - Result := PerformOperation(AObject, AObject.Id, otStore, StoreMap, - ConflictAction); -end; - -function TInstantCustomRelationalBroker.PerformOperation( - AObject: TInstantObject; const AObjectId: string; - OperationType: TInstantOperationType; Operation: TInstantBrokerOperation; - ConflictAction: TInstantConflictAction): Boolean; - - function OperationRequired(Map: TInstantAttributeMap): Boolean; - var - I: Integer; - Attrib: TInstantAttribute; - begin - case OperationType of - otStore: - begin - Result := not AObject.IsPersistent; - if not Result then - for I := 0 to Pred(Map.Count) do - begin - Attrib := AObject.AttributeByName(Map[I].Name); - Result := Attrib.IsMandatory or Attrib.IsChanged; - if Result then - Exit; - end; - end; - otRetrieve, otDispose: - Result := True; - else - Result := False; - end; - end; - -var - I: Integer; - RootMap, Map: TInstantAttributeMap; - Info: TInstantOperationInfo; -begin - with Info do - begin - Success := False; - Conflict := False; - end; - with AObject.Metadata do - begin - RootMap := StorageMaps.RootMap; - Operation(AObject, AObjectId, RootMap, ConflictAction, @Info); - Result := Info.Success; - if Result then - for I := 0 to Pred(StorageMaps.Count) do - begin - Map := StorageMaps[I]; - if (Map <> RootMap) and (Info.Conflict or OperationRequired(Map)) then - Operation(AObject, AObjectId, Map); - end; - end; -end; - -procedure TInstantCustomRelationalBroker.RetrieveMap(AObject: TInstantObject; - const AObjectId: string; Map: TInstantAttributeMap; - ConflictAction: TInstantConflictAction; Info: PInstantOperationInfo); -begin - EnsureResolver(Map).RetrieveMap(AObject, AObjectId, Map, ConflictAction, Info); -end; - -procedure TInstantCustomRelationalBroker.SetStatementCacheCapacity(const Value: Integer); -begin - FStatementCacheCapacity := Value; - if FStatementCacheCapacity = 0 then - FreeAndNil(FStatementCache) - else if Assigned(FStatementCache) then - FStatementCache.Capacity := FStatementCacheCapacity; -end; - -procedure TInstantCustomRelationalBroker.StoreMap(AObject: TInstantObject; - const AObjectId: string; Map: TInstantAttributeMap; - ConflictAction: TInstantConflictAction; Info: PInstantOperationInfo); - - // Always storing fixes #880713 - {function MustStoreMap: Boolean; - var - I: Integer; - Attrib: TInstantAttribute; - begin - Result := Map.IsRootMap; - if Result then - Exit; - for I := 0 to Pred(Map.Count) do - begin - Attrib := AObject.AttributeByName(Map[I].Name); - Result := Attrib.IsMandatory or not Attrib.IsDefault; - if Result then - Exit; - end; - Result := False; - end;} - -var - Resolver: TInstantCustomResolver; - {MustStore: Boolean;} -begin - {MustStore := MustStoreMap;} - {if MustStore or AObject.IsPersistent then - begin} - Resolver := EnsureResolver(Map); - {if MustStore then} - Resolver.StoreMap(AObject, Map, ConflictAction, Info) - {else if AObject.IsPersistent then - Resolver.DisposeMap(AObject, Map, ConflictAction, Info); - end;} -end; - -{ TInstantNavigationalBroker } - -destructor TInstantNavigationalBroker.Destroy; -begin - FResolverList.Free; - inherited; -end; - -function TInstantNavigationalBroker.EnsureResolver( - Map: TInstantAttributeMap): TInstantCustomResolver; -var - TableName: string; -begin - TableName := Map.Name; - Result := FindResolver(TableName); - if not Assigned(Result) then - begin - Result := CreateResolver(TableName); - ResolverList.Add(Result); - end; -end; - -function TInstantNavigationalBroker.FindResolver( - const TableName: string): TInstantNavigationalResolver; -var - I: Integer; -begin - for I := 0 to Pred(ResolverCount) do - begin - Result := Resolvers[I]; - if SameText(TableName, Result.TableName) then - Exit; - end; - Result := nil; -end; - -function TInstantNavigationalBroker.GetResolverCount: Integer; -begin - Result := ResolverList.Count; -end; - -function TInstantNavigationalBroker.GetResolverList: TObjectList; -begin - if not Assigned(FResolverList) then - FResolverList := TObjectList.Create; - Result := FResolverList; -end; - -function TInstantNavigationalBroker.GetResolvers( - Index: Integer): TInstantNavigationalResolver; -begin - Result := ResolverList[Index] as TInstantNavigationalResolver; -end; - -destructor TInstantSQLBroker.Destroy; -begin - FGenerator.Free; - FResolverList.Free; - inherited; -end; - -{ TInstantSQLBroker } - -function TInstantSQLBroker.AcquireDataSet(const AStatement: string; - AParams: TParams): TDataSet; -var - CachedStatement: TInstantStatement; -begin - Result := nil; - if FStatementCacheCapacity <> 0 then - begin - CachedStatement := StatementCache.GetStatement(AStatement); - if Assigned(CachedStatement) then - begin - Result := TDataSet(CachedStatement.StatementImplementation); - AssignDataSetParams(Result, AParams); - end; - end; - if not Assigned(Result) then - begin - Result := CreateDataSet(AStatement, AParams); - try - if Assigned(AParams) and (FStatementCacheCapacity <> 0) then - StatementCache.AddStatement(AStatement, Result); - except - if FStatementCacheCapacity <> 0 then - StatementCache.RemoveStatement(AStatement); - Result.Free; - raise; - end; - end; -end; - -procedure TInstantSQLBroker.AssignDataSetParams(DataSet: TDataSet; AParams: TParams); -begin - raise EInstantError.CreateFmt(SMissingImplementation, ['AssignDataSetParams', ClassName]); -end; - -function TInstantSQLBroker.EnsureResolver( - AMap: TInstantAttributeMap): TInstantCustomResolver; -begin - Result := FindResolver(AMap); - if not Assigned(Result) then - begin - Result := CreateResolver(AMap); - ResolverList.Add(Result) - end; -end; - -function TInstantSQLBroker.FindResolver( - AMap: TInstantAttributeMap): TInstantSQLResolver; -var - I: Integer; -begin - for I := 0 to Pred(ResolverCount) do - begin - Result := Resolvers[I]; - if Result.Map = AMap then - Exit; - end; - Result := nil; -end; - -class function TInstantSQLBroker.GeneratorClass: TInstantSQLGeneratorClass; -begin - Result := TInstantSQLGenerator; -end; - -function TInstantSQLBroker.GetGenerator: TInstantSQLGenerator; -begin - if not Assigned(FGenerator) then - FGenerator := GeneratorClass.Create(Self); - Result := FGenerator; -end; - -function TInstantSQLBroker.GetResolverCount: Integer; -begin - Result := ResolverList.Count; -end; - -function TInstantSQLBroker.GetResolverList: TObjectList; -begin - if not Assigned(FResolverList) then - FResolverList := TObjectList.Create; - Result := FResolverList; -end; - -function TInstantSQLBroker.GetResolvers( - Index: Integer): TInstantSQLResolver; -begin - Result := ResolverList[Index] as TInstantSQLResolver; -end; - -procedure TInstantSQLBroker.InternalBuildDatabase(Scheme: TInstantScheme); -var - I, J: Integer; - TableMetadata: TInstantTableMetadata; - IndexMetadata: TInstantIndexMetadata; -begin - if not Assigned(Scheme) then - Exit; - with Scheme do - begin - for I := 0 to Pred(TableMetadataCount) do - begin - TableMetadata := TableMetadatas[I]; - try - Execute(Generator.GenerateDropTableSQL(TableMetadata)); - except - end; - Execute(Generator.GenerateCreateTableSQL(TableMetadata)); - with TableMetadata do - begin - for J := 0 to Pred(IndexMetadatas.Count) do - begin - IndexMetadata := IndexMetadatas[J]; - if not (ixPrimary in IndexMetadata.Options) then - Execute(Generator.GenerateCreateIndexSQL(IndexMetadata)); - end; - end; - end; - end; -end; - -procedure TInstantSQLBroker.ReleaseDataSet(const ADataSet: TDataSet); -begin - if FStatementCacheCapacity <> 0 then - ADataSet.Close - else - ADataSet.Free; -end; - -{ TInstantRelationalConnector } - -procedure TInstantRelationalConnector.DoGetDataSet(const CommandText: string; - var DataSet: TDataSet); -begin - if Assigned(FOnGetDataSet) then - FOnGetDataSet(Self, CommandText, DataSet) - else - GetDataSet(CommandText, DataSet); -end; - -procedure TInstantRelationalConnector.DoInitDataSet( - const CommandText: string; DataSet: TDataSet); -begin - if Assigned(FOnInitDataSet) then - FOnInitDataSet(Self, CommandText, DataSet) - else - InitDataSet(CommandText, DataSet); -end; - -function TInstantRelationalConnector.GetBroker: TInstantCustomRelationalBroker; -begin - Result := inherited Broker as TInstantCustomRelationalBroker; -end; - -procedure TInstantRelationalConnector.GetDataSet(const CommandText: string; - var DataSet: TDataSet); -begin -end; - -function TInstantRelationalConnector.GetDBMSName: string; -begin - Result := Broker.DBMSName; -end; - -procedure TInstantRelationalConnector.InitDataSet(const CommandText: string; - DataSet: TDataSet); -begin -end; - -function TInstantRelationalConnector.InternalCreateScheme( - Model: TInstantModel): TInstantScheme; -begin - Result := TInstantScheme.Create; - try - Result.IdDataType := IdDataType; - Result.IdSize := IdSize; - Result.BlobStreamFormat := BlobStreamFormat; - Result.Catalog := TInstantModelCatalog.Create(Result, Model); - except - FreeAndNil(Result); - raise; - end; -end; - -constructor TInstantConnectionBasedConnector.Create(AOwner: TComponent); -begin - inherited; - FLoginPrompt := True; -end; - -{ TInstantConnectionBasedConnector } - -procedure TInstantConnectionBasedConnector.AfterConnectionChange; -begin -end; - -procedure TInstantConnectionBasedConnector.AssignLoginOptions; -begin - if HasConnection then - begin - FConnection.LoginPrompt := FLoginPrompt; - end; -end; - -procedure TInstantConnectionBasedConnector.BeforeConnectionChange; -begin -end; - -procedure TInstantConnectionBasedConnector.CheckConnection; -begin - InstantCheckConnection(FConnection); -end; - -procedure TInstantConnectionBasedConnector.DoAfterConnectionChange; -begin - if Assigned(FConnection) then - FConnection.FreeNotification(Self); - AfterConnectionChange; -end; - -procedure TInstantConnectionBasedConnector.DoBeforeConnectionChange; -begin - try - BeforeConnectionChange; - finally - if Assigned(FConnection) then - FConnection.RemoveFreeNotification(Self); - end; -end; - -function TInstantConnectionBasedConnector.GetConnected: Boolean; -begin - if HasConnection then - Result := Connection.Connected - else - Result := inherited GetConnected; -end; - -function TInstantConnectionBasedConnector.GetConnection: TCustomConnection; -begin - if not (csDesigning in ComponentSt... [truncated message content] |
From: <jcm...@us...> - 2007-02-24 19:41:55
|
Revision: 762 http://svn.sourceforge.net/instantobjects/revision/?rev=762&view=rev Author: jcmoraisjr Date: 2007-02-24 11:41:55 -0800 (Sat, 24 Feb 2007) Log Message: ----------- Moved the LogStatement call to the AcquireDataSet method in order to log all db statements. Modified Paths: -------------- trunk/Source/Core/InstantBrokers.pas Modified: trunk/Source/Core/InstantBrokers.pas =================================================================== --- trunk/Source/Core/InstantBrokers.pas 2007-02-24 19:37:18 UTC (rev 761) +++ trunk/Source/Core/InstantBrokers.pas 2007-02-24 19:41:55 UTC (rev 762) @@ -1294,6 +1294,9 @@ var CachedStatement: TInstantStatement; begin + {$IFDEF IO_STATEMENT_LOGGING} + InstantLogStatement('Before: ', AStatement, AParams); + {$ENDIF} Result := nil; if FStatementCacheCapacity <> 0 then begin @@ -2855,9 +2858,6 @@ var TransError: Exception; begin - {$IFDEF IO_STATEMENT_LOGGING} - InstantLogStatement('Before: ', AStatement, AParams); - {$ENDIF} try Result := Broker.Execute(AStatement, AParams); Info.Success := Result >= 1; |
From: <jcm...@us...> - 2007-02-24 23:49:56
|
Revision: 766 http://svn.sourceforge.net/instantobjects/revision/?rev=766&view=rev Author: jcmoraisjr Date: 2007-02-24 15:49:44 -0800 (Sat, 24 Feb 2007) Log Message: ----------- Fixed bug #1174283 Modified Paths: -------------- trunk/Source/Core/InstantBrokers.pas Modified: trunk/Source/Core/InstantBrokers.pas =================================================================== --- trunk/Source/Core/InstantBrokers.pas 2007-02-24 23:45:06 UTC (rev 765) +++ trunk/Source/Core/InstantBrokers.pas 2007-02-24 23:49:44 UTC (rev 766) @@ -3993,15 +3993,13 @@ Resolver.AddIdParam(Params, InstantParentIdFieldName, AttributeOwner.Id); Resolver.AddStringParam(Params, InstantParentClassFieldName, AttributeOwner.ClassName); - Resolver.AddStringParam(Params, InstantChildClassFieldName, - Attribute.Metadata.ObjectClassName); DataSet := Broker.AcquireDataSet(Statement, Params); try DataSet.Open; try while not DataSet.Eof do begin - Obj := Attribute.Metadata.ObjectClass.Retrieve( + Obj := InstantFindClass(DataSet.FieldByName(InstantChildClassFieldName).AsString).Retrieve( // DataSet.Fields[1].AsString, False, False, AObject.Connector); DataSet.FieldByName(InstantChildIdFieldName).AsString, False, False, Attribute.Connector) as TInstantObject; @@ -4039,8 +4037,6 @@ Resolver.AddIdParam(Params, InstantParentIdFieldName, AObjectId); Resolver.AddStringParam(Params, InstantParentClassFieldName, AttributeOwner.ClassName); - Resolver.AddStringParam(Params, InstantChildClassFieldName, - Attribute.Metadata.ObjectClassName); DataSet := Broker.AcquireDataSet(Statement, Params); try DataSet.Open; @@ -4680,10 +4676,9 @@ begin FieldStr := Format('%s, %s, %s', [EmbraceField(InstantChildClassFieldName), EmbraceField(InstantChildIdFieldName), EmbraceField(InstantSequenceNoFieldName)]); - WhereStr := Format('%s = :%s AND %s = :%s AND %s = :%s', + WhereStr := Format('%s = :%s AND %s = :%s', [EmbraceField(InstantParentClassFieldName), InstantParentClassFieldName, - EmbraceField(InstantParentIdFieldName), InstantParentIdFieldName, - EmbraceField(InstantChildClassFieldName), InstantChildClassFieldName]); + EmbraceField(InstantParentIdFieldName), InstantParentIdFieldName]); Result := Format('SELECT %s FROM %s WHERE %s ORDER BY %s', [FieldStr, EmbraceTable('%s'), WhereStr, EmbraceField(InstantSequenceNoFieldName)]); end; |
From: <jcm...@us...> - 2008-07-01 12:34:11
|
Revision: 779 http://instantobjects.svn.sourceforge.net/instantobjects/revision/?rev=779&view=rev Author: jcmoraisjr Date: 2008-07-01 05:34:20 -0700 (Tue, 01 Jul 2008) Log Message: ----------- Fixed storage of container attributes. Modified Paths: -------------- trunk/Source/Core/InstantBrokers.pas Modified: trunk/Source/Core/InstantBrokers.pas =================================================================== --- trunk/Source/Core/InstantBrokers.pas 2008-02-27 09:03:37 UTC (rev 778) +++ trunk/Source/Core/InstantBrokers.pas 2008-07-01 12:34:20 UTC (rev 779) @@ -3308,7 +3308,11 @@ begin Attribute := TInstantContainer(AObject.AttributeByName( AttributeMetadata.Name)); - if Attribute.IsChanged and + + { TODO : Attribute.Owner.IsPersistent is used (below) because Dispose + doesn't change the state of changed attributes to IsChanged. + Perhaps ObjStore.DisposeObject is the right place to fix (JM) } + if (Attribute.IsChanged or not Attribute.Owner.IsPersistent) and (AttributeMetadata.StorageKind = skExternal) then begin LinkResolver := TInstantSQLLinkResolver.Create(Self, |