+
+
+# Return an array containing all preferences defined in current Koha instance
+# .pref files.
+
+sub get_prefs_from_files {
+ my $context = C4::Context->new();
+ my $path_pref_en = $context->config('intrahtdocs') .
+ '/prog/en/modules/admin/preferences';
+ # Get all .pref file names
+ opendir ( my $fh, $path_pref_en );
+ my @pref_files = grep { /.pref/ } readdir($fh);
+ close $fh;
+
+ my @names = ();
+ my $append = sub {
+ my $prefs = shift;
+ for my $pref ( @$prefs ) {
+ for my $element ( @$pref ) {
+ if ( ref( $element) eq 'HASH' ) {
+ my $name = $element->{pref};
+ next unless $name;
+ push @names, $name;
+ next;
+ }
+ }
+ }
+ };
+ for my $file (@pref_files) {
+ my $pref = LoadFile( "$path_pref_en/$file" );
+ for my $tab ( keys %$pref ) {
+ my $content = $pref->{$tab};
+ if ( ref($content) eq 'ARRAY' ) {
+ $append->($content);
+ next;
+ }
+ for my $section ( keys %$content ) {
+ my $syspref = $content->{$section};
+ $append->($syspref);
+ }
+ }
+ }
+ return @names;
+}
+
+
+# Return an array containg all preferences defined in DB
+
+sub get_prefs_from_db {
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare("SELECT variable FROM systempreferences");
+ $sth->execute;
+ my @names = ();
+ while ( (my $name) = $sth->fetchrow_array ) {
+ push @names, $name if $name;
+ }
+ return @names;
+}
+
+
+# Return an array containing all local preferences: those which are defined in
+# DB and not defined in Koha .pref files.
+
+sub get_local_prefs {
+ my @prefs_file = get_prefs_from_files();
+ my @prefs_db = get_prefs_from_db();
+
+ my %prefs_file = map { $_ => 1 } @prefs_file;
+ my @names = ();
+ foreach my $name (@prefs_db) {
+ push @names, $name unless $prefs_file{$name};
+ }
+
+ return @names;
+}
+