upsert 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,13 @@
1
+ 0.3.4 / 2012-07-03
2
+
3
+ * Bug fixes
4
+
5
+ * Allow upserting by auto-increment primary key (thanks @atandrau https://github.com/seamusabshere/upsert/issues/3)
6
+
7
+ * Enhancements
8
+
9
+ * Make document an optional argument
10
+
1
11
  0.3.3 / 2012-06-26
2
12
 
3
13
  * Bug fixes
data/README.md CHANGED
@@ -54,9 +54,10 @@ Pull requests for any of these would be greatly appreciated:
54
54
 
55
55
  1. Fix SQLite tests.
56
56
  2. For PG, be smarter about when you create functions - try to re-use them within a connection.
57
- 3. Provide `require 'upsert/debug'` that will make sure you are selecting on columns that have unique indexes
58
- 4. Make `Upsert` instances accept arbitrary columns, which is what people probably expect.
59
- 5. Naming suggestions: should "document" be called "setters" or "attributes"?
57
+ 3. Provide optional SQL logging.
58
+ 4. Provide `require 'upsert/debug'` that will make sure you are selecting on columns that have unique indexes
59
+ 5. Make `Upsert` instances accept arbitrary columns, which is what people probably expect.
60
+ 6. Naming suggestions: should "document" be called "setters" or "attributes"?
60
61
 
61
62
  ## Real-world usage
62
63
 
@@ -94,7 +94,7 @@ class Upsert
94
94
  # upsert = Upsert.new Pet.connection, Pet.table_name
95
95
  # upsert.row({:name => 'Jerry'}, :breed => 'beagle')
96
96
  # upsert.row({:name => 'Pierre'}, :breed => 'tabby')
97
- def row(selector, document)
97
+ def row(selector, document = {})
98
98
  buffer.push Row.new(self, selector, document)
99
99
  if sql = chunk
100
100
  execute sql
@@ -1,6 +1,6 @@
1
1
  class Upsert
2
2
  module ActiveRecordUpsert
3
- def upsert(selector, document)
3
+ def upsert(selector, document = {})
4
4
  ActiveRecord::Base.connection_pool.with_connection do |c|
5
5
  upsert = Upsert.new c, table_name
6
6
  upsert.row selector, document
@@ -4,41 +4,16 @@ class Upsert
4
4
  # activerecord-3.2.5/lib/active_record/connection_adapters/postgresql_adapter.rb#column_definitions
5
5
  class ColumnDefinition
6
6
  class << self
7
- def auto_increment_primary_key(connection, table_name)
8
- res = connection.exec <<-EOS
9
- SELECT attr.attname, seq.relname
10
- FROM pg_class seq,
11
- pg_attribute attr,
12
- pg_depend dep,
13
- pg_namespace name,
14
- pg_constraint cons
15
- WHERE seq.oid = dep.objid
16
- AND seq.relkind = 'S'
17
- AND attr.attrelid = dep.refobjid
18
- AND attr.attnum = dep.refobjsubid
19
- AND attr.attrelid = cons.conrelid
20
- AND attr.attnum = cons.conkey[1]
21
- AND cons.contype = 'p'
22
- AND dep.refobjid = '#{connection.quote_ident(table_name.to_s)}'::regclass
23
- EOS
24
- if hit = res.first
25
- hit['attname']
26
- end
27
- end
28
-
29
7
  def all(connection, table_name)
30
- auto_increment_primary_key = auto_increment_primary_key(connection, table_name)
31
8
  res = connection.exec <<-EOS
32
9
  SELECT a.attname AS name, format_type(a.atttypid, a.atttypmod) AS sql_type, d.adsrc AS default
33
10
  FROM pg_attribute a LEFT JOIN pg_attrdef d
34
11
  ON a.attrelid = d.adrelid AND a.attnum = d.adnum
35
12
  WHERE a.attrelid = '#{connection.quote_ident(table_name.to_s)}'::regclass
36
- AND a.attnum > 0 AND NOT a.attisdropped
13
+ AND a.attnum > 0 AND NOT a.attisdropped
37
14
  ORDER BY a.attnum
38
15
  EOS
39
- res.reject do |row|
40
- row['name'] == auto_increment_primary_key
41
- end.map do |row|
16
+ res.map do |row|
42
17
  new connection, row['name'], row['sql_type'], row['default']
43
18
  end
44
19
  end
@@ -1,3 +1,3 @@
1
1
  class Upsert
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.4"
3
3
  end
@@ -36,7 +36,6 @@ shared_examples_for 'is a database with an upsert trick' do
36
36
  end
37
37
  Pet.where(:gender => 'male').count.must_equal 0
38
38
  end
39
-
40
39
  it "works for a single row with implicit nulls" do
41
40
  upsert = Upsert.new connection, :pets
42
41
  assert_creates(Pet, [{:name => 'Inky', :gender => nil}]) do
@@ -44,6 +43,13 @@ shared_examples_for 'is a database with an upsert trick' do
44
43
  upsert.row({:name => 'Inky'}, {})
45
44
  end
46
45
  end
46
+ it "works for a single row with empty document" do
47
+ upsert = Upsert.new connection, :pets
48
+ assert_creates(Pet, [{:name => 'Inky', :gender => nil}]) do
49
+ upsert.row(:name => 'Inky')
50
+ upsert.row(:name => 'Inky')
51
+ end
52
+ end
47
53
  it "works for a single row with explicit nulls" do
48
54
  upsert = Upsert.new connection, :pets
49
55
  assert_creates(Pet, [{:name => 'Inky', :gender => nil}]) do
@@ -51,6 +57,13 @@ shared_examples_for 'is a database with an upsert trick' do
51
57
  upsert.row({:name => 'Inky'}, {:gender => nil})
52
58
  end
53
59
  end
60
+ it "works with ids" do
61
+ jerry = Pet.create :name => 'Jerry', :lovability => 1.0
62
+ upsert = Upsert.new connection, :pets
63
+ assert_creates(Pet, [{:name => 'Jerry', :lovability => 2.0}]) do
64
+ upsert.row({:id => jerry.id}, :lovability => 2.0)
65
+ end
66
+ end
54
67
  end
55
68
  describe :batch do
56
69
  it "works for multiple rows (base case)" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: upsert
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-26 00:00:00.000000000 Z
12
+ date: 2012-07-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sqlite3