This repository has been archived by the owner on May 29, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 5
/
query.rb
87 lines (64 loc) · 1.65 KB
/
query.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
module Virsandra
class InvalidQuery < Exception; end
class Query
attr_reader :row
attr_accessor :table, :statement
class << self
def select(*fields)
SelectQuery.new(fields)
end
def insert
InsertQuery.new
end
def delete
DeleteQuery.new
end
def alter
AlterQuery.new
end
end
def to_s
raw_query.map{|query_part| query_part.to_s }.reject(&:empty?).join(" ")
end
def from *args
raise InvalidQuery.new("From, table or into clause not defined for #{self.class}")
end
alias_method :table, :from
alias_method :into, :from
def where *args
raise InvalidQuery.new("Where clause not defined for #{self.class}")
end
def order *args
raise InvalidQuery.new("Order clause not defined for #{self.class}")
end
def limit *args
raise InvalidQuery.new("Limit clause not defined for #{self.class}")
end
def add *args
raise InvalidQuery.new("Add clause not defined for #{self.class}")
end
def values *args
raise InvalidQuery.new("Values clause not defined for #{self.class}")
end
def execute
@row = Virsandra.execute(self.to_s)
end
def fetch(statement = nil)
@raw_query = statement if statement
execute
fetch_with_symbolized_keys
end
private
def raw_query
[@raw_query]
end
def fetch_with_symbolized_keys
row_hash = @row && @row.first
return {} unless row_hash
Hash[row_hash.map{|(k,v)| [k.to_sym,v]}]
end
end
end
Dir[File.expand_path('../queries/*_query.rb', __FILE__)].each do |path|
require path
end