rhodes-framework 1.0.10 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (198) hide show
  1. data/Manifest.txt +159 -30
  2. data/Rakefile +3 -19
  3. data/lib/erb.rb +1 -1
  4. data/lib/rho/rho.rb +94 -107
  5. data/lib/rho/rhofsconnector.rb +4 -0
  6. data/lib/rho/rhoutils.rb +26 -0
  7. data/lib/rho/rhoviewhelpers.rb +1 -1
  8. data/lib/rhodes.rb +2 -2
  9. data/lib/rhoframework.rb +9 -9
  10. data/lib/rhom/rhom.rb +1 -1
  11. data/lib/rhom/rhom_db_adapter.rb +36 -15
  12. data/lib/rhom/rhom_db_adapterME.rb +2 -3
  13. data/lib/rhom/rhom_object.rb +14 -2
  14. data/lib/rhom/rhom_object_factory.rb +42 -11
  15. data/lib/version.rb +2 -2
  16. data/spec/README +1 -0
  17. data/spec/Rakefile +1 -0
  18. data/spec/{configs/account.rb → app/Account/config.rb} +0 -0
  19. data/spec/{configs/case.rb → app/Case/config.rb} +0 -0
  20. data/spec/app/Question/config.rb +3 -0
  21. data/spec/app/Settings/controller.rb +10 -0
  22. data/spec/app/Settings/index.erb +11 -0
  23. data/spec/app/SpecRunner/controller.rb +15 -0
  24. data/spec/app/SpecRunner/index.erb +14 -0
  25. data/spec/app/application.rb +4 -0
  26. data/spec/app/index.erb +17 -0
  27. data/spec/app/layout.erb +27 -0
  28. data/spec/app/loading.html +11 -0
  29. data/spec/app/mspec.rb +11 -0
  30. data/spec/app/mspec/expectations.rb +2 -0
  31. data/spec/app/mspec/expectations/expectations.rb +17 -0
  32. data/spec/app/mspec/expectations/should.rb +25 -0
  33. data/spec/app/mspec/fileutils.rb +1590 -0
  34. data/spec/app/mspec/guards.rb +16 -0
  35. data/spec/app/mspec/guards/background.rb +21 -0
  36. data/spec/app/mspec/guards/bug.rb +24 -0
  37. data/spec/app/mspec/guards/compliance.rb +37 -0
  38. data/spec/app/mspec/guards/conflict.rb +18 -0
  39. data/spec/app/mspec/guards/endian.rb +44 -0
  40. data/spec/app/mspec/guards/extensions.rb +20 -0
  41. data/spec/app/mspec/guards/guard.rb +166 -0
  42. data/spec/app/mspec/guards/noncompliance.rb +20 -0
  43. data/spec/app/mspec/guards/platform.rb +43 -0
  44. data/spec/app/mspec/guards/quarantine.rb +17 -0
  45. data/spec/app/mspec/guards/runner.rb +34 -0
  46. data/spec/app/mspec/guards/superuser.rb +17 -0
  47. data/spec/app/mspec/guards/support.rb +20 -0
  48. data/spec/app/mspec/guards/tty.rb +20 -0
  49. data/spec/app/mspec/guards/version.rb +38 -0
  50. data/spec/app/mspec/helpers.rb +11 -0
  51. data/spec/app/mspec/helpers/argv.rb +43 -0
  52. data/spec/app/mspec/helpers/bignum.rb +5 -0
  53. data/spec/app/mspec/helpers/const_lookup.rb +9 -0
  54. data/spec/app/mspec/helpers/environment.rb +23 -0
  55. data/spec/app/mspec/helpers/fixture.rb +20 -0
  56. data/spec/app/mspec/helpers/flunk.rb +5 -0
  57. data/spec/app/mspec/helpers/io.rb +17 -0
  58. data/spec/app/mspec/helpers/language_version.rb +20 -0
  59. data/spec/app/mspec/helpers/ruby_exe.rb +123 -0
  60. data/spec/app/mspec/helpers/scratch.rb +17 -0
  61. data/spec/app/mspec/helpers/tmp.rb +32 -0
  62. data/spec/app/mspec/matchers.rb +23 -0
  63. data/spec/app/mspec/matchers/base.rb +95 -0
  64. data/spec/app/mspec/matchers/be_an_instance_of.rb +26 -0
  65. data/spec/app/mspec/matchers/be_ancestor_of.rb +24 -0
  66. data/spec/app/mspec/matchers/be_close.rb +27 -0
  67. data/spec/app/mspec/matchers/be_empty.rb +20 -0
  68. data/spec/app/mspec/matchers/be_false.rb +20 -0
  69. data/spec/app/mspec/matchers/be_kind_of.rb +24 -0
  70. data/spec/app/mspec/matchers/be_nil.rb +20 -0
  71. data/spec/app/mspec/matchers/be_true.rb +20 -0
  72. data/spec/app/mspec/matchers/complain.rb +56 -0
  73. data/spec/app/mspec/matchers/eql.rb +26 -0
  74. data/spec/app/mspec/matchers/equal.rb +26 -0
  75. data/spec/app/mspec/matchers/equal_element.rb +78 -0
  76. data/spec/app/mspec/matchers/equal_utf16.rb +34 -0
  77. data/spec/app/mspec/matchers/have_constant.rb +30 -0
  78. data/spec/app/mspec/matchers/have_instance_method.rb +24 -0
  79. data/spec/app/mspec/matchers/have_method.rb +24 -0
  80. data/spec/app/mspec/matchers/have_private_instance_method.rb +24 -0
  81. data/spec/app/mspec/matchers/include.rb +32 -0
  82. data/spec/app/mspec/matchers/match_yaml.rb +47 -0
  83. data/spec/app/mspec/matchers/method.rb +14 -0
  84. data/spec/app/mspec/matchers/output.rb +67 -0
  85. data/spec/app/mspec/matchers/output_to_fd.rb +71 -0
  86. data/spec/app/mspec/matchers/raise_error.rb +48 -0
  87. data/spec/app/mspec/matchers/respond_to.rb +24 -0
  88. data/spec/app/mspec/matchers/stringsymboladapter.rb +8 -0
  89. data/spec/app/mspec/mocks.rb +3 -0
  90. data/spec/app/mspec/mocks/mock.rb +159 -0
  91. data/spec/app/mspec/mocks/object.rb +20 -0
  92. data/spec/app/mspec/mocks/proxy.rb +136 -0
  93. data/spec/app/mspec/pp.rb +893 -0
  94. data/spec/app/mspec/runner.rb +15 -0
  95. data/spec/app/mspec/runner/actions.rb +8 -0
  96. data/spec/app/mspec/runner/actions/debug.rb +17 -0
  97. data/spec/app/mspec/runner/actions/filter.rb +40 -0
  98. data/spec/app/mspec/runner/actions/gdb.rb +17 -0
  99. data/spec/app/mspec/runner/actions/tag.rb +133 -0
  100. data/spec/app/mspec/runner/actions/taglist.rb +56 -0
  101. data/spec/app/mspec/runner/actions/tagpurge.rb +56 -0
  102. data/spec/app/mspec/runner/actions/tally.rb +116 -0
  103. data/spec/app/mspec/runner/actions/timer.rb +22 -0
  104. data/spec/app/mspec/runner/context.rb +188 -0
  105. data/spec/app/mspec/runner/example.rb +34 -0
  106. data/spec/app/mspec/runner/exception.rb +43 -0
  107. data/spec/app/mspec/runner/filters.rb +4 -0
  108. data/spec/app/mspec/runner/filters/match.rb +22 -0
  109. data/spec/app/mspec/runner/filters/profile.rb +54 -0
  110. data/spec/app/mspec/runner/filters/regexp.rb +7 -0
  111. data/spec/app/mspec/runner/filters/tag.rb +29 -0
  112. data/spec/app/mspec/runner/formatters.rb +10 -0
  113. data/spec/app/mspec/runner/formatters/describe.rb +24 -0
  114. data/spec/app/mspec/runner/formatters/dotted.rb +98 -0
  115. data/spec/app/mspec/runner/formatters/file.rb +19 -0
  116. data/spec/app/mspec/runner/formatters/html.rb +81 -0
  117. data/spec/app/mspec/runner/formatters/method.rb +93 -0
  118. data/spec/app/mspec/runner/formatters/specdoc.rb +41 -0
  119. data/spec/app/mspec/runner/formatters/spinner.rb +99 -0
  120. data/spec/app/mspec/runner/formatters/summary.rb +11 -0
  121. data/spec/app/mspec/runner/formatters/unit.rb +21 -0
  122. data/spec/app/mspec/runner/formatters/yaml.rb +44 -0
  123. data/spec/app/mspec/runner/mspec.rb +361 -0
  124. data/spec/app/mspec/runner/object.rb +24 -0
  125. data/spec/app/mspec/runner/shared.rb +12 -0
  126. data/spec/app/mspec/runner/tag.rb +32 -0
  127. data/spec/app/mspec/utils/name_map.rb +129 -0
  128. data/spec/app/mspec/utils/options.rb +441 -0
  129. data/spec/app/mspec/utils/ruby_name.rb +8 -0
  130. data/spec/app/mspec/utils/script.rb +220 -0
  131. data/spec/app/mspec/utils/version.rb +53 -0
  132. data/spec/app/mspec/version.rb +5 -0
  133. data/spec/app/spec/fixtures/client_info.txt +2 -0
  134. data/spec/app/spec/fixtures/object_values.txt +90 -0
  135. data/spec/{rho_controller_spec.rb → app/spec/rho_controller_spec.rb} +4 -7
  136. data/spec/{rho_spec.rb → app/spec/rho_spec.rb} +15 -36
  137. data/spec/{rhom_object_factory_spec.rb → app/spec/rhom_object_factory_spec.rb} +108 -72
  138. data/spec/{rhom_spec.rb → app/spec/rhom_spec.rb} +8 -4
  139. data/spec/app/spec/spec_helper.rb +15 -0
  140. data/spec/app/spec/webview_spec.rb +27 -0
  141. data/spec/app/spec_runner.rb +26 -0
  142. data/spec/build.yml +28 -0
  143. data/spec/public/css/base.css +39 -0
  144. data/spec/public/css/blackberry.css +99 -0
  145. data/spec/public/css/iphone.css +392 -0
  146. data/spec/public/css/rho.css +3 -0
  147. data/spec/public/css/xhtml.css +114 -0
  148. data/spec/public/images/IUI_LICENSE.txt +21 -0
  149. data/spec/public/images/backButton.png +0 -0
  150. data/spec/public/images/blueButton.png +0 -0
  151. data/spec/public/images/cancel.png +0 -0
  152. data/spec/public/images/grayButton.png +0 -0
  153. data/spec/public/images/iui-logo-touch-icon.png +0 -0
  154. data/spec/public/images/listArrow.png +0 -0
  155. data/spec/public/images/listArrowSel.png +0 -0
  156. data/spec/public/images/listGroup.png +0 -0
  157. data/spec/public/images/loading.gif +0 -0
  158. data/spec/public/images/pinstripes.png +0 -0
  159. data/spec/public/images/right_button.png +0 -0
  160. data/spec/public/images/selection.png +0 -0
  161. data/spec/public/images/thumb.png +0 -0
  162. data/spec/public/images/toggle.png +0 -0
  163. data/spec/public/images/toggleOn.png +0 -0
  164. data/spec/public/images/toolButton.png +0 -0
  165. data/spec/public/images/toolButton_new.png +0 -0
  166. data/spec/public/images/toolbar.png +0 -0
  167. data/spec/public/images/whiteButton.png +0 -0
  168. data/spec/public/js/application.js +1 -0
  169. data/spec/public/js/jquery-1.2.6.min.js +32 -0
  170. data/spec/public/js/rho.js +4 -0
  171. data/spec/public/js/rhogeolocation-wm.js +59 -0
  172. data/spec/public/js/rhogeolocation.js +11 -0
  173. data/spec/rhoconfig.txt +19 -0
  174. metadata +169 -39
  175. data/History.txt +0 -37
  176. data/README.rdoc +0 -2
  177. data/lib/TestServe.rb +0 -9
  178. data/res/sqlite3/constants.rb +0 -49
  179. data/res/sqlite3/database.rb +0 -715
  180. data/res/sqlite3/driver/dl/api.rb +0 -154
  181. data/res/sqlite3/driver/dl/driver.rb +0 -307
  182. data/res/sqlite3/driver/native/driver.rb +0 -257
  183. data/res/sqlite3/errors.rb +0 -68
  184. data/res/sqlite3/pragmas.rb +0 -271
  185. data/res/sqlite3/resultset.rb +0 -176
  186. data/res/sqlite3/sqlite3_api.rb +0 -0
  187. data/res/sqlite3/statement.rb +0 -230
  188. data/res/sqlite3/translator.rb +0 -109
  189. data/res/sqlite3/value.rb +0 -57
  190. data/res/sqlite3/version.rb +0 -14
  191. data/rhodes.gemspec +0 -18
  192. data/spec/app_manifest.txt +0 -4
  193. data/spec/configs/contact.rb +0 -3
  194. data/spec/configs/employee.rb +0 -3
  195. data/spec/spec.opts +0 -1
  196. data/spec/spec_helper.rb +0 -49
  197. data/spec/stubs.rb +0 -39
  198. data/spec/syncdbtest.sqlite +0 -0
