Skip to content

Commit

Permalink
Initial import.
Browse files Browse the repository at this point in the history
git-svn-id: http://svn.ruido-blanco.net/dependent_protect/trunk@1 246b335f-cd19-0410-9f1f-de397f2a1261
  • Loading branch information
daniel committed Jul 30, 2006
0 parents commit ceffc6a
Show file tree
Hide file tree
Showing 13 changed files with 368 additions and 0 deletions.
20 changes: 20 additions & 0 deletions MIT-LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
Copyright (c) 2006 Daniel Rodríguez Troitiño

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 changes: 22 additions & 0 deletions README
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
dependent => :protect option
============================

Adds a new option :protect for the parameter :depends from has_many method.
This option forbids destroying records with associated records in a
association created with :dependent => :protect option, more or less like
"ON DELETE RESTRICT" SQL statement. If you try to destroy a record with
associated records it will raise a ReferentialIntegrityProtectionError (defined
also in this plugin).

Based on the idea and the code from [email protected] in Ruby on Rails
ticket #3837 (http://dev.rubyonrails.org/ticket/3837).

You can download this plugin at:

http://svn.ruido-blanco.net/dependent_protect/trunk

Author
======

Daniel Rodríguez Troitiño <[email protected]>, based on the ideas and
the code from <[email protected]>.
22 changes: 22 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'

desc 'Default: run unit tests.'
task :default => :test

desc 'Test the dependent_protect plugin.'
Rake::TestTask.new(:test) do |t|
t.libs << 'lib'
t.pattern = 'test/**/*_test.rb'
t.verbose = true
end

desc 'Generate documentation for the dependent_protect plugin.'
Rake::RDocTask.new(:rdoc) do |rdoc|
rdoc.rdoc_dir = 'rdoc'
rdoc.title = 'DependentProtect'
rdoc.options << '--line-numbers' << '--inline-source'
rdoc.rdoc_files.include('README')
rdoc.rdoc_files.include('lib/**/*.rb')
end
3 changes: 3 additions & 0 deletions init.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Include hook code here

require 'dependent_protect'
38 changes: 38 additions & 0 deletions lib/dependent_protect.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# DependentProtect

module ActiveRecord
module Associations
module ClassMethods

alias_method :has_many_without_protect, :has_many

# We should be aliasing configure_dependency_for_has_many but that method
# is private so we can't. We alias has_many instead trying to be as fair
# as we can to the original behaviour.
def has_many_with_protect(association_id, options = {}, &extension) #:nodoc:
reflection = create_reflection(:has_many, association_id, options, self)

# This would break if has_many :dependent behaviour changes. One
# solution is removing both the second when and the else branches but
# the exception message wouldn't be exact.
case reflection.options[:dependent]
when :protect
module_eval "before_destroy 'raise ReferentialIntegrityProtectionError, \"Can\\'t destroy because there\\'s at least one #{reflection.class_name} in this #{self.class_name}\" if self.#{reflection.name}.find(:first)'"
options.delete(:dependent)
when true, :destroy, :delete_all, :nullify, nil, false
#pass
else
raise ArgumentError, 'The :dependent option expects either true, :destroy, :delete_all, :nullify or :protect'
end

has_many_without_protect(association_id, options, &extension)
end

alias_method :has_many, :has_many_with_protect

end
end

