sqlconstructor 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/LICENSE.md +16 -0
- data/README.md +161 -0
- data/Rakefile +11 -0
- data/doc/Object.html +267 -0
- data/doc/Rakefile.html +150 -0
- data/doc/SQLAliasedList.html +717 -0
- data/doc/SQLColumn.html +326 -0
- data/doc/SQLCondList.html +318 -0
- data/doc/SQLConditional.html +1082 -0
- data/doc/SQLConditional/BasicCond.html +325 -0
- data/doc/SQLConstructor.html +763 -0
- data/doc/SQLConstructor/BasicDelete.html +383 -0
- data/doc/SQLConstructor/BasicDelete_mysql.html +368 -0
- data/doc/SQLConstructor/BasicInsert.html +339 -0
- data/doc/SQLConstructor/BasicInsert_mysql.html +325 -0
- data/doc/SQLConstructor/BasicJoin.html +408 -0
- data/doc/SQLConstructor/BasicJoin_mysql.html +439 -0
- data/doc/SQLConstructor/BasicSelect.html +554 -0
- data/doc/SQLConstructor/BasicSelect_example.html +288 -0
- data/doc/SQLConstructor/BasicSelect_mysql.html +466 -0
- data/doc/SQLConstructor/BasicUnion.html +396 -0
- data/doc/SQLConstructor/BasicUpdate.html +409 -0
- data/doc/SQLConstructor/BasicUpdate_mysql.html +310 -0
- data/doc/SQLConstructor/GenericQuery.html +797 -0
- data/doc/SQLConstructor/QAttr.html +398 -0
- data/doc/SQLConstructorTest.html +603 -0
- data/doc/SQLExporter.html +382 -0
- data/doc/SQLExporter/Exporter_generic.html +413 -0
- data/doc/SQLExporter/Exporter_mysql.html +395 -0
- data/doc/SQLObject.html +525 -0
- data/doc/SQLValList.html +322 -0
- data/doc/SQLValue.html +375 -0
- data/doc/created.rid +12 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +356 -0
- data/doc/js/darkfish.js +118 -0
- data/doc/js/jquery.js +32 -0
- data/doc/js/quicksearch.js +114 -0
- data/doc/js/thickbox-compressed.js +10 -0
- data/doc/lib/dialects/example-constructor_rb.html +52 -0
- data/doc/lib/dialects/mysql-constructor_rb.html +52 -0
- data/doc/lib/dialects/mysql-exporter_rb.html +54 -0
- data/doc/lib/sqlconditional_rb.html +64 -0
- data/doc/lib/sqlconstructor_rb.html +52 -0
- data/doc/lib/sqlerrors_rb.html +54 -0
- data/doc/lib/sqlexporter_rb.html +55 -0
- data/doc/lib/sqlobject_rb.html +54 -0
- data/doc/rdoc.css +763 -0
- data/doc/test/queries_rb.html +56 -0
- data/doc/test_rb.html +52 -0
- data/lib/dialects/example-constructor.rb +45 -0
- data/lib/dialects/mysql-constructor.rb +247 -0
- data/lib/dialects/mysql-exporter.rb +108 -0
- data/lib/sqlconditional.rb +196 -0
- data/lib/sqlconstructor.rb +708 -0
- data/lib/sqlerrors.rb +15 -0
- data/lib/sqlexporter.rb +125 -0
- data/lib/sqlobject.rb +284 -0
- data/test/queries.rb +92 -0
- metadata +121 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
3
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
4
|
+
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
6
|
+
<head>
|
7
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
8
|
+
|
9
|
+
<title>File: queries.rb [RDoc Documentation]</title>
|
10
|
+
|
11
|
+
<link type="text/css" media="screen" href="../rdoc.css" rel="stylesheet" />
|
12
|
+
|
13
|
+
<script src="../js/jquery.js" type="text/javascript"
|
14
|
+
charset="utf-8"></script>
|
15
|
+
<script src="../js/thickbox-compressed.js" type="text/javascript"
|
16
|
+
charset="utf-8"></script>
|
17
|
+
<script src="../js/quicksearch.js" type="text/javascript"
|
18
|
+
charset="utf-8"></script>
|
19
|
+
<script src="../js/darkfish.js" type="text/javascript"
|
20
|
+
charset="utf-8"></script>
|
21
|
+
</head>
|
22
|
+
|
23
|
+
<body class="file file-popup">
|
24
|
+
<div id="metadata">
|
25
|
+
<dl>
|
26
|
+
<dt class="modified-date">Last Modified</dt>
|
27
|
+
<dd class="modified-date">2014-08-28 15:20:52 +0400</dd>
|
28
|
+
|
29
|
+
|
30
|
+
<dt class="requires">Requires</dt>
|
31
|
+
<dd class="requires">
|
32
|
+
<ul>
|
33
|
+
|
34
|
+
<li>test/unit</li>
|
35
|
+
|
36
|
+
<li>sqlconstructor</li>
|
37
|
+
|
38
|
+
</ul>
|
39
|
+
</dd>
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
</dl>
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<div id="documentation">
|
47
|
+
|
48
|
+
<div class="description">
|
49
|
+
<h2>Description</h2>
|
50
|
+
|
51
|
+
</div>
|
52
|
+
|
53
|
+
</div>
|
54
|
+
</body>
|
55
|
+
</html>
|
56
|
+
|
data/doc/test_rb.html
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
3
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
4
|
+
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
6
|
+
<head>
|
7
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
8
|
+
|
9
|
+
<title>File: test.rb [RDoc Documentation]</title>
|
10
|
+
|
11
|
+
<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet" />
|
12
|
+
|
13
|
+
<script src="./js/jquery.js" type="text/javascript"
|
14
|
+
charset="utf-8"></script>
|
15
|
+
<script src="./js/thickbox-compressed.js" type="text/javascript"
|
16
|
+
charset="utf-8"></script>
|
17
|
+
<script src="./js/quicksearch.js" type="text/javascript"
|
18
|
+
charset="utf-8"></script>
|
19
|
+
<script src="./js/darkfish.js" type="text/javascript"
|
20
|
+
charset="utf-8"></script>
|
21
|
+
</head>
|
22
|
+
|
23
|
+
<body class="file file-popup">
|
24
|
+
<div id="metadata">
|
25
|
+
<dl>
|
26
|
+
<dt class="modified-date">Last Modified</dt>
|
27
|
+
<dd class="modified-date">2014-08-29 10:20:36 +0400</dd>
|
28
|
+
|
29
|
+
|
30
|
+
<dt class="requires">Requires</dt>
|
31
|
+
<dd class="requires">
|
32
|
+
<ul>
|
33
|
+
|
34
|
+
</ul>
|
35
|
+
</dd>
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
</dl>
|
40
|
+
</div>
|
41
|
+
|
42
|
+
<div id="documentation">
|
43
|
+
|
44
|
+
<div class="description">
|
45
|
+
<h2>Description</h2>
|
46
|
+
|
47
|
+
</div>
|
48
|
+
|
49
|
+
</div>
|
50
|
+
</body>
|
51
|
+
</html>
|
52
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
class SQLConstructor::BasicSelect_example < SQLConstructor::BasicSelect
|
5
|
+
|
6
|
+
# attr_reader :attr_foo
|
7
|
+
|
8
|
+
|
9
|
+
##########################################################################
|
10
|
+
# Class constructor.
|
11
|
+
# Init any attributes here. Do not forget to call 'super'!
|
12
|
+
# _caller - the caller object
|
13
|
+
# *list - list of sources for the FROM clause
|
14
|
+
##########################################################################
|
15
|
+
def initialize ( _caller, *list )
|
16
|
+
super
|
17
|
+
# @attr_foo = false
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
##########################################################################
|
22
|
+
# Define your methods here.
|
23
|
+
# If your dialect supports a keyword FOO, so that you would want to
|
24
|
+
# construct something like
|
25
|
+
# SELECT a FROM t WHERE b=1 FOO 5
|
26
|
+
# you'll need to implement a foo() method here and further use it like
|
27
|
+
# SQLConstructor.new.select(:a).from('t').where.eq(:b,1).foo(5)
|
28
|
+
##########################################################################
|
29
|
+
|
30
|
+
# def foo ( value = nil )
|
31
|
+
# @attr_foo = value
|
32
|
+
# return self
|
33
|
+
# end
|
34
|
+
|
35
|
+
|
36
|
+
#############################################################################
|
37
|
+
# You may do mostly anything here, but don't forget to call method_missing
|
38
|
+
# of the parent ( 'return super' )
|
39
|
+
#############################################################################
|
40
|
+
def method_missing ( method, *args )
|
41
|
+
return super
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,247 @@
|
|
1
|
+
|
2
|
+
VALID_INDEX_HINTS = [ :use_index, :force_index, :ignore_index,
|
3
|
+
:use_key, :ignore_key, :force_key ]
|
4
|
+
|
5
|
+
##########################################################################################
|
6
|
+
# MySQL dialect descendant of BasicSelect class
|
7
|
+
##########################################################################################
|
8
|
+
class SQLConstructor::BasicSelect_mysql < SQLConstructor::BasicSelect
|
9
|
+
|
10
|
+
attr_reader :attr_high_priority, :attr_straight_join, :attr_sql_result_size,
|
11
|
+
:attr_sql_cache, :attr_sql_calc_found_rows, :attr_limit, :attr_group_by_with_rollup
|
12
|
+
|
13
|
+
METHODS = {
|
14
|
+
:straight_join => SQLConstructor::QAttr.new( :name => 'attr_straight_join',
|
15
|
+
:text => 'STRAIGHT_JOIN' ),
|
16
|
+
:sql_cache => SQLConstructor::QAttr.new( :name => 'attr_sql_cache', :text => 'SQL_CACHE'),
|
17
|
+
:sql_no_cache => SQLConstructor::QAttr.new( :name => 'attr_sql_cache', :text => 'SQL_NO_CACHE'),
|
18
|
+
:high_priority => SQLConstructor::QAttr.new( :name => 'attr_high_priority',:text => 'HIGH_PRIORITY' ),
|
19
|
+
:sql_calc_found_rows => SQLConstructor::QAttr.new( :name => 'attr_sql_calc_found_rows',
|
20
|
+
:text => 'SQL_CALC_FOUND_ROWS' ),
|
21
|
+
:sql_small_result => SQLConstructor::QAttr.new( :name => 'attr_sql_result_size',
|
22
|
+
:text => 'SQL_SMALL_RESULT' ),
|
23
|
+
:sql_big_result => SQLConstructor::QAttr.new( :name => 'attr_sql_result_size',
|
24
|
+
:text => 'SQL_BIG_RESULT' ),
|
25
|
+
:sql_buffer_result => SQLConstructor::QAttr.new( :name => 'attr_sql_result_size',
|
26
|
+
:text => 'SQL_BUFFER_RESULT' ),
|
27
|
+
:limit => SQLConstructor::QAttr.new( :name => 'attr_limit',
|
28
|
+
:text => 'LIMIT', :val => SQLObject ),
|
29
|
+
:group_by_with_rollup => SQLConstructor::QAttr.new( :name => 'attr_group_by_with_rollup',
|
30
|
+
:text => "WITH ROLLUP" ),
|
31
|
+
}
|
32
|
+
|
33
|
+
##########################################################################
|
34
|
+
# Class constructor.
|
35
|
+
# _caller - the caller object
|
36
|
+
# *list - list of sources for the FROM clause
|
37
|
+
##########################################################################
|
38
|
+
def initialize ( _caller, *list )
|
39
|
+
super
|
40
|
+
end
|
41
|
+
|
42
|
+
##########################################################################
|
43
|
+
# Send missing methods calls to the @caller object, and also handle
|
44
|
+
# JOINs, UNIONs and INDEX hints
|
45
|
+
##########################################################################
|
46
|
+
def method_missing ( method, *args )
|
47
|
+
# Handle all [*_]join calls:
|
48
|
+
return _addJoin( method, *args ) if method.to_s =~ /^[a-z_]*join$/
|
49
|
+
# Handle all valid *_index/*_key calls:
|
50
|
+
return _addIndexes( method, *args ) if VALID_INDEX_HINTS.include? method
|
51
|
+
super
|
52
|
+
end
|
53
|
+
|
54
|
+
#########
|
55
|
+
private
|
56
|
+
#########
|
57
|
+
|
58
|
+
##########################################################################
|
59
|
+
# Adds a USE/FORCE/IGNORE INDEX clause for the last objects in for_vals
|
60
|
+
# argument.
|
61
|
+
##########################################################################
|
62
|
+
def _addIndexes ( type, *list )
|
63
|
+
type = type.to_s
|
64
|
+
type.upcase!.gsub! /_/, ' '
|
65
|
+
@attr_index_hints ||= [ ]
|
66
|
+
# set the attr_index_hints for the last object in for_vals
|
67
|
+
last_ind = @attr_from.val.length - 1
|
68
|
+
@attr_index_hints[last_ind] = { :type => type, :list => SQLObject.get( list ) }
|
69
|
+
@string = nil
|
70
|
+
return self
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
##########################################################################################
|
77
|
+
# MySQL dialect descendant of BasicDelete class
|
78
|
+
##########################################################################################
|
79
|
+
class SQLConstructor::BasicDelete_mysql < SQLConstructor::BasicDelete
|
80
|
+
|
81
|
+
attr_reader :del_ignore, :del_quick, :del_low_priority, :attr_limit
|
82
|
+
|
83
|
+
METHODS = {
|
84
|
+
:low_priority => SQLConstructor::QAttr.new( :name => 'del_low_priority',
|
85
|
+
:text => 'LOW_PRIORITY' ),
|
86
|
+
:quick => SQLConstructor::QAttr.new( :name => 'del_quick', :text => 'QUICK '),
|
87
|
+
:ignore => SQLConstructor::QAttr.new( :name => 'del_ignore', :text => 'IGNORE'),
|
88
|
+
:limit => SQLConstructor::QAttr.new( :name => 'attr_limit', :text => 'LIMIT', :val => SQLObject)
|
89
|
+
}
|
90
|
+
|
91
|
+
##########################################################################
|
92
|
+
# Class constructor.
|
93
|
+
# _caller - the caller object
|
94
|
+
##########################################################################
|
95
|
+
def initialize ( _caller )
|
96
|
+
super
|
97
|
+
end
|
98
|
+
|
99
|
+
##########################################################################
|
100
|
+
# Handle JOINs or send call to the parent.
|
101
|
+
##########################################################################
|
102
|
+
def method_missing ( method, *args )
|
103
|
+
# Handle all [*_]join calls:
|
104
|
+
return _addJoin( method, *args ) if method =~ /^[a-z_]*join$/
|
105
|
+
super
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
##########################################################################################
|
112
|
+
# MySQL dialect descendant of BasicInsert class
|
113
|
+
##########################################################################################
|
114
|
+
class SQLConstructor::BasicInsert_mysql < SQLConstructor::BasicInsert
|
115
|
+
|
116
|
+
attr_reader :ins_priority, :ins_quick, :ins_ignore, :ins_on_duplicate_key_update
|
117
|
+
|
118
|
+
METHODS = {
|
119
|
+
:low_priority => SQLConstructor::QAttr.new( :name => 'ins_priority', :text => 'LOW_PRIORITY' ),
|
120
|
+
:delayed => SQLConstructor::QAttr.new( :name => 'ins_priority', :text => 'DELAYED' ),
|
121
|
+
:high_priority => SQLConstructor::QAttr.new( :name => 'ins_priority', :text => 'HIGH_PRIORITY' ),
|
122
|
+
:quick => SQLConstructor::QAttr.new( :name => 'ins_quick', :text => 'QUICK' ),
|
123
|
+
:ignore => SQLConstructor::QAttr.new( :name => 'ins_ignore', :text => 'IGNORE' ),
|
124
|
+
:on_duplicate_key_update => SQLConstructor::QAttr.new(
|
125
|
+
:name => 'ins_on_duplicate_key_update',
|
126
|
+
:text => 'ON DUPLICATE KEY UPDATE',
|
127
|
+
:val => SQLConditional
|
128
|
+
)
|
129
|
+
}
|
130
|
+
|
131
|
+
##########################################################################
|
132
|
+
# Class constructor.
|
133
|
+
# _caller - the caller object
|
134
|
+
##########################################################################
|
135
|
+
def initialize ( _caller )
|
136
|
+
super
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
##########################################################################################
|
143
|
+
# MySQL dialect descendant of BasicUpdate class
|
144
|
+
##########################################################################################
|
145
|
+
class SQLConstructor::BasicUpdate_mysql < SQLConstructor::BasicUpdate
|
146
|
+
|
147
|
+
attr_reader :upd_low_priority, :upd_ignore, :attr_limit
|
148
|
+
|
149
|
+
METHODS = {
|
150
|
+
:low_priority => SQLConstructor::QAttr.new( :name => 'upd_low_priority', :text => 'LOW_PRIORITY'),
|
151
|
+
:ignore => SQLConstructor::QAttr.new( :name => 'upd_ignore', :text => 'IGNORE' ),
|
152
|
+
:limit => SQLConstructor::QAttr.new( :name => 'attr_limit', :text => 'LIMIT',
|
153
|
+
:val => SQLObject )
|
154
|
+
}
|
155
|
+
|
156
|
+
##########################################################################
|
157
|
+
# Class constructor.
|
158
|
+
# _caller - the caller object
|
159
|
+
##########################################################################
|
160
|
+
def initialize ( _caller, *list )
|
161
|
+
super
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
|
167
|
+
##########################################################################################
|
168
|
+
# MySQL dialect descendant of BasicJoin class
|
169
|
+
##########################################################################################
|
170
|
+
class SQLConstructor::BasicJoin_mysql < SQLConstructor::BasicJoin
|
171
|
+
|
172
|
+
VALID_JOINS = [ "join", "inner_join", "cross_join", "left_join", "right_join",
|
173
|
+
"left_outer_join", "right_outer_join",
|
174
|
+
"natural_join", "natural_left_join", "natural_right_join",
|
175
|
+
"natural_left_outer_join", "natural_right_outer_join" ]
|
176
|
+
|
177
|
+
##########################################################################
|
178
|
+
# Class contructor. Takes a caller object as the first argument, JOIN
|
179
|
+
# type as the second argument, and a list of sources for the JOIN clause
|
180
|
+
##########################################################################
|
181
|
+
def initialize ( _caller, type, *sources )
|
182
|
+
type = type.to_s
|
183
|
+
if ! VALID_JOINS.include? type
|
184
|
+
raise NoMethodError, ERR_UNKNOWN_METHOD + ": " + type
|
185
|
+
end
|
186
|
+
super
|
187
|
+
end
|
188
|
+
|
189
|
+
##########################################################################
|
190
|
+
# Adds a USE/FORCE/IGNORE INDEX clause for the last objects in for_vals
|
191
|
+
# argument.
|
192
|
+
##########################################################################
|
193
|
+
def _addIndexes ( type, *list )
|
194
|
+
type = type.to_s
|
195
|
+
type.upcase!.gsub! /_/, ' '
|
196
|
+
@attr_index_hints ||= [ ]
|
197
|
+
# set the attr_index_hints for the last object in for_vals
|
198
|
+
last_ind = @join_sources.length - 1
|
199
|
+
@attr_index_hints[last_ind] = { :type => type, :list => SQLObject.get( list ) }
|
200
|
+
@string = nil
|
201
|
+
return self
|
202
|
+
end
|
203
|
+
|
204
|
+
##########################################################################
|
205
|
+
# Export to string with index hints included
|
206
|
+
##########################################################################
|
207
|
+
def to_s
|
208
|
+
return @string if @string
|
209
|
+
result = @type + " " + to_sWithAliasesIndexes( @join_sources )
|
210
|
+
result += @exporter.separator
|
211
|
+
result += "ON " + @join_on.val.to_s if @join_on
|
212
|
+
@string = result
|
213
|
+
end
|
214
|
+
|
215
|
+
##########################################################################
|
216
|
+
# Handles INDEX hints or sends the call to the parent
|
217
|
+
##########################################################################
|
218
|
+
def method_missing ( method, *args )
|
219
|
+
# Handle all valid *_index/*_key calls:
|
220
|
+
return _addIndexes( method, *args ) if VALID_INDEX_HINTS.include? method
|
221
|
+
super
|
222
|
+
end
|
223
|
+
|
224
|
+
########
|
225
|
+
private
|
226
|
+
########
|
227
|
+
|
228
|
+
##########################################################################
|
229
|
+
# Returns a string of objects in list merged with @attr_index_hints
|
230
|
+
##########################################################################
|
231
|
+
def to_sWithAliasesIndexes ( list )
|
232
|
+
list = [ list ] if ! [ Array, SQLValList, SQLAliasedList ].include? list.class
|
233
|
+
arr = [ ]
|
234
|
+
list.each_with_index do |item,i|
|
235
|
+
_alias = item.alias ? " " + item.alias.to_s : ""
|
236
|
+
str = item.to_s + _alias
|
237
|
+
if @attr_index_hints
|
238
|
+
index_hash = @attr_index_hints[i]
|
239
|
+
str += " " + index_hash[:type] + " " + index_hash[:list].to_s
|
240
|
+
end
|
241
|
+
arr << str
|
242
|
+
end
|
243
|
+
return arr.join ','
|
244
|
+
end
|
245
|
+
|
246
|
+
end
|
247
|
+
|
@@ -0,0 +1,108 @@
|
|
1
|
+
|
2
|
+
#####################################################################################
|
3
|
+
# MySQL dialect translator class.
|
4
|
+
#####################################################################################
|
5
|
+
class SQLExporter::Exporter_mysql < SQLExporter::Exporter_generic
|
6
|
+
|
7
|
+
attr_reader :dialect
|
8
|
+
|
9
|
+
# The main rule for the MySQL SELECT query syntax
|
10
|
+
SELECT_SYNTAX = [
|
11
|
+
"SELECT",
|
12
|
+
:attr_distinction,
|
13
|
+
:attr_high_priority,
|
14
|
+
:attr_straight_join,
|
15
|
+
:attr_sql_result_size,
|
16
|
+
:attr_sql_cache,
|
17
|
+
:attr_sql_calc_found_rows,
|
18
|
+
:attr_expression,
|
19
|
+
:attr_from,
|
20
|
+
:attr_joins,
|
21
|
+
:attr_where,
|
22
|
+
:attr_group_by,
|
23
|
+
:attr_group_by_order,
|
24
|
+
:attr_group_by_with_rollup,
|
25
|
+
:attr_having,
|
26
|
+
:attr_order_by,
|
27
|
+
:attr_order_by_order,
|
28
|
+
:attr_limit,
|
29
|
+
:attr_unions
|
30
|
+
]
|
31
|
+
|
32
|
+
# The main rule for the MySQL DELETE query syntax
|
33
|
+
DELETE_SYNTAX = [
|
34
|
+
"DELETE",
|
35
|
+
:del_low_priority,
|
36
|
+
:del_quick,
|
37
|
+
:del_ignore,
|
38
|
+
:attr_from,
|
39
|
+
:attr_where,
|
40
|
+
:attr_order_by,
|
41
|
+
:attr_limit
|
42
|
+
]
|
43
|
+
|
44
|
+
INSERT_SYNTAX = [
|
45
|
+
"INSERT",
|
46
|
+
:ins_priority,
|
47
|
+
:ins_ignore,
|
48
|
+
:ins_into,
|
49
|
+
:ins_values,
|
50
|
+
:ins_set,
|
51
|
+
:ins_select,
|
52
|
+
:ins_on_duplicate_key_update
|
53
|
+
]
|
54
|
+
|
55
|
+
UPDATE_SYNTAX = [
|
56
|
+
"UPDATE",
|
57
|
+
:upd_low_priority,
|
58
|
+
:upd_ignore,
|
59
|
+
:upd_tables,
|
60
|
+
:upd_set,
|
61
|
+
:attr_where,
|
62
|
+
:attr_order_by,
|
63
|
+
:attr_limit
|
64
|
+
]
|
65
|
+
|
66
|
+
|
67
|
+
def initialize ( tidy )
|
68
|
+
@tidy = tidy
|
69
|
+
@dialect = 'mysql'
|
70
|
+
super tidy # ha ha, "super tidy" :)
|
71
|
+
end
|
72
|
+
|
73
|
+
#############################################################################
|
74
|
+
# Forms a string for the FROM clause from the objects attributes @attr_from
|
75
|
+
# and @attr_index_hints
|
76
|
+
#############################################################################
|
77
|
+
def attr_from ( obj )
|
78
|
+
result = ""
|
79
|
+
if obj.attr_from
|
80
|
+
result = "FROM " + to_sWithAliasesIndexes( obj, obj.attr_from.val )
|
81
|
+
end
|
82
|
+
return result
|
83
|
+
end
|
84
|
+
|
85
|
+
########
|
86
|
+
private
|
87
|
+
########
|
88
|
+
|
89
|
+
#############################################################################
|
90
|
+
# Returns a string of objects in list merged with indexes of obj
|
91
|
+
#############################################################################
|
92
|
+
def to_sWithAliasesIndexes ( obj, list )
|
93
|
+
list = [ list ] if ! [ Array, SQLValList, SQLAliasedList ].include? list.class
|
94
|
+
arr = [ ]
|
95
|
+
list.each_with_index do |item,i|
|
96
|
+
_alias = item.alias ? " " + item.alias.to_s : ""
|
97
|
+
str = item.to_s + _alias
|
98
|
+
if obj.attr_index_hints
|
99
|
+
index_hash = obj.attr_index_hints[i]
|
100
|
+
str += " " + index_hash[:type] + " " + index_hash[:list].to_s
|
101
|
+
end
|
102
|
+
arr << str
|
103
|
+
end
|
104
|
+
return arr.join ','
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|