prevenir corrupción

prevenir corrupción

Postby rolando » Tue Oct 14, 2008 12:40 pm

Buen día,

Tengo intención de que, al iniciar una aplicación, "revise" las .DBF, los .CDX y los .FPT y, si hay algún error en las .CDX, inicie un proceso de reindexado. Aunque no me ha pasado con las CDX, tengo entendido que los índices son lo que presentan problemas.

¿Que puedo usar para comprobar el estado de estos archivos?. Gracias.

Rolando :D

FWH 2.7 + xHarbour
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby karinha » Tue Oct 14, 2008 3:02 pm

Code: Select all  Expand view
#Include "Fivewin.Ch"

REQUEST OrdKeyNo, OrdKeyCount, OrdKeyGoto

FUNCTION VENTAS()

    LOCAL DbClientes

    IF NetUse( "CLIENTES", .T. )
        OrdListAdd( "Clientes", "CODIGO" )
        DATABASE DbClientes
        DbClientes:Load()
        DbClientes:SetBuffer( .T. )
     ELSE
        MsgStop( "Banco de Dados Bloqueado", "Cuidado!" )
        RETURN NIL
    ENDIF

    IF ORDKEYCOUNT() != RECCOUNT()

       VERIFY_CDX( "Clientes" ) //-> Banco de datos: CLIENTES.DBF

    Endif

    ...
    ...

RETURN NIL
//
STATIC FUNCTION VERIFY_CDX( XARCHIVO )

    MsgStop( ( "Tu mensageria aqui... " ), "avisa personas" )

    DbCLoseAll()
    REINDEXAR() //-> Funcion de indexacion...
    DbCLoseAll()

    QUIT

RETURN NIL


Saludos
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby rolando » Tue Oct 14, 2008 9:51 pm

Gracias João,

No conzco algunas funciones pero imagino lo que hacen y lo voy a poner en práctica.

Saludos.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Postby Carlos Mora » Wed Oct 15, 2008 1:53 pm

Hola Rolando,

La función OrdKeyCount() solo verifica que haya tantas claves como registros haya en la tabla. Esa condición no se cumple en los casos en que tienes alguna condición FOR para el índice, por ejemplo FOR !Deleted().

Tampoco te avisará si, por ejemplo, alguien cambia alguno de los campos claves sin abrir el índice.

Hasta donde sé, no existe una forma práctica de verificar la integridad, ya que para estar seguro habría que regenerar todas las claves y ver de que estén correctamente indexadas, lo que sería más pesado que reindexar de nuevo.

Te recomiendo que sigas los consejos del manual de Clipper para Redes: SIEMPRE, pero SIEMPRE, un COMMIT antes de UNLOCK.

Asegurarte de que los usuarios salen correctamente del programa, y deja alguna señal para detectar una salida anómala.
En caso de detectar que un programa abortó, sugiere al usuario reindexar como medida preventiva.

Con eso te puedo decir que no tengo problemas importantes.

Un saludo,

Carlos.
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby karinha » Wed Oct 15, 2008 2:54 pm

Carlos, puedes probar la clave tanbien:
Code: Select all  Expand view
    SET ORDER TO 4

    IF INDEXKEY() # "COD+DTOC(EMISION)" .AND. LEFT(xARCHIVO,8) = "CLIENTES"
        REINDEXAR()
    ENDIF


Una idea

Saludos
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby Carlos Mora » Wed Oct 15, 2008 4:43 pm

Joao,

como comentaba antes, lo que se verifica es muy superficial, y estamos atacando el problema cuando ya ha sucedido. Por eso le recomendaba al compañero que toma algunos recaudos que son de carácter preventivo, que son más efectivos que tratar de intuir cuando estan bien o nó los datos, lo que es prácticamente imposible hacerlo con un alto grado de seguridad.

Un saludo,

Carlos.
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby karinha » Wed Oct 15, 2008 5:23 pm

Carlos Mora wrote:Joao,

como comentaba antes, lo que se verifica es muy superficial, y estamos atacando el problema cuando ya ha sucedido. Por eso le recomendaba al compañero que toma algunos recaudos que son de carácter preventivo, que son más efectivos que tratar de intuir cuando estan bien o nó los datos, lo que es prácticamente imposible hacerlo con un alto grado de seguridad.

Un saludo,

Carlos.


Carlos, como haces entonces??

Cual és tu sugerencia via codigo??

Tiene algo escrito, por favor? Ideas nuevas, és siempre bienvenidas.

Gracias,

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby Carlos Mora » Wed Oct 15, 2008 6:16 pm

Joao,

Lee mi primer post. Mis sugerencias estan ahí, yo no verifico la integridad de los índices, no hay formas prácticas de asegurar que un índice esta desactualizado, y las verificaciones que tu haces cubren muy pocas de las muchas posibilidades de corrupción o desincronización. NO PONGO CODIGO porque como te reitero ESE CODIGO NO EXISTE.

imagina un indice de una base de 1000 registros (pequeña). ¿Como puedes asegurar que todas las claves del índice se corresponden con su registro? Solo yendo registro por registro, generando la clave y comparándola. Eso es más costoso que reconstruir el indice, por lo tanto NO TIENE SENTIDO.

Mejor que eso es prevenir, eliminando los orígenes de las posibles corrupciones, con las dos recomendaciones que ya hice. El código esta en el manual del Clipper 5.2, y creeme, funciona.

Carlos.
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby karinha » Wed Oct 15, 2008 6:54 pm

Carlos Mora wrote:Joao,

Lee mi primer post. Mis sugerencias estan ahí, yo no verifico la integridad de los índices, no hay formas prácticas de asegurar que un índice esta desactualizado, y las verificaciones que tu haces cubren muy pocas de las muchas posibilidades de corrupción o desincronización. NO PONGO CODIGO porque como te reitero ESE CODIGO NO EXISTE.

imagina un indice de una base de 1000 registros (pequeña). ¿Como puedes asegurar que todas las claves del índice se corresponden con su registro? Solo yendo registro por registro, generando la clave y comparándola. Eso es más costoso que reconstruir el indice, por lo tanto NO TIENE SENTIDO.

Mejor que eso es prevenir, eliminando los orígenes de las posibles corrupciones, con las dos recomendaciones que ya hice. El código esta en el manual del Clipper 5.2, y creeme, funciona.

Carlos.


Gracias, Carlos.

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby rolando » Wed Oct 15, 2008 9:00 pm

Gracias por los aportes.

Saludos

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 109 guests