cabecera dbf

Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

cabecera dbf

Post by Francisco Horta »

Existe alguna funcion para cambiar/corregir la cabecera de las dbf de mi sistema para poder abrirlas "unicamente" desde el sistema o en dado caso regresarla a su forma original para abrirlas desde cualquier dbu para dbfs? lo quiero hacer por seguridad en lugar de encriptar todos los datos.
gracias
paco
User avatar
Alfredo Arteaga
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico
Contact:

Post by Alfredo Arteaga »

He aqui la función:

Code: Select all

FUNCTION DbProtect(cDbf,nAction)
   LOCAL nHandle:=0, cFile
   LOCAL cBuffer:=Space(32)
   IF !File(cDbf)
      nHandle:=FOpen(cFile,FO_READWRITE+FO_SHARED)
      DEFAULT nAction:=1
      IF nHandle!=-1
         IF FRead(nHandle,@cBuffer,32)==32
            IF nAction==0       // Proteger
               IF SubStr(cBuffer,1,1)<>Chr(26)
                  cBuffer:=Chr(26)+SubStr(cBuffer,1,31)
               ENDIF
            ELSE                // Desproteger
               IF SubStr(cBuffer,1,1)==Chr(26)
                  cBuffer:=SubStr(cBuffer,2,31)+ Chr(0)
               ENDIF
            ENDIF
            FSeek(nHandle,0)
            FWrite(nHandle,cBuffer,32)
         ENDIF
         FClose(nHandle)
      ENDIF
   ENDIF
RETURN (NIL)
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

Gracias Alfredo lo probare
Saludos
Paco
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

Que tal Alfredo,
Intente probando asi al cerrar mi aplicacion:

oDbf:="Clientes.Dbf"
DbProtect(oDbf,0)

inmediatamente cargo el dbwide y si me bare la dbf, como hago para que no la pueda abrir?
salu2
paco
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

Gracias, revisado y funcionando,,,
salu2
paco
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Post by Manuel Valdenebro »

Francisco Horta wrote:Gracias, revisado y funcionando,,,
salu2
paco
Francisco,

¿Podias explicarnos como lo has hecho? ¿Como abres y cierras las dbf?
Un saludo

Manuel
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

Que tal Manuel,
te comento como lo hago

1.tengo una funcion para abrir las dbf, antes de abrirla verifico si esta protegida con esto:
IF lFileProtect("MiArchivo.dbf")
DbProtect("MiArchivo.dbf",1) // con el 1 se desprotege
ENDIF
--> aqui ya abro la dbf
2. Al cerrar la dbf vuelvo a proteger la dbf
DbProtect("MiArchivo.dbf",0) // con el 0 se protege

aqui dejo las funciones del autor Alfredo Arteaga, gracias Alfredo.


FUNCTION lFileProtect(cDbf)
LOCAL nHandle :=0
LOCAL cBuffer :=Space(32)
LOCAL lRet :=.F.
IF (nHandle:=FOpen(cDbf,FO_READWRITE+FO_SHARED))!=-1
IF FRead(nHandle,@cBuffer,32)==32
lRet:=IF(SubStr(cBuffer,1,1)==Chr(26),.T.,.F.)
ENDIF
FClose(nHandle)
ELSE
MsgInfo("Error, No se pudo abrir la Base de Datos "+cDbf,"Verifique !!")
ENDIF
RETURN (lRet)


FUNCTION DbProtect(cDbf,nAction)
LOCAL nHandle:=0
LOCAL cBuffer:=Space(32)
nHandle:=FOpen(cDbf,FO_READWRITE+FO_SHARED)
DEFAULT nAction:=1
IF nHandle!=-1
IF FRead(nHandle,@cBuffer,32)==32
IF nAction==0 // Proteger
IF SubStr(cBuffer,1,1)<>Chr(26)
cBuffer:=Chr(26)+SubStr(cBuffer,1,31)
ENDIF
ELSE // Desproteger
IF SubStr(cBuffer,1,1)==Chr(26)
cBuffer:=SubStr(cBuffer,2,31)+ Chr(0)
ENDIF
ENDIF
FSeek(nHandle,0)
FWrite(nHandle,cBuffer,32)
ENDIF
FClose(nHandle)
ENDIF
RETURN (NIL)


Saludos
Paco
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Post by karinha »

Buenas Francisco...

Una duda:

Y se hay una falla elétrica? El que ocorri? No te causa problemas?

Gracias,

Saludos.
João Santos - São Paulo - Brasil
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

Karinha,
De hecho si, porque algunas dbf estarian sin bloqueo, pero o puedes controlar con un flag para si el sistema tuvo una salida anormal y antes de arrancar el sistema comprobar si estan protegidas o desprotegidas.
En caso de que sea en red (server sin ups, raro!!) desde cualqueir otra terminal con energia electrica puede seguir protegiendo y desprotegiendo sin problemas, ya que siempre busca la validacion de la misma
salu2
paco
derpipu
Posts: 93
Joined: Tue Mar 28, 2006 4:09 pm
Location: Tequila, Jalisco Mexico
Contact:

Post by derpipu »

Amigo Pancho, y que pasa si el sistema se utiliza en red, y internamente se abren y cierran las mismas bds en varias estaciones de trabajo, no truena ?

Saludos
Luis Fernando Rubio Rubio
User avatar
José Vicente Beltrán
Posts: 279
Joined: Mon Oct 10, 2005 8:55 am
Location: Algeciras, España
Contact:

Post by José Vicente Beltrán »

Hola a todos después de mucho tiempo.

Yo lo que hago es:
1. cambiar la cabecera para poder abrir la base de datos
2. abrir la base de datos
3. cambiar la cabecera al estado anterior
4. trabajar normalmente con la BD

De esta forma si otros terminales de la red necesitan abrir la BD siempre se la encontrarán cerrada y pueden ejecutar los cuatro puntos anteriores.

Y por supuesto si hay fallo electrico y/o de red las BD siempre se quedan protegidas de las miradas curiosas

Saludos :shock:
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

Luis,
Efectivamente como comenta vicente asi mismo funciona, el cambio de cabeceras las ejecutas dentro de las funciones al abrir y cerrar las bases de datos.. y siempre validas, por lo tanto aunque este en red, si una terminal va a usar determinada base de datos, verifica si esta o no cambiada la cabecera y tons aplica lo que se necesite.

salu2
paco
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Post by Manuel Valdenebro »

José Vicente Beltrán wrote:Hola a todos después de mucho tiempo.

Yo lo que hago es:
1. cambiar la cabecera para poder abrir la base de datos
2. abrir la base de datos
3. cambiar la cabecera al estado anterior
4. trabajar normalmente con la BD

De esta forma si otros terminales de la red necesitan abrir la BD siempre se la encontrarán cerrada y pueden ejecutar los cuatro puntos anteriores.

Y por supuesto si hay fallo electrico y/o de red las BD siempre se quedan protegidas de las miradas curiosas

Saludos :shock:
Jose Vicente, ¿puedes indicarnos como lo haces con detalle?
Last edited by Manuel Valdenebro on Fri Dec 19, 2008 7:16 am, edited 1 time in total.
Un saludo

Manuel
User avatar
José Vicente Beltrán
Posts: 279
Joined: Mon Oct 10, 2005 8:55 am
Location: Algeciras, España
Contact:

Post by José Vicente Beltrán »

Basicamente hago lo siguiente:

//----------- para abrir la BD ------------------//
protege( "OFF", file ) //pone la cabecera normal
USE file NEW
protege( "ON", file ) //cambia la cabecera para impedir la apertura
//------------------------------------------------//
...
a partir de aquí uso normal
...
CLOSE file // fin de la aplicación


#include "FiveWin.ch"
#define PROT_SIN_DBT CHR(255)
#define PROT_CON_DBT CHR(254)
#define PROT_CON_FTP CHR(253)
#define DESPROT_SIN_DBT CHR(3)
#define DESPROT_CON_DBT CHR(131)
#define DESPROT_CON_FTP CHR(245)

//---------------------------------------------------------------------
function Protege(cModo, cFicheroDBF)
local nManejador, cCabecera, cescribe:= ""

//se abre el fichero a bajo nivel para lectura-escritura
nManejador = FOpen ( cFicheroDBF , 2 )

//Leemos el primer byte
cCabecera := FReadStr( nManejador , 1 )

if cModo == "ON" // busca codigo de protección
do case
case cCabecera == DESPROT_SIN_DBT
cEscribe := PROT_SIN_DBT

case cCabecera == DESPROT_CON_DBT
cEscribe := PROT_CON_DBT

case cCabecera == DESPROT_CON_FTP
cEscribe := PROT_CON_FTP

otherwise
Fclose ( nManejador )
return .T.

endcase
else // busca código de desprotección
do case
case cCabecera == PROT_SIN_DBT
cEscribe := DESPROT_SIN_DBT

case cCabecera == PROT_CON_DBT
cEscribe := DESPROT_CON_DBT

case cCabecera == PROT_CON_FTP
cEscribe := DESPROT_CON_FTP

otherwise
Fclose ( nManejador )
return .T.

endcase
endif

// mueve el puntero al principio del fichero
Fseek( nManejador, 0, 0 )
FWrite( nManejador, cEscribe, 1 )
Fclose( nManejador )
return .t.
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Post by Manuel Valdenebro »

Muchas gracias Francisco y Jose Vicente.
Un saludo

Manuel
Post Reply