=end
+ Config.register Config::StringValue.new('journal.storage',
+ :default => nil,
+ :requires_restart => true,
+ :desc => 'storage engine used by the journal')
+ Config.register Config::StringValue.new('journal.storage.uri',
+ :default => nil,
+ :requires_restart => true,
+ :desc => 'storage database uri')
+
class InvalidJournalMessage < StandardError
end
class ConsumeInterrupt < StandardError
end
+ class StorageError < StandardError
+ end
class JournalMessage
# a unique identification of this message
end
end
+ module Storage
+ class AbstractStorage
+ # intializes/opens a new storage connection
+ def initialize(opts={})
+ end
+
+ # inserts a message in storage
+ def insert(message)
+ end
+
+ # creates/ensures a index exists on the payload specified by key
+ def ensure_index(key)
+ end
+
+ # returns a array of message instances that match the query
+ def find(query, limit=10, offset=0)
+ end
+
+ # returns the number of messages that match the query
+ def count(query)
+ end
+
+ # delete messages that match the query
+ def delete(query)
+ end
+ end
+ end
+
# Describes a query on journal entries, it is used both to describe
# a subscription aswell as to query persisted messages.
# There two ways to declare a Query instance, using
def initialize(opts={})
# overrides the internal consumer with a block
@consumer = opts[:consumer]
+ # storage backend
+ @storage = opts[:storage]
@queue = Queue.new
# consumer thread:
@thread = Thread.new do
s.block.call(message)
end
end
+
+ @storage.insert(message) if @storage
+ end
+
+ def persists?
+ true if @storage
end
def join
--- /dev/null
+# encoding: UTF-8
+#-- vim:sw=2:et
+#++
+#
+# :title: journal backend for postgresql
+
+require 'pg'
+
+module Irc
+class Bot
+module Journal
+ module Storage
+ class PostgresStorage < AbstractStorage
+ def initialize(opts={})
+ @uri = opts[:uri] || 'postgresql://localhost/rbot_journal'
+ @conn = PG.connect(@uri)
+ @version = @conn.exec('SHOW server_version;')[0]['server_version']
+
+ @version.gsub!(/^(\d+\.\d+)$/, '\1.0')
+ log 'journal storage: postgresql connected to version: ' + @version
+
+ version = @version.split('.')[0,3].join.to_i
+ if version < 930
+ raise StorageError.new(
+ 'PostgreSQL Version too old: %s, supported: >= 9.3' % [@version])
+ end
+ @jsonb = (version >= 940)
+ log 'journal storage: no jsonb support, consider upgrading postgres'
+
+ create_table
+ end
+
+ def create_table
+ end
+ end
+ end
+end # Journal
+end # Bot
+end # Irc
require 'test/unit'
require 'rbot/ircbot'
require 'rbot/journal'
+require 'rbot/journal/postgres.rb'
class JournalMessageTest < Test::Unit::TestCase
end
+class JournalStorageTest < Test::Unit::TestCase
+
+ include Irc::Bot::Journal
+
+ def test_storage
+ s = Storage::PostgresStorage.new(
+ uri: 'postgresql://apoc:seed42@localhost/rbot_journal')
+ assert_equal(true, true)
+ end
+
+end
+