baza 0.0.35 → 0.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Gemfile +1 -1
- data/Gemfile.lock +14 -17
- data/VERSION +1 -1
- data/baza.gemspec +8 -7
- data/lib/baza/base_sql_driver.rb +38 -8
- data/lib/baza/cloner.rb +10 -0
- data/lib/baza/commands/select.rb +15 -8
- data/lib/baza/db.rb +8 -4
- data/lib/baza/driver/active_record.rb +7 -0
- data/lib/baza/driver/mysql/column.rb +4 -6
- data/lib/baza/driver/mysql/columns.rb +4 -4
- data/lib/baza/driver/mysql/database.rb +4 -4
- data/lib/baza/driver/mysql/databases.rb +3 -3
- data/lib/baza/driver/mysql/foreign_key.rb +2 -2
- data/lib/baza/driver/mysql/index.rb +1 -1
- data/lib/baza/driver/mysql/sql/column.rb +4 -4
- data/lib/baza/driver/mysql/sql/create_indexes.rb +3 -3
- data/lib/baza/driver/mysql/sql/create_table.rb +1 -1
- data/lib/baza/driver/mysql/table.rb +16 -16
- data/lib/baza/driver/mysql_java.rb +3 -3
- data/lib/baza/driver/pg/column.rb +5 -13
- data/lib/baza/driver/pg/columns.rb +4 -4
- data/lib/baza/driver/pg/create_index_sql_creator.rb +3 -3
- data/lib/baza/driver/pg/database.rb +4 -4
- data/lib/baza/driver/pg/databases.rb +1 -1
- data/lib/baza/driver/pg/foreign_key.rb +2 -2
- data/lib/baza/driver/pg/index.rb +1 -1
- data/lib/baza/driver/pg/table.rb +9 -9
- data/lib/baza/driver/pg/tables.rb +1 -1
- data/lib/baza/driver/sqlite3/column.rb +1 -1
- data/lib/baza/driver/sqlite3/columns.rb +1 -1
- data/lib/baza/driver/sqlite3/index.rb +1 -1
- data/lib/baza/driver/sqlite3/table.rb +4 -4
- data/lib/baza/driver/tiny.rb +83 -8
- data/lib/baza/driver/tiny/result.rb +18 -2
- data/lib/baza/idquery.rb +3 -3
- data/lib/baza/mysql_base_driver.rb +3 -3
- data/lib/baza/sql_queries/generic_insert.rb +3 -3
- data/lib/baza/sql_queries/generic_update.rb +2 -2
- data/lib/baza/sql_queries/mysql_upsert.rb +5 -5
- data/lib/baza/sql_queries/mysql_upsert_duplicate_key.rb +3 -3
- data/lib/baza/sql_queries/postgres_upsert_duplicate_key.rb +7 -7
- data/lib/baza/sql_queries/select.rb +8 -8
- data/lib/baza/sql_queries/sqlite_upsert_duplicate_key.rb +6 -6
- data/lib/baza/table.rb +3 -3
- data/spec/baza/cloner_spec.rb +2 -2
- data/spec/drivers/tiny_spec.rb +27 -0
- data/spec/info_active_record_pg_peak_flow.rb +2 -2
- data/spec/info_active_record_sqlite3.rb +6 -13
- data/spec/info_sqlite3.rb +3 -12
- metadata +8 -7
@@ -46,7 +46,7 @@ class Baza::Driver::Pg::Tables < Baza::Tables
|
|
46
46
|
|
47
47
|
create_table_sql = "CREATE"
|
48
48
|
create_table_sql << " TEMPORARY" if data[:temp]
|
49
|
-
create_table_sql << " TABLE #{db.
|
49
|
+
create_table_sql << " TABLE #{db.quote_table(table_name)} ("
|
50
50
|
|
51
51
|
first = true
|
52
52
|
data.fetch(:columns).each do |col_data|
|
@@ -108,7 +108,7 @@ class Baza::Driver::Sqlite3::Column < Baza::Column
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def reload
|
111
|
-
@db.q("PRAGMA table_info(
|
111
|
+
@db.q("PRAGMA table_info(#{@db.quote_table(table_name)})") do |data|
|
112
112
|
next unless data.fetch(:name) == name
|
113
113
|
@data = data
|
114
114
|
@type = nil
|
@@ -39,7 +39,7 @@ class Baza::Driver::Sqlite3::Columns
|
|
39
39
|
if data.key?(:default_func)
|
40
40
|
sql << " DEFAULT #{data[:default_func]}"
|
41
41
|
elsif data.key?(:default) && data[:default] != false
|
42
|
-
sql << " DEFAULT #{@db.
|
42
|
+
sql << " DEFAULT #{@db.quote_value(data.fetch(:default))}"
|
43
43
|
end
|
44
44
|
|
45
45
|
sql
|
@@ -53,7 +53,7 @@ class Baza::Driver::Sqlite3::Index < Baza::Index
|
|
53
53
|
|
54
54
|
def reload
|
55
55
|
data = nil
|
56
|
-
@db.query("PRAGMA index_list(
|
56
|
+
@db.query("PRAGMA index_list(#{@db.quote_table(name)})") do |d_indexes|
|
57
57
|
next unless d_indexes.fetch(:name) == name
|
58
58
|
data = d_indexes
|
59
59
|
break
|
@@ -90,7 +90,7 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
90
90
|
@db.columns
|
91
91
|
ret = []
|
92
92
|
|
93
|
-
@db.query("PRAGMA table_info(
|
93
|
+
@db.query("PRAGMA table_info(#{@db.quote_table(name)})") do |d_cols|
|
94
94
|
column_name = d_cols.fetch(:name)
|
95
95
|
obj = @list.get(column_name)
|
96
96
|
|
@@ -283,7 +283,7 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
283
283
|
@db.indexes
|
284
284
|
ret = [] unless block_given?
|
285
285
|
|
286
|
-
@db.query("PRAGMA index_list(
|
286
|
+
@db.query("PRAGMA index_list(#{@db.quote_table(name)})") do |d_indexes|
|
287
287
|
next if d_indexes[:Key_name] == "PRIMARY"
|
288
288
|
obj = @indexes_list.get(d_indexes[:name])
|
289
289
|
|
@@ -333,13 +333,13 @@ class Baza::Driver::Sqlite3::Table < Baza::Table
|
|
333
333
|
|
334
334
|
sql = "CREATE"
|
335
335
|
sql << " UNIQUE" if index_data[:unique]
|
336
|
-
sql << " INDEX #{@db.
|
336
|
+
sql << " INDEX #{@db.quote_index(index_name)} ON #{@db.quote_table(name)} ("
|
337
337
|
|
338
338
|
first = true
|
339
339
|
index_data.fetch(:columns).each do |col_name|
|
340
340
|
sql << ", " unless first
|
341
341
|
first = false if first
|
342
|
-
sql <<
|
342
|
+
sql << @db.quote_column(col_name)
|
343
343
|
end
|
344
344
|
|
345
345
|
sql << ")"
|
data/lib/baza/driver/tiny.rb
CHANGED
@@ -1,22 +1,19 @@
|
|
1
1
|
class Baza::Driver::Tiny < Baza::BaseSqlDriver
|
2
|
-
SEPARATOR_DATABASE = "
|
3
|
-
SEPARATOR_TABLE = "".freeze
|
4
|
-
SEPARATOR_COLUMN = "".freeze
|
2
|
+
SEPARATOR_DATABASE = "[".freeze
|
3
|
+
SEPARATOR_TABLE = "[".freeze
|
4
|
+
SEPARATOR_COLUMN = "[".freeze
|
5
|
+
SEPARATOR_INDEX = "[".freeze
|
5
6
|
SEPARATOR_VALUE = "'".freeze
|
6
|
-
SEPARATOR_INDEX = "`".freeze
|
7
7
|
|
8
8
|
def initialize(db)
|
9
|
-
super
|
10
|
-
|
11
9
|
@sep_database = SEPARATOR_DATABASE
|
12
10
|
@sep_table = SEPARATOR_TABLE
|
13
11
|
@sep_col = SEPARATOR_COLUMN
|
14
12
|
@sep_val = SEPARATOR_VALUE
|
15
13
|
@sep_index = SEPARATOR_INDEX
|
16
|
-
end
|
17
14
|
|
18
|
-
def initialize(db)
|
19
15
|
super
|
16
|
+
|
20
17
|
@client = TinyTds::Client.new(username: db.opts.fetch(:user), password: db.opts.fetch(:pass), host: db.opts.fetch(:host))
|
21
18
|
end
|
22
19
|
|
@@ -24,6 +21,48 @@ class Baza::Driver::Tiny < Baza::BaseSqlDriver
|
|
24
21
|
@client.close
|
25
22
|
end
|
26
23
|
|
24
|
+
def escape(value)
|
25
|
+
@client.escape(value)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.escape_identifier(string)
|
29
|
+
string = string.to_s
|
30
|
+
raise "Invalid column-string: #{string}" if string.include?("[") || string.include?("]")
|
31
|
+
string
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.escape_database(name)
|
35
|
+
escape_identifier(name)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.escape_column(name)
|
39
|
+
escape_identifier(name)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.escape_index(name)
|
43
|
+
escape_identifier(name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.escape_table(name)
|
47
|
+
escape_identifier(name)
|
48
|
+
end
|
49
|
+
|
50
|
+
def escape_database(name)
|
51
|
+
self.class.escape_identifier(name)
|
52
|
+
end
|
53
|
+
|
54
|
+
def escape_column(name)
|
55
|
+
self.class.escape_identifier(name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def escape_index(name)
|
59
|
+
self.class.escape_identifier(name)
|
60
|
+
end
|
61
|
+
|
62
|
+
def escape_table(name)
|
63
|
+
self.class.escape_identifier(name)
|
64
|
+
end
|
65
|
+
|
27
66
|
def insert(table_name, data, args = {})
|
28
67
|
sql = Baza::SqlQueries::GenericInsert.new({
|
29
68
|
db: @db,
|
@@ -39,4 +78,40 @@ class Baza::Driver::Tiny < Baza::BaseSqlDriver
|
|
39
78
|
result = @client.execute(sql)
|
40
79
|
Baza::Driver::Tiny::Result.new(result)
|
41
80
|
end
|
81
|
+
|
82
|
+
def self.quote_identifier(name)
|
83
|
+
"[#{escape_database(name)}]"
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.quote_database(database_name)
|
87
|
+
quote_identifier(database_name)
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.quote_column(column_name)
|
91
|
+
quote_identifier(column_name)
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.quote_index(index_name)
|
95
|
+
quote_identifier(index_name)
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.quote_table(table_name)
|
99
|
+
quote_identifier(table_name)
|
100
|
+
end
|
101
|
+
|
102
|
+
def quote_database(database_name)
|
103
|
+
self.class.quote_identifier(database_name)
|
104
|
+
end
|
105
|
+
|
106
|
+
def quote_column(column_name)
|
107
|
+
self.class.quote_identifier(column_name)
|
108
|
+
end
|
109
|
+
|
110
|
+
def quote_index(index_name)
|
111
|
+
self.class.quote_identifier(index_name)
|
112
|
+
end
|
113
|
+
|
114
|
+
def quote_table(table_name)
|
115
|
+
self.class.quote_identifier(table_name)
|
116
|
+
end
|
42
117
|
end
|
@@ -3,7 +3,23 @@ class Baza::Driver::Tiny::Result < Baza::ResultBase
|
|
3
3
|
@result = result.to_a
|
4
4
|
end
|
5
5
|
|
6
|
-
def each(
|
7
|
-
|
6
|
+
def each(&blk)
|
7
|
+
enum.each(&blk)
|
8
|
+
end
|
9
|
+
|
10
|
+
def fetch
|
11
|
+
enum.next
|
12
|
+
rescue StopIteration
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def enum
|
19
|
+
@enum ||= Enumerator.new do |yielder|
|
20
|
+
@result.each do |result|
|
21
|
+
yielder << result
|
22
|
+
end
|
23
|
+
end
|
8
24
|
end
|
9
25
|
end
|
data/lib/baza/idquery.rb
CHANGED
@@ -85,8 +85,8 @@ private
|
|
85
85
|
|
86
86
|
# Spawns a new database-result to read from.
|
87
87
|
def new_res
|
88
|
-
table_esc =
|
89
|
-
col_esc =
|
88
|
+
table_esc = @db.quote_table(@args.fetch(:table))
|
89
|
+
col_esc = @db.quote_column(@args.fetch(:col))
|
90
90
|
ids = @ids.shift(@args[:size])
|
91
91
|
|
92
92
|
if ids.empty?
|
@@ -94,7 +94,7 @@ private
|
|
94
94
|
return nil
|
95
95
|
end
|
96
96
|
|
97
|
-
ids_sql = ids.map { |id|
|
97
|
+
ids_sql = ids.map { |id| @db.quote_value(id) }.join(",")
|
98
98
|
query_str = "SELECT * FROM #{table_esc} WHERE #{table_esc}.#{col_esc} IN (#{ids_sql})"
|
99
99
|
puts "Query: #{query_str}" if @debug
|
100
100
|
|
@@ -37,7 +37,7 @@ class Baza::MysqlBaseDriver < Baza::BaseSqlDriver
|
|
37
37
|
keys.each do |col_name|
|
38
38
|
sql << "," unless first
|
39
39
|
first = false if first
|
40
|
-
sql <<
|
40
|
+
sql << quote_column(col_name)
|
41
41
|
end
|
42
42
|
|
43
43
|
sql << ") VALUES ("
|
@@ -59,7 +59,7 @@ class Baza::MysqlBaseDriver < Baza::BaseSqlDriver
|
|
59
59
|
sql << ","
|
60
60
|
end
|
61
61
|
|
62
|
-
sql << @db.
|
62
|
+
sql << @db.quote_value(val)
|
63
63
|
end
|
64
64
|
else
|
65
65
|
hash.each do |_key, val|
|
@@ -69,7 +69,7 @@ class Baza::MysqlBaseDriver < Baza::BaseSqlDriver
|
|
69
69
|
sql << ","
|
70
70
|
end
|
71
71
|
|
72
|
-
sql << @db.
|
72
|
+
sql << @db.quote_value(val)
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
@@ -21,7 +21,7 @@ class Baza::SqlQueries::GenericInsert
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def to_sql
|
24
|
-
sql = "INSERT INTO #{@db.
|
24
|
+
sql = "INSERT INTO #{@db.quote_table(@table_name)}"
|
25
25
|
|
26
26
|
if !@data || @data.empty?
|
27
27
|
sql << " #{sql_default_values}"
|
@@ -55,7 +55,7 @@ private
|
|
55
55
|
sql << ", "
|
56
56
|
end
|
57
57
|
|
58
|
-
sql <<
|
58
|
+
sql << @db.quote_column(key)
|
59
59
|
end
|
60
60
|
|
61
61
|
sql << ")"
|
@@ -73,7 +73,7 @@ private
|
|
73
73
|
sql << ", "
|
74
74
|
end
|
75
75
|
|
76
|
-
quoted = @db.
|
76
|
+
quoted = @db.quote_value(value)
|
77
77
|
quoted = convert_line_breaks(quoted) if @replace_line_breaks
|
78
78
|
|
79
79
|
sql << quoted
|
@@ -16,13 +16,13 @@ class Baza::SqlQueries::GenericUpdate
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def to_sql
|
19
|
-
sql = "UPDATE #{@db.
|
19
|
+
sql = "UPDATE #{@db.quote_table(@table_name)} SET "
|
20
20
|
|
21
21
|
first = true
|
22
22
|
@data.each do |key, value|
|
23
23
|
sql << ", " unless first
|
24
24
|
first = false if first
|
25
|
-
sql << "#{@db.
|
25
|
+
sql << "#{@db.quote_column(key)} = #{@db.quote_value(value)}"
|
26
26
|
end
|
27
27
|
|
28
28
|
sql << " WHERE #{@db.sql_make_where(@terms)}" if @terms && !@terms.empty?
|
@@ -9,7 +9,7 @@ class Baza::SqlQueries::MysqlUpsert
|
|
9
9
|
def execute
|
10
10
|
procedure_name = "baza_upsert_#{SecureRandom.hex(5)}"
|
11
11
|
|
12
|
-
sql = "CREATE PROCEDURE
|
12
|
+
sql = "CREATE PROCEDURE #{@db.quote_table(procedure_name)} () BEGIN\n"
|
13
13
|
sql << "\tIF EXISTS(#{select_query}) THEN\n"
|
14
14
|
sql << "\t\t#{update_sql};\n"
|
15
15
|
sql << "\tELSE\n"
|
@@ -20,9 +20,9 @@ class Baza::SqlQueries::MysqlUpsert
|
|
20
20
|
@db.query(sql)
|
21
21
|
|
22
22
|
begin
|
23
|
-
@db.query("CALL
|
23
|
+
@db.query("CALL #{@db.quote_table(procedure_name)}")
|
24
24
|
ensure
|
25
|
-
@db.query("DROP PROCEDURE
|
25
|
+
@db.query("DROP PROCEDURE #{@db.quote_table(procedure_name)}")
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -30,13 +30,13 @@ private
|
|
30
30
|
|
31
31
|
def select_query
|
32
32
|
sql = ""
|
33
|
-
sql << "SELECT * FROM #{@db.
|
33
|
+
sql << "SELECT * FROM #{@db.quote_table(@table_name)} WHERE"
|
34
34
|
|
35
35
|
first = true
|
36
36
|
@terms.each do |column, value|
|
37
37
|
sql << " AND" unless first
|
38
38
|
first = false if first
|
39
|
-
sql << " #{@db.
|
39
|
+
sql << " #{@db.quote_column(column)} = #{@db.quote_value(value)}"
|
40
40
|
end
|
41
41
|
|
42
42
|
sql
|
@@ -15,14 +15,14 @@ class Baza::SqlQueries::MysqlUpsertDuplicateKey
|
|
15
15
|
first = true
|
16
16
|
|
17
17
|
if @return_id
|
18
|
-
sql << " #{@db.
|
18
|
+
sql << " #{@db.quote_column(primary_key_column_name)} = LAST_INSERT_ID(#{@db.quote_column(primary_key_column_name)})"
|
19
19
|
first = false
|
20
20
|
end
|
21
21
|
|
22
22
|
@updates.each do |key, value|
|
23
23
|
sql << "," unless first
|
24
24
|
first = false if first
|
25
|
-
sql << " #{@db.
|
25
|
+
sql << " #{@db.quote_column(key)} = #{@db.quote_value(value)}"
|
26
26
|
end
|
27
27
|
|
28
28
|
sql
|
@@ -52,6 +52,6 @@ private
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def last_insert_sql
|
55
|
-
"SELECT LAST_INSERT_ID() AS
|
55
|
+
"SELECT LAST_INSERT_ID() AS #{@db.quote_column("id")} FROM #{@db.quote_table(@table_name)}"
|
56
56
|
end
|
57
57
|
end
|
@@ -65,14 +65,14 @@ private
|
|
65
65
|
sql << ", " unless first
|
66
66
|
first = false if first
|
67
67
|
|
68
|
-
sql <<
|
68
|
+
sql << @db.quote_column(column_name)
|
69
69
|
end
|
70
70
|
|
71
71
|
sql
|
72
72
|
end
|
73
73
|
|
74
74
|
def insert_sql
|
75
|
-
sql = "INSERT INTO #{@db.
|
75
|
+
sql = "INSERT INTO #{@db.quote_table(@table_name)} ("
|
76
76
|
|
77
77
|
combined_data = @updates.merge(@terms)
|
78
78
|
|
@@ -80,7 +80,7 @@ private
|
|
80
80
|
combined_data.each_key do |column_name|
|
81
81
|
sql << ", " unless first
|
82
82
|
first = false if first
|
83
|
-
sql <<
|
83
|
+
sql << @db.quote_column(column_name)
|
84
84
|
end
|
85
85
|
|
86
86
|
sql << ") VALUES ("
|
@@ -89,7 +89,7 @@ private
|
|
89
89
|
combined_data.each_value do |value|
|
90
90
|
sql << ", " unless first
|
91
91
|
first = false if first
|
92
|
-
sql << @db.
|
92
|
+
sql << @db.quote_value(value).to_s
|
93
93
|
end
|
94
94
|
|
95
95
|
sql << ")"
|
@@ -97,7 +97,7 @@ private
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def update_sql
|
100
|
-
"UPDATE #{@db.
|
100
|
+
"UPDATE #{@db.quote_table(@table_name)} #{update_set_sql} #{update_where_sql}"
|
101
101
|
end
|
102
102
|
|
103
103
|
def update_set_sql
|
@@ -107,7 +107,7 @@ private
|
|
107
107
|
@updates.each do |key, value|
|
108
108
|
sql << ", " unless first
|
109
109
|
first = false if first
|
110
|
-
sql << "#{@db.
|
110
|
+
sql << "#{@db.quote_column(key)} = #{@db.quote_value(value)}"
|
111
111
|
end
|
112
112
|
|
113
113
|
sql
|
@@ -120,7 +120,7 @@ private
|
|
120
120
|
@terms.each do |key, value|
|
121
121
|
sql << " AND " unless first
|
122
122
|
first = false if first
|
123
|
-
sql << "#{@db.
|
123
|
+
sql << "#{@db.quote_column(key)} = #{@db.quote_value(value)}"
|
124
124
|
end
|
125
125
|
|
126
126
|
sql
|
@@ -126,9 +126,9 @@ private
|
|
126
126
|
first = false if first
|
127
127
|
|
128
128
|
if select.is_a?(Symbol)
|
129
|
-
select << " #{@db.
|
129
|
+
select << " #{@db.quote_column(select)}"
|
130
130
|
else
|
131
|
-
select << @db.
|
131
|
+
select << @db.quote_value(select)
|
132
132
|
end
|
133
133
|
end
|
134
134
|
end
|
@@ -143,7 +143,7 @@ private
|
|
143
143
|
@froms.each do |from|
|
144
144
|
sql << "," unless first
|
145
145
|
first = false if first
|
146
|
-
sql << " #{@db.
|
146
|
+
sql << " #{@db.quote_table(from)}"
|
147
147
|
end
|
148
148
|
|
149
149
|
sql
|
@@ -167,12 +167,12 @@ private
|
|
167
167
|
|
168
168
|
if where.is_a?(Hash)
|
169
169
|
where.each do |key, value|
|
170
|
-
sql << "#{@db.
|
170
|
+
sql << "#{@db.quote_column(key)} = #{@db.quote_value(value)}"
|
171
171
|
end
|
172
172
|
elsif where.is_a?(String)
|
173
173
|
sql_arg = where.clone
|
174
174
|
args.each do |arg|
|
175
|
-
sql_arg.sub!("?", @db.
|
175
|
+
sql_arg.sub!("?", @db.quote_value(arg))
|
176
176
|
end
|
177
177
|
|
178
178
|
sql << sql_arg
|
@@ -192,10 +192,10 @@ private
|
|
192
192
|
unless @count
|
193
193
|
if @page
|
194
194
|
@per_page ||= 30
|
195
|
-
sql = "LIMIT #{@db.
|
195
|
+
sql = "LIMIT #{@db.quote_value(@per_page)} OFFSET #{@per_page * (current_page - 1)}"
|
196
196
|
elsif @limit
|
197
|
-
sql = "LIMIT #{@db.
|
198
|
-
sql << ", #{@db.
|
197
|
+
sql = "LIMIT #{@db.quote_value(@limit)}"
|
198
|
+
sql << ", #{@db.quote_value(@offset)}" if @offset
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|