Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-12-2005
soto soto is offline
Miembro
 
Registrado: oct 2005
Posts: 17
Poder: 0
soto Va por buen camino
Post My.ini relativo

Buenas noches, tengo problemas con dos partes del my.ini: base dir y datadir.

El tema es que mi aplicación corre con MySQL, y ya he hecho todo el instalador con el innoSetup. Pero a la hora de correr el demonio -para que esté andando en standalone- me hace falta el my.ini en el C:\ y que el mismo sepa en donde están basedir y datadir.

Concretamente el problema es que no sé como meterle al "my.ini" texto desde afuera, ya que my.ini cambia según la ruta de la instalación. Por ejemplo hacerlo en c:\archivos de programa ó en f:/borrame

  1. basedir="c:/archivos de programa/Soft/MySQL/"
  2. datadir="c:/archivos de programa/soft/MySQL/Data/"
ó
  1. basedir="F:/BORRAME/Soft/MySQL/"
  2. datadir="F:/BORRAME/soft/MySQL/Data/"
Bueno, espero que se entienda. Redondeando en my.ini en donde dice:
  • basedir="F:/BORRAME/Soft/MySQL/"
  • debe decir
  • 'basedir=" '+{direcciónRelativa}+' /MySQL/" '
Si alguien sabe como puedo hacer eso desde innosetup, milgracias. Si no se entiende chiflen que trato de ponerlo más simple. Saludos



EDIT:
Perdón, me he dado cuenta de que instalando el programa,y ejecutando un script de DOS el servicio se instala, PERO NO LO CORRE. Me da el error 1067. Es decir está, pero no corre como un demonio permanentemente. Ahora, si el servicio está, pero no se corre ¿Cómo le saco la dirección? Puesto que si saco la dirección se me soluciona un poquitito lo de la dirección relativa.

Ya se que soy medio tonto, pero traté de escribir lo mejor que pude. Suerte

Última edición por soto fecha: 14-12-2005 a las 00:33:26.
Responder Con Cita
  #2  
Antiguo 15-12-2005
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Hola soto, a mi modo de ver puedes hacerlo de dos formas:
a) Si tienes Delphi instalado en el ordenador
Como la estructura de My.ini es la de un TIniFile (SECCION, VARIABLE, VALOR), solo tendrias que hacerte una aplicación que copiara los valores de "basedir" y "datadir" de una sección tuya a la sección "mysqld" y salvar el nuevo "My.ini" modificado
b) No tienes Delphi, entonces utilizar un programilla en DOS
1º - Modificar el "My.ini" para que "basedir" y "datadir" apunten a otro sitio (por ejemplo basedir=G:\WWW\mysql y datadir=G:\WWW\mysql\data) donde previamente habras copiado la estructura de directorios que utilizas actualmente

2º - Hacer el programilla DOS que, dependiendo de un número de menú, mueva la estructura de "datadir" al sitio original y luego vuelque la estructura del data que vas a utilizar a donde apunte "datadir" (algo así como hacer primero un backup y luego un restore "machacando")
En ambos casos (por seguridad) deberias parar el servicio, modificar (My.ini o programilla DOS) y reactivar el servicio.

Espero que te sirva de ayuda, si quieres algo más, "chifla",
Saludos, salvica
Responder Con Cita
  #3  
Antiguo 15-12-2005
soto soto is offline
Miembro
 
Registrado: oct 2005
Posts: 17
Poder: 0
soto Va por buen camino
Talking

Hola salvica, muchas gracias. Lo que decís vos en el punto dos es lo que quiero hacer. Pero me veo con estos problemas:
  1. El my.ini tiene muchas líneas, de entre las cuales se encuentran basedir y datadir. Ahora, suponiendo que eso no fuese un problema, cómo sé en donde instaló la persona(desde el inno setup) my aplicación. Puesto que con mi aplicación le meto el MySQL-NoInstall-, y necesito ponerle el my.ini en c:\.
  2. No tengo ni la menor idea de cómo hacer el script que contatene strings desde el innosetup(ya que la dirección la capturo con {app}). El script debería copiar así:
  • 'algo' + 'basedir= ' +{app}\mysql + 'otrasCosas' + ' datadir=' +{app}\mysql\data
Ahora si me decís que se puede hacer desde delphi, cómo hago para capturar la dirección de la aplicación instalada..?¡???


Por ahora la única solución que encontré, es tirarle al instalador mio el instalador del MySQL, una vez ejecutado el instalador de mysql arranca el mío y en una carpeta cualquiera corro unos comandos de DOS (si les interesa los pongo) que crean y cargan la base de datos y pum todo anda....... pero es medio feo que una aplicación de escritorio te abra dos ventanas de instalación a mi criterio

Muchas gracias de nuevo, haaaa te chiflo
Responder Con Cita
  #4  
Antiguo 16-12-2005
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Hola soto, salvica de nuevo al aparato

Vamos a ver, el My.ini (por definición) solo puede estar en "x:\" o en "x:\WINDOWS\", te digo lo de "x" porque depende de la unidad de arranque (yo instalé wXP en el disco "D", en cierta ocasión) y además el directorio "WINDOWS" depende del sistema operativo, en w2000 es "WINNT", así que lo primero que haremos será buscar el directorio "WINDOWS"
Código Delphi [-]
{ hay que incluir la unidad Windows en uses}
function GetWinDir:string;
var
  pdWindowsDirectory : PChar;
  dwWDSize : DWord;
