ar-extensions 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +97 -0
- data/README +123 -0
- data/Rakefile +97 -0
- data/config/database.yml +7 -0
- data/config/database.yml.template +7 -0
- data/config/mysql.schema +72 -0
- data/config/postgresql.schema +39 -0
- data/db/migrate/generic_schema.rb +59 -0
- data/db/migrate/mysql_schema.rb +26 -0
- data/db/migrate/version.rb +4 -0
- data/init.rb +32 -0
- data/lib/ar-extensions.rb +4 -0
- data/lib/ar-extensions/adapters/abstract_adapter.rb +83 -0
- data/lib/ar-extensions/adapters/mysql_adapter.rb +14 -0
- data/lib/ar-extensions/adapters/postgresql.rb +7 -0
- data/lib/ar-extensions/csv.rb +302 -0
- data/lib/ar-extensions/extensions.rb +474 -0
- data/lib/ar-extensions/finders.rb +76 -0
- data/lib/ar-extensions/foreign_keys.rb +70 -0
- data/lib/ar-extensions/fulltext.rb +63 -0
- data/lib/ar-extensions/fulltext/mysql.rb +44 -0
- data/lib/ar-extensions/import.rb +254 -0
- data/lib/ar-extensions/import/mysql.rb +70 -0
- data/lib/ar-extensions/import/postgresql.rb +0 -0
- data/lib/ar-extensions/temporary_table.rb +124 -0
- data/lib/ar-extensions/temporary_table/mysql.rb +3 -0
- data/lib/ar-extensions/version.rb +8 -0
- metadata +83 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
module ActiveRecord::Extensions::ConnectionAdapters::MysqlAdapter # :nodoc:
|
2
|
+
|
3
|
+
include ActiveRecord::Extensions::Import::ImportSupport
|
4
|
+
include ActiveRecord::Extensions::Import::OnDuplicateKeyUpdateSupport
|
5
|
+
|
6
|
+
# Returns an array of post SQL statements given the passed in options.
|
7
|
+
def post_sql_statements( table_name, options ) # :nodoc:
|
8
|
+
post_sql_statements = []
|
9
|
+
if options[:on_duplicate_key_update]
|
10
|
+
post_sql_statements << sql_for_on_duplicate_key_update( table_name, options[:on_duplicate_key_update] )
|
11
|
+
end
|
12
|
+
post_sql_statements
|
13
|
+
end
|
14
|
+
|
15
|
+
def multiple_value_sets_insert_sql( table_name, column_names, options ) # :nodoc:
|
16
|
+
"INSERT #{options[:ignore]?'IGNORE ':''}INTO #{table_name} (#{column_names.join(',')}) VALUES "
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns a generated ON DUPLICATE KEY UPDATE statement given the passed
|
20
|
+
# in +args+.
|
21
|
+
def sql_for_on_duplicate_key_update( table_name, *args ) # :nodoc:
|
22
|
+
sql = ' ON DUPLICATE KEY UPDATE '
|
23
|
+
arg = args.first
|
24
|
+
if arg.is_a?( Array )
|
25
|
+
sql << sql_for_on_duplicate_key_update_as_array( table_name, arg )
|
26
|
+
elsif arg.is_a?( Hash )
|
27
|
+
sql << sql_for_on_duplicate_key_update_as_hash( table_name, arg )
|
28
|
+
else
|
29
|
+
raise ArgumentError.new( "Expected Array or Hash" )
|
30
|
+
end
|
31
|
+
sql
|
32
|
+
end
|
33
|
+
|
34
|
+
def sql_for_on_duplicate_key_update_as_array( table_name, arr ) # :nodoc:
|
35
|
+
qt = quote_column_name( table_name )
|
36
|
+
results = arr.map do |column|
|
37
|
+
qc = quote_column_name( column )
|
38
|
+
"#{qt}.#{qc}=VALUES(#{qc})"
|
39
|
+
end
|
40
|
+
results.join( ',' )
|
41
|
+
end
|
42
|
+
|
43
|
+
def sql_for_on_duplicate_key_update_as_hash( table_name, hsh ) # :nodoc:
|
44
|
+
sql = ' ON DUPLICATE KEY UPDATE '
|
45
|
+
qt = quote_column_name( table_name )
|
46
|
+
results = hsh.map do |column1, column2|
|
47
|
+
qc1 = quote_column_name( column1 )
|
48
|
+
qc2 = quote_column_name( column2 )
|
49
|
+
"#{qt}.#{qc1}=VALUES( #{qc2} )"
|
50
|
+
end
|
51
|
+
results.join( ',')
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns SQL the VALUES for an INSERT statement given the passed in +columns+
|
55
|
+
# and +array_of_attributes+.
|
56
|
+
def values_sql_for_column_names_and_attributes( columns, array_of_attributes ) # :nodoc:
|
57
|
+
values = []
|
58
|
+
array_of_attributes.each do |arr|
|
59
|
+
my_values = []
|
60
|
+
arr.each_with_index do |val,j|
|
61
|
+
my_values << quote( val, columns[j] )
|
62
|
+
end
|
63
|
+
values << my_values
|
64
|
+
end
|
65
|
+
values_arr = values.map{ |arr| '(' + arr.join( ',' ) + ')' }
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
ActiveRecord::ConnectionAdapters::MysqlAdapter.send( 'include', ActiveRecord::Extensions::ConnectionAdapters::MysqlAdapter )
|
File without changes
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module ActiveRecord::Extensions::TemporaryTableSupport # :nodoc:
|
2
|
+
def supports_temporary_tables? #:nodoc:
|
3
|
+
true
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
class ActiveRecord::Base
|
9
|
+
@@temporary_table_hsh ||= {}
|
10
|
+
|
11
|
+
# Returns true if the underlying database connection supports temporary tables
|
12
|
+
def self.supports_temporary_tables?
|
13
|
+
connection.supports_temporary_tables?
|
14
|
+
rescue NoMethodError
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
######################################################################
|
19
|
+
# Creates a temporary table given the passed in options hash. The
|
20
|
+
# temporary table is created based off from another table the
|
21
|
+
# current model class. This method returns the constant for the new
|
22
|
+
# new model. This can also be used with block form (see below).
|
23
|
+
#
|
24
|
+
# == Parameters
|
25
|
+
# * options - the options hash used to define the temporary table.
|
26
|
+
#
|
27
|
+
# ==== Options
|
28
|
+
# * :table_name - the desired name of the temporary table. If not supplied \
|
29
|
+
# then a name of "temp_" + the current table_name of the current model \
|
30
|
+
# will be used.
|
31
|
+
# * :like - the table model you want to base the temporary tables \
|
32
|
+
# structure off from. If this is not supplied then the table_name of the \
|
33
|
+
# current model will be used.
|
34
|
+
# * :model_name - the name of the model you want to use for the temporary \
|
35
|
+
# table. This must be compliant with Ruby's naming conventions for \
|
36
|
+
# constants. If this is not supplied a rails-generated table name will \
|
37
|
+
# be created which is based off from the table_name of the temporary table. \
|
38
|
+
# IE: Account.create_temporary_table creates the TempAccount model class
|
39
|
+
#
|
40
|
+
# ==== Example 1, using defaults
|
41
|
+
# class Project < ActiveRecord::Base ; end
|
42
|
+
#
|
43
|
+
# Project.create_temporary_table
|
44
|
+
#
|
45
|
+
# This creates a temporary table named 'temp_projects' and creates a constant
|
46
|
+
# name TempProject. The table structure is copied from the _projects_ table.
|
47
|
+
#
|
48
|
+
# ==== Example 2, using :table_name and :model options
|
49
|
+
# Project.create_temporary_table :table_name=>'my_projects', :model=>'MyProject'
|
50
|
+
#
|
51
|
+
# This creates a temporary table named 'my_projects' and creates a constant named
|
52
|
+
# MyProject. The table structure is copied from the _projects_ table.
|
53
|
+
#
|
54
|
+
# ==== Example 3, using :like
|
55
|
+
# ActiveRecord::Base.create_temporary_table :like=>Project
|
56
|
+
#
|
57
|
+
# This is the same as calling Project.create_temporary_table.
|
58
|
+
#
|
59
|
+
# ==== Example 4, using block form
|
60
|
+
# Project.create_temporary_table do |t|
|
61
|
+
# # ...
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# Using the block form will automatically drop the temporary table
|
65
|
+
# when the block exits. _t_ which is passed into the block is the temporary
|
66
|
+
# table class. In the above example _t_ equals TempProject. The block form
|
67
|
+
# can be used with all of the available options.
|
68
|
+
#
|
69
|
+
# === See
|
70
|
+
# * drop
|
71
|
+
######################################################################
|
72
|
+
def self.create_temporary_table( options={} )
|
73
|
+
options[:table_name] = "temp_#{self.table_name}" unless options[:table_name]
|
74
|
+
options[:like] = self unless options[:like]
|
75
|
+
options[:temporary] = true if not options[:permanent] and not options.has_key?( :temporary )
|
76
|
+
table_name = options[:table_name]
|
77
|
+
model_name = options[:model_name] || Inflector.classify( table_name )
|
78
|
+
raise Exception.new( "Model #{model_name} already exists! \n" ) if Object.const_defined? model_name
|
79
|
+
|
80
|
+
like_table_name = options[:like].table_name || self.table_name
|
81
|
+
sql = "CREATE #{options[:temporary] ? 'TEMPORARY' : ''} TABLE #{table_name} LIKE #{like_table_name}"
|
82
|
+
connection.execute( sql )
|
83
|
+
|
84
|
+
eval "class ::#{model_name} < #{ActiveRecord::TemporaryTable.name}
|
85
|
+
set_table_name :#{table_name}
|
86
|
+
end"
|
87
|
+
|
88
|
+
@@temporary_table_hsh[ model = Object.const_get( model_name ) ] = true
|
89
|
+
|
90
|
+
if block_given?
|
91
|
+
yield model
|
92
|
+
model.drop
|
93
|
+
nil
|
94
|
+
else
|
95
|
+
model
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
class ActiveRecord::TemporaryTable < ActiveRecord::Base
|
102
|
+
|
103
|
+
# Drops a temporary table from the database and removes
|
104
|
+
# the temporary table constant.
|
105
|
+
#
|
106
|
+
# ==== Example
|
107
|
+
# Project.create_temporary_table
|
108
|
+
# Object.const_defined?( :TempProject ) # => true
|
109
|
+
# TempProject.drop
|
110
|
+
# Object.const_defined?( :TempProject ) # => false
|
111
|
+
#
|
112
|
+
def self.drop
|
113
|
+
if @@temporary_table_hsh[ self ]
|
114
|
+
sql = 'DROP TABLE ' + self.table_name + ';'
|
115
|
+
connection.execute( sql )
|
116
|
+
Object.send( :remove_const, self.name.to_sym )
|
117
|
+
@@temporary_table_hsh.delete( self )
|
118
|
+
else
|
119
|
+
raise StandardError.new "Trying to drop nonexistance temporary table: #{self.name}"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.1
|
3
|
+
specification_version: 1
|
4
|
+
name: ar-extensions
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.5.1
|
7
|
+
date: 2007-03-15 00:00:00 -04:00
|
8
|
+
summary: Extends ActiveRecord functionality.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: zach.dennis@gmail.com
|
12
|
+
homepage: http://www.continuousthinking.com/tags/arext
|
13
|
+
rubyforge_project: arext
|
14
|
+
description: Extends ActiveRecord functionality by adding better finder/query support, as well as supporting mass data import, foreign key, CSV and temporary tables
|
15
|
+
autorequire: ar-extensions.rb
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Zach Dennis
|
31
|
+
- Mark Van Holstyn
|
32
|
+
files:
|
33
|
+
- init.rb
|
34
|
+
- db/migrate
|
35
|
+
- db/migrate/generic_schema.rb
|
36
|
+
- db/migrate/mysql_schema.rb
|
37
|
+
- db/migrate/version.rb
|
38
|
+
- Rakefile
|
39
|
+
- ChangeLog
|
40
|
+
- README
|
41
|
+
- config/database.yml
|
42
|
+
- config/database.yml.template
|
43
|
+
- config/mysql.schema
|
44
|
+
- config/postgresql.schema
|
45
|
+
- lib/ar-extensions.rb
|
46
|
+
- lib/ar-extensions/csv.rb
|
47
|
+
- lib/ar-extensions/extensions.rb
|
48
|
+
- lib/ar-extensions/finders.rb
|
49
|
+
- lib/ar-extensions/foreign_keys.rb
|
50
|
+
- lib/ar-extensions/fulltext.rb
|
51
|
+
- lib/ar-extensions/import.rb
|
52
|
+
- lib/ar-extensions/temporary_table.rb
|
53
|
+
- lib/ar-extensions/version.rb
|
54
|
+
- lib/ar-extensions/adapters/abstract_adapter.rb
|
55
|
+
- lib/ar-extensions/adapters/mysql_adapter.rb
|
56
|
+
- lib/ar-extensions/adapters/postgresql.rb
|
57
|
+
- lib/ar-extensions/fulltext/mysql.rb
|
58
|
+
- lib/ar-extensions/import/mysql.rb
|
59
|
+
- lib/ar-extensions/import/postgresql.rb
|
60
|
+
- lib/ar-extensions/temporary_table/mysql.rb
|
61
|
+
test_files: []
|
62
|
+
|
63
|
+
rdoc_options:
|
64
|
+
- --main
|
65
|
+
- README
|
66
|
+
extra_rdoc_files:
|
67
|
+
- README
|
68
|
+
executables: []
|
69
|
+
|
70
|
+
extensions: []
|
71
|
+
|
72
|
+
requirements: []
|
73
|
+
|
74
|
+
dependencies:
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: activerecord
|
77
|
+
version_requirement:
|
78
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.14.1
|
83
|
+
version:
|