@@ -1,176 +0,0 @@
1
- require 'sqlite3/constants'
2
- require 'sqlite3/errors'
3
-
4
- module SQLite3
5
-
6
- # The ResultSet object encapsulates the enumerability of a query's output.
7
- # It is a simple cursor over the data that the query returns. It will
8
- # very rarely (if ever) be instantiated directly. Instead, client's should
9
- # obtain a ResultSet instance via Statement#execute.
10
- class ResultSet
11
- include Enumerable
12
-
13
- # The class of which we return an object in case we want an Array as
14
- # result. (ArrayFields is installed.)
15
- class ArrayWithTypes < Array
16
- attr_accessor :types
17
- end
18
-
19
- # The class of which we return an object in case we want an Array as
20
- # result. (ArrayFields is not installed.)
21
- class ArrayWithTypesAndFields < Array
22
- attr_accessor :types
23
- attr_accessor :fields
24
- end
25
-
26
- # The class of which we return an object in case we want a Hash as
27
- # result.
28
- class HashWithTypes < Hash
29
- attr_accessor :types
30
- end
31
-
32
- # Create a new ResultSet attached to the given database, using the
33
- # given sql text.
34
- def initialize( db, stmt )
35
- @db = db
36
- @driver = @db.driver
37
- @stmt = stmt
38
- commence
39
- end
40
-
41
- # A convenience method for compiling the virtual machine and stepping
42
- # to the first row of the result set.
43
- def commence
44
- result = @driver.step( @stmt.handle )
45
- if result == Constants::ErrorCode::ERROR
46
- @driver.reset( @stmt.handle )
47
- end
48
- check result
49
- @first_row = true
50
- end
51
- private :commence
52
-
53
- def check( result )
54
- @eof = ( result == Constants::ErrorCode::DONE )
55
- found = ( result == Constants::ErrorCode::ROW )
56
- Error.check( result, @db ) unless @eof || found
57
- end
58
- private :check
59
-
60
- # Reset the cursor, so that a result set which has reached end-of-file
61
- # can be rewound and reiterated.
62
- def reset( *bind_params )
63
- @stmt.must_be_open!
64
- @stmt.reset!(false)
65
- @driver.reset( @stmt.handle )
66
- @stmt.bind_params( *bind_params )
67
- @eof = false
68
- commence
69
- end
70
-
71
- # Query whether the cursor has reached the end of the result set or not.
72
- def eof?
73
- @eof
74
- end
75
-
76
- # Obtain the next row from the cursor. If there are no more rows to be
77
- # had, this will return +nil+. If type translation is active on the
78
- # corresponding database, the values in the row will be translated
79
- # according to their types.
80
- #
81
- # The returned value will be an array, unless Database#results_as_hash has
82
- # been set to +true+, in which case the returned value will be a hash.
83
- #
84
- # For arrays, the column names are accessible via the +fields+ property,
85
- # and the column types are accessible via the +types+ property.
86
- #
87
- # For hashes, the column names are the keys of the hash, and the column
88
- # types are accessible via the +types+ property.
89
- def next
90
- return nil if @eof
91
-
92
- @stmt.must_be_open!
93
-
94
- unless @first_row
95
- result = @driver.step( @stmt.handle )
96
- check result
97
- end
98
-
99
- @first_row = false
100
-
101
- unless @eof
102
- row = []
103
- @driver.data_count( @stmt.handle ).times do |column|
104
- type = @driver.column_type( @stmt.handle, column )
105
-
106
- if type == Constants::ColumnType::TEXT
107
- row << @driver.column_text( @stmt.handle, column )
108
- elsif type == Constants::ColumnType::NULL
109
- row << nil
110
- elsif type == Constants::ColumnType::BLOB
111
- row << @driver.column_blob( @stmt.handle, column )
112
- else
113
- row << @driver.column_text( @stmt.handle, column )
114
- end
115
- end
116
-
117
- if @db.type_translation
118
- row = @stmt.types.zip( row ).map do |type, value|
119
- @db.translator.translate( type, value )
120
- end
121
- end
122
-
123
- if @db.results_as_hash
124
- new_row = HashWithTypes[ *( @stmt.columns.zip( row ).to_a.flatten ) ]
125
- row.each_with_index { |value,idx| new_row[idx] = value }
126
- row = new_row
127
- else
128
- if row.respond_to?(:fields)
129
- row = ArrayWithTypes.new(row)
130
- else
131
- row = ArrayWithTypesAndFields.new(row)
132
- end
133
- row.fields = @stmt.columns
134
- end
135
-
136
- row.types = @stmt.types
137
-
138
- return row
139
- end
140
-
141
- nil
142
- end
143
-
144
- # Required by the Enumerable mixin. Provides an internal iterator over the
145
- # rows of the result set.
146
- def each
147
- while row=self.next
148
- yield row
149
- end
150
- end
151
-
152
- # Closes the statement that spawned this result set.
153
- # <em>Use with caution!</em> Closing a result set will automatically
154
- # close any other result sets that were spawned from the same statement.
155
- def close
156
- @stmt.close
157
- end
158
-
159
- # Queries whether the underlying statement has been closed or not.
160
- def closed?
161
- @stmt.closed?
162
- end
163
-
164
- # Returns the types of the columns returned by this result set.
165
- def types
166
- @stmt.types
167
- end
168
-
169
- # Returns the names of the columns returned by this result set.
170
- def columns
171
- @stmt.columns
172
- end
173
-
174
- end
175
-
176
- end
File without changes
@@ -1,230 +0,0 @@
1
- require 'sqlite3/errors'
2
- require 'sqlite3/resultset'
3
-
4
- class String
5
- def to_blob
6
- SQLite3::Blob.new( self )
7
- end
8
- end
9
-
10
- module SQLite3
11
-
12
- # A class for differentiating between strings and blobs, when binding them
13
- # into statements.
14
- class Blob < String; end
15
-
16
- # A statement represents a prepared-but-unexecuted SQL query. It will rarely
17
- # (if ever) be instantiated directly by a client, and is most often obtained
18
- # via the Database#prepare method.
19
- class Statement
20
-
21
- # This is any text that followed the first valid SQL statement in the text
22
- # with which the statement was initialized. If there was no trailing text,
23
- # this will be the empty string.
24
- attr_reader :remainder
25
-
26
- # The underlying opaque handle used to access the SQLite @driver.
27
- attr_reader :handle
28
-
29
- # Create a new statement attached to the given Database instance, and which
30
- # encapsulates the given SQL text. If the text contains more than one
31
- # statement (i.e., separated by semicolons), then the #remainder property
32
- # will be set to the trailing text.
33
- def initialize( db, sql, utf16=false )
34
- @db = db
35
- @driver = @db.driver
36
- @closed = false
37
- @results = @columns = nil
38
- result, @handle, @remainder = @driver.prepare( @db.handle, sql )
39
- Error.check( result, @db )
40
- end
41
-
42
- # Closes the statement by finalizing the underlying statement
43
- # handle. The statement must not be used after being closed.
44
- def close
45
- must_be_open!
46
- @closed = true
47
- @driver.finalize( @handle )
48
- end
49
-
50
- # Returns true if the underlying statement has been closed.
51
- def closed?
52
- @closed
53
- end
54
-
55
- # Binds the given variables to the corresponding placeholders in the SQL
56
- # text.
57
- #
58
- # See Database#execute for a description of the valid placeholder
59
- # syntaxes.
60
- #
61
- # Example:
62
- #
63
- # stmt = db.prepare( "select * from table where a=? and b=?" )
64
- # stmt.bind_params( 15, "hello" )
65
- #
66
- # See also #execute, #bind_param, Statement#bind_param, and
67
- # Statement#bind_params.
68
- def bind_params( *bind_vars )
69
- index = 1
70
- bind_vars.flatten.each do |var|
71
- if Hash === var
72
- var.each { |key, val| bind_param key, val }
73
- else
74
- bind_param index, var
75
- index += 1
76
- end
77
- end
78
- end
79
-
80
- # Binds value to the named (or positional) placeholder. If +param+ is a
81
- # Fixnum, it is treated as an index for a positional placeholder.
82
- # Otherwise it is used as the name of the placeholder to bind to.
83
- #
84
- # See also #bind_params.
85
- def bind_param( param, value )
86
- must_be_open!
87
- reset! if active?
88
- if Fixnum === param
89
- case value
90
- when Bignum then
91
- @driver.bind_int64( @handle, param, value )
92
- when Integer then
93
- if value >= (2 ** 31)
94
- @driver.bind_int64( @handle, param, value )
95
- else
96
- @driver.bind_int( @handle, param, value )
97
- end
98
- when Numeric then
99
- @driver.bind_double( @handle, param, value.to_f )
100
- when Blob then
101
- @driver.bind_blob( @handle, param, value )
102
- when nil then
103
- @driver.bind_null( @handle, param )
104
- else
105
- @driver.bind_text( @handle, param, value )
106
- end
107
- else
108
- param = param.to_s
109
- param = ":#{param}" unless param[0] == ?:
110
- index = @driver.bind_parameter_index( @handle, param )
111
- raise Exception, "no such bind parameter '#{param}'" if index == 0
112
- bind_param index, value
113
- end
114
- end
115
-
116
- # Execute the statement. This creates a new ResultSet object for the
117
- # statement's virtual machine. If a block was given, the new ResultSet will
118
- # be yielded to it; otherwise, the ResultSet will be returned.
119
- #
120
- # Any parameters will be bound to the statement using #bind_params.
121
- #
122
- # Example:
123
- #
124
- # stmt = db.prepare( "select * from table" )
125
- # stmt.execute do |result|
126
- # ...
127
- # end
128
- #
129
- # See also #bind_params, #execute!.
130
- def execute( *bind_vars )
131
- must_be_open!
132
- reset! if active?
133
-
134
- bind_params(*bind_vars) unless bind_vars.empty?
135
- @results = ResultSet.new( @db, self )
136
-
137
- if block_given?
138
- yield @results
139
- else
140
- return @results
141
- end
142
- end
143
-
144
- # Execute the statement. If no block was given, this returns an array of
145
- # rows returned by executing the statement. Otherwise, each row will be
146
- # yielded to the block.
147
- #
148
- # Any parameters will be bound to the statement using #bind_params.
149
- #
150
- # Example:
151
- #
152
- # stmt = db.prepare( "select * from table" )
153
- # stmt.execute! do |row|
154
- # ...
155
- # end
156
- #
157
- # See also #bind_params, #execute.
158
- def execute!( *bind_vars )
159
- result = execute( *bind_vars )
160
- rows = [] unless block_given?
161
- while row = result.next
162
- if block_given?
163
- yield row
164
- else
165
- rows << row
166
- end
167
- end
168
- rows
169
- end
170
-
171
- # Resets the statement. This is typically done internally, though it might
172
- # occassionally be necessary to manually reset the statement.
173
- def reset!(clear_result=true)
174
- @driver.reset(@handle)
175
- @results = nil if clear_result
176
- end
177
-
178
- # Returns true if the statement is currently active, meaning it has an
179
- # open result set.
180
- def active?
181
- not @results.nil?
182
- end
183
-
184
- # Return an array of the column names for this statement. Note that this
185
- # may execute the statement in order to obtain the metadata; this makes it
186
- # a (potentially) expensive operation.
187
- def columns
188
- get_metadata unless @columns
189
- return @columns
190
- end
191
-
192
- # Return an array of the data types for each column in this statement. Note
193
- # that this may execute the statement in order to obtain the metadata; this
194
- # makes it a (potentially) expensive operation.
195
- def types
196
- get_metadata unless @types
197
- return @types
198
- end
199
-
200
- # A convenience method for obtaining the metadata about the query. Note
201
- # that this will actually execute the SQL, which means it can be a
202
- # (potentially) expensive operation.
203
- def get_metadata
204
- must_be_open!
205
-
206
- @columns = []
207
- @types = []
208
-
209
- column_count = @driver.column_count( @handle )
210
- column_count.times do |column|
211
- @columns << @driver.column_name( @handle, column )
212
- @types << @driver.column_decltype( @handle, column )
213
- end
214
-
215
- @columns.freeze
216
- @types.freeze
217
- end
218
- private :get_metadata
219
-
220
- # Performs a sanity check to ensure that the statement is not
221
- # closed. If it is, an exception is raised.
222
- def must_be_open! # :nodoc:
223
- if @closed
224
- raise SQLite3::Exception, "cannot use a closed statement"
225
- end
226
- end
227
-
228
- end
229
-
230
- end
@@ -1,109 +0,0 @@
1
- require 'time'
2
- require 'date'
3
-
4
- module SQLite3
5
-
6
- # The Translator class encapsulates the logic and callbacks necessary for
7
- # converting string data to a value of some specified type. Every Database
8
- # instance may have a Translator instance, in order to assist in type
9
- # translation (Database#type_translation).
10
- #
11
- # Further, applications may define their own custom type translation logic
12
- # by registering translator blocks with the corresponding database's
13
- # translator instance (Database#translator).
14
- class Translator
15
-
16
- # Create a new Translator instance. It will be preinitialized with default
17
- # translators for most SQL data types.
18
- def initialize
19
- @translators = Hash.new( proc { |type,value| value } )
20
- @type_name_cache = {}
21
- register_default_translators
22
- end
23
-
24
- # Add a new translator block, which will be invoked to process type
25
- # translations to the given type. The type should be an SQL datatype, and
26
- # may include parentheses (i.e., "VARCHAR(30)"). However, any parenthetical
27
- # information is stripped off and discarded, so type translation decisions
28
- # are made solely on the "base" type name.
29
- #
30
- # The translator block itself should accept two parameters, "type" and
31
- # "value". In this case, the "type" is the full type name (including
32
- # parentheses), so the block itself may include logic for changing how a
33
- # type is translated based on the additional data. The "value" parameter
34
- # is the (string) data to convert.
35
- #
36
- # The block should return the translated value.
37
- def add_translator( type, &block ) # :yields: type, value
38
- @translators[ type_name( type ) ] = block
39
- end
40
-
41
- # Translate the given string value to a value of the given type. In the
42
- # absense of an installed translator block for the given type, the value
43
- # itself is always returned. Further, +nil+ values are never translated,
44
- # and are always passed straight through regardless of the type parameter.
45
- def translate( type, value )
46
- unless value.nil?
47
- @translators[ type_name( type ) ].call( type, value )
48
- end
49
- end
50
-
51
- # A convenience method for working with type names. This returns the "base"
52
- # type name, without any parenthetical data.
53
- def type_name( type )
54
- @type_name_cache[type] ||= begin
55
- type = "" if type.nil?
56
- type = $1 if type =~ /^(.*?)\(/
57
- type.upcase
58
- end
59
- end
60
- private :type_name
61
-
62
- # Register the default translators for the current Translator instance.
63
- # This includes translators for most major SQL data types.
64
- def register_default_translators
65
- [ "time",
66
- "timestamp" ].each { |type| add_translator( type ) { |t, v| Time.parse( v ) } }
67
-
68
- add_translator( "date" ) { |t,v| Date.parse(v) }
69
- add_translator( "datetime" ) { |t,v| DateTime.parse(v) }
70
-
71
- [ "decimal",
72
- "float",
73
- "numeric",
74
- "double",
75
- "real",
76
- "dec",
77
- "fixed" ].each { |type| add_translator( type ) { |t,v| v.to_f } }
78
-
79
- [ "integer",
80
- "smallint",
81
- "mediumint",
82
- "int",
83
- "bigint" ].each { |type| add_translator( type ) { |t,v| v.to_i } }
84
-
85
- [ "bit",
86
- "bool",
87
- "boolean" ].each do |type|
88
- add_translator( type ) do |t,v|
89
- !( v.strip.gsub(/00+/,"0") == "0" ||
90
- v.downcase == "false" ||
91
- v.downcase == "f" ||
92
- v.downcase == "no" ||
93
- v.downcase == "n" )
94
- end
95
- end
96
-
97
- add_translator( "tinyint" ) do |type, value|
98
- if type =~ /\(\s*1\s*\)/
99
- value.to_i == 1
100
- else
101
- value.to_i
102
- end
103
- end
104
- end
105
- private :register_default_translators
106
-
107
- end
108
-
109
- end