Automatická změna struktury databáze: Porovnání verzí

Z Freenetis Wiki
Přejít na: navigace, hledání
Řádek 1: Řádek 1:
Protože při vývoji Freenetisu se neustále mění také struktura databáze, umí Freenetis po stažení nové verze z svn (příkaz "svn update") automaticky sám provést upgrade struktury databáze tak, aby původní obsah databáze zůstal nepoškozen.
+
FreenetIS obsahuje mechanismus pro automatickou změnu struktury databáze. Tyto změny jsou provedeny po spuštění FreenetISu (po otevření v prohlížeči) po jeho aktualizaci (zde nezáleží, zda-li se jedná o aktualizace skrze bálíčkovací systém, nebo z vývojářského repozitáře). Provedené změny mohou nelze zrušit, což znamená, že snížení verze (downgrade) FreenetISu není možné (tento jev lze samozřejmě odstranit manuální změnou databáze ze zálohy, při které ovšem nejsme schopni zaručit správnost výsledného stavu sytému).
  
To je řešeno následovně:
+
Mechanismus pro aktualizaci je úzce spjat s verzováním FreenetISu. Ve složce '''/db_upgrades''' se nachází soubory se změnami pro jednotlivé verze FreenetISu. Jména souborů jsou ve formátu '''upgrade_sql_VERZE.php''', kde '''VERZE''' je nahrazena verzí FreenetISu. Soubory samotné musí obsahovat položku pole '''$upgrade_sql''' s indexem daným verzí FreenetISu. Tato položka obsahuje pole SQL příkazů, které jsou postupně spuštěny. Dále může obsahovat funkce spouštěné před a po provedení SQL příkazů, které jsou používané pokud např. nelze data databáze převést mezi jednotlivými verzemi přímo pomocí SQL příkazů. Obě funkce mohou obsahovat libovolné PHP příkazy a vracejí pravdivostní hodnotu (boolean).
#v adresáři '''kohana/application/upgrade_sql''' jsou soubory '''upgrade_sql_XXX.php''', který obsahuje SQL dotazy pro update databázové struktury z SVN verze XXX na novější SVN verzi
 
#ve stejném adresáři je soubor '''upgrade_sql.php''', který má nastavenu SVN property [http://svnbook.red-bean.com/en/1.4/svn.advanced.props.special.keywords.html svn:keywords na hodnotu Revision].
 
  
 +
Příklad souboru se změnami:
  
'''PHP autoupdate funkce'''
+
<?php defined('SYSPATH') or die('No direct script access.');
 +
/*
 +
  * This file is part of open source system FreeNetIS
 +
  * and it is released under GPLv3 licence.
 +
  *
 +
  * More info about licence can be found:
 +
  * http://www.gnu.org/licenses/gpl-3.0.html
 +
  *
 +
  * More info about project can be found:
 +
  * http://www.freenetis.org/
 +
  *
 +
  */
 +
 +
/** This upgrade is equal to one in 1.0.0~beta2 developer revision */
 +
$upgrade_equal_to['1.0.0~rc1'] = '1.0.0~beta2';
 +
 +
function upgrade_1_0_0_rc1_before()
 +
{
 +
echo "Some PHP code triggered before processing of all SQL commands"
 +
return TRUE;
 +
}
  
V nejnutnějších případech lze pro upgrade databáze použit i PHP (pokud nelze vykonat upgrade jen pomocí SQL).
+
$upgrade_sql['0.9.9~rc'] = array
 +
(
 +
"ALTER TABLE `ifaces` CHANGE `device_id` `device_id` INT( 11 ) NOT NULL",
 +
 +
"UPDATE ifaces i, wireless_ifaces wi
 +
SET wireless_mode = wmode, wireless_antenna = antenna
 +
WHERE wi.iface_id = i.id",
 +
 +
);
 +
 +
function upgrade_1_0_0_rc1_after()
 +
{
 +
echo "Some PHP code triggered after processing of all SQL commands"
 +
return TRUE;
 +
}
  
Do souborů '''upgrade_sql_XXX.php''' / '''upgrade_sql.php''' lze přidat funkce '''bool upgrade_sql_XXX_before(void)''', '''bool upgrade_sql_XXX_after(void)''' / '''bool upgrade_sql_before(void)''', '''bool upgrade_sql_after(void)'''.
+
Pokud některý z SQL příkazů vyvolá chybu, popřípadě některá funkce vrátí FALSE, je provádění ukončeno a chyba zobrazena uživateli.
 
 
Funkce '''before''' je volána před započetím vykonávání upgrade SQL scriptů, '''after''' po jejich provedení. Funkce musí vracet pravdivostní hodnotu.
 

Verze z 1. 8. 2012, 07:50

FreenetIS obsahuje mechanismus pro automatickou změnu struktury databáze. Tyto změny jsou provedeny po spuštění FreenetISu (po otevření v prohlížeči) po jeho aktualizaci (zde nezáleží, zda-li se jedná o aktualizace skrze bálíčkovací systém, nebo z vývojářského repozitáře). Provedené změny mohou nelze zrušit, což znamená, že snížení verze (downgrade) FreenetISu není možné (tento jev lze samozřejmě odstranit manuální změnou databáze ze zálohy, při které ovšem nejsme schopni zaručit správnost výsledného stavu sytému).

Mechanismus pro aktualizaci je úzce spjat s verzováním FreenetISu. Ve složce /db_upgrades se nachází soubory se změnami pro jednotlivé verze FreenetISu. Jména souborů jsou ve formátu upgrade_sql_VERZE.php, kde VERZE je nahrazena verzí FreenetISu. Soubory samotné musí obsahovat položku pole $upgrade_sql s indexem daným verzí FreenetISu. Tato položka obsahuje pole SQL příkazů, které jsou postupně spuštěny. Dále může obsahovat funkce spouštěné před a po provedení SQL příkazů, které jsou používané pokud např. nelze data databáze převést mezi jednotlivými verzemi přímo pomocí SQL příkazů. Obě funkce mohou obsahovat libovolné PHP příkazy a vracejí pravdivostní hodnotu (boolean).

Příklad souboru se změnami:

<?php defined('SYSPATH') or die('No direct script access.');
/*
 * This file is part of open source system FreeNetIS
 * and it is released under GPLv3 licence.
 * 
 * More info about licence can be found:
 * http://www.gnu.org/licenses/gpl-3.0.html
 * 
 * More info about project can be found:
 * http://www.freenetis.org/
 * 
 */

/** This upgrade is equal to one in 1.0.0~beta2 developer revision */
$upgrade_equal_to['1.0.0~rc1'] = '1.0.0~beta2'; 

function upgrade_1_0_0_rc1_before()
{
	echo "Some PHP code triggered before processing of all SQL commands"
	return TRUE;
}
$upgrade_sql['0.9.9~rc'] = array
(
	"ALTER TABLE `ifaces` CHANGE `device_id` `device_id` INT( 11 ) NOT NULL",

	"UPDATE ifaces i, wireless_ifaces wi

SET wireless_mode = wmode, wireless_antenna = antenna WHERE wi.iface_id = i.id",

);

function upgrade_1_0_0_rc1_after()
{
	echo "Some PHP code triggered after processing of all SQL commands"
	return TRUE;
}

Pokud některý z SQL příkazů vyvolá chybu, popřípadě některá funkce vrátí FALSE, je provádění ukončeno a chyba zobrazena uživateli.