class ReferentialIntegrityProtectionError < ActiveRecordError #:nodoc:
end
end
18 changes: 18 additions & 0 deletions test/database.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
sqlite:
:adapter: sqlite
:dbfile: dependent_protect.sqlite.db
sqlite3:
:adapter: sqlite3
:dbfile: dependent_protect.sqlite3.db
postgresql:
:adapter: postgresql
:username: postgres
:password: postgres
:database: dependent_protect_test
:min_messages: ERROR
mysql:
:adapter: mysql
:host: localhost
:username: rails
:password:
:database: dependent_protect_test
145 changes: 145 additions & 0 deletions test/debug.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
# Logfile created on Sun Jul 30 03:23:01 CEST 2006 by logger.rb/1.5.2.7
SQL (0.000000) SQLite3::SQLException: no such table: companies: DROP TABLE companies
SQL (0.352609) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.249171) CREATE TABLE schema_info (version integer)
SQL (0.243700) INSERT INTO schema_info (version) VALUES(0)
SQL (0.001462) PRAGMA table_info(schema_info)
SQL (0.233039) UPDATE schema_info SET version = 1
SQL (0.374005) DROP TABLE companies
SQL (0.244744) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.000000) SQLite3::SQLException: table schema_info already exists: CREATE TABLE schema_info (version integer)
SQL (0.001296) PRAGMA table_info(schema_info)
SQL (0.259787) UPDATE schema_info SET version = 1
SQL (0.308970) DROP TABLE companies
SQL (0.242635) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.000000) SQLite3::SQLException: table schema_info already exists: CREATE TABLE schema_info (version integer)
SQL (0.001245) PRAGMA table_info(schema_info)
SQL (0.234673) UPDATE schema_info SET version = 1
SQL (0.511355) DROP TABLE companies
SQL (0.242258) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.000000) SQLite3::SQLException: table schema_info already exists: CREATE TABLE schema_info (version integer)
SQL (0.001253) PRAGMA table_info(schema_info)
SQL (0.265396) UPDATE schema_info SET version = 1
Company Load (0.002414) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001337) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001168) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.002231) PRAGMA table_info(companies)
Company Load (0.001408) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id 
SQL (0.518647) DROP TABLE companies
SQL (0.244048) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.000000) SQLite3::SQLException: table schema_info already exists: CREATE TABLE schema_info (version integer)
SQL (0.001467) PRAGMA table_info(schema_info)
SQL (0.264112) UPDATE schema_info SET version = 1
Company Load (0.001672) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001093) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001316) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.002138) PRAGMA table_info(companies)
Company Load (0.001723) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id 
Company Load (0.001637) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id LIMIT 1
Company Load (0.004243) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001570) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001475) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.380056) DROP TABLE companies
SQL (0.231077) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.000000) SQLite3::SQLException: table schema_info already exists: CREATE TABLE schema_info (version integer)
SQL (0.001459) PRAGMA table_info(schema_info)
SQL (0.222933) UPDATE schema_info SET version = 1
Company Load (0.001667) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001157) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001091) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.002152) PRAGMA table_info(companies)
Company Load (0.001790) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id 
Company Load (0.001716) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id LIMIT 1
Company Load (0.001311) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001045) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001176) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.439825) DROP TABLE companies
SQL (0.271382) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.000000) SQLite3::SQLException: table schema_info already exists: CREATE TABLE schema_info (version integer)
SQL (0.001234) PRAGMA table_info(schema_info)
SQL (0.269928) UPDATE schema_info SET version = 1
Company Load (0.001915) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.002871) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001098) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.002066) PRAGMA table_info(companies)
Company Load (0.001802) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id 
Company Load (0.001639) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id LIMIT 1
Company Load (0.001405) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001371) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001073) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.542419) DROP TABLE companies
SQL (0.345138) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.000000) SQLite3::SQLException: table schema_info already exists: CREATE TABLE schema_info (version integer)
SQL (0.001224) PRAGMA table_info(schema_info)
SQL (0.280027) UPDATE schema_info SET version = 1
Company Load (0.002960) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001421) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001104) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.004161) PRAGMA table_info(companies)
Company Load (0.001569) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id 
Company Load (0.002282) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id LIMIT 1
Company Load (0.001124) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001058) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001379) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
Company Load (0.001600) SELECT * FROM companies WHERE (companies.id = 4) LIMIT 1
Company Load (0.000755) SELECT * FROM companies WHERE (companies.client_of = 4) ORDER BY id 
SQL (0.286080) DROP TABLE companies
SQL (0.256702) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.000000) SQLite3::SQLException: table schema_info already exists: CREATE TABLE schema_info (version integer)
SQL (0.001226) PRAGMA table_info(schema_info)
SQL (0.271669) UPDATE schema_info SET version = 1
Company Load (0.001793) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001419) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.003394) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.002202) PRAGMA table_info(companies)
Company Load (0.011262) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id 
Company Load (0.001951) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id LIMIT 1
Company Load (0.001378) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.002100) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001589) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
Company Load (0.001666) SELECT * FROM companies WHERE (companies.id = 4) LIMIT 1
Company Load (0.000569) SELECT * FROM companies WHERE (companies.client_of = 4) ORDER BY id 
Company Load (0.000580) SELECT * FROM companies WHERE (companies.client_of = 4) ORDER BY id LIMIT 1
Company Destroy (0.003189)  DELETE FROM companies
WHERE id = 4

SQL (0.577528) DROP TABLE companies
SQL (0.254211) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.000000) SQLite3::SQLException: table schema_info already exists: CREATE TABLE schema_info (version integer)
SQL (0.001242) PRAGMA table_info(schema_info)
SQL (0.264907) UPDATE schema_info SET version = 1
Company Load (0.002002) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001170) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001073) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.002551) PRAGMA table_info(companies)
Company Load (0.001507) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id 
Company Load (0.002158) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id LIMIT 1
Company Load (0.001171) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001062) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001095) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
Company Load (0.001638) SELECT * FROM companies WHERE (companies.id = 4) LIMIT 1
Company Load (0.000562) SELECT * FROM companies WHERE (companies.client_of = 4) ORDER BY id 
Company Load (0.000554) SELECT * FROM companies WHERE (companies.client_of = 4) ORDER BY id LIMIT 1
Company Destroy (0.002922)  DELETE FROM companies
WHERE id = 4

SQL (0.492315) DROP TABLE companies
SQL (0.220598) CREATE TABLE companies ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255), "client_of" integer) 
SQL (0.000000) SQLite3::SQLException: table schema_info already exists: CREATE TABLE schema_info (version integer)
SQL (0.001181) PRAGMA table_info(schema_info)
SQL (0.238530) UPDATE schema_info SET version = 1
Company Load (0.002162) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001516) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001026) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
SQL (0.002119) PRAGMA table_info(companies)
Company Load (0.002366) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id 
Company Load (0.001997) SELECT * FROM companies WHERE (companies.client_of = 1) ORDER BY id LIMIT 1
Company Load (0.001132) SELECT * FROM companies WHERE (companies.id = 1) LIMIT 1
Company Load (0.001066) SELECT * FROM companies WHERE (companies.id = 2) LIMIT 1
Company Load (0.001129) SELECT * FROM companies WHERE (companies.id = 3) LIMIT 1
Company Load (0.001872) SELECT * FROM companies WHERE (companies.id = 4) LIMIT 1
Company Load (0.000521) SELECT * FROM companies WHERE (companies.client_of = 4) ORDER BY id 
Company Load (0.000539) SELECT * FROM companies WHERE (companies.client_of = 4) ORDER BY id LIMIT 1
Company Destroy (0.003307)  DELETE FROM companies
WHERE id = 4

Binary file added test/dependent_protect.sqlite3.db
Binary file not shown.
Loading

0 comments on commit ceffc6a

Please sign in to comment.