Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Arrancar Servidor Interbase/Firebird y Firebird 1.5

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Arrancar Servidor Interbase/Firebird y Firebird 1.5 Responder citando

Bueno despues de estar investigando el tema, el codigo está extraido del IBConsole, luego el merito no es mio, el unico merito mio (que es más bien poquito) es el de convertir el codigo de Delphi a Builder C++, luego no es mucho, pero como quizás a alguno no se le hubiera ocurrido que esto se puede hacer, pues bueno, aquí lo pego y ya sabeis puede ser muy util como codigo de comienzo en tu aplicación. Imaginaros que el servidor no se encuentra en ejecución pues se arranca y tu aplicación sigue la mar de bien....

Código:

void __fastcall TFSplash::FormCreate(TObject *Sender)
{
    if (!is_IB_Server_Running()) {
        Start_IB_Server();
    }

    // Activa el Timer que eliminará este splash y activara ya
    // el formulario con la aplicacion en sí
    Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
bool __fastcall TFSplash::Is_IB_Server_Running()
{
    bool resultado;

    if (GetWindow(GetDesktopWindow,GW_HWNDNEXT)==FindWindow("IB_Server", "InterBase Server")) {
        resultado=false;
    } else {
        resultado=true;
    }
    return(resultado);
}
//---------------------------------------------------------------------------
bool __fastcall TFSplash::Start_IB_Server()
{
    TRegistry *lRegistry = new TRegistry();
    STARTUPINFO lStartUpInfo;
    SECURITY_ATTRIBUTES lSecurityAttr;
    PROCESS_INFORMATION lProcessInfo;
    AnsiString ruta_al_ibserver;
    bool resultado;
    try {
        lRegistry->RootKey=HKEY_LOCAL_MACHINE;
        if (!lRegistry->OpenKey("SOFTWARE\\Borland\\InterBase\\CurrentVersion", false)) {
            ShowMessage("InterBase server no esta instalado en este sistema.");
        } else {
            ruta_al_ibserver=lRegistry->ReadString("ServerDirectory") + "ibserver.exe" + " -a";
        }
        ZeroMemory(&lStartUpInfo, sizeof(lStartUpInfo));
        ZeroMemory(&lProcessInfo, sizeof(lProcessInfo));

        lStartUpInfo.cb=sizeof(lStartUpInfo);
        lSecurityAttr.nLength= sizeof (lSecurityAttr);
        lSecurityAttr.lpSecurityDescriptor=NULL;
        lSecurityAttr.bInheritHandle=true;
        if (CreateProcess(0, ruta_al_ibserver.c_str(), &lSecurityAttr, NULL, false, 0, 0, 0, &lStartUpInfo, &lProcessInfo)!= NULL) {
            resultado=true;
        } else {
            ShowMessage("El servidor podría no estar arrancado.");
            resultado=false;
        }
    } catch (const Exception &e) {
        delete lRegistry;
    }
    return(resultado);
}
//-----------------------------------------------------------------


En mi caso como podeis ver lo he usado en un Formulario de Splash tan pronto como se crea el formulario, compruebo si el servidor no esta corriendo con (Is_IB_Server_Running()) en el caso de que no lo esté pues llamo a la función Start_IB_Server, hecho esto nos arrancará el ibserver ya sea Interbase o en mi caso Firebird, esto es indistinto del modo de acceso a datos que utilizemos, vamos indistinto de si usas BDE, dbExpress, IBX, etc.

La primera función la podeis obviar pues es simplemente un codigo de ejemplo donde se usa. Ciao y suerte. Por cierto se acepta mejoras como es logico.


Ultima edición por XyVy el Dom 14 Dic, 2003 11:59 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Bueno chicos aquí os pongo la pequeña modificación necesaria para poder arrancar el fbserver que es ahora como se llama el servidor de Firebird 1.5. Este codigo lo he probado con la versión 1.5 RC7 y funciona perfectamente.

Luego para versiones Interbase 6.0 Open Source y Firebird 1.0.x el codigo del post anterior, para versiones 1.5 podreis el siguiente codigo:

Código:

void __fastcall TFSplash::FormCreate(TObject *Sender)
{
    if (!is_FB_Server_Running()) {
        Start_FB_Server();
    }

    // Activa el Timer que eliminará este splash y activara ya
    // el formulario con la aplicacion en sí
    Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
bool __fastcall TFSplash::Is_FB_Server_Running()
{
    bool resultado;

    if (GetWindow(GetDesktopWindow,GW_HWNDNEXT)==FindWindow("FB_Server", "Firebird Server")) {
        resultado=false;
    } else {
        resultado=true;
    }
    return(resultado);
}
//---------------------------------------------------------------------------
bool __fastcall TFSplash::Start_IB_Server()
{
    TRegistry *lRegistry = new TRegistry();
    STARTUPINFO lStartUpInfo;
    SECURITY_ATTRIBUTES lSecurityAttr;
    PROCESS_INFORMATION lProcessInfo;
    AnsiString ruta_al_ibserver;
    bool resultado;
    try {
        lRegistry->RootKey=HKEY_LOCAL_MACHINE;
        if (!lRegistry->OpenKey("SOFTWARE\\Firebird Project\\Firebird Server\\Instances", false)) {
            ShowMessage("Firebird Server 1.5 no está instalado en este sistema.");
        } else {
            ruta_al_fbserver=lRegistry->ReadString("DefaultInstance") + "\\bin\\fbserver.exe" + " -a";
        }

        ZeroMemory(&lStartUpInfo, sizeof(lStartUpInfo));
        ZeroMemory(&lProcessInfo, sizeof(lProcessInfo));

        lStartUpInfo.cb=sizeof(lStartUpInfo);
        lSecurityAttr.nLength= sizeof (lSecurityAttr);
        lSecurityAttr.lpSecurityDescriptor=NULL;
        lSecurityAttr.bInheritHandle=true;
        if (CreateProcess(0, ruta_al_ibserver.c_str(), &lSecurityAttr, NULL, false, 0, 0, 0, &lStartUpInfo, &lProcessInfo)!= NULL) {
            resultado=true;
        } else {
            ShowMessage("El servidor podría no estar arrancado.");
            resultado=false;
        }
    } catch (const Exception &e) {
        delete lRegistry;
    }
    return(resultado);
}
//-----------------------------------------------------------------


Logicamente conforme Firebird se va desligando de Interbase las cosas cambian, la versión 1.5 ha sida reescrita a C++ y algunas cosas ya estan comenzando a cambiar como es el nombre del servidor, pues se llamaba ibserver al igual que Interbase 6.0 OS.

Ciao.
_________________
OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Hola:

He utilizado el código descrito para arrancar el servidor de Interbase y me ha sido muy útil.

Lo único es que si arranco el servidor de esta manera y después abro la base de datos Interbase (con la intrucción Open()) tarda un tiempo excesivo en realizar dicha instrucción, algo que no ocurre si el servidor está arrancado por el IBConsole, o bien está activado como Servicio del sistema operativo.

¿Tienes alguna idea de por qué ocurre esto y de cómo se podría resolver?

Gracias. Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

La verdad no sé muy bien porque te sucede eso, yo simplemente cogí las instrucciones de los fuentes del IBConsole que estaba hecho en Delphi y las pasé a Builder.

Basicamente es ver si el proceso en cuestión se encuentra en ejecución, si es así no pasada, en caso contrario, entonces nos vamos al registro de windows para extraer concretamente la ruta donde se encuentra instalado Firebird y de esa manera ejecutar el proceso.

Quizás en algún parametro en la ejecución se me olvidó y suceda eso, pero creo que lo transcribí correctamente del paso de Delphi a Builder C++, como dije el merito no es mio, además la idea es muy sencilla, solo falta que a uno se le ocurra, que es lo dificil...

Lo dicho, quizás sea algun parametro a la hora de ejecutar el servidor, no tengo ni idea, lo revisaré en cuanto tenga un rato..

Por cierto da gusto saber que el codigo es útil, aunque ya digo que el merito no es mio.
Ciao.
_________________
OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Hola de nuevo:

Desinstalé y volví a instalar el servidor de Interbase y ya me funciona bien, sin tiempos excesivos ni nada.

Así que todo perfecto, gracias por todo. Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola, casualmente después de unos meses me he dado cuenta de lo que realmente ocurría con mi programa:

Si ejecuto la aplicación en modo debug bajo Builder y ésta arranca el servidor Interbase, es cuando tarda tanto al abrirla, y después, aunque ejecute el programa directamente, siempre tarda mucho al conectarse a la base de datos.

Sin embargo, si lo arranco por primera vez ejecutando el programa directamente, entonces va bien, y también va bien en las sucesivas veces que se conecta a la base de datos, aunque sea ejecutándose en modo debug.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.