⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myldblocalengine.pas

📁 一个本地database引擎,支持中文T_Sql查询,兼容DELPHI标准数据库控件
💻 PAS
📖 第 1 页 / 共 5 页
字号:
 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 + -