lazarus-ccr/components/flashfiler/sourcelaz/ffsrfmap.pas
2016-12-07 13:31:59 +00:00

258 lines
7.5 KiB
ObjectPascal

{*********************************************************}
{* FlashFiler: Server Restructure Field Map *}
{*********************************************************}
(* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is TurboPower FlashFiler
*
* The Initial Developer of the Original Code is
* TurboPower Software
*
* Portions created by the Initial Developer are Copyright (C) 1996-2002
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* ***** END LICENSE BLOCK ***** *)
{$I ffdefine.inc}
unit ffsrfmap;
interface
uses
Windows,
SysUtils,
Classes,
ffconst,
ffllbase,
fflldict,
ffsrbase,
ffsrbde,
fftbdict;
type
TffSrRestructField = record
Name: TffDictItemName;
Number: Integer;
Offset: Integer;
FieldLength: Integer;
FieldType: TffFieldType;
end;
TffSrFieldMapListItem = class(TffSelfListItem)
protected {private}
fmPadlock : TffPadlock;
fmSource : TffSrRestructField;
fmTarget : TffSrRestructField;
protected
public
constructor Create(aSourceField, aTargetField: TffSrRestructField);
destructor Destroy; override;
end;
TffSrFieldMapList = class(TffObject)
protected {private}
FList : TffList;
fmlPadlock : TffPadlock;
fmlSourceDict: TffServerDataDict;
fmlTargetDict: TffServerDataDict;
protected
function GetCount: Integer;
function GetSourceField(aIndex: Integer): TffSrRestructField;
function GetTargetField(aIndex: Integer): TffSrRestructField;
public
constructor Create(aSourceDict, aTargetDict: TffDataDictionary);
destructor Destroy; override;
function Add(aSourceFieldName, aTargetFieldName: TffShStr): TffResult;
{-insert single source-to-target field mapping into list;
return true on success}
function AddStringList(aFieldMap: TffStringList): TffResult;
{-given a string list containing "destfield=sourcefield" entries,
populates the field map with structured field entries}
property Count: Integer
{-the number of items in the list}
read GetCount;
property SourceDict: TffServerDataDict
{-provides access to the source table's dictionary}
read fmlSourceDict;
property SourceField[aIndex: Integer]: TffSrRestructField
{-returns the field info for a source field}
read GetSourceField;
property TargetDict: TffServerDataDict
{-provides access to the target table's dictionary}
read fmlTargetDict;
property TargetField[aIndex: Integer]: TffSrRestructField
{-returns the field info for a target field}
read GetTargetField;
end;
function FFBuildFieldMapEntry(aFieldName: TffDictItemName;
aDictionary: TffServerDataDict;
var aFieldEntry: TffSrRestructField): Boolean;
implementation
{===TffSrFieldMapListItem============================================}
constructor TffSrFieldMapListItem.Create(aSourceField,
aTargetField: TffSrRestructField);
begin
inherited Create;
fmPadlock := TffPadlock.Create;
fmSource := aSourceField;
fmTarget := aTargetField;
end;
{--------}
destructor TffSrFieldMapListItem.Destroy;
begin
fmPadlock.Free;
inherited Destroy;
end;
{====================================================================}
{===TffSrFieldMapLList===============================================}
constructor TffSrFieldMapList.Create(aSourceDict, aTargetDict: TffDataDictionary);
begin
inherited Create;
FList := TffList.Create;
fmlPadlock := TffPadlock.Create;
fmlSourceDict := TffServerDataDict.Create(4096);
fmlTargetDict := TffServerDataDict.Create(4096);
fmlSourceDict.Assign(aSourceDict);
fmlTargetDict.Assign(aTargetDict);
end;
{--------}
destructor TffSrFieldMapList.Destroy;
begin
fmlSourceDict.Free;
fmlTargetDict.Free;
fmlPadlock.Free;
FList.Free;
inherited Destroy;
end;
{--------}
function TffSrFieldMapList.Add(aSourceFieldName,
aTargetFieldName: TffShStr): TffResult;
var
Item: TffSrFieldMapListItem;
SourceField, TargetField: TffSrRestructField;
begin
Result := DBIERR_NONE;
fmlPadlock.Lock;
try
if aSourceFieldName = '' then
aSourceFieldName := aTargetFieldName;
{ Build packet of info about the source field }
with fmlSourceDict do begin
SourceField.Name := aSourceFieldName;
SourceField.Number := GetFieldFromName(aSourceFieldName);
if SourceField.Number = -1 then begin
Result := DBIERR_INVALIDFIELDNAME;
Exit;
end;
SourceField.Offset := FieldOffset[SourceField.Number];
SourceField.FieldLength := FieldLength[SourceField.Number];
SourceField.FieldType := FieldType[SourceField.Number];
end;
{ Build packet of info about the target field }
with fmlTargetDict do begin
TargetField.Name := aTargetFieldName;
TargetField.Number := GetFieldFromName(aTargetFieldName);
if TargetField.Number = -1 then begin
Result := DBIERR_INVALIDFIELDNAME;
Exit;
end;
TargetField.Offset := FieldOffset[TargetField.Number];
TargetField.FieldLength := FieldLength[TargetField.Number];
TargetField.FieldType := FieldType[TargetField.Number];
end;
Item := TffSrFieldMapListItem.Create(SourceField, TargetField);
try
if not FList.Insert(Item) then
Result := -1 {!! DBIERR_????};
except
Item.Free;
raise;
end;{try..except}
finally
fmlPadlock.Unlock;
end;{try..finally}
end;
{--------}
function TffSrFieldMapList.AddStringList(aFieldMap: TffStringList): TffResult;
var
I: Integer;
SourceName, TargetName: TffShStr;
begin
Result := DBIERR_NONE;
for I := 0 to aFieldMap.Count - 1 do begin
FFShStrSplit(aFieldMap.Strings[I], '=', TargetName, SourceName);
Add(SourceName, TargetName); {!! check for errors }
end;
end;
{--------}
function TffSrFieldMapList.GetCount: Integer;
begin
Result := FList.Count;
end;
{--------}
function TffSrFieldMapList.GetSourceField(aIndex: Integer): TffSrRestructField;
begin
Result := TffSrFieldMapListItem(FList.Items[aIndex]).fmSource;
end;
{--------}
function TffSrFieldMapList.GetTargetField(aIndex: Integer): TffSrRestructField;
begin
Result := TffSrFieldMapListItem(FList.Items[aIndex]).fmTarget;
end;
{====================================================================}
function FFBuildFieldMapEntry(aFieldName: TffDictItemName;
aDictionary: TffServerDataDict;
var aFieldEntry: TffSrRestructField): Boolean;
begin
Result := True;
with aDictionary do begin
aFieldEntry.Number := GetFieldFromName(aFieldName);
if aFieldEntry.Number = -1 then begin
Result := False;
Exit;
end;
aFieldEntry.Offset := FieldOffset[aFieldEntry.Number];
aFieldEntry.FieldLength := FieldLength[aFieldEntry.Number];
aFieldEntry.FieldType := FieldType[aFieldEntry.Number];
end;
end;
end.