datamapper 0.2.3 → 0.2.4

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.
Files changed (121) hide show
  1. data/example.rb +5 -5
  2. data/lib/data_mapper/adapters/abstract_adapter.rb +2 -2
  3. data/lib/data_mapper/adapters/data_object_adapter.rb +141 -147
  4. data/lib/data_mapper/adapters/mysql_adapter.rb +14 -1
  5. data/lib/data_mapper/adapters/postgresql_adapter.rb +123 -18
  6. data/lib/data_mapper/adapters/sql/coersion.rb +21 -9
  7. data/lib/data_mapper/adapters/sql/commands/load_command.rb +36 -19
  8. data/lib/data_mapper/adapters/sql/mappings/column.rb +111 -17
  9. data/lib/data_mapper/adapters/sql/mappings/schema.rb +27 -0
  10. data/lib/data_mapper/adapters/sql/mappings/table.rb +256 -29
  11. data/lib/data_mapper/adapters/sqlite3_adapter.rb +93 -8
  12. data/lib/data_mapper/associations/belongs_to_association.rb +53 -54
  13. data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +157 -25
  14. data/lib/data_mapper/associations/has_many_association.rb +45 -15
  15. data/lib/data_mapper/associations/has_n_association.rb +79 -20
  16. data/lib/data_mapper/associations/has_one_association.rb +2 -2
  17. data/lib/data_mapper/associations/reference.rb +1 -1
  18. data/lib/data_mapper/auto_migrations.rb +40 -0
  19. data/lib/data_mapper/base.rb +201 -98
  20. data/lib/data_mapper/context.rb +16 -10
  21. data/lib/data_mapper/database.rb +22 -11
  22. data/lib/data_mapper/dependency_queue.rb +28 -0
  23. data/lib/data_mapper/embedded_value.rb +61 -17
  24. data/lib/data_mapper/property.rb +4 -0
  25. data/lib/data_mapper/support/active_record_impersonation.rb +13 -5
  26. data/lib/data_mapper/support/errors.rb +5 -0
  27. data/lib/data_mapper/support/serialization.rb +8 -4
  28. data/lib/data_mapper/validatable_extensions/errors.rb +12 -0
  29. data/lib/data_mapper/validatable_extensions/macros.rb +7 -0
  30. data/lib/data_mapper/validatable_extensions/validatable_instance_methods.rb +62 -0
  31. data/lib/data_mapper/validatable_extensions/validation_base.rb +18 -0
  32. data/lib/data_mapper/validatable_extensions/validations/formats/email.rb +43 -0
  33. data/lib/data_mapper/validatable_extensions/validations/validates_acceptance_of.rb +7 -0
  34. data/lib/data_mapper/validatable_extensions/validations/validates_confirmation_of.rb +7 -0
  35. data/lib/data_mapper/validatable_extensions/validations/validates_each.rb +7 -0
  36. data/lib/data_mapper/validatable_extensions/validations/validates_format_of.rb +28 -0
  37. data/lib/data_mapper/validatable_extensions/validations/validates_length_of.rb +15 -0
  38. data/lib/data_mapper/validatable_extensions/validations/validates_numericality_of.rb +7 -0
  39. data/lib/data_mapper/validatable_extensions/validations/validates_presence_of.rb +7 -0
  40. data/lib/data_mapper/validatable_extensions/validations/validates_true_for.rb +7 -0
  41. data/lib/data_mapper/validatable_extensions/validations/validates_uniqueness_of.rb +33 -0
  42. data/lib/data_mapper/validations.rb +20 -0
  43. data/lib/data_mapper.rb +39 -34
  44. data/performance.rb +24 -18
  45. data/plugins/dataobjects/do_rb +0 -0
  46. data/rakefile.rb +12 -2
  47. data/spec/active_record_impersonation_spec.rb +133 -0
  48. data/spec/acts_as_tree_spec.rb +25 -9
  49. data/spec/associations_spec.rb +124 -4
  50. data/spec/attributes_spec.rb +13 -0
  51. data/spec/auto_migrations_spec.rb +44 -0
  52. data/spec/base_spec.rb +189 -1
  53. data/spec/column_spec.rb +85 -7
  54. data/spec/conditions_spec.rb +2 -2
  55. data/spec/dependency_spec.rb +25 -0
  56. data/spec/embedded_value_spec.rb +123 -3
  57. data/spec/fixtures/animals.yaml +1 -0
  58. data/spec/fixtures/careers.yaml +5 -0
  59. data/spec/fixtures/comments.yaml +1 -0
  60. data/spec/fixtures/people.yaml +14 -9
  61. data/spec/fixtures/projects.yaml +4 -0
  62. data/spec/fixtures/sections.yaml +5 -0
  63. data/spec/fixtures/serializers.yaml +6 -0
  64. data/spec/fixtures/users.yaml +1 -0
  65. data/spec/load_command_spec.rb +5 -4
  66. data/spec/mock_adapter.rb +2 -2
  67. data/spec/models/animal.rb +2 -1
  68. data/spec/models/animals_exhibit.rb +2 -2
  69. data/spec/models/career.rb +6 -0
  70. data/spec/models/comment.rb +4 -0
  71. data/spec/models/exhibit.rb +4 -0
  72. data/spec/models/person.rb +3 -13
  73. data/spec/models/project.rb +1 -1
  74. data/spec/models/serializer.rb +3 -0
  75. data/spec/models/user.rb +4 -0
  76. data/spec/models/zoo.rb +8 -1
  77. data/spec/natural_key_spec.rb +36 -0
  78. data/spec/paranoia_spec.rb +36 -0
  79. data/spec/property_spec.rb +70 -0
  80. data/spec/schema_spec.rb +10 -2
  81. data/spec/serialization_spec.rb +6 -3
  82. data/spec/serialize_spec.rb +19 -0
  83. data/spec/single_table_inheritance_spec.rb +7 -1
  84. data/spec/spec_helper.rb +26 -8
  85. data/spec/table_spec.rb +33 -0
  86. data/spec/validates_confirmation_of_spec.rb +20 -4
  87. data/spec/validates_format_of_spec.rb +22 -8
  88. data/spec/validates_length_of_spec.rb +26 -13
  89. data/spec/validates_uniqueness_of_spec.rb +18 -5
  90. data/spec/validations_spec.rb +55 -10
  91. data/tasks/fixtures.rb +13 -7
  92. metadata +189 -153
  93. data/lib/data_mapper/validations/confirmation_validator.rb +0 -53
  94. data/lib/data_mapper/validations/contextual_validations.rb +0 -50
  95. data/lib/data_mapper/validations/format_validator.rb +0 -85
  96. data/lib/data_mapper/validations/formats/email.rb +0 -78
  97. data/lib/data_mapper/validations/generic_validator.rb +0 -22
  98. data/lib/data_mapper/validations/length_validator.rb +0 -76
  99. data/lib/data_mapper/validations/required_field_validator.rb +0 -41
  100. data/lib/data_mapper/validations/unique_validator.rb +0 -56
  101. data/lib/data_mapper/validations/validation_errors.rb +0 -37
  102. data/lib/data_mapper/validations/validation_helper.rb +0 -77
  103. data/plugins/dataobjects/REVISION +0 -1
  104. data/plugins/dataobjects/Rakefile +0 -9
  105. data/plugins/dataobjects/do.rb +0 -348
  106. data/plugins/dataobjects/do_mysql.rb +0 -212
  107. data/plugins/dataobjects/do_postgres.rb +0 -196
  108. data/plugins/dataobjects/do_sqlite3.rb +0 -157
  109. data/plugins/dataobjects/spec/do_spec.rb +0 -150
  110. data/plugins/dataobjects/spec/spec_helper.rb +0 -81
  111. data/plugins/dataobjects/swig_mysql/extconf.rb +0 -45
  112. data/plugins/dataobjects/swig_mysql/mysql_c.c +0 -16602
  113. data/plugins/dataobjects/swig_mysql/mysql_c.i +0 -67
  114. data/plugins/dataobjects/swig_mysql/mysql_supp.i +0 -46
  115. data/plugins/dataobjects/swig_postgres/extconf.rb +0 -29
  116. data/plugins/dataobjects/swig_postgres/postgres_c.c +0 -8185
  117. data/plugins/dataobjects/swig_postgres/postgres_c.i +0 -73
  118. data/plugins/dataobjects/swig_sqlite/extconf.rb +0 -9
  119. data/plugins/dataobjects/swig_sqlite/sqlite3_c.c +0 -4725
  120. data/plugins/dataobjects/swig_sqlite/sqlite_c.i +0 -168
  121. data/tasks/drivers.rb +0 -20
