Нужна помощь профессионального программиста - страница 54

 
Volodymyr Zubov #:

Простое и возможное, Китай этим живет. Но здесь уважающий себя и свой рейтинг и наработки на это вряд ли пойдет. Я не пойду. Проще к Автору обратиться за исходником через фриланс.

Автор скочался в прощлом году.

 
Dmitriy Skub #:

Михаил, а вот эти поля нужны где-либо? А то я их везде вывожу зачем-то.

replID i8 Служебное поле подсистемы репликации
replRev i8 Служебное поле подсистемы репликации
replAct i8 Служебное поле подсистемы репликации

Добрый день, Дмитрий!

3.3. Особенности использования шлюза
3.3.1. Служебные поля репликации
Каждая реплицируемая таблица имеет в своей структуре три первых поля фиксированного типа i8, предназначенных для обеспечения механизма репликации:
• replID — уникальный идентификатор записи в таблице. При вставке каждой новой записи, этой записи присваивается уникальный
идентификатор. Несмотря на то, что таблица может иметь некий первичный ключ, определяемый бизнес-логикой, для целей
репликации все равно первичным и уникальным идентификатором является поле replID.
• replRev — уникальный номер изменения в таблице. При любом изменении в таблице (вставке, редактировании, удалении записи)
затронутая запись получает значение replRev, равное максимальному replRev в таблице до изменения +1.
• replAct — replAct — признак того, что запись удалена. Если replAct не нулевой — запись удалена. Если replAct = 0 — запись
активна..


ReplAct я использую для проверки валидности записи в таблице

//--- Check replAct ---
      if(string(field^.name) = 'replAct') then
      begin
        replAct:= PInt64(Val)^;
        if(replAct <> 0) then
        begin
          Rec.set_null();
          exit;
        end;
      end else

ReplRev я использую, когда приходит сообщение CG_MSG_P2REPL_CLEARDELETED

procedure TCGStorage.ClearDeleted(const StrData: TStreamData; const ClDel: pcg_data_cleardeleted_t);
var
  Tx: PDtsTransaction;
  Table, Rec, Save: TDtsVariant;
  tName: string;
  NewRev, CurRev: int64;
  TableIter: PDtsIterator;
begin
  NewRev:= ClDel^.table_rev;
  if(NewRev = CG_MAX_REVISON) then NewRev:= 0;  // Set revision to "0"
  if(Length(StrData.Tables) > 0) then
  begin
    tName:= StrData.sName + StrData.Tables[ClDel.table_idx].tName;
    Tx:= create_transaction(CGCntr.FStorage.DBase, kTxDefault);
    try
      Tx.init_child(Table, PAnsiChar(RawByteString(tName)));
      TableIter:= create_iterator(Table);
      try
        while(TableIter.is_valid()) do
        begin
          TableIter.init_child(Rec, PAnsiChar('replRev')).get_int64(CurRev);
          if(NewRev = 0) then
          begin
            Save:= TableIter^;
            Save.set_null();
          end else
          if(NewRev > CurRev) then
          begin
            Save:= TableIter^;
            Save.set_null();
          end;
          next_iterator(TableIter);
        end;
      finally
        free_iterator(TableIter);
      end;
    finally
      free_transaction(Tx);
    end;
  end;
end;

replID я использую для сортировки и перезаписи (один и тот же replID) приходящих сообщений

Добавлено

Возможны задержки с моими сообщениями, т.е начался сезон стройки

 
Понял. Спасибо!
 

Vladimir Mikhailov

Напишите, пожалуйста мне в личку.

Причина обращения: