Page 1 of 1

Saber si Server ADS esta en marcha

Posted: Tue Dec 13, 2011 10:54 am
by thefull
Buenas
Cansado de tener que liar con ADS, y tener 2 exe para lo mismo, al final, voy a poner un exe y dependiendo de un config, usar o no ADS.

He notado que el rdd de harbour es muchisimo mas rapido que el del ADS Local, por lo tanto, la idea es tener una rutina como esta;

Code: Select all

     if empty( cServer )  // No hay servidor de ads
        rddsetdefault( 'DBFNTX' )   // Forzamos RDD por defecto de HARBOUR
      else
       if AdsIsServerLoaded( cServer ) > 0 // Encontramos servidor de ADS
          ADS( nTipo )
       else
          Alert( "PRUEBA OTRA VEZ" )
          if AdsIsServerLoaded( cServer ) > 0 // Si el primero falla, TODOS volveran a fallar.
             Alert( "Conectado" )
          endif
          Alert( "No se encuentra servidor ADS en :" +cServer )
          quit
       endif
     endif
 
Funcionar funciona, pero ... si la primera llamada a AdsIsServerLoaded() falla, porque he detenido el server, aunque vuelva a levantar el server, cuando vuelvo a llamar a AdsIsServerLoaded(), sigue
sin encontrarlo.

¿ Alguien sabe como hacerlo ? La idea es que se quede esperando hasta que el servidor este en linea de nuevo.

Re: Saber si Server ADS esta en marcha

Posted: Tue Dec 13, 2011 11:23 am
by fgondi
Rafa,

Yo la comprobación la hago intentando conectarme al server

Code: Select all

lConnect := .F.
do while !lConnect
  if AdsConnect60( AddFile, ServerType, Usuario, Password )
    lConnect := .T.
  elseif !MsgYesNo( 'No se ha podido realizar la conexión con el diccionario de datos'+CRLF+'¿Desea volver a intentarlo?', 'Error de conexión')
    exit
  endif
enddo
 

Re: Saber si Server ADS esta en marcha

Posted: Tue Dec 13, 2011 3:05 pm
by Carles
R,


Proba

Code: Select all

 
#define ADS_LOCAL_SERVER                  1
#define ADS_REMOTE_SERVER                 2
#define ADS_AIS_SERVER                    4
...

   IF ! AdsConnect( cServer , ADS_LOCAL_SERVER )
       AdsGetLastError( @cError )
       MsgAlert( cError, 'Error conectant!' )
       RETU .F.
    ENDIF
Sobre...
He notado que el rdd de harbour es muchisimo mas rapido que el del ADS Local

Es cert, pero el rdd de ADS tiene encryptacion local tambien, y es muy robusto..., nuse son gustos. El hecho de tener un RDD q simplemente cambiando un flag tienes C/S o Local yo lo encuentro una pasada de practico. :D (ya sabes, estariamos ahora hablando horas sobre el tema, jejeje)

Re: Saber si Server ADS esta en marcha

Posted: Tue Dec 13, 2011 4:13 pm
by thefull
No funciona ninguna de las 2 soluciones ;-(

Re: Saber si Server ADS esta en marcha

Posted: Tue Dec 13, 2011 6:37 pm
by fgondi
Rafa,

Es cierto. El sistema está dejando guardado en memoría que en la dirección indicada no hay un server y ya siempre contesta lo mismo.

He probado incluso a llamar a otra dirección y luego volver a llamar a la misma:
AdsConnect60( "ruta1"...)
AdsConnect60( "ruta2"...)
AdsConnect60( "ruta1"...)
Y aun así, sigue recordando que en ruta1 no hay un server.

Desconozco si existe la forma de limpiar/vaciar ese registro.

Tampoco he encontrado ningún ejemplo, de como poder hacerlo, en Internet.
Todo lo que encuentro es que si no responde a la primera finalizan directamente la aplicación.

Re: Saber si Server ADS esta en marcha

Posted: Tue Dec 13, 2011 10:47 pm
by thefull
Criaturas de los dioses, que cuando pongo que no va es que he estado horas luchando como un jabato. :twisted:

De momento, lo dejo por imposible, pero , que ahí esta todo un reto.. Miré el C, pero no ví nada raro lo que hace la función.

Gracias por probar que tampoco funciona y no es cosa solo mía ;-)

Re: Saber si Server ADS esta en marcha

Posted: Wed Dec 14, 2011 7:57 am
by fgondi
Rafa,

Me imagino que no sea un problema de la función.

Las pruebas las he realizado teniendo instalado el server en otro equipo de la red, por lo que el acceso es \\192.168.1.254:2000\....
El primer intento de conexión tarda bastante, normal esta validando la dirección de red, pero a partir de ahí los sucesivos intentos son inmediatos.
Por lo que no puede está validando la dirección de red, en algún sitio ha dejado cacheado que en esa dirección no hay server.

Re: Saber si Server ADS esta en marcha

Posted: Wed Dec 14, 2011 8:25 am
by Carles
R,

Ara no tinc acceso a los servidores ADS pero podrias probar la funcion AdsApplicationExit()

Code: Select all

HB_FUNC( ADSISSERVERLOADED )
{
   UNSIGNED16 pbLoaded = 0;

   hb_retni( ISCHAR( 1 ) && AdsIsServerLoaded( ( UNSIGNED8 * ) hb_parcx( 1 ),
                                               &pbLoaded ) == AE_SUCCESS ? pbLoaded : 0 );
}
Segun la ayuda del API sirve para descargar de memoria todo...
Closes all tables and cleans up all open Advantage connections

Syntax

UNSIGNED32 AdsApplicationExit ();
Parameters

None.

Remarks

AdsApplicationExit is used to ensure the Advantage Client Engine is unloaded completely and cleanly, and that all open indexes, tables, and connections are closed. Calling this function will roll back any open transactions.

Call AdsApplicationExit when exiting an application and all function calls into the Advantage Client Engine are complete.
Seria cuestion de probar de ejecutar la funcion y volver a probar la conexion...

Ahora estoy fuera y no puedo probarlo, sorry...

Re: Saber si Server ADS esta en marcha

Posted: Wed Dec 14, 2011 8:36 am
by fgondi
Carles,

He probado con AdsApplicationExit, AdsDisconnect, AdsSetDefault, AdsSetSearchPath. Y no lo he conseguido con ninguna.

Re: Saber si Server ADS esta en marcha

Posted: Sun Dec 18, 2011 9:03 pm
by JARO
Muy buenas la solución es la siguiente, yo lo tengo incluido en todas mis aplicaciones

local n:=AdsIsServerLoaded( 'clientes.dbf' ) //COMPROBAR CON CUALQUIER BASE DE DATOS INSTALADA EN EL SERVIDOR U OTRO EQUIPO LOCAL
If n > 0 //SERVIDOR ACTIVO
AdsSetServerType( 2 )
Else //SERVIDOR NO ACTIVO
AdsSetServerType( 1 )
EndIf
Return
SALUDOS