sequel 3.21.0 → 3.41.0
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.
- data/CHANGELOG +1131 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +106 -65
- data/Rakefile +59 -27
- data/bin/sequel +50 -26
- data/doc/active_record.rdoc +68 -52
- data/doc/advanced_associations.rdoc +201 -75
- data/doc/association_basics.rdoc +327 -79
- data/doc/bin_sequel.rdoc +144 -0
- data/doc/cheat_sheet.rdoc +21 -21
- data/doc/core_extensions.rdoc +374 -0
- data/doc/dataset_basics.rdoc +10 -10
- data/doc/dataset_filtering.rdoc +54 -42
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +89 -557
- data/doc/model_hooks.rdoc +80 -29
- data/doc/object_model.rdoc +576 -0
- data/doc/opening_databases.rdoc +121 -53
- data/doc/prepared_statements.rdoc +41 -15
- data/doc/querying.rdoc +137 -56
- data/doc/reflection.rdoc +36 -10
- data/doc/release_notes/3.22.0.txt +39 -0
- data/doc/release_notes/3.23.0.txt +172 -0
- data/doc/release_notes/3.24.0.txt +420 -0
- data/doc/release_notes/3.25.0.txt +88 -0
- data/doc/release_notes/3.26.0.txt +88 -0
- data/doc/release_notes/3.27.0.txt +82 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/release_notes/3.29.0.txt +459 -0
- data/doc/release_notes/3.30.0.txt +135 -0
- data/doc/release_notes/3.31.0.txt +146 -0
- data/doc/release_notes/3.32.0.txt +202 -0
- data/doc/release_notes/3.33.0.txt +157 -0
- data/doc/release_notes/3.34.0.txt +671 -0
- data/doc/release_notes/3.35.0.txt +144 -0
- data/doc/release_notes/3.36.0.txt +245 -0
- data/doc/release_notes/3.37.0.txt +338 -0
- data/doc/release_notes/3.38.0.txt +234 -0
- data/doc/release_notes/3.39.0.txt +237 -0
- data/doc/release_notes/3.40.0.txt +73 -0
- data/doc/release_notes/3.41.0.txt +155 -0
- data/doc/schema_modification.rdoc +585 -0
- data/doc/sharding.rdoc +99 -8
- data/doc/sql.rdoc +154 -112
- data/doc/testing.rdoc +169 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/validations.rdoc +1 -1
- data/doc/virtual_rows.rdoc +78 -43
- data/lib/sequel/adapters/ado/access.rb +334 -0
- data/lib/sequel/adapters/ado/mssql.rb +18 -12
- data/lib/sequel/adapters/ado.rb +69 -21
- data/lib/sequel/adapters/amalgalite.rb +17 -14
- data/lib/sequel/adapters/cubrid.rb +143 -0
- data/lib/sequel/adapters/db2.rb +178 -85
- data/lib/sequel/adapters/dbi.rb +19 -21
- data/lib/sequel/adapters/do/mysql.rb +17 -11
- data/lib/sequel/adapters/do/postgres.rb +2 -61
- data/lib/sequel/adapters/do/sqlite.rb +0 -10
- data/lib/sequel/adapters/do.rb +20 -39
- data/lib/sequel/adapters/firebird.rb +33 -210
- data/lib/sequel/adapters/ibmdb.rb +452 -0
- data/lib/sequel/adapters/informix.rb +6 -29
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/cubrid.rb +52 -0
- data/lib/sequel/adapters/jdbc/db2.rb +78 -0
- data/lib/sequel/adapters/jdbc/derby.rb +325 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
- data/lib/sequel/adapters/jdbc/h2.rb +68 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +189 -0
- data/lib/sequel/adapters/jdbc/informix.rb +21 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +40 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
- data/lib/sequel/adapters/jdbc/mysql.rb +16 -28
- data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
- data/lib/sequel/adapters/jdbc/postgresql.rb +77 -52
- data/lib/sequel/adapters/jdbc/progress.rb +21 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
- data/lib/sequel/adapters/jdbc/sqlserver.rb +72 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +308 -114
- data/lib/sequel/adapters/mock.rb +372 -0
- data/lib/sequel/adapters/mysql.rb +130 -230
- data/lib/sequel/adapters/mysql2.rb +64 -63
- data/lib/sequel/adapters/odbc/mssql.rb +17 -9
- data/lib/sequel/adapters/odbc.rb +29 -10
- data/lib/sequel/adapters/openbase.rb +7 -11
- data/lib/sequel/adapters/oracle.rb +364 -57
- data/lib/sequel/adapters/postgres.rb +379 -145
- data/lib/sequel/adapters/shared/access.rb +236 -11
- data/lib/sequel/adapters/shared/cubrid.rb +216 -0
- data/lib/sequel/adapters/shared/db2.rb +353 -0
- data/lib/sequel/adapters/shared/firebird.rb +231 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +412 -116
- data/lib/sequel/adapters/shared/mysql.rb +396 -89
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +166 -0
- data/lib/sequel/adapters/shared/oracle.rb +262 -45
- data/lib/sequel/adapters/shared/postgres.rb +688 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +317 -96
- data/lib/sequel/adapters/sqlite.rb +109 -46
- data/lib/sequel/adapters/swift/mysql.rb +10 -12
- data/lib/sequel/adapters/swift/postgres.rb +13 -79
- data/lib/sequel/adapters/swift/sqlite.rb +9 -6
- data/lib/sequel/adapters/swift.rb +31 -27
- data/lib/sequel/adapters/tinytds.rb +177 -25
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +77 -0
- data/lib/sequel/adapters/utils/pg_types.rb +81 -0
- data/lib/sequel/adapters/utils/split_alter_table.rb +36 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
- data/lib/sequel/ast_transformer.rb +194 -0
- data/lib/sequel/connection_pool/sharded_single.rb +23 -13
- data/lib/sequel/connection_pool/sharded_threaded.rb +64 -13
- data/lib/sequel/connection_pool/single.rb +11 -3
- data/lib/sequel/connection_pool/threaded.rb +69 -20
- data/lib/sequel/connection_pool.rb +20 -18
- data/lib/sequel/core.rb +143 -11
- data/lib/sequel/database/connecting.rb +66 -29
- data/lib/sequel/database/dataset.rb +4 -4
- data/lib/sequel/database/dataset_defaults.rb +63 -2
- data/lib/sequel/database/logging.rb +7 -2
- data/lib/sequel/database/misc.rb +192 -51
- data/lib/sequel/database/query.rb +299 -114
- data/lib/sequel/database/schema_generator.rb +103 -36
- data/lib/sequel/database/schema_methods.rb +310 -69
- data/lib/sequel/dataset/actions.rb +344 -90
- data/lib/sequel/dataset/features.rb +101 -8
- data/lib/sequel/dataset/graph.rb +42 -15
- data/lib/sequel/dataset/misc.rb +52 -25
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +322 -68
- data/lib/sequel/dataset/sql.rb +716 -293
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +83 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +109 -0
- data/lib/sequel/extensions/blank.rb +4 -0
- data/lib/sequel/extensions/columns_introspection.rb +72 -0
- data/lib/sequel/extensions/connection_validator.rb +109 -0
- data/lib/sequel/extensions/constraint_validations.rb +451 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +30 -46
- data/lib/sequel/extensions/eval_inspect.rb +173 -0
- data/lib/sequel/extensions/inflector.rb +4 -0
- data/lib/sequel/extensions/looser_typecasting.rb +5 -4
- data/lib/sequel/extensions/migration.rb +100 -11
- data/lib/sequel/extensions/named_timezones.rb +9 -0
- data/lib/sequel/extensions/null_dataset.rb +94 -0
- data/lib/sequel/extensions/pagination.rb +4 -0
- data/lib/sequel/extensions/pg_array.rb +539 -0
- data/lib/sequel/extensions/pg_array_ops.rb +263 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +175 -0
- data/lib/sequel/extensions/pg_hstore.rb +334 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +293 -0
- data/lib/sequel/extensions/pg_inet.rb +113 -0
- data/lib/sequel/extensions/pg_interval.rb +191 -0
- data/lib/sequel/extensions/pg_json.rb +212 -0
- data/lib/sequel/extensions/pg_range.rb +513 -0
- data/lib/sequel/extensions/pg_range_ops.rb +150 -0
- data/lib/sequel/extensions/pg_row.rb +576 -0
- data/lib/sequel/extensions/pg_row_ops.rb +182 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +317 -0
- data/lib/sequel/extensions/pretty_table.rb +17 -72
- data/lib/sequel/extensions/query.rb +8 -4
- data/lib/sequel/extensions/query_literals.rb +79 -0
- data/lib/sequel/extensions/schema_caching.rb +76 -0
- data/lib/sequel/extensions/schema_dumper.rb +282 -76
- data/lib/sequel/extensions/select_remove.rb +39 -0
- data/lib/sequel/extensions/server_block.rb +140 -0
- data/lib/sequel/extensions/split_array_nil.rb +65 -0
- data/lib/sequel/extensions/sql_expr.rb +8 -110
- data/lib/sequel/extensions/string_date_time.rb +4 -0
- data/lib/sequel/extensions/thread_local_timezones.rb +10 -4
- data/lib/sequel/extensions/to_dot.rb +99 -83
- data/lib/sequel/model/associations.rb +1263 -409
- data/lib/sequel/model/base.rb +624 -171
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +24 -2
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model.rb +30 -11
- data/lib/sequel/no_core_ext.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +13 -1
- data/lib/sequel/plugins/association_pks.rb +137 -16
- data/lib/sequel/plugins/caching.rb +25 -18
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/composition.rb +44 -12
- data/lib/sequel/plugins/constraint_validations.rb +198 -0
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +72 -0
- data/lib/sequel/plugins/dirty.rb +214 -0
- data/lib/sequel/plugins/eager_each.rb +59 -0
- data/lib/sequel/plugins/force_encoding.rb +6 -6
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/plugins/identity_map.rb +134 -15
- data/lib/sequel/plugins/instance_filters.rb +10 -0
- data/lib/sequel/plugins/instance_hooks.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +77 -6
- data/lib/sequel/plugins/list.rb +13 -2
- data/lib/sequel/plugins/many_through_many.rb +103 -51
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +150 -66
- data/lib/sequel/plugins/optimistic_locking.rb +8 -0
- data/lib/sequel/plugins/pg_row.rb +121 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +65 -0
- data/lib/sequel/plugins/prepared_statements.rb +168 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
- data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
- data/lib/sequel/plugins/rcte_tree.rb +31 -17
- data/lib/sequel/plugins/schema.rb +8 -3
- data/lib/sequel/plugins/serialization.rb +98 -49
- data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
- data/lib/sequel/plugins/sharding.rb +21 -54
- data/lib/sequel/plugins/single_table_inheritance.rb +57 -12
- data/lib/sequel/plugins/static_cache.rb +99 -0
- data/lib/sequel/plugins/subclasses.rb +29 -3
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/touch.rb +18 -6
- data/lib/sequel/plugins/tree.rb +3 -3
- data/lib/sequel/plugins/typecast_on_load.rb +9 -12
- data/lib/sequel/plugins/update_primary_key.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +57 -4
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +721 -141
- data/lib/sequel/timezones.rb +67 -40
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/firebird_spec.rb +53 -39
- data/spec/adapters/mssql_spec.rb +261 -66
- data/spec/adapters/mysql_spec.rb +597 -352
- data/spec/adapters/oracle_spec.rb +92 -117
- data/spec/adapters/postgres_spec.rb +2103 -341
- data/spec/adapters/spec_helper.rb +16 -6
- data/spec/adapters/sqlite_spec.rb +237 -76
- data/spec/core/connection_pool_spec.rb +270 -141
- data/spec/core/database_spec.rb +980 -524
- data/spec/core/dataset_spec.rb +1658 -1243
- data/spec/core/expression_filters_spec.rb +741 -334
- data/spec/core/mock_adapter_spec.rb +453 -0
- data/spec/core/object_graph_spec.rb +88 -129
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +556 -53
- data/spec/core/spec_helper.rb +7 -48
- data/spec/core_extensions_spec.rb +626 -0
- data/spec/extensions/active_model_spec.rb +13 -0
- data/spec/extensions/arbitrary_servers_spec.rb +110 -0
- data/spec/extensions/association_autoreloading_spec.rb +18 -10
- data/spec/extensions/association_dependencies_spec.rb +15 -25
- data/spec/extensions/association_pks_spec.rb +227 -33
- data/spec/extensions/association_proxies_spec.rb +4 -4
- data/spec/extensions/boolean_readers_spec.rb +25 -25
- data/spec/extensions/caching_spec.rb +47 -51
- data/spec/extensions/class_table_inheritance_spec.rb +31 -83
- data/spec/extensions/columns_introspection_spec.rb +91 -0
- data/spec/extensions/composition_spec.rb +18 -13
- data/spec/extensions/connection_validator_spec.rb +118 -0
- data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
- data/spec/extensions/constraint_validations_spec.rb +316 -0
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +88 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/eval_inspect_spec.rb +67 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +97 -128
- data/spec/extensions/identity_map_spec.rb +142 -24
- data/spec/extensions/inflector_spec.rb +0 -4
- data/spec/extensions/instance_filters_spec.rb +11 -21
- data/spec/extensions/instance_hooks_spec.rb +72 -0
- data/spec/extensions/json_serializer_spec.rb +49 -12
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +49 -40
- data/spec/extensions/looser_typecasting_spec.rb +7 -7
- data/spec/extensions/many_through_many_spec.rb +368 -254
- data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
- data/spec/extensions/migration_spec.rb +140 -35
- data/spec/extensions/named_timezones_spec.rb +29 -11
- data/spec/extensions/nested_attributes_spec.rb +268 -89
- data/spec/extensions/null_dataset_spec.rb +85 -0
- data/spec/extensions/optimistic_locking_spec.rb +24 -21
- data/spec/extensions/pg_array_ops_spec.rb +112 -0
- data/spec/extensions/pg_array_spec.rb +324 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +140 -0
- data/spec/extensions/pg_hstore_spec.rb +200 -0
- data/spec/extensions/pg_inet_spec.rb +47 -0
- data/spec/extensions/pg_interval_spec.rb +72 -0
- data/spec/extensions/pg_json_spec.rb +99 -0
- data/spec/extensions/pg_range_ops_spec.rb +56 -0
- data/spec/extensions/pg_range_spec.rb +395 -0
- data/spec/extensions/pg_row_ops_spec.rb +58 -0
- data/spec/extensions/pg_row_plugin_spec.rb +49 -0
- data/spec/extensions/pg_row_spec.rb +340 -0
- data/spec/extensions/pg_statement_cache_spec.rb +208 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +58 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
- data/spec/extensions/prepared_statements_spec.rb +87 -0
- data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
- data/spec/extensions/pretty_table_spec.rb +7 -6
- data/spec/extensions/query_literals_spec.rb +167 -0
- data/spec/extensions/query_spec.rb +9 -3
- data/spec/extensions/rcte_tree_spec.rb +50 -43
- data/spec/extensions/schema_caching_spec.rb +41 -0
- data/spec/extensions/schema_dumper_spec.rb +434 -49
- data/spec/extensions/schema_spec.rb +30 -49
- data/spec/extensions/select_remove_spec.rb +38 -0
- data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
- data/spec/extensions/serialization_spec.rb +86 -48
- data/spec/extensions/server_block_spec.rb +90 -0
- data/spec/extensions/sharding_spec.rb +69 -143
- data/spec/extensions/single_table_inheritance_spec.rb +65 -29
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +34 -67
- data/spec/extensions/split_array_nil_spec.rb +24 -0
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -0
- data/spec/extensions/subclasses_spec.rb +14 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
- data/spec/extensions/thread_local_timezones_spec.rb +22 -2
- data/spec/extensions/timestamps_spec.rb +6 -6
- data/spec/extensions/to_dot_spec.rb +8 -11
- data/spec/extensions/touch_spec.rb +53 -14
- data/spec/extensions/tree_spec.rb +11 -26
- data/spec/extensions/typecast_on_load_spec.rb +9 -6
- data/spec/extensions/update_primary_key_spec.rb +30 -24
- data/spec/extensions/validation_class_methods_spec.rb +77 -68
- data/spec/extensions/validation_helpers_spec.rb +48 -37
- data/spec/extensions/xml_serializer_spec.rb +29 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
- data/spec/integration/associations_test.rb +659 -21
- data/spec/integration/database_test.rb +25 -5
- data/spec/integration/dataset_test.rb +729 -141
- data/spec/integration/eager_loader_test.rb +38 -54
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +871 -160
- data/spec/integration/prepared_statement_test.rb +272 -128
- data/spec/integration/schema_test.rb +377 -57
- data/spec/integration/spec_helper.rb +49 -32
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +40 -8
- data/spec/model/association_reflection_spec.rb +207 -8
- data/spec/model/associations_spec.rb +1206 -693
- data/spec/model/base_spec.rb +334 -100
- data/spec/model/dataset_methods_spec.rb +45 -27
- data/spec/model/eager_loading_spec.rb +828 -692
- data/spec/model/hooks_spec.rb +355 -67
- data/spec/model/model_spec.rb +251 -179
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +506 -232
- data/spec/model/spec_helper.rb +16 -77
- data/spec/model/validations_spec.rb +38 -2
- data/spec/rcov.opts +2 -0
- metadata +223 -81
- data/spec/core/core_sql_spec.rb +0 -451
|
@@ -5,97 +5,67 @@ rescue LoadError
|
|
|
5
5
|
end
|
|
6
6
|
raise(LoadError, "require 'mysql' did not define Mysql::CLIENT_MULTI_RESULTS!\n You are probably using the pure ruby mysql.rb driver,\n which Sequel does not support. You need to install\n the C based adapter, and make sure that the mysql.so\n file is loaded instead of the mysql.rb file.\n") unless defined?(Mysql::CLIENT_MULTI_RESULTS)
|
|
7
7
|
|
|
8
|
-
Sequel.require %w'shared/
|
|
8
|
+
Sequel.require %w'shared/mysql_prepared_statements', 'adapters'
|
|
9
9
|
|
|
10
10
|
module Sequel
|
|
11
11
|
# Module for holding all MySQL-related classes and modules for Sequel.
|
|
12
12
|
module MySQL
|
|
13
13
|
TYPE_TRANSLATOR = tt = Class.new do
|
|
14
14
|
def boolean(s) s.to_i != 0 end
|
|
15
|
-
def blob(s) ::Sequel::SQL::Blob.new(s) end
|
|
16
15
|
def integer(s) s.to_i end
|
|
17
16
|
def float(s) s.to_f end
|
|
18
|
-
def decimal(s) ::BigDecimal.new(s) end
|
|
19
|
-
def date(s) ::Sequel.string_to_date(s) end
|
|
20
|
-
def time(s) ::Sequel.string_to_time(s) end
|
|
21
|
-
def timestamp(s) ::Sequel.database_to_application_timestamp(s) end
|
|
22
|
-
def date_conv(s) ::Sequel::MySQL.convert_date_time(:string_to_date, s) end
|
|
23
|
-
def time_conv(s) ::Sequel::MySQL.convert_date_time(:string_to_time, s) end
|
|
24
|
-
def timestamp_conv(s) ::Sequel::MySQL.convert_date_time(:database_to_application_timestamp, s) end
|
|
25
17
|
end.new
|
|
26
18
|
|
|
27
19
|
# Hash with integer keys and callable values for converting MySQL types.
|
|
28
20
|
MYSQL_TYPES = {}
|
|
29
21
|
{
|
|
30
|
-
[0, 246]
|
|
31
|
-
[2, 3, 8, 9, 13, 247, 248]
|
|
32
|
-
[4, 5]
|
|
33
|
-
[249, 250, 251, 252]
|
|
22
|
+
[0, 246] => ::BigDecimal.method(:new),
|
|
23
|
+
[2, 3, 8, 9, 13, 247, 248] => tt.method(:integer),
|
|
24
|
+
[4, 5] => tt.method(:float),
|
|
25
|
+
[249, 250, 251, 252] => ::Sequel::SQL::Blob.method(:new)
|
|
34
26
|
}.each do |k,v|
|
|
35
27
|
k.each{|n| MYSQL_TYPES[n] = v}
|
|
36
28
|
end
|
|
37
29
|
|
|
38
|
-
# Modify the type translator used for the tinyint type based
|
|
39
|
-
# on the value given.
|
|
40
|
-
def self.convert_tinyint_to_bool=(v)
|
|
41
|
-
MYSQL_TYPES[1] = TYPE_TRANSLATOR.method(v ? :boolean : :integer)
|
|
42
|
-
@convert_tinyint_to_bool = v
|
|
43
|
-
end
|
|
44
|
-
self.convert_tinyint_to_bool = convert_tinyint_to_bool
|
|
45
|
-
|
|
46
30
|
class << self
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# Modify the type translators for the date, time, and timestamp types
|
|
55
|
-
# depending on the value given.
|
|
56
|
-
def self.convert_invalid_date_time=(v)
|
|
57
|
-
MYSQL_TYPES[11] = TYPE_TRANSLATOR.method(v == false ? :time : :time_conv)
|
|
58
|
-
m = TYPE_TRANSLATOR.method(v == false ? :date : :date_conv)
|
|
59
|
-
[10, 14].each{|i| MYSQL_TYPES[i] = m}
|
|
60
|
-
m = TYPE_TRANSLATOR.method(v == false ? :timestamp : :timestamp_conv)
|
|
61
|
-
[7, 12].each{|i| MYSQL_TYPES[i] = m}
|
|
62
|
-
@convert_invalid_date_time = v
|
|
31
|
+
# Whether to convert invalid date time values by default.
|
|
32
|
+
#
|
|
33
|
+
# Only applies to Sequel::Database instances created after this
|
|
34
|
+
# has been set.
|
|
35
|
+
attr_accessor :convert_invalid_date_time
|
|
63
36
|
end
|
|
64
37
|
self.convert_invalid_date_time = false
|
|
65
38
|
|
|
66
|
-
# If convert_invalid_date_time is nil, :nil, or :string and
|
|
67
|
-
# the conversion raises an InvalidValue exception, return v
|
|
68
|
-
# if :string and nil otherwise.
|
|
69
|
-
def self.convert_date_time(meth, v)
|
|
70
|
-
begin
|
|
71
|
-
Sequel.send(meth, v)
|
|
72
|
-
rescue InvalidValue
|
|
73
|
-
case @convert_invalid_date_time
|
|
74
|
-
when nil, :nil
|
|
75
|
-
nil
|
|
76
|
-
when :string
|
|
77
|
-
v
|
|
78
|
-
else
|
|
79
|
-
raise
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
39
|
# Database class for MySQL databases used with Sequel.
|
|
85
40
|
class Database < Sequel::Database
|
|
86
41
|
include Sequel::MySQL::DatabaseMethods
|
|
42
|
+
include Sequel::MySQL::PreparedStatements::DatabaseMethods
|
|
87
43
|
|
|
88
|
-
#
|
|
89
|
-
|
|
44
|
+
# Regular expression used for getting accurate number of rows
|
|
45
|
+
# matched by an update statement.
|
|
46
|
+
AFFECTED_ROWS_RE = /Rows matched:\s+(\d+)\s+Changed:\s+\d+\s+Warnings:\s+\d+/.freeze
|
|
90
47
|
|
|
91
48
|
set_adapter_scheme :mysql
|
|
49
|
+
|
|
50
|
+
# Hash of conversion procs for the current database
|
|
51
|
+
attr_reader :conversion_procs
|
|
52
|
+
#
|
|
53
|
+
# Whether to convert tinyint columns to bool for the current database
|
|
54
|
+
attr_reader :convert_tinyint_to_bool
|
|
55
|
+
|
|
56
|
+
# By default, Sequel raises an exception if in invalid date or time is used.
|
|
57
|
+
# However, if this is set to nil or :nil, the adapter treats dates
|
|
58
|
+
# like 0000-00-00 and times like 838:00:00 as nil values. If set to :string,
|
|
59
|
+
# it returns the strings as is.
|
|
60
|
+
attr_reader :convert_invalid_date_time
|
|
92
61
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
62
|
+
def initialize(opts={})
|
|
63
|
+
super
|
|
64
|
+
@conversion_procs = MYSQL_TYPES.dup
|
|
65
|
+
self.convert_tinyint_to_bool = Sequel::MySQL.convert_tinyint_to_bool
|
|
66
|
+
self.convert_invalid_date_time = Sequel::MySQL.convert_invalid_date_time
|
|
97
67
|
end
|
|
98
|
-
|
|
68
|
+
|
|
99
69
|
# Connect to the database. In addition to the usual database options,
|
|
100
70
|
# the following options have effect:
|
|
101
71
|
#
|
|
@@ -139,52 +109,64 @@ module Sequel
|
|
|
139
109
|
opts[:user],
|
|
140
110
|
opts[:password],
|
|
141
111
|
opts[:database],
|
|
142
|
-
opts[:port],
|
|
112
|
+
(opts[:port].to_i if opts[:port]),
|
|
143
113
|
opts[:socket],
|
|
144
114
|
Mysql::CLIENT_MULTI_RESULTS +
|
|
145
115
|
Mysql::CLIENT_MULTI_STATEMENTS +
|
|
146
116
|
(opts[:compress] == false ? 0 : Mysql::CLIENT_COMPRESS)
|
|
147
117
|
)
|
|
148
|
-
sqls =
|
|
118
|
+
sqls = mysql_connection_setting_sqls
|
|
119
|
+
|
|
149
120
|
# Set encoding a slightly different way after connecting,
|
|
150
121
|
# in case the READ_DEFAULT_GROUP overrode the provided encoding.
|
|
151
122
|
# Doesn't work across implicit reconnects, but Sequel doesn't turn on
|
|
152
123
|
# that feature.
|
|
153
|
-
sqls
|
|
154
|
-
|
|
155
|
-
# Increase timeout so mysql server doesn't disconnect us
|
|
156
|
-
# Value used by default is maximum allowed value on Windows.
|
|
157
|
-
sqls << "SET @@wait_timeout = #{opts[:timeout] || 2147483}"
|
|
158
|
-
|
|
159
|
-
# By default, MySQL 'where id is null' selects the last inserted id
|
|
160
|
-
sqls << "SET SQL_AUTO_IS_NULL=0" unless opts[:auto_is_null]
|
|
124
|
+
sqls.unshift("SET NAMES #{literal(encoding.to_s)}") if encoding
|
|
161
125
|
|
|
162
126
|
sqls.each{|sql| log_yield(sql){conn.query(sql)}}
|
|
163
127
|
|
|
164
|
-
|
|
165
|
-
attr_accessor :prepared_statements
|
|
166
|
-
end
|
|
167
|
-
conn.prepared_statements = {}
|
|
128
|
+
add_prepared_statements_cache(conn)
|
|
168
129
|
conn
|
|
169
130
|
end
|
|
170
131
|
|
|
171
|
-
#
|
|
172
|
-
def
|
|
173
|
-
|
|
132
|
+
# Closes given database connection.
|
|
133
|
+
def disconnect_connection(c)
|
|
134
|
+
c.close
|
|
135
|
+
rescue Mysql::Error
|
|
136
|
+
nil
|
|
174
137
|
end
|
|
175
138
|
|
|
176
|
-
#
|
|
177
|
-
#
|
|
178
|
-
def
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
139
|
+
# Modify the type translators for the date, time, and timestamp types
|
|
140
|
+
# depending on the value given.
|
|
141
|
+
def convert_invalid_date_time=(v)
|
|
142
|
+
m0 = ::Sequel.method(:string_to_time)
|
|
143
|
+
@conversion_procs[11] = (v != false) ? lambda{|v| convert_date_time(v, &m0)} : m0
|
|
144
|
+
m1 = ::Sequel.method(:string_to_date)
|
|
145
|
+
m = (v != false) ? lambda{|v| convert_date_time(v, &m1)} : m1
|
|
146
|
+
[10, 14].each{|i| @conversion_procs[i] = m}
|
|
147
|
+
m2 = method(:to_application_timestamp)
|
|
148
|
+
m = (v != false) ? lambda{|v| convert_date_time(v, &m2)} : m2
|
|
149
|
+
[7, 12].each{|i| @conversion_procs[i] = m}
|
|
150
|
+
@convert_invalid_date_time = v
|
|
186
151
|
end
|
|
187
|
-
|
|
152
|
+
|
|
153
|
+
# Modify the type translator used for the tinyint type based
|
|
154
|
+
# on the value given.
|
|
155
|
+
def convert_tinyint_to_bool=(v)
|
|
156
|
+
@conversion_procs[1] = TYPE_TRANSLATOR.method(v ? :boolean : :integer)
|
|
157
|
+
@convert_tinyint_to_bool = v
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Return the number of matched rows when executing a delete/update statement.
|
|
161
|
+
def execute_dui(sql, opts={})
|
|
162
|
+
execute(sql, opts){|c| return affected_rows(c)}
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Return the last inserted id when executing an insert statement.
|
|
166
|
+
def execute_insert(sql, opts={})
|
|
167
|
+
execute(sql, opts){|c| return c.insert_id}
|
|
168
|
+
end
|
|
169
|
+
|
|
188
170
|
# Return the version of the MySQL server two which we are connecting.
|
|
189
171
|
def server_version(server=nil)
|
|
190
172
|
@server_version ||= (synchronize(server){|conn| conn.server_version if conn.respond_to?(:server_version)} || super)
|
|
@@ -197,7 +179,7 @@ module Sequel
|
|
|
197
179
|
# yield the connection if a block is given.
|
|
198
180
|
def _execute(conn, sql, opts)
|
|
199
181
|
begin
|
|
200
|
-
r = log_yield(sql){conn.query(sql)}
|
|
182
|
+
r = log_yield((log_sql = opts[:log_sql]) ? sql + log_sql : sql){conn.query(sql)}
|
|
201
183
|
if opts[:type] == :select
|
|
202
184
|
yield r if r
|
|
203
185
|
elsif block_given?
|
|
@@ -220,7 +202,7 @@ module Sequel
|
|
|
220
202
|
end
|
|
221
203
|
end
|
|
222
204
|
rescue Mysql::Error => e
|
|
223
|
-
raise_error(e
|
|
205
|
+
raise_error(e)
|
|
224
206
|
ensure
|
|
225
207
|
r.free if r
|
|
226
208
|
# Use up all results to avoid a commands out of sync message.
|
|
@@ -239,15 +221,51 @@ module Sequel
|
|
|
239
221
|
end
|
|
240
222
|
end
|
|
241
223
|
|
|
224
|
+
# Try to get an accurate number of rows matched using the query
|
|
225
|
+
# info. Fall back to affected_rows if there was no match, but
|
|
226
|
+
# that may be inaccurate.
|
|
227
|
+
def affected_rows(conn)
|
|
228
|
+
s = conn.info
|
|
229
|
+
if s && s =~ AFFECTED_ROWS_RE
|
|
230
|
+
$1.to_i
|
|
231
|
+
else
|
|
232
|
+
conn.affected_rows
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
242
236
|
# MySQL connections use the query method to execute SQL without a result
|
|
243
237
|
def connection_execute_method
|
|
244
238
|
:query
|
|
245
239
|
end
|
|
246
240
|
|
|
241
|
+
# If convert_invalid_date_time is nil, :nil, or :string and
|
|
242
|
+
# the conversion raises an InvalidValue exception, return v
|
|
243
|
+
# if :string and nil otherwise.
|
|
244
|
+
def convert_date_time(v)
|
|
245
|
+
begin
|
|
246
|
+
yield v
|
|
247
|
+
rescue InvalidValue
|
|
248
|
+
case @convert_invalid_date_time
|
|
249
|
+
when nil, :nil
|
|
250
|
+
nil
|
|
251
|
+
when :string
|
|
252
|
+
v
|
|
253
|
+
else
|
|
254
|
+
raise
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
247
259
|
# The MySQL adapter main error class is Mysql::Error
|
|
248
260
|
def database_error_classes
|
|
249
261
|
[Mysql::Error]
|
|
250
262
|
end
|
|
263
|
+
|
|
264
|
+
# Raise a disconnect error if the exception message matches the list
|
|
265
|
+
# of recognized exceptions.
|
|
266
|
+
def disconnect_error?(e, opts)
|
|
267
|
+
super || (e.is_a?(::Mysql::Error) && MYSQL_DATABASE_DISCONNECT_ERRORS.match(e.message))
|
|
268
|
+
end
|
|
251
269
|
|
|
252
270
|
# The database name when using the native adapter is always stored in
|
|
253
271
|
# the :database option.
|
|
@@ -255,121 +273,31 @@ module Sequel
|
|
|
255
273
|
@opts[:database]
|
|
256
274
|
end
|
|
257
275
|
|
|
258
|
-
# Closes given database connection.
|
|
259
|
-
def disconnect_connection(c)
|
|
260
|
-
c.close
|
|
261
|
-
rescue Mysql::Error
|
|
262
|
-
nil
|
|
263
|
-
end
|
|
264
|
-
|
|
265
|
-
# Executes a prepared statement on an available connection. If the
|
|
266
|
-
# prepared statement already exists for the connection and has the same
|
|
267
|
-
# SQL, reuse it, otherwise, prepare the new statement. Because of the
|
|
268
|
-
# usual MySQL stupidity, we are forced to name arguments via separate
|
|
269
|
-
# SET queries. Use @sequel_arg_N (for N starting at 1) for these
|
|
270
|
-
# arguments.
|
|
271
|
-
def execute_prepared_statement(ps_name, opts, &block)
|
|
272
|
-
args = opts[:arguments]
|
|
273
|
-
ps = prepared_statements[ps_name]
|
|
274
|
-
sql = ps.prepared_sql
|
|
275
|
-
synchronize(opts[:server]) do |conn|
|
|
276
|
-
unless conn.prepared_statements[ps_name] == sql
|
|
277
|
-
conn.prepared_statements[ps_name] = sql
|
|
278
|
-
_execute(conn, "PREPARE #{ps_name} FROM '#{::Mysql.quote(sql)}'", opts)
|
|
279
|
-
end
|
|
280
|
-
i = 0
|
|
281
|
-
_execute(conn, "SET " + args.map {|arg| "@sequel_arg_#{i+=1} = #{literal(arg)}"}.join(", "), opts) unless args.empty?
|
|
282
|
-
_execute(conn, "EXECUTE #{ps_name}#{" USING #{(1..i).map{|j| "@sequel_arg_#{j}"}.join(', ')}" unless i == 0}", opts, &block)
|
|
283
|
-
end
|
|
284
|
-
end
|
|
285
|
-
|
|
286
276
|
# Convert tinyint(1) type to boolean if convert_tinyint_to_bool is true
|
|
287
277
|
def schema_column_type(db_type)
|
|
288
|
-
|
|
278
|
+
convert_tinyint_to_bool && db_type == 'tinyint(1)' ? :boolean : super
|
|
289
279
|
end
|
|
290
280
|
end
|
|
291
281
|
|
|
292
282
|
# Dataset class for MySQL datasets accessed via the native driver.
|
|
293
283
|
class Dataset < Sequel::Dataset
|
|
294
284
|
include Sequel::MySQL::DatasetMethods
|
|
295
|
-
include
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
module CallableStatementMethods
|
|
300
|
-
# Extend given dataset with this module so subselects inside subselects in
|
|
301
|
-
# prepared statements work.
|
|
302
|
-
def subselect_sql(ds)
|
|
303
|
-
ps = ds.to_prepared_statement(:select)
|
|
304
|
-
ps.extend(CallableStatementMethods)
|
|
305
|
-
ps = ps.bind(@opts[:bind_vars]) if @opts[:bind_vars]
|
|
306
|
-
ps.prepared_args = prepared_args
|
|
307
|
-
ps.prepared_sql
|
|
308
|
-
end
|
|
309
|
-
end
|
|
310
|
-
|
|
311
|
-
# Methods for MySQL prepared statements using the native driver.
|
|
312
|
-
module PreparedStatementMethods
|
|
313
|
-
include Sequel::Dataset::UnnumberedArgumentMapper
|
|
314
|
-
|
|
315
|
-
private
|
|
316
|
-
|
|
317
|
-
# Execute the prepared statement with the bind arguments instead of
|
|
318
|
-
# the given SQL.
|
|
319
|
-
def execute(sql, opts={}, &block)
|
|
320
|
-
super(prepared_statement_name, {:arguments=>bind_arguments}.merge(opts), &block)
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
# Same as execute, explicit due to intricacies of alias and super.
|
|
324
|
-
def execute_dui(sql, opts={}, &block)
|
|
325
|
-
super(prepared_statement_name, {:arguments=>bind_arguments}.merge(opts), &block)
|
|
326
|
-
end
|
|
327
|
-
end
|
|
328
|
-
|
|
329
|
-
# Methods for MySQL stored procedures using the native driver.
|
|
330
|
-
module StoredProcedureMethods
|
|
331
|
-
include Sequel::Dataset::StoredProcedureMethods
|
|
332
|
-
|
|
333
|
-
private
|
|
334
|
-
|
|
335
|
-
# Execute the database stored procedure with the stored arguments.
|
|
336
|
-
def execute(sql, opts={}, &block)
|
|
337
|
-
super(@sproc_name, {:args=>@sproc_args, :sproc=>true}.merge(opts), &block)
|
|
338
|
-
end
|
|
339
|
-
|
|
340
|
-
# Same as execute, explicit due to intricacies of alias and super.
|
|
341
|
-
def execute_dui(sql, opts={}, &block)
|
|
342
|
-
super(@sproc_name, {:args=>@sproc_args, :sproc=>true}.merge(opts), &block)
|
|
343
|
-
end
|
|
344
|
-
end
|
|
345
|
-
|
|
346
|
-
# MySQL is different in that it supports prepared statements but not bound
|
|
347
|
-
# variables outside of prepared statements. The default implementation
|
|
348
|
-
# breaks the use of subselects in prepared statements, so extend the
|
|
349
|
-
# temporary prepared statement that this creates with a module that
|
|
350
|
-
# fixes it.
|
|
351
|
-
def call(type, bind_arguments={}, *values, &block)
|
|
352
|
-
ps = to_prepared_statement(type, values)
|
|
353
|
-
ps.extend(CallableStatementMethods)
|
|
354
|
-
ps.call(bind_arguments, &block)
|
|
355
|
-
end
|
|
356
|
-
|
|
357
|
-
# Delete rows matching this dataset
|
|
358
|
-
def delete
|
|
359
|
-
execute_dui(delete_sql){|c| return c.affected_rows}
|
|
360
|
-
end
|
|
361
|
-
|
|
285
|
+
include Sequel::MySQL::PreparedStatements::DatasetMethods
|
|
286
|
+
|
|
287
|
+
Database::DatasetClass = self
|
|
288
|
+
|
|
362
289
|
# Yield all rows matching this dataset. If the dataset is set to
|
|
363
290
|
# split multiple statements, yield arrays of hashes one per statement
|
|
364
291
|
# instead of yielding results for all statements as hashes.
|
|
365
|
-
def fetch_rows(sql
|
|
292
|
+
def fetch_rows(sql)
|
|
366
293
|
execute(sql) do |r|
|
|
367
294
|
i = -1
|
|
295
|
+
cps = db.conversion_procs
|
|
368
296
|
cols = r.fetch_fields.map do |f|
|
|
369
297
|
# Pretend tinyint is another integer type if its length is not 1, to
|
|
370
298
|
# avoid casting to boolean if Sequel::MySQL.convert_tinyint_to_bool
|
|
371
299
|
# is set.
|
|
372
|
-
type_proc = f.type == 1 && f
|
|
300
|
+
type_proc = f.type == 1 && cast_tinyint_integer?(f) ? cps[2] : cps[f.type]
|
|
373
301
|
[output_identifier(f.name), type_proc, i+=1]
|
|
374
302
|
end
|
|
375
303
|
@columns = cols.map{|c| c.first}
|
|
@@ -378,7 +306,7 @@ module Sequel
|
|
|
378
306
|
yield_rows(r, cols){|h| s << h}
|
|
379
307
|
yield s
|
|
380
308
|
else
|
|
381
|
-
yield_rows(r, cols
|
|
309
|
+
yield_rows(r, cols){|h| yield h}
|
|
382
310
|
end
|
|
383
311
|
end
|
|
384
312
|
self
|
|
@@ -390,28 +318,6 @@ module Sequel
|
|
|
390
318
|
super
|
|
391
319
|
end
|
|
392
320
|
|
|
393
|
-
# Insert a new value into this dataset
|
|
394
|
-
def insert(*values)
|
|
395
|
-
execute_dui(insert_sql(*values)){|c| return c.insert_id}
|
|
396
|
-
end
|
|
397
|
-
|
|
398
|
-
# Store the given type of prepared statement in the associated database
|
|
399
|
-
# with the given name.
|
|
400
|
-
def prepare(type, name=nil, *values)
|
|
401
|
-
ps = to_prepared_statement(type, values)
|
|
402
|
-
ps.extend(PreparedStatementMethods)
|
|
403
|
-
if name
|
|
404
|
-
ps.prepared_statement_name = name
|
|
405
|
-
db.prepared_statements[name] = ps
|
|
406
|
-
end
|
|
407
|
-
ps
|
|
408
|
-
end
|
|
409
|
-
|
|
410
|
-
# Replace (update or insert) the matching row.
|
|
411
|
-
def replace(*args)
|
|
412
|
-
execute_dui(replace_sql(*args)){|c| return c.insert_id}
|
|
413
|
-
end
|
|
414
|
-
|
|
415
321
|
# Makes each yield arrays of rows, with each array containing the rows
|
|
416
322
|
# for a given result set. Does not work with graphing. So you can submit
|
|
417
323
|
# SQL with multiple statements and easily determine which statement
|
|
@@ -428,31 +334,25 @@ module Sequel
|
|
|
428
334
|
ds
|
|
429
335
|
end
|
|
430
336
|
|
|
431
|
-
# Update the matching rows.
|
|
432
|
-
def update(values={})
|
|
433
|
-
execute_dui(update_sql(values)){|c| return c.affected_rows}
|
|
434
|
-
end
|
|
435
|
-
|
|
436
337
|
private
|
|
338
|
+
|
|
339
|
+
# Whether a tinyint field should be casted as an integer. By default,
|
|
340
|
+
# casts to integer if the field length is not 1. Can be overwritten
|
|
341
|
+
# to make tinyint casting dataset dependent.
|
|
342
|
+
def cast_tinyint_integer?(field)
|
|
343
|
+
field.length != 1
|
|
344
|
+
end
|
|
437
345
|
|
|
438
346
|
# Set the :type option to :select if it hasn't been set.
|
|
439
347
|
def execute(sql, opts={}, &block)
|
|
440
348
|
super(sql, {:type=>:select}.merge(opts), &block)
|
|
441
349
|
end
|
|
442
350
|
|
|
443
|
-
# Set the :type option to :dui if it hasn't been set.
|
|
444
|
-
def execute_dui(sql, opts={}, &block)
|
|
445
|
-
super(sql, {:type=>:dui}.merge(opts), &block)
|
|
446
|
-
end
|
|
447
|
-
|
|
448
351
|
# Handle correct quoting of strings using ::MySQL.quote.
|
|
449
|
-
def
|
|
450
|
-
"'
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
# Extend the dataset with the MySQL stored procedure methods.
|
|
454
|
-
def prepare_extend_sproc(ds)
|
|
455
|
-
ds.extend(StoredProcedureMethods)
|
|
352
|
+
def literal_string_append(sql, v)
|
|
353
|
+
sql << "'"
|
|
354
|
+
sql << ::Mysql.quote(v)
|
|
355
|
+
sql << "'"
|
|
456
356
|
end
|
|
457
357
|
|
|
458
358
|
# Yield each row of the given result set r with columns cols
|