Idéias para pegar arq.índices corrompido

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Idéias para pegar arq.índices corrompido

Mensagem por lugab »

Eu uso a mais óbvia de todas as técnicas, que é a de após localizar o item, verificar se realmente cada itém da chave foi atendido, ex:

Código: Selecionar todos

Sele Nota
ordsetfdocus(cli)
Seek str(tnumcli,6)+str(Tnumnot,6)+Tserie
if .not. eof()
    If numcli#Tnumcli .or. Numnot#Tnumnot .or. Serie#Tserie
       Alert("Arquivo indices de Notas corrompido, programa cancelado")
       close all
       quit
    endif
endif
Alguém aqui tem mais alguma sugestão , pra compartilhar e afastar esse fantasma dos nossos sistemas ?
lugab
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Idéias para pegar arq.índices corrompido

Mensagem por Pablo César »

Quando ocorre erro de índice corrompido, geralmente dá erro. Você poderia interceptar o erro através de um ERRORSYS.PRG próprio onde detectasse a mensagem de erro:

if oErr:Description()=="Corruption detected"
// Faça sua rotina de bloquear acesso de usuários aos arquivo de dados e indexar na marra
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Gilberto M Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 230
Registrado em: 13 Mar 2007 18:00
Localização: Natal-RN / Parelhas(RN) / Natal(RN)
Contato:

Idéias para pegar arq.índices corrompido

Mensagem por Gilberto M Silva »

if oErr:Description()=="Corruption detected"

Pablo, como eu trataria esse codigo para um arquivo criptografado corrumpido?

Por ex: o usuario abril no excel o arquivo configura.cpt(criptografado) e alterou os dados, quando entra no programa que executa o descript da arquivo corrumpido. Então como usaria esse codigo para tratar esse erro.
Att, Gilberto
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Idéias para pegar arq.índices corrompido

Mensagem por lugab »

Pablo, esse codigo basicão q escrevi, serve não só para corrupção, como o q vc sugeriu, mas serve tb para detectar índices desatualizados. Acho q os 2 se completam,

Então, vc poderia detalhar mias sobre o seu errorsys, tipo postar um pouco mais sobre ele e informar arquivos "includes" necessários, etc ?
lugab
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Idéias para pegar arq.índices corrompido

Mensagem por Pablo César »

O que vocês estão pedindo, não é uma coisa simples de se fazer. Tudo depende das mensagens de erros e a situações prevíveis que possam ocorrer. Sugiro que estudem bem o ERRORSYS.PRG, as variáveis estão disponíveis em forma de objetos. Os includes, não tem mistério, aqui no exemplo abaixo eu usei "FILEIO.CH" porque manipulo arquivo em baixo nível. E se eu tivesse que explicar tudo que eu faço no meu sistema de tratamento de erro, iria demandar muito tempo e seria desnecessário. Segue parte da minha rotina:

Código: Selecionar todos

/***
*
*	Errorsys.prg
*
*  Standard Clipper error handler
*
*  Copyright (c) 1990-1993, Computer Associates International, Inc.
*  All rights reserved.
*
*  Compile:  /m /n 
*
*/

#INCLUDE "FILEIO.CH"

Procedure ErrorSys()
ErrorBlock({|oError|LogError(oError)})
return

Function LogError( oErr )
Local cScreen   := SaveScreen()       ,;
      cCorAnt   := SetColor()         ,;
      cLogFile  := Space(12)          ,;
      nWorkArea := Select()           ,;
      nRange    := ( Maxcol()+1 ) * 2 ,;
      nStart    := 1
Local aArqTemp, VNUM, VPROC, OpcAlert, XERRO
Local nFhandle   , nCount    , nForLoop  , nMemHandle ,;
      nMemLength , nMemWidth , nMemCount , cOutstring ,;
      cSubstring , cVarName  , cVarType  , cTemp      ,;
      nLenTemp   , nBytes    , cVarRec   , vOpc
Local cExt, I, SO_UMA

If ( oErr:GenCode() == 5 )
   SetColor( cCorAnt )
   Return 0
Endif
If ( oErr:GenCode() == 21 .And. oErr:OsCode() == 32 .And. oErr:CanDefault() )
   NetErr(.T.)
   SetColor( cCorAnt )
   Return .F.
EndIf
If ( oErr:GenCode() == 40 .And. oErr:CanDefault() )
   NetErr(.T.)
   SetColor( cCorAnt )
   Return .F.
EndIf
if oErr:Description()=="Corruption detected"
   _DBF_:=""
   IF RIGHT(ALLTRIM(oErr:FileName()),4)=".DBF"
      _DBF_:=UPPER(oErr:FileName())
   ELSE
      _DBF_:=UPPER(ALIAS())
   ENDIF
   IF !EMPTY(_DBF_)
      IF lOkDbf( _DBF_, _PAT_ )=.F. // Esta função verifica o hearder do DBF
          /* Mover arquivo dbf para uma pasta, a fim de que posteriormente seja verificado a possibilidade
              de recuperar dados. Eu utilizo o FILEFIX (do antigo Norton) e criar novo arquivo DBF no local */
       ENDIF
   ENDIF
   /* Crio um arquivo .bat para executar rotina de indexação
   */
Endif
Segue a rotina de verificação do header do dbf, que pode estar junto no mesmo arquivo ERRORSYS.PRG:

Código: Selecionar todos

FUNCTION lOkDbf( cNameExt, cPath )
LOCAL lReturn := .T.
LOCAL nHnd, cBytes, nNumRecs, nHdrSize, nRecSize, nFileSize, nRecs
LOCAL cError, cErrorLog

nHnd := FOpen(cPath + '\' + cNameExt, FO_READ+FO_SHARED)
FSeek(nHnd,4,FS_SET)                  // Posiciona no come‡o do arquivo
cBytes:='0000'                        // Numero registros segundo tabela
FRead(nHnd,@cBytes,4)
nNumRecs:=Bin2L(cBytes)
cBytes:='00'                          // Tamanho do Header
FRead(nHnd,@cBytes,2)
nHdrSize:=Bin2I(cBytes)
cBytes:='00'                          // Tamanho do Registro
FRead(nHnd,@cBytes,2)
nRecSize:=Bin2I(cBytes)
nFileSize:=FSeek(nHnd,0,FS_END)       // Tamanho da Tabela
nRecs:=(nFileSize-nHdrSize)/nRecSize  // Numero de registros reais
IF nRecs != Round(nRecs,0)            // dBase, Fox (tem 1 byte a mais)
   nRecs:=(nFileSize - nHdrSize - 1) / nRecSize
ENDIF
FClose(nHnd)
// Se n„o coincidem (Numero reg. segundo tabela e o que calculado)
IF nRecs != nNumRecs
   lReturn := .F.
ENDIF
RETURN lReturn
Espero que isto traga inspiração para que vocês mesmos façam a sua propria rotina. Pesquisem outros exemplos, como descritos nestes tópicos:
https://pctoledo.org/forum/viewto ... n+Detected
https://pctoledo.org/forum/viewto ... prg#p65658
https://pctoledo.org/forum/viewto ... 707#p43707

Tem inclusive no primeiro link acima, uma idéia e exemplo do Maligno que utiliza-se da verificação CR32 que também seria uma boa saída para verificar seu o dbf foi alterado por fora do sistema.

Também tem na seção de Downloads um exemplo de tratamento de erros e se não me engano trata sobre Corruption detected, só teria que mudar CDX para NTX (caso seja essa a RDD): https://pctoledo.org/forum/fileba ... t=s&page=1
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder