simple-sql 0.4.21 → 0.4.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/lib/simple/sql/helpers/decoder.rb +2 -7
- data/lib/simple/sql/insert.rb +15 -10
- data/lib/simple/sql/result/association_loader.rb +3 -1
- data/lib/simple/sql/version.rb +1 -1
- data/scripts/watch +1 -1
- data/spec/simple/{sql_all_into_spec.rb → sql/all_into_spec.rb} +0 -0
- data/spec/simple/{sql_ask_spec.rb → sql/ask_spec.rb} +0 -0
- data/spec/simple/{sql_associations_spec.rb → sql/associations_spec.rb} +0 -0
- data/spec/simple/{sql_config_spec.rb → sql/config_spec.rb} +0 -0
- data/spec/simple/{sql_conversion_spec.rb → sql/conversion_spec.rb} +0 -0
- data/spec/simple/{sql_duplicate_spec.rb → sql/duplicate_spec.rb} +0 -0
- data/spec/simple/{sql_duplicate_unique_spec.rb → sql/duplicate_unique_spec.rb} +0 -0
- data/spec/simple/{sql_insert_spec.rb → sql/insert_spec.rb} +26 -12
- data/spec/simple/{sql_reflection_spec.rb → sql/reflection_spec.rb} +0 -0
- data/spec/simple/{sql_scope_spec.rb → sql/scope_spec.rb} +0 -0
- metadata +22 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58caff3c654cc1f068e15d93f2d356fde5598e159ddd2589aeb5e5588a1e8c16
|
4
|
+
data.tar.gz: d9d06f994b53824b937872c548601c025a93060c917602a73e99d8a8ab24dbdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af6166f4600345b8151092e3f2198f89defb2d64365a3e0d616b2da86ef87a73ba7b6ed360e3c4dd4371569afa70e210ef72bdbbabd25e5b87f685cc0d7c99ef
|
7
|
+
data.tar.gz: e04ef18bd368c7e2e404daf84767204335de2f85ee22594d56bd37415b085e6dc78417cd46d5e085e134493d2cb0d09318da8665a8695a1333a6e89a7c24af7c
|
data/.gitignore
CHANGED
@@ -4,12 +4,6 @@ require "time"
|
|
4
4
|
module Simple::SQL::Helpers::Decoder
|
5
5
|
extend self
|
6
6
|
|
7
|
-
def parse_timestamp(s)
|
8
|
-
r = ::Time.parse(s)
|
9
|
-
return r if r.utc_offset == 0
|
10
|
-
Time.gm(r.year, r.mon, r.day, r.hour, r.min, r.sec, r.usec)
|
11
|
-
end
|
12
|
-
|
13
7
|
# rubocop:disable Metrics/AbcSize
|
14
8
|
# rubocop:disable Metrics/CyclomaticComplexity
|
15
9
|
def decode_value(type, s)
|
@@ -23,7 +17,8 @@ module Simple::SQL::Helpers::Decoder
|
|
23
17
|
when :'integer[]' then s.scan(/-?\d+/).map { |part| Integer(part) }
|
24
18
|
when :"character varying[]" then parse_pg_array(s)
|
25
19
|
when :"text[]" then parse_pg_array(s)
|
26
|
-
when :"timestamp without time zone" then
|
20
|
+
when :"timestamp without time zone" then ::Time.parse(s)
|
21
|
+
when :"timestamp with time zone" then ::Time.parse(s)
|
27
22
|
when :hstore then HStore.parse(s)
|
28
23
|
when :json then ::JSON.parse(s)
|
29
24
|
when :jsonb then ::JSON.parse(s)
|
data/lib/simple/sql/insert.rb
CHANGED
@@ -7,20 +7,20 @@ module Simple
|
|
7
7
|
# - records - a single hash of attributes or an array of hashes of attributes
|
8
8
|
# - on_conflict - uses a postgres ON CONFLICT clause to ignore insert conflicts if true
|
9
9
|
#
|
10
|
-
def insert(table, records, on_conflict: nil)
|
10
|
+
def insert(table, records, on_conflict: nil, into: nil)
|
11
11
|
if records.is_a?(Hash)
|
12
|
-
insert_many(table, [records], on_conflict).first
|
12
|
+
insert_many(table, [records], on_conflict, into).first
|
13
13
|
else
|
14
|
-
insert_many(table, records, on_conflict)
|
14
|
+
insert_many(table, records, on_conflict, into)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
private
|
19
19
|
|
20
|
-
def insert_many(table, records, on_conflict)
|
20
|
+
def insert_many(table, records, on_conflict, into)
|
21
21
|
return [] if records.empty?
|
22
22
|
|
23
|
-
inserter = Inserter.create(table_name: table.to_s, columns: records.first.keys, on_conflict: on_conflict)
|
23
|
+
inserter = Inserter.create(table_name: table.to_s, columns: records.first.keys, on_conflict: on_conflict, into: into)
|
24
24
|
inserter.insert(records: records)
|
25
25
|
end
|
26
26
|
|
@@ -29,16 +29,19 @@ module Simple
|
|
29
29
|
|
30
30
|
@@inserters = {}
|
31
31
|
|
32
|
-
def self.create(table_name:, columns:, on_conflict:)
|
33
|
-
|
32
|
+
def self.create(table_name:, columns:, on_conflict:, into:)
|
33
|
+
expect! on_conflict => CONFICT_HANDLING.keys
|
34
|
+
|
35
|
+
@@inserters[[table_name, columns, on_conflict, into]] ||= new(table_name: table_name, columns: columns, on_conflict: on_conflict, into: into)
|
34
36
|
end
|
35
37
|
|
36
38
|
#
|
37
39
|
# - table_name - the name of the table
|
38
40
|
# - columns - name of columns, as Array[String] or Array[Symbol]
|
39
41
|
#
|
40
|
-
def initialize(table_name:, columns:, on_conflict:)
|
42
|
+
def initialize(table_name:, columns:, on_conflict:, into:)
|
41
43
|
@columns = columns
|
44
|
+
@into = into
|
42
45
|
|
43
46
|
cols = []
|
44
47
|
vals = []
|
@@ -51,7 +54,9 @@ module Simple
|
|
51
54
|
cols += timestamp_columns
|
52
55
|
vals += timestamp_columns.map { "now()" }
|
53
56
|
|
54
|
-
|
57
|
+
returning = into ? '*' : "id"
|
58
|
+
|
59
|
+
@sql = "INSERT INTO #{table_name} (#{cols.join(',')}) VALUES(#{vals.join(',')}) #{confict_handling(on_conflict)} RETURNING #{returning}"
|
55
60
|
end
|
56
61
|
|
57
62
|
CONFICT_HANDLING = {
|
@@ -69,7 +74,7 @@ module Simple
|
|
69
74
|
def insert(records:)
|
70
75
|
SQL.transaction do
|
71
76
|
records.map do |record|
|
72
|
-
SQL.ask @sql, *record.values_at(*@columns)
|
77
|
+
SQL.ask @sql, *record.values_at(*@columns), into: @into
|
73
78
|
end
|
74
79
|
end
|
75
80
|
end
|
@@ -3,6 +3,8 @@
|
|
3
3
|
# rubocop:disable Metrics/ParameterLists
|
4
4
|
# rubocop:disable Style/GuardClause
|
5
5
|
|
6
|
+
require "active_support/core_ext/string/inflections"
|
7
|
+
|
6
8
|
#
|
7
9
|
# This module implements a pretty generic AssociationLoader.
|
8
10
|
#
|
@@ -52,7 +54,7 @@ module ::Simple::SQL::Result::AssociationLoader # :nodoc:
|
|
52
54
|
|
53
55
|
sql = <<~SQL
|
54
56
|
WITH foreign_keys AS(
|
55
|
-
SELECT
|
57
|
+
SELECT DISTINCT
|
56
58
|
tc.table_schema || '.' || tc.table_name AS belonging_table,
|
57
59
|
kcu.column_name AS belonging_column,
|
58
60
|
ccu.table_schema || '.' || ccu.table_name AS having_table,
|
data/lib/simple/sql/version.rb
CHANGED
data/scripts/watch
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
#!/bin/bash
|
2
|
-
watchr lib,spec
|
2
|
+
watchr lib,spec rspec $@
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -3,18 +3,32 @@ require "spec_helper"
|
|
3
3
|
describe "Simple::SQL.insert" do
|
4
4
|
let!(:users) { 1.upto(USER_COUNT).map { create(:user) } }
|
5
5
|
|
6
|
-
|
7
|
-
initial_ids
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
6
|
+
context "when inserting a user" do
|
7
|
+
let!(:initial_ids) { SQL.all("SELECT id FROM users") }
|
8
|
+
|
9
|
+
it "inserts a single user" do
|
10
|
+
id = SQL.insert :users, first_name: "foo", last_name: "bar"
|
11
|
+
expect(id).to be_a(Integer)
|
12
|
+
expect(initial_ids).not_to include(id)
|
13
|
+
expect(SQL.ask("SELECT count(*) FROM users")).to eq(USER_COUNT+1)
|
14
|
+
|
15
|
+
user = SQL.ask("SELECT * FROM users WHERE id=$1", id, into: OpenStruct)
|
16
|
+
expect(user.first_name).to eq("foo")
|
17
|
+
expect(user.last_name).to eq("bar")
|
18
|
+
expect(user.created_at).to be_a(Time)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns the id" do
|
22
|
+
id = SQL.insert :users, first_name: "foo", last_name: "bar"
|
23
|
+
expect(id).to be_a(Integer)
|
24
|
+
expect(initial_ids).not_to include(id)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns the record as a Hash" do
|
28
|
+
rec = SQL.insert :users, { first_name: "foo", last_name: "bar" }, into: Hash
|
29
|
+
expect(rec).to be_a(Hash)
|
30
|
+
expect(rec).to include(first_name: "foo", last_name: "bar")
|
31
|
+
end
|
18
32
|
end
|
19
33
|
|
20
34
|
describe 'confict handling' do
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple-sql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- radiospiel
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-11-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pg_array_parser
|
@@ -206,17 +206,17 @@ files:
|
|
206
206
|
- scripts/watch
|
207
207
|
- simple-sql.gemspec
|
208
208
|
- spec/manual/threadtest.rb
|
209
|
+
- spec/simple/sql/all_into_spec.rb
|
210
|
+
- spec/simple/sql/ask_spec.rb
|
211
|
+
- spec/simple/sql/associations_spec.rb
|
212
|
+
- spec/simple/sql/config_spec.rb
|
213
|
+
- spec/simple/sql/conversion_spec.rb
|
214
|
+
- spec/simple/sql/duplicate_spec.rb
|
215
|
+
- spec/simple/sql/duplicate_unique_spec.rb
|
216
|
+
- spec/simple/sql/insert_spec.rb
|
217
|
+
- spec/simple/sql/reflection_spec.rb
|
218
|
+
- spec/simple/sql/scope_spec.rb
|
209
219
|
- spec/simple/sql/version_spec.rb
|
210
|
-
- spec/simple/sql_all_into_spec.rb
|
211
|
-
- spec/simple/sql_ask_spec.rb
|
212
|
-
- spec/simple/sql_associations_spec.rb
|
213
|
-
- spec/simple/sql_config_spec.rb
|
214
|
-
- spec/simple/sql_conversion_spec.rb
|
215
|
-
- spec/simple/sql_duplicate_spec.rb
|
216
|
-
- spec/simple/sql_duplicate_unique_spec.rb
|
217
|
-
- spec/simple/sql_insert_spec.rb
|
218
|
-
- spec/simple/sql_reflection_spec.rb
|
219
|
-
- spec/simple/sql_scope_spec.rb
|
220
220
|
- spec/spec_helper.rb
|
221
221
|
- spec/support/001_database.rb
|
222
222
|
- spec/support/002_database_cleaner.rb
|
@@ -249,17 +249,17 @@ specification_version: 4
|
|
249
249
|
summary: SQL with a simple interface
|
250
250
|
test_files:
|
251
251
|
- spec/manual/threadtest.rb
|
252
|
+
- spec/simple/sql/all_into_spec.rb
|
253
|
+
- spec/simple/sql/ask_spec.rb
|
254
|
+
- spec/simple/sql/associations_spec.rb
|
255
|
+
- spec/simple/sql/config_spec.rb
|
256
|
+
- spec/simple/sql/conversion_spec.rb
|
257
|
+
- spec/simple/sql/duplicate_spec.rb
|
258
|
+
- spec/simple/sql/duplicate_unique_spec.rb
|
259
|
+
- spec/simple/sql/insert_spec.rb
|
260
|
+
- spec/simple/sql/reflection_spec.rb
|
261
|
+
- spec/simple/sql/scope_spec.rb
|
252
262
|
- spec/simple/sql/version_spec.rb
|
253
|
-
- spec/simple/sql_all_into_spec.rb
|
254
|
-
- spec/simple/sql_ask_spec.rb
|
255
|
-
- spec/simple/sql_associations_spec.rb
|
256
|
-
- spec/simple/sql_config_spec.rb
|
257
|
-
- spec/simple/sql_conversion_spec.rb
|
258
|
-
- spec/simple/sql_duplicate_spec.rb
|
259
|
-
- spec/simple/sql_duplicate_unique_spec.rb
|
260
|
-
- spec/simple/sql_insert_spec.rb
|
261
|
-
- spec/simple/sql_reflection_spec.rb
|
262
|
-
- spec/simple/sql_scope_spec.rb
|
263
263
|
- spec/spec_helper.rb
|
264
264
|
- spec/support/001_database.rb
|
265
265
|
- spec/support/002_database_cleaner.rb
|