?? myldbpage.pas
字號:
end;
FTableStates[Index].IsTableStateValueAssigned := True;
FTableStates[Index].TableState := TableState;
end;// SetTableState
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBPageController
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// SetPageNo
//------------------------------------------------------------------------------
procedure TMYLDBPageController.SetPageNo(Value: TMYLDBPageNo);
begin
LPage.PageNo := Value;
end;// SetPageNo
//------------------------------------------------------------------------------
// GetPageNo
//------------------------------------------------------------------------------
function TMYLDBPageController.GetPageNo: TMYLDBPageNo;
begin
Result := LPage.PageNo;
end;// GetPageNo
//------------------------------------------------------------------------------
// GetPageSize
//------------------------------------------------------------------------------
function TMYLDBPageController.GetPageSize: Integer;
begin
Result := LPage.PageSize;
end;// GetPageSize
//------------------------------------------------------------------------------
// SetPageBuffer
//------------------------------------------------------------------------------
procedure TMYLDBPageController.SetPageBuffer(Value: TMYLDBPageBuffer);
begin
LPage.PageBuffer := Value;
end;// SetPageBuffer
//------------------------------------------------------------------------------
// GetPageBuffer
//------------------------------------------------------------------------------
function TMYLDBPageController.GetPageBuffer: TMYLDBPageBuffer;
begin
Result := LPage.PageBuffer;
end;// GetPageBuffer
//------------------------------------------------------------------------------
// SetOwnBuffer
//------------------------------------------------------------------------------
procedure TMYLDBPageController.SetOwnBuffer(Value: Boolean);
begin
LPage.OwnBuffer := Value;
end;// SetOwnBuffer
//------------------------------------------------------------------------------
// GetOwnBuffer
//------------------------------------------------------------------------------
function TMYLDBPageController.GetOwnBuffer: Boolean;
begin
Result := LPage.OwnBuffer;
end;// GetOwnBuffer
//------------------------------------------------------------------------------
// SetIsDirty
//------------------------------------------------------------------------------
procedure TMYLDBPageController.SetIsDirty(Value: Boolean);
begin
LPage.IsDirty := Value;
end;// SetIsDirty
//------------------------------------------------------------------------------
// GetIsDirty
//------------------------------------------------------------------------------
function TMYLDBPageController.GetIsDirty: Boolean;
begin
Result := LPage.IsDirty;
end;// GetIsDirty
//------------------------------------------------------------------------------
// SetUseCount
//------------------------------------------------------------------------------
procedure TMYLDBPageController.SetUseCount(Value: Integer);
begin
LPage.UseCount := Value;
end;// SetUseCount
//------------------------------------------------------------------------------
// GetUseCount
//------------------------------------------------------------------------------
function TMYLDBPageController.GetUseCount: Integer;
begin
Result := LPage.UseCount;
end;// GetUseCount
//------------------------------------------------------------------------------
// GetPageManager
//------------------------------------------------------------------------------
function TMYLDBPageController.GetPageManager: TMYLDBPageManager;
begin
Result := LPage.PageManager;
end;// GetPageManager
//------------------------------------------------------------------------------
// GetPageData
//------------------------------------------------------------------------------
function TMYLDBPageController.GetPageData: TMYLDBPageBuffer;
begin
Result := LPage.PageData;
end;// GetPageData
//------------------------------------------------------------------------------
// GetPageDataSize
//------------------------------------------------------------------------------
function TMYLDBPageController.GetPageDataSize: Integer;
begin
Result := LPage.PageDataSize;
end;// GetPageDataSize
//------------------------------------------------------------------------------
// EnlargePageBuffer
//------------------------------------------------------------------------------
procedure TMYLDBPageController.EnlargePageBuffer(NewSize: Integer);
begin
LPage.EnlargePageBuffer(NewSize);
end;// EnlargePageBuffer
////////////////////////////////////////////////////////////////////////////////
//
// TMYLDBSortedPageList
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// Construct array of specified size
//------------------------------------------------------------------------------
constructor TMYLDBSortedPageList.Create(size: integer);
begin
AllocBy := 1000; // default alloc
deAllocBy := 1000; // default dealloc
MaxAllocBy := 10000; // max alloc
AllocItemCount := 0;
LRUCount := 0;
SetSize(size);
end;//Create
//------------------------------------------------------------------------------
// Delete an element by specified key
//------------------------------------------------------------------------------
procedure TMYLDBSortedPageList.Delete(PageNo: integer);
var pos : Integer;
begin
if (itemCount <= 0) then
raise EMYLDBException.Create(20165, ErrorADeleteFromArray);
if (itemCount = 1) then
DeleteByPosition(0)
else
begin
pos := FindPosition(PageNo);
if (pos < 0) then
raise EMYLDBException.Create(20166, ErrorADeleteFromArrayNotFound, [PageNo, itemCount]);
DeleteByPosition(pos);
end;
end;//Delete
//------------------------------------------------------------------------------
// Clear
//------------------------------------------------------------------------------
procedure TMYLDBSortedPageList.Clear;
begin
ItemCount := 0;
end;// Clear
//------------------------------------------------------------------------------
// FirstByLRU
//------------------------------------------------------------------------------
function TMYLDBSortedPageList.FirstByLRU: TMYLDBPage;
var
bInit: Boolean;
i: Integer;
begin
bInit := False;
Result := nil;
for i := 0 to ItemCount-1 do
if ((not bInit) or (ValueItems[i].LRUCount < LRULastFound)) then
begin
bInit := True;
LRULastFound := ValueItems[i].LRUCount;
Result := ValueItems[i].Page;
end;
end;// FirstByLRU
//------------------------------------------------------------------------------
// NextByLRU
//------------------------------------------------------------------------------
function TMYLDBSortedPageList.NextByLRU: TMYLDBPage;
var
i: Integer;
begin
Result := nil;
for i := 0 to ItemCount-1 do
if (ValueItems[i].LRUCount < LRULastFound) then
begin
LRULastFound := ValueItems[i].LRUCount;
Result := ValueItems[i].Page;
break;
end;
end;// NextByLRU
//------------------------------------------------------------------------------
// UpdateLRU
//------------------------------------------------------------------------------
procedure TMYLDBSortedPageList.UpdateLRU(Page: TMYLDBPage);
var
pos: Integer;
begin
pos := FindPosition(Page.PageNo);
if (Pos = - 1) then
raise EMYLDBException.Create(20167, ErrorAPageNotFound);
Inc(LRUCount);
ValueItems[Pos].LRUCount := LRUCount;
end;// UpdateLRU
//------------------------------------------------------------------------------
// Delete an element at specified position
//------------------------------------------------------------------------------
procedure TMYLDBSortedPageList.DeleteByPosition(ItemNo: integer);
begin
if (itemNo < itemCount-1) then
begin
Move(KeyItems[itemNo+1],KeyItems[itemNo],
(itemCount - itemNo-1) * sizeOf(integer));
Move(ValueItems[itemNo+1],ValueItems[itemNo],
(itemCount - itemNo-1) * sizeOf(ValueItems[0]));
end;
dec(ItemCount);
SetSize(ItemCount);
end;//DeleteByPosition
//------------------------------------------------------------------------------
// Finds value for specified key
// returns nil if element was not found
//------------------------------------------------------------------------------
function TMYLDBSortedPageList.Find(key: Integer): TMYLDBPage;
var
pos: Integer;
begin
pos := FindPositionForInsert(key);
if (pos >= itemCount) or (pos < 0) then
Result := nil
else
if (KeyItems[pos] <> key) then
Result := nil
else
Result := ValueItems[pos].Page;
end;//Find
//------------------------------------------------------------------------------
// Finds position for insert element
// returns -1 if element was not found
//------------------------------------------------------------------------------
function TMYLDBSortedPageList.FindPosition(key: Integer): Integer;
begin
Result := FindPositionForInsert(key);
if (Result >= itemCount) or (Result < 0) then
Result := -1
else
if (KeyItems[Result] <> key) then
Result := -1;
end;//FindPosition
//------------------------------------------------------------------------------
// Finds position for insert element
//------------------------------------------------------------------------------
function TMYLDBSortedPageList.FindPositionForInsert(key: Integer): Integer;
var i,dx,f,
oldRes,res : Integer;
begin
i := itemCount shr 1;
dx := i;
Result := itemCount;
if (itemCount > 0) then
begin
f := 0;
res := 2;
while (true) do
begin
dx := dx shr 1;
if (dx < 1) then dx := 1;
oldRes := res;
// compare, ascending
if (KeyItems[i] = key) then
res := 0
else
if (KeyItems[i] < key) then
res := 1
else
res := -1;
if (res < 0) then
begin
// element, specified by value should be higher then current element (+->0)
i := i - dx;
end
else
if (res > 0) then
begin
// element, specified by value should be lower then current element (+->0)
i := i + dx;
end
else // values are equal
begin
Result := i;
break;
end;
if (i < 0) and (dx = 1) then
begin
Result := 0;
break;
end;
if (i > itemCount-1) and (dx = 1) then
begin
Result := itemCount;
break;
end;
if (i > itemCount-1) then
i := itemCount-1;
if i < 0 then
i := 0;
if (dx = 1) and (f > 1) then
begin
// dx minimum
// compare, ascending
if (KeyItems[i] = key) then
res := 0
else
if (KeyItems[i] < key) then
res := 1
else
res := -1;
if (res < 0) and (oldRes > 0) then
Result := i;
if (res > 0) and (oldRes < 0) then
Result := i+1;
if (res = oldRes) then
continue;
break;
end;// last step
if (res <> oldRes) and (dx = 1) and (oldRes <> 2) then
inc(f);
end;//while dx
end; // if itemCount > 0
end;//FindPositionForInsert
//------------------------------------------------------------------------------
// Insert an element into specified position
//------------------------------------------------------------------------------
procedure TMYLDBSortedPageList.Insert(Page: TMYLDBPage);
var
pos : Integer;
value: TMYLDBPageElement;
begin
Inc(LRUCount);
value.Page := Page;
value.LRUCount := LRUCount;
if (itemCount <= 0) then
InsertByPosition(0,Page.PageNo,value)
else
if (itemCount = 1) then
begin
if (KeyItems[0] <= Page.PageNo) then
InsertByPosition(1,Page.PageNo,value)
else
InsertByPosition(0,Page.PageNo,value);
end
else
begin
pos := FindPositionForInsert(Page.PageNo);
InsertByPosition(pos,Page.PageNo,value);
end;
end;//Insert
//------------------------------------------------------------------------------
// Insert an element into specified position
//------------------------------------------------------------------------------
procedure TMYLDBSortedPageList.InsertByPosition(ItemNo, key: integer; var value: TMYLDBPageElement);
begin
inc(ItemCount);
SetSize(ItemCount);
if (itemCount <= 1) then
begin
KeyItems[0] := key;
ValueItems[0] := value;
end
else
if (itemNo >= itemCount-1)
then
begin
KeyItems[itemCount-1] := key;
ValueItems[itemCount-1] := value;
end
else
begin
Move(KeyItems[itemNo],KeyItems[itemNo+1],
(itemCount - itemNo-1) * sizeOf(integer));
Move(ValueItems[itemNo],ValueItems[itemNo+1],
(itemCount - itemNo-1) * sizeOf(ValueItems[0]));
KeyItems[itemNo] := key;
ValueItems[itemNo] := value;
end;
end;//InsertByPosition
//------------------------------------------------------------------------------
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -