Ir al contenido


Foto

Uso de gfix desde aplicacion


  • Por favor identifícate para responder
5 respuestas en este tema

#1 vvalladolid

vvalladolid

    Advanced Member

  • Miembros
  • PipPipPip
  • 90 mensajes
  • LocationMéxico

Escrito 24 febrero 2011 - 11:26

Hola foro,
Pues aqui sufriendo porque no puedo poner una base de datos fuera de linea desde mi aplicación.
(Firebird 2.1.3 + delphi2009 + Win vista)
Server Version: WI-V2.1.3.18185 Firebird 2.1
Server Implementation: Firebird/x86/Windows NT
Service Version: 2
Estoy haciendo un programa de adicion, modificacion, etc. a la base de datos. Con eso no tengo ningun problema.
La situación es que deseo (debo poner) la base de datos fuera de linea antes de aplicar dichas actualizaciones.
Lo estoy intentando a traves de gfix y ejecutarlo en una consola de DOS. He buscado por la internet algunas soluciones y
he encontrado varias funciones que te permiten ejecutar programas externos.
Ahora, lo estoy haciendo a traves de un archivo ejecutable bat, donde en tiempo de ejecucion construyo los parametros del
gfix.
Tanto para cerrar como poner en linea nuevamente la base de datos.
Me he encontrado con;
Poner la BD fuera de linea = Sin problemas
Poner la BD en linea = no funciona, en algunas ocasiones hasta me detiene el servicio de la instancia FireBird.
He realizado pruebas de ejcutar los archivos bat desde la consola DOS y funcionan correctamente, pero desde mi aplicacion
tengo esta falla.
Ciclo del programa.
1.- Poner en linea la BD (por si está fuera de linea)  *-)
2.- Cerrar la BD.  :D
3.- aplicar las actualizaciones a la BD, a traves de IBScript.  :D
4.- Poner en linea la BD  :p
5.- Cerrar el programa.
Si trato de entrar a la BD por otro medio, IBExpert, otro programa, me encuentro que la BD esta fuera de linea.
Lo más extraño es que si vuelvo a ejcutar el programa, el punto 1 funciona adecuadamente (sin hacer nada mas del
programa solo el evento OnShow), cierro la aplicación y voila ! todo correctamente.
Si ejecuto nuevamente el programa de actualizacion mencionado, se repite el ciclo que les comento.
En este momento y despues de usar varias funciones para ejecutar el BAT.  :@
Estoy usando la funcion ExecAndWait, que ejecuta y espera hasta finalizar.
Antes de ejecutar el bat, determino la ruta de la instancia firebird y la pongo como directorio actual (SetCurrentDir)
El contenido del archivo BAT para arrancar la BD es;
gfix -user sysdba -password contra shostess:d:\hoszip\app\hoszip.fdb -online normal
El contenido del archivo BAT para detener la BD es;
gfix -user sysdba -password contra shostess:d:\hoszip\app\hoszip.fdb -shut single -force 0
Por ahí me encontre en la internet que el gfix, tiene algunos bugs  :| pero no lo puedo creer.
Pues he hecho otro programa para realizar las instalaciones de mis aplicaciones y con el hago la instalacion de firebird
desde la aplicaciona traves de un archivo bat conteniendo los parametros de instalacion.
Instalo ambas partes, servidor y cliente. Nunca he tenido problemas al ejecutar
Ayuda, por favor alguien tiene algo para hacer esto. He agotado todas las instancias para solucionar esto. 8o|
Gracias,
:tongue:  :embarrassed:
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 25 febrero 2011 - 05:34

Para ese mismo problema yo uso otro enfoque: Antes de aplicar el parche, compruebo que solo hay un usuario conectado (yo), y si no es asi, warning al canto (pero sin ShowModal).

Esto lo hago activando un timer, de forma que se compruebe cada segundo, asi, si aparece alguien conectado, paro en la SQL siguiente, saco un warning (sin showmodal, para que se reanude el proceso el solito), y espero a que vuelva a ser 1, momento en el que continuo con la siguiente instruccion.

En el timer hago algo asi:

NumUsuarios:= DataBase.UserNames.count-1; //Sin contamre a mi
IF NumUsuarios>0 then begin

  ..aqui pongo un texto rojo en flash "Hay N usuarios conectados", evitar ShowMessages y esas cosas que bloquean el programa...

end else begin

  ...ya se ha desconectado el intruso, activo algun flag de "sigue con la siguiente instruccion" y quito el mensaje...

end;

Tambien puedes hacer el check justo antes de cada instruccion y seguir solo si no hay nadie, pero de todas formas, si quieres que se reinicie el proceso sin esperar a que se pulse "OK", te toca usar un timer, claro.

Ah! No todas las actualizaciones las marcamos como "delicadas", asi que en la mayoria de casos, la base de datos se actualiza "en caliente" con la gente trabajando!
  • 0

#3 vvalladolid

vvalladolid

    Advanced Member

  • Miembros
  • PipPipPip
  • 90 mensajes
  • LocationMéxico

Escrito 25 febrero 2011 - 09:39

Hola Sergio,
Así es, hago esa validación antes de aplicar los cambios y en el caso de que exista algun usuario (ademas del que está ejecutando la actualización) envío un mensaje de aviso, con 2 botones reintentar y cancelar.
Como podrás ver en los parametros utilizo -shut single -force 0.
La actualización se hace en la parte del servidor y la parte del cliente. La actualización se puede ejecutar desde cualquier parte. Sín embargo, la BD sólo se actualiza solamente 1 vez.
En fín, realizo una serie de validaciones para que la actualización se aplique correctamente en todas las maquinas donde esté instalada la aplicación.
El problema es la ejecución del gfix.
Gracias,
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 25 febrero 2011 - 12:12

Hola.

Yo también solo compruebo que no haya más conexiones para lanzar las actualizaciones, pero no la pongo fuera de línea.

Lo primero que se me ocurre, ¿ porqué lanzas el gfix en un bat ?, ¿ porqué no ejecutas directamente el gfix.exe con el ShellExecute ?.

En todo caso siempre puedes atacar directamente el Services API del cliente de Firebird.

http://www.firebird....hp?storyid=2915

Saludos.
  • 0

#5 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 28 febrero 2011 - 04:29

Creo que ya se de donde te puede venir el problema.

Sacado del manual de gfix http://www.firebirds...bstartstop.html (penultima frase):

"This hierarchy is important, you cannot shutdown a database to a higher or equal level that it currently is, nor can you startup a database to a lower or equal level."

Se refiere a que si la base de datos ya esta online, volverla a poner online dará un error, o si ya esta en single user, volver a hacerlo te dara tambien un error, y comentan que para comprobar el estado uses gstat (eso si, el ejemplo que te dan es para linux, que tienen unos comandos de linea mucho mas pontentes que windows, como grep).

¿Necesitas de verdad que la base de datos quede cerrada mientras pasas los parches de actualizacion, o realmente solo lo necesitas al inciar el parche en si?

Quizas sea mas simple enfocarlo asi:

1) Compruebas que solo estas tu como usuario.
2) Pones un flag de "base de datos ocupada" a true
3) Tu aplicacion, al entrar, si ve este flag a true, se niega a seguir y se desconecta de la base de datos.
4) Pasas tus actualizaciones.
5) Pones el flag a false.

O bien como hacemos nosotros:

1) Rompemos el script de actualizacion en lineas independiente.
2) Cada linea se marca como de acceso exclusivo solo si es necesario.
3) Al ejecutar cada linea individual, si lleva la marca de exclusivo, comprobamos que solo estmaos nosotros.
4) Si estamos solos, pasmaos esa linea, y si no, mensaje y timer a la espera de quedarnos solos.

Como ves no necesitas hacer un shut de la base de datos siempre que las conexiones las controle tu aplicacion.

¿Has pensado que el problema podría venir de estar actualizando una misma base de datos desde 2 PC de forma simultánea? No digo que sea esto, pero jugar con la desconexion de la base de datos puede tener estas cosas en entornos multiusuario.
  • 0

#6 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 febrero 2011 - 07:56

1) Compruebas que solo estas tu como usuario.
2) Pones un flag de "base de datos ocupada" a true
3) Tu aplicacion, al entrar, si ve este flag a true, se niega a seguir y se desconecta de la base de datos.
4) Pasas tus actualizaciones.
5) Pones el flag a false.


Así es como lo hago yo. No me complico demasiado (el Flag de "Base de Datos Ocupada" es un simple campo en la tabla de configuración).

:)
  • 0




IP.Board spam blocked by CleanTalk.