active_table 0.1.3 → 0.1.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.
- data/lib/active_table/base.rb +40 -12
- data/lib/active_table/version.rb +1 -1
- data/spec/active_table_spec.rb +27 -0
- metadata +3 -3
data/lib/active_table/base.rb
CHANGED
@@ -56,22 +56,33 @@ module ActiveTable
|
|
56
56
|
|
57
57
|
unless connection.table_exists?(temp_table_name)
|
58
58
|
db_drop_and_create_table(temp_table_name, @table[:options], @table[:block])
|
59
|
+
insert_rows!(@table[:name], :temporary => true)
|
60
|
+
|
61
|
+
case [tables_match?(@table[:name], temp_table_name), rows_match?(@table[:name], temp_table_name)]
|
62
|
+
when [false, false], [false, true]
|
63
|
+
db_drop_table(@table[:name])
|
64
|
+
connection.rename_table(temp_table_name, @table[:name])
|
65
|
+
when [true, false]
|
66
|
+
db_truncate_and_copy_tables(@table[:name], temp_table_name)
|
67
|
+
when [true, true]
|
68
|
+
db_drop_table(temp_table_name)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
59
72
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
@@insert_statements.reject!{|statement| statement[:table_name] == @table[:name]}
|
65
|
-
@@table_list << @table[:name] unless @@table_list.include?(@table[:name])
|
73
|
+
def insert_rows!(table_name, options = {})
|
74
|
+
@@insert_statements.reject!{|statement| statement[:table_name] == @table[:name]}
|
75
|
+
@@table_list << @table[:name] unless @@table_list.include?(@table[:name])
|
66
76
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
77
|
+
@table[:rows].each do |row|
|
78
|
+
if options[:temporary]
|
79
|
+
insert_sql_now = generate_insert_sql_for_hash(connection, "#{table_name}__temp", row)
|
80
|
+
insert_sql_later = generate_insert_sql_for_hash(connection, table_name, row)
|
72
81
|
else
|
73
|
-
|
82
|
+
insert_sql_now = insert_sql_later = generate_insert_sql_for_hash(connection, table_name_name, row)
|
74
83
|
end
|
84
|
+
@@insert_statements << {:table_name => @table[:name], :sql => insert_sql_later}
|
85
|
+
connection.execute insert_sql_now
|
75
86
|
end
|
76
87
|
end
|
77
88
|
|
@@ -82,6 +93,23 @@ module ActiveTable
|
|
82
93
|
columns_1.to_json == columns_2.to_json
|
83
94
|
end
|
84
95
|
|
96
|
+
def rows_match?(table_1, table_2)
|
97
|
+
return false unless connection.table_exists?(table_1) and connection.table_exists?(table_2)
|
98
|
+
|
99
|
+
query = "SELECT COUNT(*) AS rows FROM (SELECT DISTINCT * FROM ( SELECT * FROM #{connection.quote_table_name(table_1)} UNION ALL SELECT * FROM #{connection.quote_table_name(table_2)} ) t) s"
|
100
|
+
distinct_count = connection.execute(query).first["rows"]
|
101
|
+
|
102
|
+
query = "SELECT COUNT(*) AS rows FROM #{connection.quote_table_name(table_1)}"
|
103
|
+
current_count = connection.execute(query).first["rows"]
|
104
|
+
|
105
|
+
distinct_count == current_count
|
106
|
+
end
|
107
|
+
|
108
|
+
def db_truncate_and_copy_tables(destination, source)
|
109
|
+
connection.execute("DELETE FROM #{connection.quote_table_name(destination)}")
|
110
|
+
connection.execute("INSERT INTO #{connection.quote_table_name(destination)} SELECT * FROM #{connection.quote_table_name(source)}")
|
111
|
+
end
|
112
|
+
|
85
113
|
def db_drop_and_create_table(name, options, block)
|
86
114
|
db_drop_table(name)
|
87
115
|
connection.create_table name, options do |t|
|
data/lib/active_table/version.rb
CHANGED
data/spec/active_table_spec.rb
CHANGED
@@ -94,6 +94,33 @@ describe "a model created with active_table" do
|
|
94
94
|
lambda { @connection.execute("SELECT name FROM awesome_models") }.should raise_error
|
95
95
|
lambda { @connection.execute("SELECT different_name FROM awesome_models") }.should_not raise_error
|
96
96
|
end
|
97
|
+
|
98
|
+
it "should truncate and reload data if the data has changed" do
|
99
|
+
class AwesomeModel < ActiveTable::Base
|
100
|
+
active_table do
|
101
|
+
self.table_name = "awesome_models"
|
102
|
+
create_table :awesome_models do |t|
|
103
|
+
t.string :name
|
104
|
+
end
|
105
|
+
|
106
|
+
insert :id => 1, :name => "foo"
|
107
|
+
insert :id => 2, :name => "bar"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
class MoreAwesomeModel < ActiveTable::Base
|
112
|
+
active_table do
|
113
|
+
self.table_name = "awesome_models"
|
114
|
+
create_table :awesome_models do |t|
|
115
|
+
t.string :name
|
116
|
+
end
|
117
|
+
|
118
|
+
insert :id => 1, :name => "baz"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
@connection.execute("SELECT * FROM awesome_models").size.should == 1
|
123
|
+
end
|
97
124
|
end
|
98
125
|
|
99
126
|
context "#table_list" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_table
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-08-15 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &2161615920 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
version: 4.0.0
|
25
25
|
type: :runtime
|
26
26
|
prerelease: false
|
27
|
-
version_requirements: *
|
27
|
+
version_requirements: *2161615920
|
28
28
|
description: Dynamically-populated ActiveRecord models based on static data
|
29
29
|
email:
|
30
30
|
- casecommons-dev@googlegroups.com
|