activerecord 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (378) hide show
  1. data/CHANGELOG +105 -34
  2. data/examples/performance.rb +3 -39
  3. data/examples/simple.rb +14 -0
  4. data/lib/active_record.rb +81 -47
  5. data/lib/active_record/aggregations.rb +1 -3
  6. data/lib/active_record/association_preload.rb +39 -54
  7. data/lib/active_record/associations.rb +262 -419
  8. data/lib/active_record/associations/association_collection.rb +85 -100
  9. data/lib/active_record/associations/association_proxy.rb +20 -18
  10. data/lib/active_record/associations/belongs_to_association.rb +8 -8
  11. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +13 -35
  12. data/lib/active_record/associations/has_many_association.rb +11 -19
  13. data/lib/active_record/associations/has_many_through_association.rb +30 -183
  14. data/lib/active_record/associations/has_one_association.rb +10 -10
  15. data/lib/active_record/associations/has_one_through_association.rb +13 -11
  16. data/lib/active_record/associations/through_association_scope.rb +153 -0
  17. data/lib/active_record/attribute_methods.rb +17 -370
  18. data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
  19. data/lib/active_record/attribute_methods/dirty.rb +87 -0
  20. data/lib/active_record/attribute_methods/primary_key.rb +44 -0
  21. data/lib/active_record/attribute_methods/query.rb +37 -0
  22. data/lib/active_record/attribute_methods/read.rb +116 -0
  23. data/lib/active_record/attribute_methods/time_zone_conversion.rb +60 -0
  24. data/lib/active_record/attribute_methods/write.rb +37 -0
  25. data/lib/active_record/autosave_association.rb +20 -41
  26. data/lib/active_record/base.rb +357 -1180
  27. data/lib/active_record/batches.rb +10 -16
  28. data/lib/active_record/callbacks.rb +66 -126
  29. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +17 -13
  30. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +5 -25
  31. data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -43
  32. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -2
  33. data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -4
  34. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
  35. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +18 -72
  36. data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -49
  37. data/lib/active_record/connection_adapters/mysql_adapter.rb +15 -27
  38. data/lib/active_record/connection_adapters/postgresql_adapter.rb +84 -46
  39. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +9 -3
  40. data/lib/active_record/connection_adapters/sqlite_adapter.rb +34 -65
  41. data/lib/active_record/fixtures.rb +21 -25
  42. data/lib/active_record/locale/en.yml +9 -27
  43. data/lib/active_record/locking/optimistic.rb +16 -48
  44. data/lib/active_record/migration.rb +59 -46
  45. data/lib/active_record/named_scope.rb +85 -92
  46. data/lib/active_record/nested_attributes.rb +18 -24
  47. data/lib/active_record/observer.rb +18 -94
  48. data/lib/active_record/railtie.rb +83 -0
  49. data/lib/active_record/railties/controller_runtime.rb +38 -0
  50. data/lib/active_record/railties/databases.rake +477 -0
  51. data/lib/active_record/railties/subscriber.rb +27 -0
  52. data/lib/active_record/reflection.rb +2 -15
  53. data/lib/active_record/relation.rb +339 -0
  54. data/lib/active_record/relation/calculations.rb +259 -0
  55. data/lib/active_record/relation/finder_methods.rb +315 -0
  56. data/lib/active_record/relation/predicate_builder.rb +46 -0
  57. data/lib/active_record/relation/query_methods.rb +218 -0
  58. data/lib/active_record/relation/spawn_methods.rb +102 -0
  59. data/lib/active_record/schema_dumper.rb +10 -6
  60. data/lib/active_record/serialization.rb +31 -74
  61. data/lib/active_record/serializers/xml_serializer.rb +33 -121
  62. data/lib/active_record/session_store.rb +1 -9
  63. data/lib/active_record/test_case.rb +1 -3
  64. data/lib/active_record/timestamp.rb +7 -5
  65. data/lib/active_record/transactions.rb +9 -9
  66. data/lib/active_record/validations.rb +51 -1100
  67. data/lib/active_record/validations/associated.rb +47 -0
  68. data/lib/active_record/validations/uniqueness.rb +181 -0
  69. data/lib/active_record/version.rb +3 -3
  70. data/lib/generators/active_record.rb +30 -0
  71. data/lib/generators/active_record/migration/migration_generator.rb +25 -0
  72. data/lib/generators/active_record/migration/templates/migration.rb +11 -0
  73. data/lib/generators/active_record/model/model_generator.rb +33 -0
  74. data/lib/generators/active_record/model/templates/migration.rb +16 -0
  75. data/lib/generators/active_record/model/templates/model.rb +5 -0
  76. data/lib/generators/active_record/observer/observer_generator.rb +15 -0
  77. data/lib/generators/active_record/observer/templates/observer.rb +2 -0
  78. data/lib/generators/active_record/session_migration/session_migration_generator.rb +24 -0
  79. data/lib/generators/active_record/session_migration/templates/migration.rb +16 -0
  80. metadata +67 -325
  81. data/RUNNING_UNIT_TESTS +0 -36
  82. data/Rakefile +0 -268
  83. data/install.rb +0 -30
  84. data/lib/active_record/calculations.rb +0 -321
  85. data/lib/active_record/connection_adapters/abstract/database_limits.rb +0 -57
  86. data/lib/active_record/dirty.rb +0 -183
  87. data/lib/active_record/serializers/json_serializer.rb +0 -91
  88. data/lib/activerecord.rb +0 -2
  89. data/test/assets/example.log +0 -1
  90. data/test/assets/flowers.jpg +0 -0
  91. data/test/cases/aaa_create_tables_test.rb +0 -24
  92. data/test/cases/active_schema_test_mysql.rb +0 -122
  93. data/test/cases/active_schema_test_postgresql.rb +0 -24
  94. data/test/cases/adapter_test.rb +0 -144
  95. data/test/cases/aggregations_test.rb +0 -167
  96. data/test/cases/ar_schema_test.rb +0 -32
  97. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  98. data/test/cases/associations/callbacks_test.rb +0 -161
  99. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  100. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  101. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  102. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  103. data/test/cases/associations/eager_singularization_test.rb +0 -145
  104. data/test/cases/associations/eager_test.rb +0 -852
  105. data/test/cases/associations/extension_test.rb +0 -62
  106. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  107. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  108. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  109. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  110. data/test/cases/associations/has_one_associations_test.rb +0 -330
  111. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  112. data/test/cases/associations/inner_join_association_test.rb +0 -93
  113. data/test/cases/associations/inverse_associations_test.rb +0 -566
  114. data/test/cases/associations/join_model_test.rb +0 -712
  115. data/test/cases/associations_test.rb +0 -282
  116. data/test/cases/attribute_methods_test.rb +0 -305
  117. data/test/cases/autosave_association_test.rb +0 -1218
  118. data/test/cases/base_test.rb +0 -2166
  119. data/test/cases/batches_test.rb +0 -81
  120. data/test/cases/binary_test.rb +0 -30
  121. data/test/cases/calculations_test.rb +0 -360
  122. data/test/cases/callbacks_observers_test.rb +0 -38
  123. data/test/cases/callbacks_test.rb +0 -438
  124. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  125. data/test/cases/column_alias_test.rb +0 -17
  126. data/test/cases/column_definition_test.rb +0 -70
  127. data/test/cases/connection_pool_test.rb +0 -25
  128. data/test/cases/connection_test_firebird.rb +0 -8
  129. data/test/cases/connection_test_mysql.rb +0 -65
  130. data/test/cases/copy_table_test_sqlite.rb +0 -80
  131. data/test/cases/counter_cache_test.rb +0 -84
  132. data/test/cases/database_statements_test.rb +0 -12
  133. data/test/cases/datatype_test_postgresql.rb +0 -204
  134. data/test/cases/date_time_test.rb +0 -37
  135. data/test/cases/default_test_firebird.rb +0 -16
  136. data/test/cases/defaults_test.rb +0 -111
  137. data/test/cases/deprecated_finder_test.rb +0 -30
  138. data/test/cases/dirty_test.rb +0 -316
  139. data/test/cases/finder_respond_to_test.rb +0 -76
  140. data/test/cases/finder_test.rb +0 -1098
  141. data/test/cases/fixtures_test.rb +0 -661
  142. data/test/cases/helper.rb +0 -68
  143. data/test/cases/i18n_test.rb +0 -46
  144. data/test/cases/inheritance_test.rb +0 -262
  145. data/test/cases/invalid_date_test.rb +0 -24
  146. data/test/cases/json_serialization_test.rb +0 -219
  147. data/test/cases/lifecycle_test.rb +0 -193
  148. data/test/cases/locking_test.rb +0 -350
  149. data/test/cases/method_scoping_test.rb +0 -704
  150. data/test/cases/migration_test.rb +0 -1649
  151. data/test/cases/migration_test_firebird.rb +0 -124
  152. data/test/cases/mixin_test.rb +0 -96
  153. data/test/cases/modules_test.rb +0 -109
  154. data/test/cases/multiple_db_test.rb +0 -85
  155. data/test/cases/named_scope_test.rb +0 -372
  156. data/test/cases/nested_attributes_test.rb +0 -840
  157. data/test/cases/pk_test.rb +0 -119
  158. data/test/cases/pooled_connections_test.rb +0 -103
  159. data/test/cases/query_cache_test.rb +0 -129
  160. data/test/cases/readonly_test.rb +0 -107
  161. data/test/cases/reflection_test.rb +0 -234
  162. data/test/cases/reload_models_test.rb +0 -22
  163. data/test/cases/repair_helper.rb +0 -50
  164. data/test/cases/reserved_word_test_mysql.rb +0 -176
  165. data/test/cases/sanitize_test.rb +0 -25
  166. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  167. data/test/cases/schema_dumper_test.rb +0 -211
  168. data/test/cases/schema_test_postgresql.rb +0 -178
  169. data/test/cases/serialization_test.rb +0 -47
  170. data/test/cases/sp_test_mysql.rb +0 -16
  171. data/test/cases/synonym_test_oracle.rb +0 -17
  172. data/test/cases/timestamp_test.rb +0 -75
  173. data/test/cases/transactions_test.rb +0 -543
  174. data/test/cases/unconnected_test.rb +0 -32
  175. data/test/cases/validations_i18n_test.rb +0 -925
  176. data/test/cases/validations_test.rb +0 -1684
  177. data/test/cases/xml_serialization_test.rb +0 -240
  178. data/test/cases/yaml_serialization_test.rb +0 -11
  179. data/test/config.rb +0 -5
  180. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  181. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  182. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  183. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  184. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  185. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  186. data/test/connections/native_db2/connection.rb +0 -25
  187. data/test/connections/native_firebird/connection.rb +0 -26
  188. data/test/connections/native_frontbase/connection.rb +0 -27
  189. data/test/connections/native_mysql/connection.rb +0 -25
  190. data/test/connections/native_openbase/connection.rb +0 -21
  191. data/test/connections/native_oracle/connection.rb +0 -27
  192. data/test/connections/native_postgresql/connection.rb +0 -21
  193. data/test/connections/native_sqlite/connection.rb +0 -25
  194. data/test/connections/native_sqlite3/connection.rb +0 -25
  195. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  196. data/test/connections/native_sybase/connection.rb +0 -23
  197. data/test/fixtures/accounts.yml +0 -29
  198. data/test/fixtures/all/developers.yml +0 -0
  199. data/test/fixtures/all/people.csv +0 -0
  200. data/test/fixtures/all/tasks.yml +0 -0
  201. data/test/fixtures/author_addresses.yml +0 -5
  202. data/test/fixtures/author_favorites.yml +0 -4
  203. data/test/fixtures/authors.yml +0 -9
  204. data/test/fixtures/binaries.yml +0 -132
  205. data/test/fixtures/books.yml +0 -7
  206. data/test/fixtures/categories.yml +0 -14
  207. data/test/fixtures/categories/special_categories.yml +0 -9
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  209. data/test/fixtures/categories_ordered.yml +0 -7
  210. data/test/fixtures/categories_posts.yml +0 -23
  211. data/test/fixtures/categorizations.yml +0 -17
  212. data/test/fixtures/clubs.yml +0 -6
  213. data/test/fixtures/comments.yml +0 -59
  214. data/test/fixtures/companies.yml +0 -56
  215. data/test/fixtures/computers.yml +0 -4
  216. data/test/fixtures/courses.yml +0 -7
  217. data/test/fixtures/customers.yml +0 -26
  218. data/test/fixtures/developers.yml +0 -21
  219. data/test/fixtures/developers_projects.yml +0 -17
  220. data/test/fixtures/edges.yml +0 -6
  221. data/test/fixtures/entrants.yml +0 -14
  222. data/test/fixtures/faces.yml +0 -11
  223. data/test/fixtures/fk_test_has_fk.yml +0 -3
  224. data/test/fixtures/fk_test_has_pk.yml +0 -2
  225. data/test/fixtures/funny_jokes.yml +0 -10
  226. data/test/fixtures/interests.yml +0 -33
  227. data/test/fixtures/items.yml +0 -4
  228. data/test/fixtures/jobs.yml +0 -7
  229. data/test/fixtures/legacy_things.yml +0 -3
  230. data/test/fixtures/mateys.yml +0 -4
  231. data/test/fixtures/member_types.yml +0 -6
  232. data/test/fixtures/members.yml +0 -6
  233. data/test/fixtures/memberships.yml +0 -20
  234. data/test/fixtures/men.yml +0 -5
  235. data/test/fixtures/minimalistics.yml +0 -2
  236. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  237. data/test/fixtures/mixins.yml +0 -29
  238. data/test/fixtures/movies.yml +0 -7
  239. data/test/fixtures/naked/csv/accounts.csv +0 -1
  240. data/test/fixtures/naked/yml/accounts.yml +0 -1
  241. data/test/fixtures/naked/yml/companies.yml +0 -1
  242. data/test/fixtures/naked/yml/courses.yml +0 -1
  243. data/test/fixtures/organizations.yml +0 -5
  244. data/test/fixtures/owners.yml +0 -7
  245. data/test/fixtures/parrots.yml +0 -27
  246. data/test/fixtures/parrots_pirates.yml +0 -7
  247. data/test/fixtures/people.yml +0 -15
  248. data/test/fixtures/pets.yml +0 -14
  249. data/test/fixtures/pirates.yml +0 -9
  250. data/test/fixtures/polymorphic_designs.yml +0 -19
  251. data/test/fixtures/polymorphic_prices.yml +0 -19
  252. data/test/fixtures/posts.yml +0 -52
  253. data/test/fixtures/price_estimates.yml +0 -7
  254. data/test/fixtures/projects.yml +0 -7
  255. data/test/fixtures/readers.yml +0 -9
  256. data/test/fixtures/references.yml +0 -17
  257. data/test/fixtures/reserved_words/distinct.yml +0 -5
  258. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  259. data/test/fixtures/reserved_words/group.yml +0 -14
  260. data/test/fixtures/reserved_words/select.yml +0 -8
  261. data/test/fixtures/reserved_words/values.yml +0 -7
  262. data/test/fixtures/ships.yml +0 -5
  263. data/test/fixtures/sponsors.yml +0 -9
  264. data/test/fixtures/subscribers.yml +0 -7
  265. data/test/fixtures/subscriptions.yml +0 -12
  266. data/test/fixtures/taggings.yml +0 -28
  267. data/test/fixtures/tags.yml +0 -7
  268. data/test/fixtures/tasks.yml +0 -7
  269. data/test/fixtures/tees.yml +0 -4
  270. data/test/fixtures/ties.yml +0 -4
  271. data/test/fixtures/topics.yml +0 -42
  272. data/test/fixtures/toys.yml +0 -4
  273. data/test/fixtures/treasures.yml +0 -10
  274. data/test/fixtures/vertices.yml +0 -4
  275. data/test/fixtures/warehouse-things.yml +0 -3
  276. data/test/fixtures/zines.yml +0 -5
  277. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  278. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  279. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  280. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  281. data/test/migrations/duplicate/3_foo.rb +0 -7
  282. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  283. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  284. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  285. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  286. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  287. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  288. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  289. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  290. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  291. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  292. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  293. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  294. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  295. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  296. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  297. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  298. data/test/models/author.rb +0 -151
  299. data/test/models/auto_id.rb +0 -4
  300. data/test/models/binary.rb +0 -2
  301. data/test/models/bird.rb +0 -9
  302. data/test/models/book.rb +0 -4
  303. data/test/models/categorization.rb +0 -5
  304. data/test/models/category.rb +0 -34
  305. data/test/models/citation.rb +0 -6
  306. data/test/models/club.rb +0 -13
  307. data/test/models/column_name.rb +0 -3
  308. data/test/models/comment.rb +0 -29
  309. data/test/models/company.rb +0 -173
  310. data/test/models/company_in_module.rb +0 -78
  311. data/test/models/computer.rb +0 -3
  312. data/test/models/contact.rb +0 -16
  313. data/test/models/contract.rb +0 -5
  314. data/test/models/course.rb +0 -3
  315. data/test/models/customer.rb +0 -73
  316. data/test/models/default.rb +0 -2
  317. data/test/models/developer.rb +0 -101
  318. data/test/models/edge.rb +0 -5
  319. data/test/models/entrant.rb +0 -3
  320. data/test/models/essay.rb +0 -3
  321. data/test/models/event.rb +0 -3
  322. data/test/models/event_author.rb +0 -8
  323. data/test/models/face.rb +0 -7
  324. data/test/models/guid.rb +0 -2
  325. data/test/models/interest.rb +0 -5
  326. data/test/models/invoice.rb +0 -4
  327. data/test/models/item.rb +0 -7
  328. data/test/models/job.rb +0 -5
  329. data/test/models/joke.rb +0 -3
  330. data/test/models/keyboard.rb +0 -3
  331. data/test/models/legacy_thing.rb +0 -3
  332. data/test/models/line_item.rb +0 -3
  333. data/test/models/man.rb +0 -9
  334. data/test/models/matey.rb +0 -4
  335. data/test/models/member.rb +0 -12
  336. data/test/models/member_detail.rb +0 -5
  337. data/test/models/member_type.rb +0 -3
  338. data/test/models/membership.rb +0 -9
  339. data/test/models/minimalistic.rb +0 -2
  340. data/test/models/mixed_case_monkey.rb +0 -3
  341. data/test/models/movie.rb +0 -5
  342. data/test/models/order.rb +0 -4
  343. data/test/models/organization.rb +0 -6
  344. data/test/models/owner.rb +0 -5
  345. data/test/models/parrot.rb +0 -22
  346. data/test/models/person.rb +0 -16
  347. data/test/models/pet.rb +0 -5
  348. data/test/models/pirate.rb +0 -80
  349. data/test/models/polymorphic_design.rb +0 -3
  350. data/test/models/polymorphic_price.rb +0 -3
  351. data/test/models/post.rb +0 -102
  352. data/test/models/price_estimate.rb +0 -3
  353. data/test/models/project.rb +0 -30
  354. data/test/models/reader.rb +0 -4
  355. data/test/models/reference.rb +0 -4
  356. data/test/models/reply.rb +0 -46
  357. data/test/models/ship.rb +0 -19
  358. data/test/models/ship_part.rb +0 -7
  359. data/test/models/sponsor.rb +0 -4
  360. data/test/models/subject.rb +0 -4
  361. data/test/models/subscriber.rb +0 -8
  362. data/test/models/subscription.rb +0 -4
  363. data/test/models/tag.rb +0 -7
  364. data/test/models/tagging.rb +0 -10
  365. data/test/models/task.rb +0 -3
  366. data/test/models/tee.rb +0 -4
  367. data/test/models/tie.rb +0 -4
  368. data/test/models/topic.rb +0 -80
  369. data/test/models/toy.rb +0 -6
  370. data/test/models/treasure.rb +0 -8
  371. data/test/models/vertex.rb +0 -9
  372. data/test/models/warehouse_thing.rb +0 -5
  373. data/test/models/zine.rb +0 -3
  374. data/test/schema/mysql_specific_schema.rb +0 -31
  375. data/test/schema/postgresql_specific_schema.rb +0 -114
  376. data/test/schema/schema.rb +0 -550
  377. data/test/schema/schema2.rb +0 -6
  378. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -1,57 +0,0 @@
