PDA

Ver la Versión Completa : My.ini relativo


soto
14-12-2005, 00:22:25
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



basedir="c:/archivos de programa/Soft/MySQL/"
datadir="c:/archivos de programa/soft/MySQL/Data/"
ó

basedir="F:/BORRAME/Soft/MySQL/"
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

salvica
15-12-2005, 12:00:40
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

soto
15-12-2005, 14:15:40
Hola salvica, muchas gracias. Lo que decís vos en el punto dos es lo que quiero hacer. Pero me veo con estos problemas:


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:\.
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 :p

salvica
16-12-2005, 01:31:43
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"

{ 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)


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

soto
17-12-2005, 23:35:23
Muchas gracias, lamento no haberte contestado antes, lo que pasa es que se me rompió la compu. Lo pruebo y te cuento. Mil gracias!!!!