about summary refs log tree commit
path: root/lib/metropolis.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/metropolis.rb')
-rw-r--r--lib/metropolis.rb28
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/metropolis.rb b/lib/metropolis.rb
new file mode 100644
index 0000000..987040d
--- /dev/null
+++ b/lib/metropolis.rb
@@ -0,0 +1,28 @@
+# -*- encoding: binary -*-
+require 'rack'
+require 'uri'
+
+module Metropolis
+  autoload :TokyoCabinet, 'metropolis/tokyocabinet'
+
+  def self.new(opts = {})
+    opts = opts.dup
+    rv = Object.new
+    uri = URI.parse(opts[:uri])
+    case uri.scheme
+    when 'tc'
+      opts[:path_pattern] = uri.path
+      opts[:query] = Rack::Utils.parse_query(uri.query) if uri.query
+      case ext = File.extname(uri.path)
+      when '.tch'
+        rv.extend Metropolis::TokyoCabinet::HDB
+      else
+        raise ArgumentError, "unsupported suffix: #{ext}"
+      end
+    else
+      raise ArgumentError, "unsupported URI scheme: #{uri.scheme}"
+    end
+    rv.setup(opts)
+    rv
+  end
+end