my %builtin_config = ();
my $builtin_config_path;
my $builtin_config_default;
+my $config_cache = 1;
+my %config_cache = ();
our $error;
#
'name' => 'direct',
'_immutable' => '1',
'schemas' => {},
- }
+ },
+ 'environment' => {
+ 'name' => 'environment',
+ '_immutable' => '1',
+ 'schemas' => {},
+ },
},
'config-version' => '2',
};
module_path => sub { return dirname(realpath($0)) },
quote => sub { return $_ },
reload => sub {},
+ wait_for_child => sub {},
};
#
'set' => sub {
_cmd_set(@_);
},
-
+
'show' => sub {
_cmd_show(@_);
},
'nodebug' => sub {
_cmd_nodebug(@_);
},
+
+ 'service' => sub {
+ _cmd_service(@_);
+ },
};
#
#
@text = map { defined($_)?$remote_api->{quote}->($_):'(undef)' } @text;
- $outputstack[0]->{ewpf}->(sprintf($format, @text));
+ $outputstack[0]->{io}->(sprintf($format, @text));
}
#
config_get => \&_config_get,
config_set => \&_config_set,
config_has => \&_config_has,
+ wait_for_child => $remote_api->{wait_for_child},
});
} else {
_io('%s has wrong type (got %s, expected %s)', $p, $g->{'TYPE'}, $type);
}
_debug("Loaded %d plugins", $#g+1);
-
+
return @g;
}
#
sub _config_get {
my $path = shift;
+ my $dotpath = join('.', @{$path});
my $value;
- $value = $remote_api->{config_get}->($path);
- _debug("config: getting %s=%s", join('.', @{$path}), $value);
+ if ($config_cache && exists($config_cache{$dotpath}) && exists($config_cache{$dotpath}->{value})) {
+ $value = $config_cache{$dotpath}->{value};
+ } else {
+ $value = $remote_api->{config_get}->($path);
+ $config_cache{$dotpath} = {value => $value, has => 1};
+
+ }
+ _debug("config: getting %s=%s", $dotpath, $value);
return $value;
}
sub _config_set {
my $path = shift;
+ my $dotpath = join('.', @{$path});
my $value = shift;
- _debug("config: setting %s=%s", join('.', @{$path}), $value);
+ _debug("config: setting %s=%s", $dotpath, $value);
+ $config_cache{$dotpath} = {value => $value, has => 1};
return $remote_api->{config_set}->($path, $value);
}
sub _config_has {
my $path = shift;
+ my $dotpath = join('.', @{$path});
my $b;
- $b = $remote_api->{config_has}->($path);
- _debug("config: testing %s (%s)", join('.', @{$path}), $b?'true':'false');
+ if ($config_cache && exists($config_cache{$dotpath}) && exists($config_cache{$dotpath}->{has})) {
+ $b = $config_cache{$dotpath}->{has};
+ } else {
+ $b = $remote_api->{config_has}->($path);
+ $config_cache{$dotpath}->{has} = $b;
+ }
+ _debug("config: testing %s (%s)", $dotpath, $b?'true':'false');
return $b;
}
sub _config_del {
my $path = shift;
+ my $dotpath = join('.', @{$path});
- _debug("config: removing %s", join('.', @{$path}));
+ _debug("config: removing %s", $dotpath);
+ delete($config_cache{$dotpath});
$remote_api->{config_del}->($path);
}
_config_set($path, join(',', @c));
}
-#
+#
# Remove an item from the list
#
sub _config_list_del {
}
}
+#
+# Handle generic service commands
+#
+sub _cmd_service {
+ my $event = shift;
+ my $subcmd = shift || '';
+
+ $subcmd = lc($subcmd);
+
+ if ($subcmd eq 'cache') {
+ _cmd_service_cache($event, @_);
+ }
+}
+
+
+#
+# Display or clear the content of the config cache
+#
+sub _cmd_service_cache {
+ my $event = shift;
+ my $subcmd = shift;
+
+ $subcmd = 'list' unless defined($subcmd);
+ $subcmd = lc($subcmd);
+
+ if ($subcmd eq 'list') {
+ _io("Content of config cache:");
+ foreach (sort(keys(%config_cache))) {
+ if (exists($config_cache{$_}->{value})) {
+ _io(" %s => %s", $_, $config_cache{$_}->{value});
+ } else {
+ _io(" %s present", $_);
+ }
+ }
+ } elsif ($subcmd eq 'clear') {
+ %config_cache = ();
+ _io("Cache cleared");
+ }
+}
+
#
# Return the list of loaded grabbers.
$builtin_config_default = $a->{_config_default}->();
}
- @outputstack = ({ewpf => $remote_api->{'io'}, window => ""});
+ if (exists($a->{_config_cache})) {
+ $config_cache = $a->{_config_cache}->();
+ }
+
+ @outputstack = ({io => $remote_api->{'io'}, window => ""});
return 1;
}