1
- module ActiveRecord
2
- module ConnectionAdapters # :nodoc:
3
- module DatabaseLimits
4
-
5
- # the maximum length of a table alias
6
- def table_alias_length
7
- 255
8
- end
9
-
10
- # the maximum length of a column name
11
- def column_name_length
12
- 64
13
- end
14
-
15
- # the maximum length of a table name
16
- def table_name_length
17
- 64
18
- end
19
-
20
- # the maximum length of an index name
21
- def index_name_length
22
- 64
23
- end
24
-
25
- # the maximum number of columns per table
26
- def columns_per_table
27
- 1024
28
- end
29
-
30
- # the maximum number of indexes per table
31
- def indexes_per_table
32
- 16
33
- end
34
-
35
- # the maximum number of columns in a multicolumn index
36
- def columns_per_multicolumn_index
37
- 16
38
- end
39
-
40
- # the maximum number of elements in an IN (x,y,z) clause
41
- def in_clause_length
42
- 65535
43
- end
44
-
45
- # the maximum length of a SQL query
46
- def sql_query_length
47
- 1048575
48
- end
49
-
50
- # maximum number of joins in a single query
51
- def joins_per_query
52
- 256
53
- end
54
-
55
- end
56
- end
57
- end
@@ -1,183 +0,0 @@
1
- module ActiveRecord
2
- # Track unsaved attribute changes.
3
- #
4
- # A newly instantiated object is unchanged:
5
- # person = Person.find_by_name('uncle bob')
6
- # person.changed? # => false
7
- #
8
- # Change the name:
9
- # person.name = 'Bob'
10
- # person.changed? # => true
11
- # person.name_changed? # => true
12
- # person.name_was # => 'uncle bob'
13
- # person.name_change # => ['uncle bob', 'Bob']
14
- # person.name = 'Bill'
15
- # person.name_change # => ['uncle bob', 'Bill']
16
- #
17
- # Save the changes:
18
- # person.save
19
- # person.changed? # => false
20
- # person.name_changed? # => false
21
- #
22
- # Assigning the same value leaves the attribute unchanged:
23
- # person.name = 'Bill'
24
- # person.name_changed? # => false
25
- # person.name_change # => nil
26
- #
27
- # Which attributes have changed?
28
- # person.name = 'bob'
29
- # person.changed # => ['name']
30
- # person.changes # => { 'name' => ['Bill', 'bob'] }
31
- #
32
- # Before modifying an attribute in-place:
33
- # person.name_will_change!
34
- # person.name << 'by'
35
- # person.name_change # => ['uncle bob', 'uncle bobby']
36
- module Dirty
37
- DIRTY_SUFFIXES = ['_changed?', '_change', '_will_change!', '_was']
38
-
39
- def self.included(base)
40
- base.attribute_method_suffix *DIRTY_SUFFIXES
41
- base.alias_method_chain :write_attribute, :dirty
42
- base.alias_method_chain :save, :dirty
43
- base.alias_method_chain :save!, :dirty
44
- base.alias_method_chain :update, :dirty
45
- base.alias_method_chain :reload, :dirty
46
-
47
- base.class_attribute :partial_updates
48
- base.partial_updates = true
49
-
50
- base.send(:extend, ClassMethods)
51
- end
52
-
53
- # Do any attributes have unsaved changes?
54
- # person.changed? # => false
55
- # person.name = 'bob'
56
- # person.changed? # => true
57
- def changed?
58
- !changed_attributes.empty?
59
- end
60
-
61
- # List of attributes with unsaved changes.
62
- # person.changed # => []
63
- # person.name = 'bob'
64
- # person.changed # => ['name']
65
- def changed
66
- changed_attributes.keys
67
- end
68
-
69
- # Map of changed attrs => [original value, new value].
70
- # person.changes # => {}
71
- # person.name = 'bob'
72
- # person.changes # => { 'name' => ['bill', 'bob'] }
73
- def changes
74
- changed.inject({}) { |h, attr| h[attr] = attribute_change(attr); h }
75
- end
76
-
77
- # Attempts to +save+ the record and clears changed attributes if successful.
78
- def save_with_dirty(*args) #:nodoc:
79
- if status = save_without_dirty(*args)
80
- changed_attributes.clear
81
- end
82
- status
83
- end
84
-
85
- # Attempts to <tt>save!</tt> the record and clears changed attributes if successful.
86
- def save_with_dirty!(*args) #:nodoc:
87
- status = save_without_dirty!(*args)
88
- changed_attributes.clear
89
- status
90
- end
91
-
92
- # <tt>reload</tt> the record and clears changed attributes.
93
- def reload_with_dirty(*args) #:nodoc:
94
- record = reload_without_dirty(*args)
95
- changed_attributes.clear
96
- record
97
- end
98
-
99
- private
100
- # Map of change <tt>attr => original value</tt>.
101
- def changed_attributes
102
- @changed_attributes ||= {}
103
- end
104
-
105
- # Handle <tt>*_changed?</tt> for +method_missing+.
106
- def attribute_changed?(attr)
107
- changed_attributes.include?(attr)
108
- end
109
-
110
- # Handle <tt>*_change</tt> for +method_missing+.
111
- def attribute_change(attr)
112
- [changed_attributes[attr], __send__(attr)] if attribute_changed?(attr)
113
- end
114
-
115
- # Handle <tt>*_was</tt> for +method_missing+.
116
- def attribute_was(attr)
117
- attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
118
- end
119
-
120
- # Handle <tt>*_will_change!</tt> for +method_missing+.
121
- def attribute_will_change!(attr)
122
- changed_attributes[attr] = clone_attribute_value(:read_attribute, attr)
123
- end
124
-
125
- # Wrap write_attribute to remember original attribute value.
126
- def write_attribute_with_dirty(attr, value)
127
- attr = attr.to_s
128
-
129
- # The attribute already has an unsaved change.
130
- if changed_attributes.include?(attr)
131
- old = changed_attributes[attr]
132
- changed_attributes.delete(attr) unless field_changed?(attr, old, value)
133
- else
134
- old = clone_attribute_value(:read_attribute, attr)
135
- changed_attributes[attr] = old if field_changed?(attr, old, value)
136
- end
137
-
138
- # Carry on.
139
- write_attribute_without_dirty(attr, value)
140
- end
141
-
142
- def update_with_dirty
143
- if partial_updates?
144
- # Serialized attributes should always be written in case they've been
145
- # changed in place.
146
- update_without_dirty(changed | (attributes.keys & self.class.serialized_attributes.keys))
147
- else
148
- update_without_dirty
149
- end
150
- end
151
-
152
- def field_changed?(attr, old, value)
153
- if column = column_for_attribute(attr)
154
- if column.number? && column.null && (old.nil? || old == 0) && value.blank?
155
- # For nullable numeric columns, NULL gets stored in database for blank (i.e. '') values.
156
- # Hence we don't record it as a change if the value changes from nil to ''.
157
- # If an old value of 0 is set to '' we want this to get changed to nil as otherwise it'll
158
- # be typecast back to 0 (''.to_i => 0)
159
- value = nil
160
- else
161
- value = column.type_cast(value)
162
- end
163
- end
164
-
165
- old != value
166
- end
167
-
168
- module ClassMethods
169
- def self.extended(base)
170
- base.singleton_class.alias_method_chain(:alias_attribute, :dirty)
171
- end
172
-
173
- def alias_attribute_with_dirty(new_name, old_name)
174
- alias_attribute_without_dirty(new_name, old_name)
175
- DIRTY_SUFFIXES.each do |suffix|
176
- module_eval <<-STR, __FILE__, __LINE__ + 1
177
- def #{new_name}#{suffix}; self.#{old_name}#{suffix}; end # def subject_changed?; self.title_changed?; end
178
- STR
179
- end
180
- end
181
- end
182
- end
183
- end
@@ -1,91 +0,0 @@
1
- require 'active_support/json'
2
- require 'active_support/core_ext/module/model_naming'
3
-
4
- module ActiveRecord #:nodoc:
5
- module Serialization
6
- def self.included(base)
7
- base.cattr_accessor :include_root_in_json, :instance_writer => false
8
- end
9
-
10
- # Returns a JSON string representing the model. Some configuration is
11
- # available through +options+.
12
- #
13
- # The option <tt>ActiveRecord::Base.include_root_in_json</tt> controls the
14
- # top-level behavior of to_json. In a new Rails application, it is set to
15
- # <tt>true</tt> in initializers/new_rails_defaults.rb. When it is <tt>true</tt>,
16
- # to_json will emit a single root node named after the object's type. For example:
17
- #
18
- # konata = User.find(1)
19
- # ActiveRecord::Base.include_root_in_json = true
20
- # konata.to_json
21
- # # => { "user": {"id": 1, "name": "Konata Izumi", "age": 16,
22
- # "created_at": "2006/08/01", "awesome": true} }
23
- #
24
- # ActiveRecord::Base.include_root_in_json = false
25
- # konata.to_json
26
- # # => {"id": 1, "name": "Konata Izumi", "age": 16,
27
- # "created_at": "2006/08/01", "awesome": true}
28
- #
29
- # The remainder of the examples in this section assume include_root_in_json is set to
30
- # <tt>false</tt>.
31
- #
32
- # Without any +options+, the returned JSON string will include all
33
- # the model's attributes. For example:
34
- #
35
- # konata = User.find(1)
36
- # konata.to_json
37
- # # => {"id": 1, "name": "Konata Izumi", "age": 16,
38
- # "created_at": "2006/08/01", "awesome": true}
39
- #
40
- # The <tt>:only</tt> and <tt>:except</tt> options can be used to limit the attributes
41
- # included, and work similar to the +attributes+ method. For example:
42
- #
43
- # konata.to_json(:only => [ :id, :name ])
44
- # # => {"id": 1, "name": "Konata Izumi"}
45
- #
46
- # konata.to_json(:except => [ :id, :created_at, :age ])
47
- # # => {"name": "Konata Izumi", "awesome": true}
48
- #
49
- # To include any methods on the model, use <tt>:methods</tt>.
50
- #
51
- # konata.to_json(:methods => :permalink)
52
- # # => {"id": 1, "name": "Konata Izumi", "age": 16,
53
- # "created_at": "2006/08/01", "awesome": true,
54
- # "permalink": "1-konata-izumi"}
55
- #
56
- # To include associations, use <tt>:include</tt>.
57
- #
58
- # konata.to_json(:include => :posts)
59
- # # => {"id": 1, "name": "Konata Izumi", "age": 16,
60
- # "created_at": "2006/08/01", "awesome": true,
61
- # "posts": [{"id": 1, "author_id": 1, "title": "Welcome to the weblog"},
62
- # {"id": 2, author_id: 1, "title": "So I was thinking"}]}
63
- #
64
- # 2nd level and higher order associations work as well:
65
- #
66
- # konata.to_json(:include => { :posts => {
67
- # :include => { :comments => {
68
- # :only => :body } },
69
- # :only => :title } })
70
- # # => {"id": 1, "name": "Konata Izumi", "age": 16,
71
- # "created_at": "2006/08/01", "awesome": true,
72
- # "posts": [{"comments": [{"body": "1st post!"}, {"body": "Second!"}],
73
- # "title": "Welcome to the weblog"},
74
- # {"comments": [{"body": "Don't think too hard"}],
75
- # "title": "So I was thinking"}]}
76
- def to_json(options = {})
77
- super
78
- end
79
-
80
- def as_json(options = nil) #:nodoc:
81
- hash = Serializer.new(self, options).serializable_record
82
- hash = { options[:root] || self.class.model_name.element => hash } if include_root_in_json
83
- hash
84
- end
85
-
86
- def from_json(json)
87
- self.attributes = ActiveSupport::JSON.decode(json)
88
- self
89
- end
90
- end
91
- end
@@ -1,2 +0,0 @@
1
- require 'active_record'
2
- ActiveSupport::Deprecation.warn 'require "activerecord" is deprecated and will be removed in Rails 3. Use require "active_record" instead.'
@@ -1 +0,0 @@
1
- # Logfile created on Wed Oct 31 16:05:13 +0000 2007 by logger.rb/1.5.2.9
Binary file
@@ -1,24 +0,0 @@
1
- # The filename begins with "aaa" to ensure this is the first test.
2
- require "cases/helper"
3
-
4
- class AAACreateTablesTest < ActiveRecord::TestCase
5
- self.use_transactional_fixtures = false
6
-
7
- def test_load_schema
8
- eval(File.read(SCHEMA_ROOT + "/schema.rb"))
9
- if File.exists?(adapter_specific_schema_file)
10
- eval(File.read(adapter_specific_schema_file))
11
- end
12
- assert true
13
- end
14
-
15
- def test_drop_and_create_courses_table
16
- eval(File.read(SCHEMA_ROOT + "/schema2.rb"))
17
- assert true
18
- end
19
-
20
- private
21
- def adapter_specific_schema_file
22
- SCHEMA_ROOT + '/' + ActiveRecord::Base.connection.adapter_name.downcase + '_specific_schema.rb'
23
- end
24
- end
@@ -1,122 +0,0 @@
1
- require "cases/helper"
2
-
3
- class ActiveSchemaTest < ActiveRecord::TestCase
4
- def setup
5
- ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
6
- alias_method :execute_without_stub, :execute
7
- def execute(sql, name = nil) return sql end
8
- end
9
- end
10
-
11
- def teardown
12
- ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
13
- remove_method :execute
14
- alias_method :execute, :execute_without_stub
15
- end
16
- end
17
-
18
- def test_add_index
19
- # add_index calls index_exists? which can't work since execute is stubbed
20
- ActiveRecord::ConnectionAdapters::MysqlAdapter.send(:define_method, :index_exists?) do |*|
21
- false
22
- end
23
- expected = "CREATE INDEX `index_people_on_last_name` ON `people` (`last_name`)"
24
- assert_equal expected, add_index(:people, :last_name, :length => nil)
25
-
26
- expected = "CREATE INDEX `index_people_on_last_name` ON `people` (`last_name`(10))"
27
- assert_equal expected, add_index(:people, :last_name, :length => 10)
28
-
29
- expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`(15))"
30
- assert_equal expected, add_index(:people, [:last_name, :first_name], :length => 15)
31
-
32
- expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`)"
33
- assert_equal expected, add_index(:people, [:last_name, :first_name], :length => {:last_name => 15})
34
-
35
- expected = "CREATE INDEX `index_people_on_last_name_and_first_name` ON `people` (`last_name`(15), `first_name`(10))"
36
- assert_equal expected, add_index(:people, [:last_name, :first_name], :length => {:last_name => 15, :first_name => 10})
37
- ActiveRecord::ConnectionAdapters::MysqlAdapter.send(:remove_method, :index_exists?)
38
- end
39
-
40
- def test_drop_table
41
- assert_equal "DROP TABLE `people`", drop_table(:people)
42
- end
43
-
44
- if current_adapter?(:MysqlAdapter)
45
- def test_create_mysql_database_with_encoding
46
- assert_equal "CREATE DATABASE `matt` DEFAULT CHARACTER SET `utf8`", create_database(:matt)
47
- assert_equal "CREATE DATABASE `aimonetti` DEFAULT CHARACTER SET `latin1`", create_database(:aimonetti, {:charset => 'latin1'})
48
- assert_equal "CREATE DATABASE `matt_aimonetti` DEFAULT CHARACTER SET `big5` COLLATE `big5_chinese_ci`", create_database(:matt_aimonetti, {:charset => :big5, :collation => :big5_chinese_ci})
49
- end
50
-
51
- def test_recreate_mysql_database_with_encoding
52
- create_database(:luca, {:charset => 'latin1'})
53
- assert_equal "CREATE DATABASE `luca` DEFAULT CHARACTER SET `latin1`", recreate_database(:luca, {:charset => 'latin1'})
54
- end
55
- end
56
-
57
- def test_add_column
58
- assert_equal "ALTER TABLE `people` ADD `last_name` varchar(255)", add_column(:people, :last_name, :string)
59
- end
60
-
61
- def test_add_column_with_limit
62
- assert_equal "ALTER TABLE `people` ADD `key` varchar(32)", add_column(:people, :key, :string, :limit => 32)
63
- end
64
-
65
- def test_drop_table_with_specific_database
66
- assert_equal "DROP TABLE `otherdb`.`people`", drop_table('otherdb.people')
67
- end
68
-
69
- def test_add_timestamps
70
- with_real_execute do
71
- begin
72
- ActiveRecord::Base.connection.create_table :delete_me do |t|
73
- end
74
- ActiveRecord::Base.connection.add_timestamps :delete_me
75
- assert column_present?('delete_me', 'updated_at', 'datetime')
76
- assert column_present?('delete_me', 'created_at', 'datetime')
77
- ensure
78
- ActiveRecord::Base.connection.drop_table :delete_me rescue nil
79
- end
80
- end
81
- end
82
-
83
- def test_remove_timestamps
84
- with_real_execute do
85
- begin
86
- ActiveRecord::Base.connection.create_table :delete_me do |t|
87
- t.timestamps
88
- end
89
- ActiveRecord::Base.connection.remove_timestamps :delete_me
90
- assert !column_present?('delete_me', 'updated_at', 'datetime')
91
- assert !column_present?('delete_me', 'created_at', 'datetime')
92
- ensure
93
- ActiveRecord::Base.connection.drop_table :delete_me rescue nil
94
- end
95
- end
96
- end
97
-
98
- private
99
- def with_real_execute
100
- #we need to actually modify some data, so we make execute point to the original method
101
- ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
102
- alias_method :execute_with_stub, :execute
103
- alias_method :execute, :execute_without_stub
104
- end
105
- yield
106
- ensure
107
- #before finishing, we restore the alias to the mock-up method
108
- ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
109
- alias_method :execute, :execute_with_stub
110
- end
111
- end
112
-
113
-
114
- def method_missing(method_symbol, *arguments)
115
- ActiveRecord::Base.connection.send(method_symbol, *arguments)
116
- end
117
-
118
- def column_present?(table_name, column_name, type)
119
- results = ActiveRecord::Base.connection.select_all("SHOW FIELDS FROM #{table_name} LIKE '#{column_name}'")
120
- results.first && results.first['Type'] == type
121
- end
122
- end