begin
  dwWDSize := MAX_PATH + 1;
  GetMem( pcWindowsDirectory, dwWDSize );
  try
    if GetWindowsDirectory( pcWindowsDirectory, dwWDSize ) <> 0 then
       Result := pcWindowsDirectory;
  finally
       FreeMem( pcWindowsDirectory );
  end;
end;

Ahora, en el evento OnLoad del Form, hacemos los pasos para crear My.ini (si no lo encontramos)

Código Delphi [-]
procedure TForm_Main.Form_OnCreate(Sender: TObject);
var
  IniFile : TIniFile;
  tmpIni  : string;
  tmpDir  : string;
  tmpUnit : string[3];
begin
{ localizar el directorio "Windows" }
  tmpIni  := GetWinDir;
  if( Trim(tmpDir)='' ) then begin
    { NO LOCALIZADO, dar mensaje y acabar el proceso }
      ShowMessage( 'Directorio Windows NO LOCALIZADO' );
      Application.Terminate;
      exit;
  end;
{ copiamos los tres primeros caracteres de tmpDir en tmpUnit, el resto no interesa }
  tmpUnit := tmpDir;
{ como no recuerdo si tmpDir acaba en '\' o nó, lo comprobamos }
  if( tmpDir[Length(tmpDir)]<>'\' )
      then tmpDir := tmpDir+'\';
{ comprobamos que My.ini está en x:\WINDOWS o x:\ }
  if FileExists( tmpDir+'MyIni' )
     then tmpIni := tmpDir +'MyIni'
     else tmpIni := tmpUnit+'MyIni'; // si no lo encontramos, obligamos a que esté en x:\
{ cargamos My.ini (si existe), sinó estará en blanco }
  IniFile := TIniFile.Create( tmpIni );
  with IniFile do begin
       if( ReadString('mysqld', 'basedir', '')='' ) then begin
         { no habiamos encontrado My.ini, debemos crearlo entero
           *** los valores son un ejemplo, tú pon los que quieras ***
               cuando en My.ini una línea comienza por "#" es un comentario
                   no se si una variable puede empezar por ese carácter, asi
                   que si falla o dá errores no creamos la línea
         }
           WriteString('mysqld', 'basedir',          'G:/WWW/Apache/mysql');
           WriteString('mysqld', '#bind-address',    '192.168.0.1');
           WriteString('mysqld', 'datadir',          'G:/WWW/Apache/mysql/data');
           WriteString('mysqld', 'language',         'G:/WWW/Apache/mysql/share/spanish');
           WriteString('mysqld', '#slow query log#', '');
           WriteString('mysqld', '#tmpdir#',         '');
           WriteString('mysqld', 'port',             '3306');
           WriteString('mysqld', '#set-variable',    'key_buffer=16M');
           
           WriteString('WinMySQLadmin', 'Server',    'G:/WWW/Apache/mysql/bin/mysqld-nt.exe');
           WriteString('WinMySQLadmin', 'user',      'salvica');
           WriteString('WinMySQLadmin', 'password',  'aquí va la tuya');
       end;
     { ahora añadimos (si no existen) las secciones:
           - ArchivosdePrograma
           - BORRAME
     }
       if( ReadString('ArchivosdePrograma', 'basedir', '')='' ) then begin
           WriteString('ArchivosdePrograma', 'basedir', tmpUnit+'Archivos de programa/Soft/MySQL');
           WriteString('ArchivosdePrograma', 'datadir', tmpUnit+'Archivos de programa/Soft/MySQL/data');
       end;
       if( ReadString('BORRAME', 'basedir', '')='' ) then begin
           WriteString('BORRAME', 'basedir', tmpUnit+'BORRAME/Soft/MySQL');
           WriteString('BORRAME', 'datadir', tmpUnit+'BORRAME/Soft/MySQL/data');
       end;
     { ahora quitamos el objeto TIniFile de la memoria }
       Free;
  end;
{ como no he comprobado nunca si los valores se graban según se van creando,
  añadiremos aquí la sección "original" que contendrá los mismos valores que
  la sección "mysqld" (por si en algún momento quieres dejar las cosas como
  estaban originalmente 
}
  IniFile := TIniFile.Create( tmpIni );
  with IniFile do begin
       if( ReadString('original', 'basedir', '')='' ) then begin
           WriteString('original', 'basedir', ReadString('mysqld', 'basedir', ''));
           WriteString('original', 'datadir', ReadString('mysqld', 'datadir', ''));
       end;
     { ahora quitamos el objeto TIniFile de la memoria }
       Free;
  end;
end;

Una vez llegado a este punto, tendrias que poner en la sección "mysqld" el contenido bien de la sección "ArchivosdePrograma" o bien el de la "BORRAME" dependiendo de un valor externo (Aplicación de consola) o por el estado de un "CheckBox" y hacer más o menos lo que yo he hecho con la sección "original"

Espero que todo este rollo te sirva para algo, en caso contrario sigue chiflando....
Saludos: salvica
Responder Con Cita
  #5  
Antiguo 17-12-2005
soto soto is offline
Miembro
 
Registrado: oct 2005
Posts: 17
Poder: 0
soto Va por buen camino
Muchas gracias, lamento no haberte contestado antes, lo que pasa es que se me rompió la compu. Lo pruebo y te cuento. Mil gracias!!!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:26:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi