📄 myldblocalengine.pas
字号:
FirstPosition := False;
LastPosition := True;
end; // InternalLast
//------------------------------------------------------------------------------
// insert record
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.InternalInsert;
begin
end; // InternalInsert
//------------------------------------------------------------------------------
// edit record
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.InternalEdit;
{$IFDEF FILE_SERVER_VERSION}
var
TempBuffer: TMYLDBRecordBuffer;
LockType: TMYLDBLockType;
procedure CheckOtherUsersModifications;
begin
if (Session.InTransaction) then
LockType := ltXIRW
else
LockType := ltSIRW;
if (TMYLDBDiskTableData(FTableData).LockTable(Session.SessionID, LockType,
EditRecordTableLockRetries, EditRecordTableLockDelay)) then
begin
if (TMYLDBDiskTableData(FTableData).LockRecord(Session.SessionID,
CurrentRecordID, RecordLockRetries, RecordLockDelay)) then
begin
try
TempBuffer := AllocateRecordBuffer;
try
Move(CurrentRecordBuffer^,TempBuffer^,RecordBufferSize);
if (GetRecordBuffer(grmCurrent) = grrOk) then
begin
if (not FTableData.FieldManager.CompareRecordBuffers(
TempBuffer,CurrentRecordBuffer)) then
begin
ErrorCode := MYLDB_ERR_UPDATE_RECORD_MODIFIED;
// restore previous record buffer with new value
Move(TempBuffer^,CurrentRecordBuffer^,RecordBufferSize);
end
end
else
begin
ErrorCode := MYLDB_ERR_UPDATE_RECORD_DELETED;
// restore previous record buffer with new value
Move(TempBuffer^,CurrentRecordBuffer^,RecordBufferSize);
end;
finally
FreeRecordBuffer(TempBuffer);
end;
finally
if (ErrorCode <> MYLDB_ERR_OK) then
begin
TMYLDBDiskTableData(FTableData).UnlockRecord(Session.SessionID, CurrentRecordID);
TMYLDBDiskTableData(FTableData).UnlockTable(Session.SessionID, LockType);
end;
end;
end
else
begin
TMYLDBDiskTableData(FTableData).UnlockTable(Session.SessionID, LockType);
ErrorCode := MYLDB_ERR_RECORD_LOCKED;
end;
end
else
ErrorCode := MYLDB_ERR_TABLE_LOCKED;
end;
{$ENDIF}
begin
LockTableData;
try
ErrorCode := MYLDB_ERR_OK;
if (FTableData is TMYLDBTemporaryTableData) then
ErrorCode := MYLDB_ERR_UPDATE_RECORD_PROHIBITED
else
if (FTableData is TMYLDBDiskTableData) then
begin
{$IFDEF FILE_SERVER_VERSION}
if (FSession.MultiUser) then
CheckOtherUsersModifications
{$ENDIF}
end;
finally
UnlockTableData;
end;
end; // InternalEdit
//------------------------------------------------------------------------------
// cancels updates
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.InternalCancel(ToInsert: Boolean);
var Buffer: TMYLDBRecordBuffer;
begin
LockTableData;
try
ErrorCode := MYLDB_ERR_OK;
// if (FTableData is TMYLDBTemporaryTableData) then
// ErrorCode := MYLDB_ERR_CANCEL_PROHIBITED
// else
begin
ClearBLOBStreams(True);
Buffer := CurrentRecordBuffer;
if (FTableData is TMYLDBDiskTableData) then
TMYLDBDiskTableData(FTableData).ClearModifiedBLOBFieldsInRecordBuffer(Buffer);
if (ToInsert) then
FTableData.ClearBLOBFieldsInRecordBuffer(Buffer);
{$IFDEF FILE_SERVER_VERSION}
if (FSession.MultiUser) then
if (not ToInsert) then
if (FTableData is TMYLDBDiskTableData) then
begin
TMYLDBDiskTableData(FTableData).UnlockRecord(Session.SessionID, CurrentRecordID);
if (not Session.InTransaction) then
TMYLDBDiskTableData(FTableData).UnlockTable(Session.SessionID, ltSIRW);
end;
{$ENDIF}
end;
finally
UnlockTableData;
end;
end; // InternalCancel
//------------------------------------------------------------------------------
// update record
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.InternalPost(ToInsert: Boolean);
var
TempCursor: TMYLDBCursor;
Bookmark: PMYLDBBookmarkInfo;
TempBuffer: TMYLDBRecordBuffer;
{$IFDEF FILE_SERVER_VERSION}
LockSucceeded: Boolean;
LockType: TMYLDBLockType;
i: Integer;
{$ENDIF}
procedure DoInternalPost;
begin
// Check Constraints
try
if (ToInsert) then
begin
{$IFDEF FILE_SERVER_VERSION}
if (FTableData is TMYLDBDiskTableData) then
TMYLDBDiskTableData(FTableData).LoadMostUpdated(Session.SessionID);
{$ENDIF}
FTableData.FieldManager.ApplyAutoincsToRecordBuffer(Session, CurrentRecordBuffer);
end;
if (not (FTableData is TMYLDBTemporaryTableData)) then
FTableData.ConstraintManager.CheckConstraints(
Session.SessionID, CurrentRecordBuffer, EditRecordBuffer,
ToInsert, CurrentRecordID, True);
except
on e: Exception do
begin
ErrorCode := MYLDB_ERR_CONSTRAINT_VIOLATED;
ErrorMessage := e.Message;
Exit;
end;
end;
TempCursor := Self;
ClearBLOBStreams(True);
if (ToInsert) then
begin
// insert
if (FTableData.InsertRecord(TempCursor)) then
ErrorCode := MYLDB_ERR_OK
else
ErrorCode := MYLDB_ERR_INSERT_RECORD;
// write bookmark info to new record buffer
Bookmark := PMYLDBBookmarkInfo(CurrentRecordBuffer + BookmarkOffset);
Bookmark^.BookmarkData := CurrentRecordID;
// ???
Bookmark^.BookmarkFlag := abfInserted;
end // insert
else
begin
// update
Move(PChar(FCurrentRecordBuffer + BookmarkOffset)^,
CurrentRecordID,sizeof(TMYLDBRecordID));
TempBuffer := AllocateRecordBuffer;
try
Move(CurrentRecordBuffer^,TempBuffer^,RecordBufferSize);
if (GetRecordBuffer(grmCurrent) = grrOk) then
begin
if (not FTableData.FieldManager.CompareRecordBuffers(
EditRecordBuffer,CurrentRecordBuffer)) then
begin
ErrorCode := MYLDB_ERR_UPDATE_RECORD_MODIFIED;
// restore previous record buffer with new value
Move(TempBuffer^,CurrentRecordBuffer^,RecordBufferSize);
end
else
begin
// update record
// restore previous record buffer with new value
Move(TempBuffer^,CurrentRecordBuffer^,RecordBufferSize);
if (FTableData.UpdateRecord(TempCursor)) then
ErrorCode := MYLDB_ERR_OK
else
ErrorCode := MYLDB_ERR_UPDATE_RECORD;
end;
end // get record ok
else
begin
// get record failed
ErrorCode := MYLDB_ERR_UPDATE_RECORD_DELETED;
// restore previous record buffer with new value
Move(TempBuffer^,CurrentRecordBuffer^,RecordBufferSize);
end;
finally
FreeRecordBuffer(TempBuffer);
end; // try
end; // update;
end;
begin
LockTableData;
try
{$IFDEF FILE_SERVER_VERSION}
if (FSession.MultiUser) then
begin
if (Session.InTransaction) then
LockType := ltXIRW
else
LockType := ltRW;
if (FTableData is TMYLDBDiskTableData) then
for i:=1 to PostRecordTableLockRetries do
begin
LockSucceeded := TMYLDBDiskTableData(FTableData).LockTable(Session.SessionID,
LockType, 1, 0);
if (LockSucceeded) then break;
UnlockTableData;
Sleep(PostRecordTableLockDelay);
LockTableData;
end
else
LockSucceeded := True;
if (LockSucceeded) then
begin
try
DoInternalPost;
finally
if (not ToInsert) then
if ((FTableData is TMYLDBDiskTableData) and
(ErrorCode <> MYLDB_ERR_CONSTRAINT_VIOLATED)) then
begin
TMYLDBDiskTableData(FTableData).UnlockRecord(Session.SessionID, CurrentRecordID);
TMYLDBDiskTableData(FTableData).UnlockTable(Session.SessionID, ltSIRW, Session.InTransaction);
end;
if (FTableData is TMYLDBDiskTableData) then
if (not Session.InTransaction) then
TMYLDBDiskTableData(FTableData).UnlockTable(Session.SessionID, ltRW);
end;
end;
if (not LockSucceeded) then
ErrorCode := MYLDB_ERR_TABLE_LOCKED;
end
else
{$ENDIF}
DoInternalPost;
finally
UnlockTableData;
end;
end; // InternalPost
//------------------------------------------------------------------------------
// delete record
//------------------------------------------------------------------------------
procedure TMYLDBLocalCursor.InternalDelete;
var
TempBuffer: TMYLDBRecordBuffer;
{$IFDEF FILE_SERVER_VERSION}
TableLockSucceeded: Boolean;
RecordLockSucceeded: Boolean;
LockType: TMYLDBLockType;
i: Integer;
{$ENDIF}
procedure DoInternalDelete;
begin
if (FTableData is TMYLDBTemporaryTableData) then
ErrorCode := MYLDB_ERR_DELETE_RECORD_PROHIBITED
else
begin
// delete
Move(PChar(FCurrentRecordBuffer + BookmarkOffset)^,
CurrentRecordID,sizeof(TMYLDBRecordID));
// record exist
TempBuffer := AllocateRecordBuffer;
try
Move(CurrentRecordBuffer^,TempBuffer^,RecordBufferSize);
if (GetRecordBuffer(grmCurrent) = grrOk) then
begin
if (not CompareRecordBuffers(
TempBuffer,CurrentRecordBuffer,RecordSize)) then
begin
ErrorCode := MYLDB_ERR_DELETE_RECORD_MODIFIED;
// restore previous record buffer with new value
Move(TempBuffer^,CurrentRecordBuffer^,RecordBufferSize);
end
else
begin
// update record
// restore previous record buffer with new value
Move(TempBuffer^,CurrentRecordBuffer^,RecordBufferSize);
if (FTableData.DeleteRecord(Self)) then
ErrorCode := MYLDB_ERR_OK
else
ErrorCode := MYLDB_ERR_DELETE_RECORD;
end;
end // get record ok
else
begin
// get record failed
ErrorCode := MYLDB_ERR_DELETE_RECORD_DELETED;
// restore previous record buffer with new value
Move(TempBuffer^,CurrentRecordBuffer^,RecordBufferSize);
end;
finally
FreeRecordBuffer(TempBuffer);
end; // try
end;
end;
begin
LockTableData;
try
{$IFDEF FILE_SERVER_VERSION}
if (FSession.MultiUser) then
begin
if (Session.InTransaction) then
LockType := ltXIRW
else
LockType := ltRW;
if (FTableData is TMYLDBDiskTableData) then
begin
for i:=1 to DeleteRecordTableLockRetries do
begin
TableLockSucceeded := TMYLDBDiskTableData(FTableData).LockTable(
Session.SessionID, LockType, 1, 0);
if (TableLockSucceeded) then break;
UnlockTableData;
Sleep(DeleteRecordTableLockDelay);
LockTableData;
end;
if (TableLockSucceeded) then
RecordLockSucceeded := TMYLDBDiskTableData(FTableData).LockRecord(
Session.SessionID, CurrentRecordID, RecordLockRetries, RecordLockDelay)
else
RecordLockSucceeded := False;
end
else
begin
TableLockSucceeded := True;
RecordLockSucceeded := True;
end;
if ((TableLockSucceeded) and (RecordLockSucceeded)) then
try
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -