require 'oauth' require 'json' module Logworm class ForbiddenAccessException < Exception ; end class DatabaseException < Exception ; end class InvalidQueryException < Exception ; end class DB DB_HOST = "http://db.logworm.com" def initialize(keys = nil) if keys.is_a? Array and keys.size == 4 @consumer_key, @consumer_secret, @token, @token_secret = keys elsif keys.is_a? Array and keys.size == 2 @consumer_key = ENV["#{ENV['APP_ID']}_APPS_KEY"] @consumer_secret = ENV["#{ENV['APP_ID']}_APPS_SECRET"] @token, @token_secret = keys else config = Logworm::Config.instance if config.file_found? @consumer_key, @consumer_secret, @token, @token_secret = config.keys else raise "Could not find .logworm file in current directory." if keys.is_a? FalseClass @consumer_key, @consumer_secret = [ENV['LW_CONSUMER_KEY'], ENV['LW_CONSUMER_SECRET']] @token, @token_secret = [ENV['LW_PROJECT_KEY'], ENV['LW_PROJECT_SECRET']] end end raise ForbiddenAccessException.new("Missing keys") if @consumer_key.nil? or @consumer_secret.nil? raise ForbiddenAccessException.new("Missing keys") if @token.nil? or @token_secret.nil? @connection = OAuth::AccessToken.new(OAuth::Consumer.new(@consumer_key, @consumer_secret), @token, @token_secret) end def tables() res = db_call(:get, "#{DB_HOST}/") end def query(table, cond) res = db_call(:post, "#{DB_HOST}/queries", {:table => table, :query => cond}) end def results(uri) res = db_call(:get, uri) raise InvalidQueryException.new("#{res['error']}") if res['error'] res["results"] = JSON.parse(res["results"]) res end def batch_log(entries) db_call(:post, "#{DB_HOST}/log", {:entries => $lr_queue.to_json}) end private def db_call(method, uri, params = {}) begin res = @connection.send(method, uri, params) rescue SocketError raise DatabaseException end raise DatabaseException if res.code.to_i == 404 raise DatabaseException.new("Server returned: #{res.body}") if res.code.to_i == 500 raise ForbiddenAccessException if res.code.to_i == 403 raise InvalidQueryException.new("#{res.body}") if res.code.to_i == 400 begin JSON.parse(res.body) rescue Exception => e raise DatabaseException.new("Database reponse cannot be parsed: #{e}") end end end end