On 02/02/2009, at 4:46 PM, Chris Anderson wrote:
On Sun, Feb 1, 2009 at 9:40 PM, Antony Blakey
<[email protected]> wrote:
There are command line options for manipulating the list of
plugins. By
default it will load plugins from /etc/couchdb/plugins/ or whatever
your
localconfdir is - mine is always relative - but this can be
controlled by
the options:
-C clean the plugins list
-D add all the plugins in $DEFAULT_PLUGIN_DIR
-G DIR add all the plugins in DIR
-P DIR add the plugin DIR
Bit light on testing, I wanted to show how trivial it is.
Thanks for getting started on this. It looks like with a make plugins
target, this will be ready to roll.
I think there are multiple levels of modularity possible - some core
features could be plugins, purely in a separation-of-concerns kind of
way. Then there would be third-party plugins. This could be a
convenient way to play with some new contributions without having to
merge into the a single code directory (assuming each plugin is
separate in the source). And finally there would be per-user plugins
that customize couch on a per-app basis.
I assume you mean a make plugins target for core plugins?
One thing I don't understand is the plugins list and the additional
command-line options to launch script. I wonder if there's a
non-ephemeral way to control the list of loaded plugins.
Well, there is the default location. If a plugin were to have an
extension e.g. '.plugin' then the activation could be controlled via
renaming. OTOH I like the Apache (httpd) mechanism of having
'available/active' dirs, which seems cleaner.
I use the command line options to the startup script because I have
couchdb/erlang/icu etc packaged as ruby gems that deploys couch using
dependcies, and the class that controls couchdb allows multiple
instances in self-contained locations. It looks a bit like this:
---------------------------------------
require 'memetic'
require 'memetic-erlang'
require 'memetic-spidermonkey'
require 'memetic-icu'
module Memetic
class CouchDB
DIRECTORY = %x{cd #{File.dirname(File.dirname(__FILE__)) + "/
BUILD"} ; pwd}.split()[0]
def CouchDB.configure_environment(env)
Erlang.configure_environment(env)
Spidermonkey.configure_environment(env)
ICU.configure_environment(env)
end
def initialize(local_directory)
@local_directory = local_directory
Dir.mkdir(@local_directory) unless File.exists?(@local_directory)
@log_directory = "#...@local_directory}/log"
Dir.mkdir(@log_directory) unless File.exists?(@log_directory)
@data_directory = "#...@local_directory}/data"
Dir.mkdir(@data_directory) unless File.exists?(@data_directory)
File.open("#...@local_directory}/configuration.ini", "w") do |f|
f << configuration()
end
end
def start
env = Environment.new
CouchDB.configure_environment(env)
cmd = env.as_command_prefix
cmd << "( cd '#{DIRECTORY}' ; "
cmd << "./bin/couchdb -b "
cmd << "-o '#...@log_directory}/couchdb.stdout' "
cmd << "-e '#...@log_directory}/couchdb.stderr' "
cmd << "-p '#...@local_directory}/pid' "
cmd << "-c './etc/couchdb/default.ini' "
cmd << "-c '#...@local_directory}/configuration.ini' "
#cmd << "-G '#...@local_directory}/plugins' "
cmd << " )"
IO.popen(cmd) do |p|
s = p.gets
s.chomp if s
end
end
def status
env = Environment.new
CouchDB.configure_environment(env)
IO.popen("#{env.as_command_prefix} #{DIRECTORY}/bin/couchdb -p
#...@local_directory}/pid -s") do |p|
s = p.gets
s.chomp if s
end
end
def stop
env = Environment.new
CouchDB.configure_environment(env)
IO.popen("#{env.as_command_prefix} #{DIRECTORY}/bin/couchdb -p
#...@local_directory}/pid -d") do |p|
s = p.gets
s.chomp if s
end
end
def configuration
return <<END_OF_STRING
[couchdb]
database_dir = #...@data_directory}
[log]
file = #...@log_directory}/couch.log
level = debug
END_OF_STRING
end
end
end
---------------------------------------
As far as configuration, users will likely also want to configure
their API endpoints as http_db_handlers or http_global_handlers. These
allow you to hook an Erlang function directly to a CouchDB path.
Sure.
I imagined that the ini file in the plugin directory wouldn't be
modified by users i.e. that's "part of the plugin". Users would modify
the local.ini file to change the user-configurable parts of that. That
makes me think that the startup script should load local.*.ini, so you
can separate your per-plugin user-configurable bits. The reason for
not modifying the plugin.ini directly is so that you can update them
easily.
Antony Blakey
-------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787
A reasonable man adapts himself to suit his environment. An
unreasonable man persists in attempting to adapt his environment to
suit himself. Therefore, all progress depends on the unreasonable man.
-- George Bernard Shaw