datamapper 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +65 -0
- data/README +193 -1
- data/do_performance.rb +153 -0
- data/environment.rb +45 -0
- data/example.rb +119 -22
- data/lib/data_mapper.rb +36 -16
- data/lib/data_mapper/adapters/abstract_adapter.rb +8 -0
- data/lib/data_mapper/adapters/data_object_adapter.rb +360 -0
- data/lib/data_mapper/adapters/mysql_adapter.rb +30 -179
- data/lib/data_mapper/adapters/postgresql_adapter.rb +90 -199
- data/lib/data_mapper/adapters/sql/coersion.rb +32 -3
- data/lib/data_mapper/adapters/sql/commands/conditions.rb +97 -128
- data/lib/data_mapper/adapters/sql/commands/load_command.rb +234 -231
- data/lib/data_mapper/adapters/sql/commands/loader.rb +99 -0
- data/lib/data_mapper/adapters/sql/mappings/associations_set.rb +30 -0
- data/lib/data_mapper/adapters/sql/mappings/column.rb +68 -6
- data/lib/data_mapper/adapters/sql/mappings/schema.rb +6 -3
- data/lib/data_mapper/adapters/sql/mappings/table.rb +71 -42
- data/lib/data_mapper/adapters/sql/quoting.rb +8 -2
- data/lib/data_mapper/adapters/sqlite3_adapter.rb +32 -201
- data/lib/data_mapper/associations.rb +21 -7
- data/lib/data_mapper/associations/belongs_to_association.rb +96 -80
- data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +158 -67
- data/lib/data_mapper/associations/has_many_association.rb +96 -78
- data/lib/data_mapper/associations/has_n_association.rb +64 -0
- data/lib/data_mapper/associations/has_one_association.rb +49 -79
- data/lib/data_mapper/associations/reference.rb +47 -0
- data/lib/data_mapper/base.rb +216 -50
- data/lib/data_mapper/callbacks.rb +71 -24
- data/lib/data_mapper/{session.rb → context.rb} +20 -8
- data/lib/data_mapper/database.rb +176 -45
- data/lib/data_mapper/embedded_value.rb +65 -0
- data/lib/data_mapper/identity_map.rb +12 -4
- data/lib/data_mapper/support/active_record_impersonation.rb +12 -8
- data/lib/data_mapper/support/enumerable.rb +8 -0
- data/lib/data_mapper/support/serialization.rb +13 -0
- data/lib/data_mapper/support/string.rb +1 -12
- data/lib/data_mapper/support/symbol.rb +3 -0
- data/lib/data_mapper/validations/unique_validator.rb +1 -2
- data/lib/data_mapper/validations/validation_helper.rb +18 -1
- data/performance.rb +109 -34
- data/plugins/can_has_sphinx/LICENSE +23 -0
- data/plugins/can_has_sphinx/README +4 -0
- data/plugins/can_has_sphinx/REVISION +1 -0
- data/plugins/can_has_sphinx/Rakefile +22 -0
- data/plugins/can_has_sphinx/init.rb +1 -0
- data/plugins/can_has_sphinx/install.rb +1 -0
- data/plugins/can_has_sphinx/lib/acts_as_sphinx.rb +123 -0
- data/plugins/can_has_sphinx/lib/sphinx.rb +460 -0
- data/plugins/can_has_sphinx/scripts/sphinx.sh +47 -0
- data/plugins/can_has_sphinx/tasks/acts_as_sphinx_tasks.rake +41 -0
- data/plugins/dataobjects/REVISION +1 -0
- data/plugins/dataobjects/Rakefile +7 -0
- data/plugins/dataobjects/do.rb +246 -0
- data/plugins/dataobjects/do_mysql.rb +179 -0
- data/plugins/dataobjects/do_postgres.rb +181 -0
- data/plugins/dataobjects/do_sqlite3.rb +153 -0
- data/plugins/dataobjects/spec/do_spec.rb +150 -0
- data/plugins/dataobjects/spec/spec_helper.rb +81 -0
- data/plugins/dataobjects/swig_mysql/do_mysql.bundle +0 -0
- data/plugins/dataobjects/swig_mysql/extconf.rb +33 -0
- data/plugins/dataobjects/swig_mysql/mysql_c.c +18800 -0
- data/plugins/dataobjects/swig_mysql/mysql_c.i +8 -0
- data/plugins/dataobjects/swig_mysql/mysql_supp.i +46 -0
- data/plugins/dataobjects/swig_postgres/Makefile +146 -0
- data/plugins/dataobjects/swig_postgres/extconf.rb +29 -0
- data/plugins/dataobjects/swig_postgres/postgres_c.bundle +0 -0
- data/plugins/dataobjects/swig_postgres/postgres_c.c +8185 -0
- data/plugins/dataobjects/swig_postgres/postgres_c.i +73 -0
- data/plugins/dataobjects/swig_sqlite/db +0 -0
- data/plugins/dataobjects/swig_sqlite/extconf.rb +9 -0
- data/plugins/dataobjects/swig_sqlite/sqlite3_c.c +4725 -0
- data/plugins/dataobjects/swig_sqlite/sqlite_c.i +168 -0
- data/rakefile.rb +45 -23
- data/spec/acts_as_tree_spec.rb +39 -0
- data/spec/associations_spec.rb +220 -0
- data/spec/attributes_spec.rb +15 -0
- data/spec/base_spec.rb +44 -0
- data/spec/callbacks_spec.rb +45 -0
- data/spec/can_has_sphinx.rb +6 -0
- data/spec/coersion_spec.rb +34 -0
- data/spec/conditions_spec.rb +49 -0
- data/spec/conversions_to_yaml_spec.rb +17 -0
- data/spec/count_command_spec.rb +11 -0
- data/spec/delete_command_spec.rb +1 -1
- data/spec/embedded_value_spec.rb +23 -0
- data/spec/fixtures/animals_exhibits.yaml +2 -0
- data/spec/fixtures/people.yaml +18 -1
- data/spec/{legacy.rb → legacy_spec.rb} +3 -3
- data/spec/load_command_spec.rb +157 -20
- data/spec/magic_columns_spec.rb +9 -0
- data/spec/mock_adapter.rb +20 -0
- data/spec/models/animal.rb +1 -1
- data/spec/models/animals_exhibit.rb +6 -0
- data/spec/models/exhibit.rb +2 -0
- data/spec/models/person.rb +26 -1
- data/spec/models/project.rb +19 -0
- data/spec/models/sales_person.rb +1 -0
- data/spec/models/section.rb +6 -0
- data/spec/models/zoo.rb +3 -1
- data/spec/query_spec.rb +9 -0
- data/spec/save_command_spec.rb +65 -1
- data/spec/schema_spec.rb +89 -0
- data/spec/single_table_inheritance_spec.rb +27 -0
- data/spec/spec_helper.rb +9 -55
- data/spec/{symbolic_operators.rb → symbolic_operators_spec.rb} +9 -5
- data/spec/{validates_confirmation_of.rb → validates_confirmation_of_spec.rb} +4 -3
- data/spec/{validates_format_of.rb → validates_format_of_spec.rb} +5 -4
- data/spec/{validates_length_of.rb → validates_length_of_spec.rb} +8 -7
- data/spec/{validates_uniqueness_of.rb → validates_uniqueness_of_spec.rb} +7 -10
- data/spec/{validations.rb → validations_spec.rb} +24 -6
- data/tasks/drivers.rb +20 -0
- data/tasks/fixtures.rb +42 -0
- metadata +181 -42
- data/lib/data_mapper/adapters/sql/commands/advanced_load_command.rb +0 -140
- data/lib/data_mapper/adapters/sql/commands/delete_command.rb +0 -113
- data/lib/data_mapper/adapters/sql/commands/save_command.rb +0 -141
- data/lib/data_mapper/adapters/sql/commands/table_exists_command.rb +0 -33
- data/lib/data_mapper/adapters/sql_adapter.rb +0 -163
- data/lib/data_mapper/associations/advanced_has_many_association.rb +0 -55
- data/lib/data_mapper/support/blank_slate.rb +0 -3
- data/lib/data_mapper/support/proc.rb +0 -69
- data/lib/data_mapper/support/struct.rb +0 -26
- data/lib/data_mapper/unit_of_work.rb +0 -38
- data/spec/basic_finder.rb +0 -67
- data/spec/belongs_to.rb +0 -47
- data/spec/has_and_belongs_to_many.rb +0 -25
- data/spec/has_many.rb +0 -34
- data/spec/new_record.rb +0 -24
- data/spec/sub_select.rb +0 -16
- data/spec/support/string_spec.rb +0 -7
@@ -0,0 +1,99 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Adapters
|
3
|
+
module Sql
|
4
|
+
module Commands
|
5
|
+
|
6
|
+
class Loader
|
7
|
+
|
8
|
+
def initialize(load_command, klass)
|
9
|
+
@load_command, @klass = load_command, klass
|
10
|
+
@columns = {}
|
11
|
+
@key = nil
|
12
|
+
@key_index = nil
|
13
|
+
@type_override_present = false
|
14
|
+
@type_override_index = nil
|
15
|
+
@type_override = nil
|
16
|
+
@session = load_command.session
|
17
|
+
@reload = load_command.reload?
|
18
|
+
@set = []
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_column(column, index)
|
22
|
+
if column.key?
|
23
|
+
@key = column
|
24
|
+
@key_index = index
|
25
|
+
end
|
26
|
+
|
27
|
+
if column.type == :class
|
28
|
+
@type_override_present = true
|
29
|
+
@type_override_index = index
|
30
|
+
@type_override = column
|
31
|
+
end
|
32
|
+
|
33
|
+
@columns[index] = column
|
34
|
+
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def materialize(values)
|
39
|
+
|
40
|
+
instance_id = @key.type_cast_value(values[@key_index])
|
41
|
+
instance = if @type_override_present
|
42
|
+
create_instance(instance_id, @type_override.type_cast_value(values[@type_override_index]))
|
43
|
+
else
|
44
|
+
create_instance(instance_id)
|
45
|
+
end
|
46
|
+
|
47
|
+
@klass.callbacks.execute(:before_materialize, instance)
|
48
|
+
|
49
|
+
original_hashes = instance.original_hashes
|
50
|
+
|
51
|
+
@columns.each_pair do |index, column|
|
52
|
+
# This may be a little confusing, but we're
|
53
|
+
# setting both the original-hash value, and the
|
54
|
+
# instance-variable through method chaining to avoid
|
55
|
+
# lots of extra short-lived local variables.
|
56
|
+
original_hashes[column.name] = instance.instance_variable_set(
|
57
|
+
column.instance_variable_name,
|
58
|
+
column.type_cast_value(values[index])
|
59
|
+
).hash
|
60
|
+
end
|
61
|
+
|
62
|
+
instance.instance_variable_set(:@loaded_set, @set)
|
63
|
+
@set << instance
|
64
|
+
|
65
|
+
@klass.callbacks.execute(:after_materialize, instance)
|
66
|
+
|
67
|
+
return instance
|
68
|
+
end
|
69
|
+
|
70
|
+
def loaded_set
|
71
|
+
@set
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def create_instance(instance_id, instance_type = @klass)
|
77
|
+
instance = @session.identity_map.get(@klass, instance_id)
|
78
|
+
|
79
|
+
if instance.nil? || @reload
|
80
|
+
instance = instance_type.new() if instance.nil?
|
81
|
+
instance.instance_variable_set(:@__key, instance_id)
|
82
|
+
instance.instance_variable_set(:@new_record, false)
|
83
|
+
@session.identity_map.set(instance)
|
84
|
+
elsif instance.new_record?
|
85
|
+
instance.instance_variable_set(:@__key, instance_id)
|
86
|
+
instance.instance_variable_set(:@new_record, false)
|
87
|
+
end
|
88
|
+
|
89
|
+
instance.session = @session
|
90
|
+
|
91
|
+
return instance
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end # module Commands
|
97
|
+
end # module Sql
|
98
|
+
end # module Adapters
|
99
|
+
end # module DataMapper
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Adapters
|
3
|
+
module Sql
|
4
|
+
module Mappings
|
5
|
+
|
6
|
+
class AssociationsSet
|
7
|
+
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@set = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def <<(association)
|
15
|
+
@set[association.name] = association
|
16
|
+
end
|
17
|
+
|
18
|
+
def [](name)
|
19
|
+
@set[name]
|
20
|
+
end
|
21
|
+
|
22
|
+
def each
|
23
|
+
@set.each { |name, association| yield(association) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end # module Mappings
|
28
|
+
end # module Sql
|
29
|
+
end # module Adapters
|
30
|
+
end # module DataMapper
|
@@ -7,13 +7,19 @@ module DataMapper
|
|
7
7
|
# Ordinal, Length/Size, Nullability are just a few.
|
8
8
|
class Column
|
9
9
|
|
10
|
-
attr_accessor :name, :type, :options
|
10
|
+
attr_accessor :table, :name, :type, :options
|
11
11
|
|
12
12
|
def initialize(adapter, table, name, type, options = {})
|
13
13
|
@adapter = adapter
|
14
14
|
@table = table
|
15
15
|
@name, @type, @options = name.to_sym, type, options
|
16
16
|
|
17
|
+
@key = (@options[:key] == true)
|
18
|
+
@nullable = @options.has_key?(:nullable) ? @options[:nullable] : !@key
|
19
|
+
@lazy = @options.has_key?(:lazy) ? @options[:lazy] : @type == :text
|
20
|
+
@serial = (@key == true && @type == :integer && @options[:serial] != false)
|
21
|
+
@default = @options[:default]
|
22
|
+
|
17
23
|
(class << self; self end).class_eval <<-EOS
|
18
24
|
def type_cast_value(value)
|
19
25
|
@adapter.type_cast_#{type}(value)
|
@@ -22,24 +28,32 @@ module DataMapper
|
|
22
28
|
end
|
23
29
|
|
24
30
|
def lazy=(value)
|
25
|
-
@
|
31
|
+
@lazy = value
|
26
32
|
end
|
27
33
|
|
28
34
|
# Determines if the field should be lazy loaded.
|
29
35
|
# You can set this explicitly, or accept the default,
|
30
36
|
# which is false for all but text fields.
|
31
37
|
def lazy?
|
32
|
-
@
|
38
|
+
@lazy
|
33
39
|
end
|
34
40
|
|
35
41
|
def nullable?
|
36
|
-
@
|
42
|
+
@nullable
|
37
43
|
end
|
38
44
|
|
39
45
|
def key?
|
40
|
-
@
|
46
|
+
@key
|
41
47
|
end
|
42
|
-
|
48
|
+
|
49
|
+
def serial?
|
50
|
+
@serial
|
51
|
+
end
|
52
|
+
|
53
|
+
def default
|
54
|
+
@default
|
55
|
+
end
|
56
|
+
|
43
57
|
def to_sym
|
44
58
|
@name
|
45
59
|
end
|
@@ -82,6 +96,54 @@ module DataMapper
|
|
82
96
|
def inspect
|
83
97
|
"#<%s:0x%x @name=%s, @type=%s, @options=%s>" % [self.class.name, (object_id * 2), to_sql, type.inspect, options.inspect]
|
84
98
|
end
|
99
|
+
|
100
|
+
def to_long_form
|
101
|
+
@to_long_form || begin
|
102
|
+
@to_long_form = "#{to_sql} #{type_declaration}"
|
103
|
+
|
104
|
+
unless nullable? || not_null_declaration.blank?
|
105
|
+
@to_long_form << " #{not_null_declaration}"
|
106
|
+
end
|
107
|
+
|
108
|
+
if key? && !primary_key_declaration.blank?
|
109
|
+
@to_long_form << " #{primary_key_declaration}"
|
110
|
+
end
|
111
|
+
|
112
|
+
if serial? && !serial_declaration.blank?
|
113
|
+
@to_long_form << " #{serial_declaration}"
|
114
|
+
end
|
115
|
+
|
116
|
+
if default && !default_declaration.blank?
|
117
|
+
@to_long_form << " #{default_declaration}"
|
118
|
+
end
|
119
|
+
|
120
|
+
@to_long_form
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
def primary_key_declaration
|
127
|
+
"PRIMARY KEY"
|
128
|
+
end
|
129
|
+
|
130
|
+
def type_declaration
|
131
|
+
sql = "#{@adapter.class::TYPES[type] || type}"
|
132
|
+
sql << "(#{size})" unless size.nil?
|
133
|
+
sql
|
134
|
+
end
|
135
|
+
|
136
|
+
def not_null_declaration
|
137
|
+
"NOT NULL"
|
138
|
+
end
|
139
|
+
|
140
|
+
def serial_declaration
|
141
|
+
"AUTO_INCREMENT"
|
142
|
+
end
|
143
|
+
|
144
|
+
def default_declaration
|
145
|
+
"DEFAULT #{default}"
|
146
|
+
end
|
85
147
|
|
86
148
|
end
|
87
149
|
|
@@ -7,11 +7,14 @@ module DataMapper
|
|
7
7
|
|
8
8
|
class Schema
|
9
9
|
|
10
|
-
|
10
|
+
attr_reader :name
|
11
|
+
|
12
|
+
def initialize(adapter, database_name)
|
13
|
+
@name = database_name
|
11
14
|
@adapter = adapter
|
12
|
-
@tables = Hash.new { |h,k| h[k] = Table.new(@adapter, k) }
|
15
|
+
@tables = Hash.new { |h,k| h[k] = adapter.class::Mappings::Table.new(@adapter, k) }
|
13
16
|
end
|
14
|
-
|
17
|
+
|
15
18
|
def [](klass)
|
16
19
|
@tables[klass]
|
17
20
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/column'
|
2
|
+
require File.dirname(__FILE__) + '/associations_set'
|
2
3
|
|
3
4
|
module DataMapper
|
4
5
|
module Adapters
|
@@ -7,47 +8,41 @@ module DataMapper
|
|
7
8
|
|
8
9
|
class Table
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
def name
|
16
|
-
@association_name
|
17
|
-
end
|
18
|
-
|
19
|
-
def constant
|
20
|
-
@constant || @constant = begin
|
21
|
-
Object.const_get(@constant_name)
|
22
|
-
end
|
23
|
-
end
|
11
|
+
attr_reader :klass, :name
|
12
|
+
|
13
|
+
def initialize(adapter, klass_or_name)
|
14
|
+
raise "\"klass_or_name\" must not be nil!" if klass_or_name.nil?
|
24
15
|
|
25
|
-
|
16
|
+
@klass = klass_or_name.kind_of?(String) ? nil : klass_or_name
|
17
|
+
@klass_or_name = klass_or_name
|
26
18
|
|
27
|
-
attr_reader :klass
|
28
|
-
|
29
|
-
def initialize(adapter, setup_klass)
|
30
|
-
raise "\"setup_klass\" must not be nil!" if setup_klass.nil?
|
31
19
|
@adapter = adapter
|
32
|
-
@klass = setup_klass
|
33
20
|
@columns = []
|
34
21
|
@columns_hash = Hash.new { |h,k| h[k] = @columns.find { |c| c.name == k } }
|
35
22
|
@columns_by_column_name = Hash.new { |h,k| h[k.to_s] = @columns.find { |c| c.column_name == k.to_s } }
|
36
|
-
|
37
|
-
@associations =
|
23
|
+
|
24
|
+
@associations = AssociationsSet.new
|
25
|
+
|
26
|
+
@multi_class = false
|
27
|
+
|
28
|
+
if @klass && @klass.ancestors.include?(DataMapper::Base) && @klass.superclass != DataMapper::Base
|
29
|
+
@adapter.table(@klass.superclass).columns.each do |column|
|
30
|
+
self.add_column(column.name, column.type, column.options)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def multi_class?
|
36
|
+
@multi_class
|
38
37
|
end
|
39
38
|
|
40
39
|
def associations
|
41
40
|
@associations
|
42
41
|
end
|
43
|
-
|
44
|
-
# def has_many(association_name, options)
|
45
|
-
# @associtaions << Association.new(association_name, Inflector.classify(Inflector.singularize(association_name.to_s)))
|
46
|
-
# end
|
47
42
|
|
48
|
-
|
49
|
-
|
50
|
-
|
43
|
+
def reflect_columns
|
44
|
+
@adapter.reflect_columns(self)
|
45
|
+
end
|
51
46
|
|
52
47
|
def columns
|
53
48
|
key if @key.nil?
|
@@ -59,11 +54,14 @@ module DataMapper
|
|
59
54
|
end
|
60
55
|
|
61
56
|
def drop!
|
62
|
-
@adapter.
|
57
|
+
@adapter.drop(database, self) if exists?
|
63
58
|
end
|
64
59
|
|
65
|
-
def create!
|
66
|
-
|
60
|
+
def create!(force = false)
|
61
|
+
unless exists? || force
|
62
|
+
drop! if force
|
63
|
+
@adapter.create_table(self)
|
64
|
+
end
|
67
65
|
end
|
68
66
|
|
69
67
|
def key
|
@@ -86,8 +84,9 @@ module DataMapper
|
|
86
84
|
|
87
85
|
if column.nil?
|
88
86
|
reset_derived_columns!
|
89
|
-
column = Column.new(@adapter, self, column_name, type, options)
|
87
|
+
column = @adapter.class::Mappings::Column.new(@adapter, self, column_name, type, options)
|
90
88
|
@columns.send(column_name == :id ? :unshift : :push, column)
|
89
|
+
@multi_class = true if column_name == :type
|
91
90
|
end
|
92
91
|
|
93
92
|
return column
|
@@ -103,13 +102,18 @@ module DataMapper
|
|
103
102
|
end
|
104
103
|
|
105
104
|
def name
|
106
|
-
@name ||
|
107
|
-
@
|
108
|
-
|
105
|
+
@name || @name = if @klass_or_name.kind_of?(String)
|
106
|
+
@klass_or_name
|
107
|
+
elsif @klass_or_name.kind_of?(Class)
|
108
|
+
if @klass_or_name.superclass != DataMapper::Base \
|
109
|
+
&& @klass_or_name.ancestors.include?(DataMapper::Base)
|
110
|
+
@adapter.table(@klass_or_name.superclass).name
|
109
111
|
else
|
110
|
-
Inflector.tableize(@
|
111
|
-
end
|
112
|
-
|
112
|
+
Inflector.tableize(@klass_or_name.name)
|
113
|
+
end
|
114
|
+
else
|
115
|
+
raise "+klass_or_name+ (#{@klass_or_name.inspect}) must be a Class or a string containing the name of a table"
|
116
|
+
end.freeze
|
113
117
|
end
|
114
118
|
|
115
119
|
def name=(value)
|
@@ -117,15 +121,40 @@ module DataMapper
|
|
117
121
|
end
|
118
122
|
|
119
123
|
def default_foreign_key
|
120
|
-
@default_foreign_key || (@default_foreign_key = "#{
|
124
|
+
@default_foreign_key || (@default_foreign_key = "#{Inflector.underscore(Inflector.singularize(name))}_id".freeze)
|
121
125
|
end
|
122
126
|
|
123
127
|
def to_sql
|
124
|
-
@to_sql ||
|
128
|
+
@to_sql || @to_sql = quote_table.freeze
|
129
|
+
end
|
130
|
+
|
131
|
+
def to_create_table_sql
|
132
|
+
@to_create_table_sql || @to_create_table_sql = begin
|
133
|
+
"CREATE TABLE #{to_sql} (#{columns.map { |c| c.to_long_form }.join(', ')})"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def to_exists_sql
|
138
|
+
@to_exists_sql || @to_exists_sql = <<-EOS.compress_lines
|
139
|
+
SELECT TABLE_NAME
|
140
|
+
FROM INFORMATION_SCHEMA.TABLES
|
141
|
+
WHERE TABLE_NAME = #{@adapter.quote_value(name)}
|
142
|
+
AND TABLE_SCHEMA = #{@adapter.quote_value(@adapter.schema.name)}
|
143
|
+
EOS
|
144
|
+
end
|
145
|
+
|
146
|
+
def quote_table
|
147
|
+
@adapter.quote_table_name(name)
|
125
148
|
end
|
126
149
|
|
127
150
|
def inspect
|
128
|
-
"#<%s:0x%x @klass=%s, @name=%s, @columns=%s>" % [
|
151
|
+
"#<%s:0x%x @klass=%s, @name=%s, @columns=%s>" % [
|
152
|
+
self.class.name,
|
153
|
+
(object_id * 2),
|
154
|
+
klass.inspect,
|
155
|
+
to_sql,
|
156
|
+
@columns.inspect
|
157
|
+
]
|
129
158
|
end
|
130
159
|
|
131
160
|
private
|
@@ -26,9 +26,15 @@ module DataMapper
|
|
26
26
|
when String then "'#{value.gsub("'", "''")}'"
|
27
27
|
when Class then "'#{value.name}'"
|
28
28
|
when Date then "'#{value.to_s}'"
|
29
|
-
when Time, DateTime then "'#{value.strftime("%Y-%m-%d %H:%M:%S")}'"
|
29
|
+
when Time, DateTime then "'#{value.utc.strftime("%Y-%m-%d %H:%M:%S")}'"
|
30
30
|
when TrueClass, FalseClass then value.to_s.upcase
|
31
|
-
|
31
|
+
when Array then "(#{value.map { |entry| quote_value(entry) }.join(', ')})"
|
32
|
+
else
|
33
|
+
if value.respond_to?(:to_sql)
|
34
|
+
value.to_sql
|
35
|
+
else
|
36
|
+
raise "Don't know how to quote #{value.inspect}"
|
37
|
+
end
|
32
38
|
end
|
33
39
|
end
|
34
40
|
|