@@ -1,196 +0,0 @@
1
- require 'postgres_c'
2
- require 'do'
3
-
4
- module DataObject
5
- module Postgres
6
- TYPES = Hash[*Postgres_c.constants.select {|x| x.include?("OID")}.map {|x| [Postgres_c.const_get(x), x.gsub(/_?OID$/, "")]}.flatten]
7
- QUOTE_STRING = "'"
8
- QUOTE_COLUMN = "\""
9
-
10
- class Connection < DataObject::Connection
11
- attr_reader :db
12
-
13
- def initialize(connection_string)
14
- @state = STATE_CLOSED
15
- @connection_string = connection_string
16
- end
17
-
18
- def open
19
- @db = Postgres_c.PQconnectdb(@connection_string)
20
- if Postgres_c.PQstatus(@db) != Postgres_c::CONNECTION_OK
21
- raise ConnectionFailed, "The connection with connection string #{@connection_string} failed\n#{Postgres_c.PQerrorMessage(@db)}"
22
- end
23
- @state = STATE_OPEN
24
- true
25
- end
26
-
27
- def close
28
- Postgres_c.PQfinish(@db)
29
- @state = STATE_CLOSED
30
- true
31
- end
32
-
33
- def create_command(text)
34
- Command.new(self, text)
35
- end
36
-
37
- end
38
-
39
- class Reader < DataObject::Reader
40
-
41
- def initialize(db, reader)
42
- @reader = reader
43
- case Postgres_c.PQresultStatus(reader)
44
- when Postgres_c::PGRES_COMMAND_OK
45
- @records_affected = Postgres_c.PQcmdTuples(reader).to_i
46
- close
47
- when Postgres_c::PGRES_TUPLES_OK
48
- @fields, @field_types = [], []
49
- @field_count = Postgres_c.PQnfields(@reader)
50
- i = 0
51
- while(i < @field_count)
52
- @field_types.push(Postgres_c.PQftype(@reader, i))
53
- @fields.push(Postgres_c.PQfname(@reader, i))
54
- i += 1
55
- end
56
- @rows = Postgres_c.PQntuples(@reader)
57
- @has_rows = @rows > 0
58
- @cursor = 0
59
- @state = STATE_OPEN
60
- end
61
- end
62
-
63
- def real_close
64
- Postgres_c.PQclear(@reader)
65
- end
66
-
67
- def data_type_name(col)
68
-
69
- end
70
-
71
- def name(col)
72
- super
73
- Postgres_c.PQfname(@reader, col)
74
- end
75
-
76
- def get_index(name)
77
- super
78
- @fields.index(name)
79
- end
80
-
81
- def null?(idx)
82
- super
83
- Postgres_c.PQgetisnull(@reader, @cursor, idx) != 0
84
- end
85
-
86
- def item(idx)
87
- super
88
- val = Postgres_c.PQgetvalue(@reader, @cursor, idx)
89
- typecast(val, @field_types[idx])
90
- end
91
-
92
- def each
93
- return unless has_rows?
94
-
95
- while(true) do
96
- yield
97
- break unless self.next
98
- end
99
- end
100
-
101
- def next
102
- super
103
- if @cursor >= @rows - 1
104
- @cursor = nil
105
- close
106
- return nil
107
- end
108
- @cursor += 1
109
- true
110
- end
111
-
112
- protected
113
- def native_type(col)
114
- TYPES[Postgres_c.PQftype(@reader, col)]
115
- end
116
-
117
- def typecast(val, field_type)
118
- return nil if val.nil?
119
- case TYPES[field_type]
120
- when "BOOL"
121
- val == "t"
122
- when "INT2", "INT4", "OID", "TID", "XID", "CID", "INT8"
123
- val.to_i
124
- when "FLOAT4", "FLOAT8", "NUMERIC", "CASH"
125
- val.to_f
126
- when "TIMESTAMP", "TIMETZ", "TIMESTAMPTZ"
127
- DateTime.parse(val) rescue nil
128
- when "TIME"
129
- DateTime.parse(val).to_time rescue nil
130
- when "DATE"
131
- Date.parse(val) rescue nil
132
- else
133
- val
134
- end
135
- end
136
-
137
- end
138
-
139
- class ResultData < DataObject::ResultData
140
-
141
- def last_insert_row
142
- @last_insert_row ||= begin
143
- reader = @conn.create_command("select lastval()").execute_reader
144
- reader.item(0).to_i
145
- rescue QueryError
146
- raise NoInsertError, "You tried to get the last inserted row without doing an insert\n#{Postgres_c.PQerrorMessage(@conn.db)}"
147
- ensure
148
- reader and reader.close
149
- end
150
- end
151
-
152
- end
153
-
154
- class Command < DataObject::Command
155
-
156
- def execute_reader(*args)
157
- super
158
- sql = escape_sql(args)
159
- @connection.logger.debug { sql }
160
- ptr = Postgres_c.PQexec(@connection.db, sql)
161
- unless [Postgres_c::PGRES_COMMAND_OK, Postgres_c::PGRES_TUPLES_OK].include?(Postgres_c.PQresultStatus(ptr))
162
- raise QueryError, "Your query failed.\n#{Postgres_c.PQerrorMessage(@connection.db)}QUERY: \"#{sql}\""
163
- else
164
- reader = Reader.new(@connection.db, ptr)
165
- if block_given?
166
- return_value = yield(reader)
167
- reader.close
168
- return_value
169
- else
170
- reader
171
- end
172
- end
173
- end
174
-
175
- def execute_non_query(*args)
176
- super
177
- sql = escape_sql(args)
178
- @connection.logger.debug { sql }
179
- results = Postgres_c.PQexec(@connection.db, sql)
180
- status = Postgres_c.PQresultStatus(results)
181
- if status == Postgres_c::PGRES_TUPLES_OK
182
- Postgres_c.PQclear(results)
183
- raise QueryError, "Your query failed or you tried to execute a SELECT query through execute_non_reader\n#{Postgres_c.PQerrorMessage(@connection.db)}\nQUERY: \"#{sql}\""
184
- elsif status != Postgres_c::PGRES_COMMAND_OK
185
- Postgres_c.PQclear(results)
186
- raise QueryError, "Your query failed.\n#{Postgres_c.PQerrorMessage(@connection.db)}\nQUERY: \"#{sql}\""
187
- end
188
- rows_affected = Postgres_c.PQcmdTuples(results).to_i
189
- Postgres_c.PQclear(results)
190
- ResultData.new(@connection, rows_affected)
191
- end
192
-
193
- end
194
-
195
- end
196
- end
@@ -1,157 +0,0 @@
1
- require 'sqlite3_c'
2
- require 'do'
3
-
4
- module DataObject
5
- module Sqlite3
6
-
7
- QUOTE_STRING = "\""
8
- QUOTE_COLUMN = "'"
9
-
10
- class Connection < DataObject::Connection
11
-
12
- attr_reader :db
13
-
14
- def initialize(connection_string)
15
- @state = STATE_CLOSED
16
- @connection_string = connection_string
17
- @conn = Hash[*connection_string.split(" ").map {|x| x.split("=")}.flatten]["dbname"]
18
- end
19
-
20
- def open
21
- r, d = Sqlite3_c.sqlite3_open(@conn)
22
- unless r == Sqlite3_c::SQLITE_OK
23
- raise ConnectionFailed, "The connection with connection string #{@connection_string} failed\n#{Sqlite3_c.sqlite3_errmsg(d)}"
24
- else
25
- @db = d
26
- end
27
- @state = STATE_OPEN
28
- true
29
- end
30
-
31
- def close
32
- Sqlite3_c.sqlite3_close(@db)
33
- @state = STATE_CLOSED
34
- true
35
- end
36
-
37
- def create_command(text)
38
- logger.debug { text }
39
- Command.new(self, text)
40
- end
41
-
42
- end
43
-
44
- class Reader < DataObject::Reader
45
-
46
- def initialize(db, reader)
47
- @reader = reader
48
- result = Sqlite3_c.sqlite3_step(reader)
49
- rows_affected, field_count = Sqlite3_c.sqlite3_changes(db), Sqlite3_c.sqlite3_column_count(reader)
50
- if field_count == 0
51
- @records_affected = rows_affected
52
- close
53
- else
54
- @field_count = field_count
55
- @fields, @field_types = [], []
56
- i = 0
57
- while(i < @field_count)
58
- @field_types.push(Sqlite3_c.sqlite3_column_type(reader, i))
59
- @fields.push(Sqlite3_c.sqlite3_column_name(reader, i))
60
- i += 1
61
- end
62
- case result
63
- when Sqlite3_c::SQLITE_BUSY, Sqlite3_c::SQLITE_ERROR, Sqlite3_c::SQLITE_MISUSE
64
- raise ReaderError, "An error occurred while trying to get the next row\n#{Sqlite3_c.sqlite3_errmsg(db)}"
65
- else
66
- @has_rows = result == Sqlite3_c::SQLITE_ROW
67
- @state = STATE_OPEN
68
- close unless @has_rows
69
- end
70
- end
71
- end
72
-
73
- def real_close
74
- Sqlite3_c.sqlite3_finalize(@reader)
75
- end
76
-
77
- def name(idx)
78
- super
79
- @fields[idx]
80
- end
81
-
82
- def get_index(name)
83
- super
84
- @fields.index(name)
85
- end
86
-
87
- def null?(idx)
88
- super
89
- item(idx).nil?
90
- end
91
-
92
- def item(idx)
93
- super
94
- case @field_types[idx]
95
- when 1 # SQLITE_INTEGER
96
- Sqlite3_c.sqlite3_column_int(@reader, idx).to_i
97
- when 2 # SQLITE_FLOAT
98
- Sqlite3_c.sqlite3_column_double(@reader, idx)
99
- else
100
- Sqlite3_c.sqlite3_column_text(@reader, idx)
101
- end
102
- end
103
-
104
- def each
105
- return unless has_rows?
106
-
107
- while(true) do
108
- yield
109
- break unless Sqlite3_c.sqlite3_step(@reader) == Sqlite3_c::SQLITE_ROW
110
- end
111
- end
112
-
113
- end
114
-
115
- class Command < DataObject::Command
116
-
117
- def execute_reader(*args)
118
- super
119
- sql = escape_sql(args)
120
- result, ptr = Sqlite3_c.sqlite3_prepare_v2(@connection.db, sql, sql.size + 1)
121
- unless result == Sqlite3_c::SQLITE_OK
122
- raise QueryError, "Your query failed.\n#{Sqlite3_c.sqlite3_errmsg(@connection.db)}\nQUERY: \"#{sql}\""
123
- else
124
- reader = Reader.new(@connection.db, ptr)
125
-
126
- if block_given?
127
- return_value = yield(reader)
128
- reader.close
129
- return_value
130
- else
131
- reader
132
- end
133
- end
134
- end
135
-
136
- def execute_non_query(*args)
137
- super
138
- sql = escape_sql(args)
139
- result, reader = Sqlite3_c.sqlite3_prepare_v2(@connection.db, sql, -1)
140
- unless result == Sqlite3_c::SQLITE_OK
141
- Sqlite3_c.sqlite3_finalize(reader)
142
- raise QueryError, "Your query failed.\n#{Sqlite3_c.sqlite3_errmsg(@connection.db)}\nQUERY: \"#{sql}\""
143
- else
144
- exec_result = Sqlite3_c.sqlite3_step(reader)
145
- Sqlite3_c.sqlite3_finalize(reader)
146
- if exec_result == Sqlite3_c::SQLITE_DONE
147
- ResultData.new(@connection, Sqlite3_c.sqlite3_changes(@connection.db), Sqlite3_c.sqlite3_last_insert_rowid(@connection.db))
148
- else
149
- raise QueryError, "Your query failed or you tried to execute a SELECT query through execute_non_reader\n#{Sqlite3_c.sqlite3_errmsg(@connection.db)}\nQUERY: \"#{@text}\""
150
- end
151
- end
152
- end
153
-
154
- end
155
-
156
- end
157
- end
@@ -1,150 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
-
3
- describe "Connectable", :shared => true do
4
- before :each do
5
- @c = $adapter_module::Connection.new($connection_string)
6
- @c.open
7
- end
8
-
9
- after :each do
10
- @c.close
11
- end
12
- end
13
-
14
- describe "DO::Connection" do
15
- it_should_behave_like "Connectable"
16
-
17
- it "should be able to be opened" do
18
- @c.should be_is_a($adapter_module::Connection)
19
- @c.state.should == 0
20
- end
21
-
22
- it "should be able to create a related command" do
23
- @c.open
24
- cmd = @c.create_command("select * from table1")
25
- cmd.connection.should == @c
26
- end
27
-
28
- end
29
-
30
- describe "DO::Command" do
31
- it_should_behave_like "Connectable"
32
-
33
- def delete_3
34
- cmd = @c.create_command("DELETE from table1 where id > 2")
35
- cmd.execute_non_query
36
- end
37
-
38
- it "should be able to be executed if it's a select" do
39
- cmd = @c.create_command("select * from table1")
40
- r = cmd.execute_reader
41
- r.has_rows?.should be_true
42
- r.close
43
- end
44
-
45
- it "should be able to be executed if it's not a select" do
46
- begin
47
- cmd = @c.create_command("INSERT into table1(#{$escape}int#{$escape}) VALUES(7)")
48
- result = cmd.execute_non_query
49
- result.to_i.should == 1
50
- result.class.to_s.should include("ResultData")
51
- result.last_insert_row.should == 3
52
- ensure
53
- delete_3
54
- end
55
- end
56
-
57
- it "should throw an error if a select is passed to execute_non_query" do
58
- cmd = @c.create_command("SELECT * from table1")
59
- lambda { cmd.execute_non_query }.should raise_error(DataObject::QueryError)
60
- end
61
-
62
- it "should immediately close the reader and populate records_affected if a modification is passed to execute_reader" do
63
- if $adapter_module.to_s == "DataObject::Postgres"
64
- cmd = @c.create_command("INSERT into table1(#{$escaped_columns}) VALUES(NULL, now(), false, now(), NULL)")
65
- else
66
- cmd = @c.create_command("INSERT into table1(#{$escaped_columns}) VALUES(NULL, CURRENT_TIME, 0, CURRENT_DATE, NULL)")
67
- end
68
- r = cmd.execute_reader
69
- r.records_affected.should == 1
70
- lambda { r.name(0) }.should raise_error(DataObject::ReaderClosed)
71
- delete_3
72
- end
73
-
74
- end
75
-
76
- describe "DO::Reader" do
77
-
78
- before :each do
79
- @c = $adapter_module::Connection.new($connection_string)
80
- @c.open
81
- cmd = @c.create_command("select * from table1")
82
- @r = cmd.execute_reader
83
- end
84
-
85
- after :each do
86
- @c.close
87
- end
88
-
89
- it "should be able to get the field count" do
90
- @r.field_count.should == 6
91
- end
92
-
93
- it "should be able to get field names" do
94
- @r.name(0).should == "id"
95
- @r.name(1).should == "int"
96
- @r.name(2).should == "time"
97
- @r.name(3).should == "bool"
98
- @r.name(4).should == "date"
99
- @r.name(5).should == "str"
100
- @r.name(6).should == nil
101
- end
102
-
103
- it "should be able to get field indexes" do
104
- @r.get_index("id").should == 0
105
- @r.get_index("int").should == 1
106
- @r.get_index("time").should == 2
107
- @r.get_index("bool").should == 3
108
- @r.get_index("date").should == 4
109
- @r.get_index("foo").should == nil
110
- end
111
-
112
- it "should be able to determine whether a particular field is null" do
113
- @r.null?(0).should == false
114
- @r.null?(1).should == true
115
- end
116
-
117
- it "should be able to get a typecasted version of a particular field" do
118
- case $adapter_module.to_s
119
- when "DataObject::Sqlite3"
120
- @r.item(0).should == 1
121
- @r.item(1).should == nil
122
- @r.item(2).class.should == String
123
- @r.item(3).should == 0
124
- @r.item(4).class.should == String
125
- when "DataObject::Mysql"
126
- @r.item(0).should == 1
127
- @r.item(1).should == nil
128
- @r.item(2).class.should == DateTime
129
- @r.item(3).should == false
130
- @r.item(4).class.should == Date
131
- end
132
- end
133
-
134
- it "should allow the use of the object being returned even after the reader is closed" do
135
- val = @r.item(5)
136
- val.should == "foo"
137
- end
138
-
139
- it "should be able to get to the next row" do
140
- @r.next.should == true
141
- @r.item(0).should == 2
142
- end
143
-
144
- it "should return nil and close the reader when the cursor reaches the end" do
145
- @r.next
146
- @r.next.should == nil
147
- lambda { @r.name(0) }.should raise_error(DataObject::ReaderClosed)
148
- end
149
-
150
- end
@@ -1,81 +0,0 @@
1
- require 'spec'
2
- $:.push File.join(File.dirname(__FILE__), '..')
3
- require 'do'
4
-
5
- adapter = (ENV["ADAPTER"] || "sqlite3").dup
6
-
7
- require "do_#{adapter}"
8
-
9
- adapter_module = adapter.dup
10
- adapter_module[0] = adapter_module[0].chr.upcase
11
- $adapter_module = DataObject.const_get(adapter_module)
12
-
13
- $connection_string = case adapter
14
- when "sqlite3"
15
- "dbname=do_rb"
16
- when "mysql"
17
- "socket=/tmp/mysql.sock user=root dbname=do_rb"
18
- when "postgres"
19
- "dbname=do_rb"
20
- end
21
-
22
- $escape = $adapter_module::QUOTE_COLUMN
23
- $escaped_columns = ["int", "time", "bool", "date", "str"].map {|x| "#{$escape}#{x}#{$escape}"}.join(", ")
24
- $quote = quote = $adapter_module::QUOTE_STRING
25
-
26
- begin
27
- c = $adapter_module::Connection.new($connection_string)
28
- c.open
29
- cmd = c.create_command("DROP TABLE table1")
30
- cmd.execute_non_query rescue nil
31
- if adapter == "mysql"
32
- sql = <<-SQL
33
- CREATE TABLE table1 (
34
- `id` serial NOT NULL,
35
- `int` int(11) default NULL,
36
- `time` timestamp,
37
- `bool` tinyint(1) default NULL,
38
- `date` date default NULL,
39
- `str` varchar(20) default NULL,
40
- PRIMARY KEY (`id`)
41
- );
42
- SQL
43
- elsif adapter == "sqlite3"
44
- sql = <<-SQL
45
- CREATE TABLE table1 (
46
- `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT,
47
- `int` int(11) default NULL,
48
- `time` timestamp,
49
- `bool` tinyint(1) default NULL,
50
- `date` date default NULL,
51
- `str` varchar(20) default NULL
52
- );
53
- SQL
54
- elsif adapter == "postgres"
55
- sql = <<-SQL
56
- CREATE TABLE table1 (
57
- "id" serial NOT NULL,
58
- "int" integer default NULL,
59
- "time" timestamp,
60
- "bool" boolean default NULL,
61
- "date" date default NULL,
62
- "str" varchar(20) default NULL,
63
- PRIMARY KEY ("id")
64
- );
65
- SQL
66
- end
67
- cmd2 = c.create_command(sql)
68
- cmd2.execute_non_query
69
- insert1 = adapter == "postgres" ?
70
- "INSERT into table1(#{$escaped_columns}) VALUES(NULL, #{quote}#{Time.now.to_s_db}#{quote}, false, #{quote}#{Date.today.to_s}#{quote}, #{quote}foo#{quote})" :
71
- "INSERT into table1(#{$escaped_columns}) VALUES(NULL, #{quote}#{Time.now.to_s_db}#{quote}, 0, #{quote}#{Date.today.to_s}#{quote}, #{quote}foo#{quote})"
72
- cmd3 = c.create_command(insert1)
73
- cmd3.execute_non_query
74
- insert2 = adapter == "postgres" ?
75
- "INSERT into table1(#{$escaped_columns}) VALUES(17, #{quote}#{Time.now.to_s_db}#{quote}, true, NULL, NULL)" :
76
- "INSERT into table1(#{$escaped_columns}) VALUES(17, #{quote}#{Time.now.to_s_db}#{quote}, 1, NULL, NULL)"
77
- cmd4 = c.create_command(insert2)
78
- cmd4.execute_non_query
79
- ensure
80
- c.close if defined?(c) && c
81
- end
@@ -1,45 +0,0 @@
1
- require 'mkmf'
2
- require 'open3'
3
-
4
- def config_value(type)
5
- ENV["MYSQL_#{type.upcase}"] || mysql_config(type)
6
- end
7
-
8
- def mysql_config(type)
9
-
10
- sin, sout, serr = Open3.popen3("mysql_config5 --#{type}")
11
-
12
- unless serr.read.empty?
13
- sin, sout, serr = Open3.popen3("mysql_config --#{type}")
14
- end
15
-
16
- unless serr.read.empty?
17
- raise "mysql_config not found"
18
- end
19
-
20
- sout.readline.chomp[2..-1]
21
- end
22
-
23
- $inc, $lib = dir_config('mysql', config_value('include'), config_value('libs_r'))
24
-
25
- def have_build_env
26
- libs = ['m', 'z', 'socket', 'nsl']
27
- while not find_library('mysqlclient', 'mysql_query', config_value('libs'), $lib, "#{$lib}/mysql") do
28
- exit 1 if libs.empty?
29
- have_library(libs.shift)
30
- end
31
- true
32
- # have_header('mysql.h')
33
- end
34
-
35
- required_libraries = [] #%w(m z socket nsl)
36
- desired_functions = %w(mysql_ssl_set)
37
- # compat_functions = %w(PQescapeString PQexecParams)
38
-
39
- if have_build_env
40
- $CFLAGS << ' -Wall '
41
- dir_config("mysql_c")
42
- create_makefile("mysql_c")
43
- else
44
- puts 'Could not find MySQL build environment (libraries & headers): Makefile not created'
45
- end