db_memoize 0.2.1 → 0.2.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 254ec2be767020e1ff61a4b5ddbfc561f894b716
4
- data.tar.gz: b27ccaf67e4a4dc32901fe802ab6b7da5872d9ba
3
+ metadata.gz: ec9a05ceb15a0252b3e145983035f1192d9252c4
4
+ data.tar.gz: 53190328b2d6a04e861bc0d4d88dd29aea61ad7c
5
5
  SHA512:
6
- metadata.gz: e430b58340a10f27910e558068cca7ac75ab8e07ec9d0aa5898d340aeeaa142dc3241779d3f1c02d16755d8390ddaee44518a704c563e9c5b7a5aa2ac670ea36
7
- data.tar.gz: 82949ec2ac4094966459edbeadb5f34c91f03d9f20cda7e98ee9c1978b3b6fb12a671623473fdb7db88554a01f0ec9fcfb28c8fe8da873f5f218adbd1d07b430
6
+ metadata.gz: 1da1fe68e2389d0d6a74ac03d38f486fcd249f58142f52e4fa5aa3b683a1905f2dc879bd57f188957519fb3181bcbd2fca2dcd521071e155ed3fda6e20e3cfe4
7
+ data.tar.gz: f448a8946e63346fe401d763d396994638ced3cf9e25340ea36b40fcc26372654da88e9593bcbf18f596497325f3dc40c5ae4fc7877421a36d7f5b3489f41d0b
data/README.md CHANGED
@@ -103,6 +103,14 @@ class CreateMemoizedValues < ActiveRecord::Migration
103
103
  end
104
104
  ```
105
105
 
106
+ ### Testing
107
+
108
+ Note that db_memoize needs Postgres. To set up the database needed to run tests, this is what you can do:
109
+
110
+ # sudo su postgresql
111
+    # createuser >>yourusername<<
112
+ # createdb -O >>yourusername<< db_memoize_test
113
+
106
114
 
107
115
  Have fun!
108
116
 
@@ -46,20 +46,37 @@ module DbMemoize
46
46
  @base_klass.columns_hash.key?(column_name)
47
47
  end
48
48
 
49
- def insert_sql(field_names)
50
- @query_cache[field_names] ||= _insert_sql(field_names)
49
+ class Inserter
50
+ def initialize(sql:, bytea_indices:)
51
+ @sql = sql
52
+ @bytea_indices = bytea_indices
53
+ end
54
+
55
+ def exec(raw_connection:, values:)
56
+ @bytea_indices.each do |bytea_index|
57
+ value = values[bytea_index]
58
+ values[bytea_index] = PGconn.escape_bytea(value) if value
59
+ end
60
+
61
+ raw_connection.exec_params(@sql, values)
62
+ end
63
+ end
64
+
65
+ # returns an Inserter
66
+ def inserter(field_names)
67
+ @query_cache[field_names] ||= _inserter(field_names)
51
68
  end
52
69
 
53
70
  DATABASE_IDENTIFIER_REGEX = /\A\w+\z/
54
71
 
55
72
  def check_database_identifiers!(*strings)
56
73
  strings.each do |s|
57
- next if DATABASE_IDENTIFIER_REGEX =~ s.to_s
74
+ next if DATABASE_IDENTIFIER_REGEX =~ s
58
75
  raise ArgumentError, "Invalid database identifier: #{s.inspect}"
59
76
  end
60
77
  end
61
78
 
62
- def _insert_sql(field_names)
79
+ def _inserter(field_names)
63
80
  check_database_identifiers! table_name, *field_names
64
81
 
65
82
  placeholders = 0.upto(field_names.count - 1).map { |idx| "$#{idx + 1}" }
@@ -76,16 +93,24 @@ module DbMemoize
76
93
 
77
94
  sql = "INSERT INTO #{table_name} (#{field_names.join(',')}) VALUES(#{placeholders.join(',')})"
78
95
  sql += " RETURNING #{primary_key.column}" if primary_key.column
79
- sql
96
+
97
+ columns_hash = @base_klass.columns_hash
98
+ bytea_indices = []
99
+ field_names.each_with_index { |column, idx|
100
+ next unless :binary == columns_hash.fetch(column).type
101
+ bytea_indices << idx
102
+ }
103
+
104
+ Inserter.new sql: sql, bytea_indices: bytea_indices
80
105
  end
81
106
 
82
107
  public
83
108
 
84
109
  def create!(record)
85
110
  keys, values = record.to_a.transpose
111
+ keys = keys.map(&:to_s)
86
112
 
87
- sql = insert_sql(keys)
88
- result = raw_connection.exec_params(sql, values)
113
+ result = inserter(keys).exec(raw_connection: raw_connection, values: values)
89
114
 
90
115
  # if we don't have an ID column then the sql does not return any value. The result
91
116
  # object would be this: #<PG::Result status=PGRES_COMMAND_OK ntuples=0 nfields=0 cmd_tuples=1>
@@ -1,3 +1,3 @@
1
1
  module DbMemoize
2
- VERSION = '0.2.1'.freeze
2
+ VERSION = '0.2.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: db_memoize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - johannes-kostas goetzinger
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-06-19 00:00:00.000000000 Z
11
+ date: 2017-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties