10-10-2011

Voor 2 klanten  hun website op een DVD gezet voor promotie activiteiten. Lijkt altijd een makkelijk verzoek maar is in de praktijk lastig. Databases en webservers zijn niet gemaakt om op "read only media" te draaien. Gekozen voor "Mongoose easy to use" webserver waarvan de code beschikbaar is op Google code. Samen met wat shell scripting maakt dit een zelf startende CD/DVD.

De grote vraag is hoe een database toe te voegen. In eerste instantie gekeken naar een XAMPP oplossing. Dat lijkt voor een relatief simple webapplicatie met een database een te ingewikkelde oplossing. Uit een lijst van "stand alone" webservers komt Mongoose als een bruikbare oplossing. De belangrijkste plus punten zijn "single file executable" en een kleine footprint. Om dynamische script taal als PHP te gebruiken kan je de CGI optie configuren. Nadeel is dat de php executables in the root directory moeten staan, maar je hebt wel de mogelijkheid om php extensies te gebruiken. Dit maakt de weg vrij om een connectie te maken naar een database. De orginele database server was mysql, dat niet erg geschikt is om in een niet server omgeving te draaien. De keuze voor een "single file database" oplossing lijkt dan logisch. SQLite is een veel gebruikte database en kan via php makkelijk benaderd worden. De data uit de mysql database is via een script omgezet naar SQLite. Dat kan niet altijd maar in dit geval was dat mogelijk met een paar kleine aanpassingen in de orginele code.

Voorbeelden hiervan zijn:

  • Geen CONCAT functie, dat kan worden opgevangen door de || operator.
  • Queries is niet "case insensitive" en dat maakt de resultaten in vergelijking met mysql anders.

De conversie is gebaseerd op dit linux shell script dat een database dump sql file genereerd, die geimporteerd kan worden in SQLite met een administrator tool (zie lijst).

{codecitation style="brush: bash;"} #!/bin/sh
mysqldump -u [mysql user] -p --compact --compatible=ansi --default-character-set=binary [database name] |
grep -v ' KEY "' |
grep -v ' UNIQUE KEY "' |
sed '/^SET/d' | sed 's/ unsigned / /g' |
sed 's/ "id" bigint(20) NOT NULL/ "id" integer primary key autoincrement/g' |
sed 's/ smallint([0-9]*) / integer /g' |
sed 's/ tinyint([0-9]*) / integer /g' |
sed 's/ int([0-9]*) / integer /g' |
sed 's/ character set [^ ]* / /g' |
sed 's/ enum([^)]*) / varchar(255) /g' |
sed 's/ on update [^,]*//g' |
sed 's/\\r\\n/\\n/g' |
sed 's/\\"/"/g' |
perl -e 'local $/;$_=<>;s/,\n\)/\n\)/gs;print "begin;\n";print;print "commit;\n"' |
perl -pe '
if (/^(INSERT.+?)\(/) {
$a=$1; s/\\'\''/'\'\''/g;
s/\\n/\n/g; s/\),\(/\);\n$a\(/g;
}
' > output.sql {/codecitation}

Het script werk op de server waar mysql is geinstalleerd en heeft Perl nodig.

De SQLite file kan samen met de web applicatie files op een dvd gezet worden en wordt dan gestart via een bat file (voor Windows)

{codecitation style="brush: bash;"}
start mongoose-3.0.exe
start "%ProgramFiles%\Internet Explorer\iexplore.exe" "http://localhost:8080/index.php"
pause "enter to stop site"
taskkill /F /IM "mongoose-3.0.exe"
{/codecitation}

Conclusie: het is geen high preformance oplossing, maar wel goedkoop en makkelijk te implementeren. Er zijn conversie problemen van mysql naar sqlite, maar veel web applicaties gebruiken geen heel ingewikkelde database functies.