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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
module FakeRecord
class Column < Struct.new(:name, :type)
end
class Connection
attr_reader :tables, :columns_hash, :visitor
def initialize(visitor)
@tables = %w{ users photos developers products}
@columns = {
'users' => [
Column.new('id', :integer),
Column.new('name', :string),
Column.new('bool', :boolean),
Column.new('created_at', :date)
],
'products' => [
Column.new('id', :integer),
Column.new('price', :decimal)
]
}
@columns_hash = {
'users' => Hash[@columns['users'].map { |x| [x.name, x] }],
'products' => Hash[@columns['products'].map { |x| [x.name, x] }]
}
@primary_keys = {
'users' => 'id',
'products' => 'id'
}
@visitor = visitor
end
def primary_key name
@primary_keys[name.to_s]
end
def table_exists? name
@tables.include? name.to_s
end
def columns name, message = nil
@columns[name.to_s]
end
def quote_table_name name
"\"#{name.to_s}\""
end
def quote_column_name name
"\"#{name.to_s}\""
end
def quote thing, column = nil
if column && column.type == :integer
return 'NULL' if thing.nil?
return thing.to_i
end
case thing
when true
"'t'"
when false
"'f'"
when nil
'NULL'
when Numeric
thing
else
"'#{thing}'"
end
end
end
class ConnectionPool
class Spec < Struct.new(:config)
end
attr_reader :spec, :connection
def initialize
@spec = Spec.new(:adapter => 'america')
@connection = Connection.new(Arel::Visitors::ToSql.new(self))
end
def with_connection
yield connection
end
def table_exists? name
connection.tables.include? name.to_s
end
def columns_hash
connection.columns_hash
end
end
class Base
attr_accessor :connection_pool
def initialize
@connection_pool = ConnectionPool.new
end
def connection
connection_pool.connection
end
end
end
|