Comme on l'a vu précédemment, il existe de nombreux scripts de test pour Slony-I™ dans le répertoire src/ducttape qui intègre la génération de script Slonik à l'intérieur de code écrit en shell.
La plupart de ces scripts ne sont pas terriblement sophistiqués. Typiquement, ils utilisent des structures comme celle-ci :
DB1=slony_test1
DB2=slony_test2
slonik <<_EOF_
cluster name = T1;
node 1 admin conninfo = 'dbname=$DB1';
node 2 admin conninfo = 'dbname=$DB2';
try {
create set (id = 1, origin = 1, comment =
'Set 1 - pgbench tables');
set add table (set id = 1, origin = 1,
id = 1, fully qualified name = 'public.accounts',
comment = 'Table accounts');
set add table (set id = 1, origin = 1,
id = 2, fully qualified name = 'public.branches',
comment = 'Table branches');
set add table (set id = 1, origin = 1,
id = 3, fully qualified name = 'public.tellers',
comment = 'Table tellers');
set add table (set id = 1, origin = 1,
id = 4, fully qualified name = 'public.history',
comment = 'Table accounts');
}
on error {
exit 1;
}
_EOF_
Une approche plus sophistiquée consiste à définir des composants communs, notamment un « préambule » qui contient les commandes SLONIK CLUSTER NAME(7) et SLONIK ADMIN CONNINFO(7) que l'on retrouve dans chaque script Slonik :
CLUSTER=T1 DB1=slony_test1 DB2=slony_test2 PREAMBULE="cluster name = $CLUSTER node 1 admin conninfo = 'dbname=$DB1'; node 2 admin conninfo = 'dbname=$DB2'; "
La variable PREAMBULE peut alors être réutilisée plusieurs fois lorsque le script shell invoque plusieurs fois slonik. Vous pouvez également utiliser SLONIK INCLUDE(7) et placer le preambule dans un fichier que vous incluez.
Les variables shell fournissent une méthode simple pour assigner les noms d'ensemble et de nœuds :
origin=1
subscriber=2
mainset=1
slonik <<_EOF_
$PREAMBULE
try {
create set (id = $mainset, origin = $origin,
comment = 'Set $mainset - pgbench tables');
set add table (set id = $mainset, origin = $origin,
id = 1, fully qualified name = 'public.accounts',
comment = 'Table accounts');
set add table (set id = $mainset, origin = $origin,
id = 2, fully qualified name = 'public.branches',
comment = 'Table branches');
set add table (set id = $mainset, origin = $origin,
id = 3, fully qualified name = 'public.tellers',
comment = 'Table tellers');
set add table (set id = $mainset, origin = $origin,
id = 4, fully qualified name = 'public.history',
comment = 'Table accounts');
} on error {
exit 1;
}
_EOF_
Le script peut être utilisé en suite pour boucler sur la liste des tables :
# Basic configuration
origin=1
subscriber=2
mainset=1
# List of tables to replicate
TABLES="accounts branches tellers history"
ADDTABLES=""
tnum=1
for table in `echo $TABLES`; do
ADDTABLES="$ADDTABLES
set add table ($set id = $mainset, origin = $origin,
id = $tnum, fully qualified name = 'public.$table',
comment = 'Table $tname');
"
let "tnum=tnum+1"
done
slonik <<_EOF_
$PREAMBULE
try {
create set (id = $mainset, origin = $origin,
comment = 'Set $mainset - pgbench tables');
$ADDTABLES
} on error {
exit 1;
}
_EOF_
Ce n'est peut-être pas nécessaire si vous n'avez que quatre tables mais cette méthode évite de recopier de longues listes de configuration à la main et préviendra les erreurs sur les grands ensembles que vous rencontrerez dans la « vraie vie ».
Vous pouvez créer des scripts encore plus sophistiqués si votre langage de script possède :
des structures de type « Record » qui permettent d'assigner des objets en parallèle ;
des fonctions, procédure ou des routines qui permettent d'implanter des fonctionnalités une seule fois, puis de les appeler à divers endroits de votre script.
Un mécanisme d'« import de module » afin de partager de fonctionnalités commune entre plusieurs scripts.
Si vous devez utiliser Bash, zsh ou Korn shell, tous ces shells possèdent des extensions qui gèrent correctement les structures de données sophistiquées et les modules. Sur linux, Bash est très répandu ; sur les systèmes UNIX™ commerciaux, Korn est le standard alors que sur BSD, les shells « sophistiqués » sont en option.
N'oubliez pas de regarder du côté des des autres langages de script, parmi lesquels Perl est le plus évident, puisqu'il est largement répandu sur Linux, UNIX™ et BSD.