simple-sql 0.4.22 → 0.4.23
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 +4 -4
- data/.rubocop.yml +6 -0
- data/Makefile +5 -0
- data/bin/console +24 -5
- data/bin/pg +14 -0
- data/config/console-init.rb +1 -0
- data/lib/simple/sql.rb +1 -1
- data/lib/simple/sql/connection.rb +1 -0
- data/lib/simple/sql/connection_adapter.rb +15 -2
- data/lib/simple/sql/duplicate.rb +5 -1
- data/lib/simple/sql/helpers/immutable.rb +150 -0
- data/lib/simple/sql/helpers/row_converter.rb +32 -6
- data/lib/simple/sql/insert.rb +3 -1
- data/lib/simple/sql/reflection.rb +25 -2
- data/lib/simple/sql/result/records.rb +12 -7
- data/lib/simple/sql/scope/filters.rb +0 -1
- data/lib/simple/sql/simple_transactions.rb +0 -2
- data/lib/simple/sql/version.rb +1 -1
- data/scripts/stats +11 -0
- data/spec/simple/sql_locked_spec.rb +20 -0
- data/spec/spec_helper.rb +6 -1
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27cc3b86bf4e72218ecc962cea6700d9a58e6a8ef594e15bfad16125bba792aa
|
4
|
+
data.tar.gz: c4642ed511a3dd94511d6a56b9c22e5bce830e15a6ecb3e2ed3a74d192253e56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 886016b412df3e5ad6d3eead65a1c1c81fe8c6eb98d868f2ae479a6c18b333d68f7661a21e17a566e7cfc151d8c844fca297c86bb7170ca423ff3d97a6bace12
|
7
|
+
data.tar.gz: a651642b76dea15fe5d56c2311576a24d2992aa07d255aab244735c392fe7d9465a93aa255479ba2544e115162bf54b15378d718af40849d3645fbe8338eb051
|
data/.rubocop.yml
CHANGED
data/Makefile
ADDED
data/bin/console
CHANGED
@@ -1,17 +1,36 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
$: << "lib"
|
3
3
|
require "simple/sql"
|
4
|
+
require "simple/store"
|
4
5
|
|
5
6
|
SQL = Simple::SQL
|
6
7
|
SQL.connect!
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
module Reload
|
10
|
+
extend self
|
11
|
+
|
12
|
+
def load_file(path)
|
13
|
+
STDERR.puts "Loading #{path}\n"
|
12
14
|
load path
|
13
|
-
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_dir(dir)
|
18
|
+
Dir.glob("#{dir}/**/*.rb").sort.each_with_index do |path, idx|
|
19
|
+
load_file path
|
20
|
+
end
|
21
|
+
end
|
14
22
|
end
|
15
23
|
|
24
|
+
$VERBOSE = nil
|
25
|
+
|
26
|
+
def reload!
|
27
|
+
Reload.load_dir "lib/simple"
|
28
|
+
Reload.load_file "config/console-init.rb"
|
29
|
+
end
|
30
|
+
|
31
|
+
Reload.load_file "config/console-init.rb"
|
32
|
+
|
16
33
|
require "irb"
|
34
|
+
require "irb/completion"
|
35
|
+
|
17
36
|
IRB.start
|
data/bin/pg
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
env = ENV["POSTJOB_ENV"] || ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
|
5
|
+
|
6
|
+
configs = YAML.load_file "config/database.yml"
|
7
|
+
config = configs.fetch(env) { configs.fetch("defaults") }
|
8
|
+
|
9
|
+
ENV["PGHOST"] = config["host"]
|
10
|
+
ENV["PGPORT"] = config["port"] && config["port"].to_s
|
11
|
+
ENV["PGUSER"] = config["username"]
|
12
|
+
ENV["PGPASSWORD"] = config["password"]
|
13
|
+
|
14
|
+
system "psql", "-d", config.fetch("database")
|
@@ -0,0 +1 @@
|
|
1
|
+
# This file is loaded when running bin/console.
|
data/lib/simple/sql.rb
CHANGED
@@ -21,7 +21,7 @@ module Simple
|
|
21
21
|
module SQL
|
22
22
|
extend self
|
23
23
|
extend Forwardable
|
24
|
-
delegate [:ask, :all, :each, :exec, :print] => :connection
|
24
|
+
delegate [:ask, :all, :each, :exec, :locked, :print] => :connection
|
25
25
|
delegate [:transaction, :wait_for_notify] => :connection
|
26
26
|
|
27
27
|
delegate [:logger, :logger=] => ::Simple::SQL::Logging
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# rubocop:disable Style/IfUnlessModifier
|
2
|
-
|
3
1
|
# This module implements an adapter between the Simple::SQL interface
|
4
2
|
# (i.e. ask, all, first, transaction) and a raw connection.
|
5
3
|
#
|
@@ -83,6 +81,21 @@ module Simple::SQL::ConnectionAdapter
|
|
83
81
|
end
|
84
82
|
end
|
85
83
|
|
84
|
+
# Executes a block, usually of db insert code, while holding an
|
85
|
+
# advisory lock.
|
86
|
+
#
|
87
|
+
# Examples:
|
88
|
+
#
|
89
|
+
# - <tt>Simple::SQL.locked(4711) { puts 'do work while locked' }
|
90
|
+
def locked(lock_id)
|
91
|
+
begin
|
92
|
+
ask("SELECT pg_advisory_lock(#{lock_id})")
|
93
|
+
yield
|
94
|
+
ensure
|
95
|
+
ask("SELECT pg_advisory_unlock(#{lock_id})")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
86
99
|
private
|
87
100
|
|
88
101
|
Encoder = ::Simple::SQL::Helpers::Encoder
|
data/lib/simple/sql/duplicate.rb
CHANGED
@@ -0,0 +1,150 @@
|
|
1
|
+
module Simple
|
2
|
+
module SQL
|
3
|
+
module Helpers
|
4
|
+
end
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class Simple::SQL::Helpers::Immutable
|
9
|
+
SELF = self
|
10
|
+
|
11
|
+
# turns an object, which can be a hash or array of hashes, arrays, and scalars
|
12
|
+
# into an object which you can use to access with dot methods.
|
13
|
+
def self.create(object, max_depth = 5)
|
14
|
+
case object
|
15
|
+
when Array
|
16
|
+
raise ArgumentError, "Object nested too deep (or inner loop?)" if max_depth < 0
|
17
|
+
object.map { |obj| create obj, max_depth - 1 }
|
18
|
+
when Hash
|
19
|
+
new(object)
|
20
|
+
else
|
21
|
+
object
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def initialize(hsh)
|
28
|
+
@hsh = hsh
|
29
|
+
end
|
30
|
+
|
31
|
+
def method_missing(sym, *args, &block)
|
32
|
+
if args.empty? && !block
|
33
|
+
begin
|
34
|
+
value = @hsh.fetch(sym.to_sym) { @hsh.fetch(sym.to_s) }
|
35
|
+
return SELF.create(value)
|
36
|
+
rescue KeyError
|
37
|
+
# STDERR.puts "Missing attribute #{sym} for Immutable w/#{@hsh.inspect}"
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
super
|
43
|
+
end
|
44
|
+
|
45
|
+
public
|
46
|
+
|
47
|
+
def respond_to_missing?(method_name, include_private = false)
|
48
|
+
@hsh.key?(method_name.to_sym) ||
|
49
|
+
@hsh.key?(method_name.to_s) ||
|
50
|
+
super
|
51
|
+
end
|
52
|
+
|
53
|
+
def inspect
|
54
|
+
"<Immutable: #{@hsh.inspect}>"
|
55
|
+
end
|
56
|
+
|
57
|
+
def respond_to?(sym)
|
58
|
+
super || @hsh.key?(sym.to_s) || @hsh.key?(sym.to_sym)
|
59
|
+
end
|
60
|
+
|
61
|
+
def ==(other)
|
62
|
+
@hsh == other
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
if $PROGRAM_NAME == __FILE__
|
67
|
+
|
68
|
+
require "test-unit"
|
69
|
+
|
70
|
+
class Simple::SQL::Helpers::Immutable::TestCase < Test::Unit::TestCase
|
71
|
+
Immutable = ::Simple::SQL::Helpers::Immutable
|
72
|
+
|
73
|
+
def hsh
|
74
|
+
{
|
75
|
+
a: "a-value",
|
76
|
+
"b": "b-value",
|
77
|
+
"child": {
|
78
|
+
name: "childname",
|
79
|
+
grandchild: {
|
80
|
+
name: "grandchildname"
|
81
|
+
}
|
82
|
+
},
|
83
|
+
"children": [
|
84
|
+
"anna",
|
85
|
+
"arthur",
|
86
|
+
{
|
87
|
+
action: {
|
88
|
+
keep_your_mouth_shut: true
|
89
|
+
}
|
90
|
+
}
|
91
|
+
]
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
def immutable
|
96
|
+
Immutable.create hsh
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_hash_access
|
100
|
+
assert_equal "a-value", immutable.a
|
101
|
+
assert_equal "b-value", immutable.b
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_comparison
|
105
|
+
immutable = Immutable.create hsh
|
106
|
+
|
107
|
+
assert_equal immutable, hsh
|
108
|
+
assert_not_equal({}, immutable)
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_child_access
|
112
|
+
child = immutable.child
|
113
|
+
assert_kind_of(Immutable, child)
|
114
|
+
assert_equal "childname", immutable.child.name
|
115
|
+
assert_equal "grandchildname", immutable.child.grandchild.name
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_array_access
|
119
|
+
assert_kind_of(Array, immutable.children)
|
120
|
+
assert_equal 3, immutable.children.length
|
121
|
+
assert_equal "anna", immutable.children[0]
|
122
|
+
|
123
|
+
assert_kind_of(Immutable, immutable.children[2])
|
124
|
+
assert_equal true, immutable.children[2].action.keep_your_mouth_shut
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_base_class
|
128
|
+
assert_nothing_raised do
|
129
|
+
immutable.object_id
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_missing_keys
|
134
|
+
assert_raise(NoMethodError) do
|
135
|
+
immutable.foo
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_skip_when_args_or_block
|
140
|
+
assert_raise(NoMethodError) do
|
141
|
+
immutable.a(1, 2, 3)
|
142
|
+
end
|
143
|
+
assert_raise(NoMethodError) do
|
144
|
+
immutable.a { :dummy }
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# rubocop:enable Style/ClassAndModuleChildren
|
150
|
+
end
|
@@ -1,15 +1,21 @@
|
|
1
|
+
require_relative "./immutable"
|
2
|
+
|
1
3
|
module Simple::SQL::Helpers::RowConverter
|
2
4
|
SELF = self
|
3
5
|
|
4
6
|
# returns an array of converted records
|
5
|
-
def self.convert_row(records, into:, associations: nil)
|
7
|
+
def self.convert_row(records, into:, associations: nil, fq_table_name: nil)
|
6
8
|
hsh = records.first
|
7
9
|
return records unless hsh
|
8
10
|
|
9
11
|
converter = if into == :struct
|
10
12
|
StructConverter.for(attributes: hsh.keys, associations: associations)
|
13
|
+
elsif into == :immutable
|
14
|
+
ImmutableConverter.new(type: into, associations: associations)
|
15
|
+
elsif into.respond_to?(:new_from_row)
|
16
|
+
TypeConverter2.new(type: into, associations: associations, fq_table_name: fq_table_name)
|
11
17
|
else
|
12
|
-
TypeConverter.
|
18
|
+
TypeConverter.new(type: into, associations: associations)
|
13
19
|
end
|
14
20
|
|
15
21
|
records.map { |record| converter.convert_row(record) }
|
@@ -21,10 +27,6 @@ module Simple::SQL::Helpers::RowConverter
|
|
21
27
|
end
|
22
28
|
|
23
29
|
class TypeConverter #:nodoc:
|
24
|
-
def self.for(type:, associations:)
|
25
|
-
new(type: type, associations: associations)
|
26
|
-
end
|
27
|
-
|
28
30
|
def initialize(type:, associations:)
|
29
31
|
@type = type
|
30
32
|
@associations = associations
|
@@ -32,6 +34,10 @@ module Simple::SQL::Helpers::RowConverter
|
|
32
34
|
|
33
35
|
def convert_row(hsh)
|
34
36
|
hsh = convert_associations(hsh) if @associations
|
37
|
+
build_row_in_target_type hsh
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_row_in_target_type(hsh)
|
35
41
|
@type.new hsh
|
36
42
|
end
|
37
43
|
|
@@ -50,6 +56,26 @@ module Simple::SQL::Helpers::RowConverter
|
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
59
|
+
class ImmutableConverter < TypeConverter #:nodoc:
|
60
|
+
Immutable = ::Simple::SQL::Helpers::Immutable
|
61
|
+
|
62
|
+
def build_row_in_target_type(hsh)
|
63
|
+
Immutable.create hsh
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class TypeConverter2 < TypeConverter #:nodoc:
|
68
|
+
def initialize(type:, associations:, fq_table_name:)
|
69
|
+
super(type: type, associations: associations)
|
70
|
+
@fq_table_name = fq_table_name
|
71
|
+
end
|
72
|
+
|
73
|
+
def convert_row(hsh)
|
74
|
+
hsh = convert_associations(hsh) if @associations
|
75
|
+
@type.new_from_row hsh, fq_table_name: @fq_table_name
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
53
79
|
class StructConverter # :nodoc:
|
54
80
|
def self.for(attributes:, associations:)
|
55
81
|
@cache ||= {}
|
data/lib/simple/sql/insert.rb
CHANGED
@@ -40,6 +40,8 @@ module Simple
|
|
40
40
|
# - columns - name of columns, as Array[String] or Array[Symbol]
|
41
41
|
#
|
42
42
|
def initialize(table_name:, columns:, on_conflict:, into:)
|
43
|
+
raise ArgumentError, "Cannot insert a record without attributes" if columns.empty?
|
44
|
+
|
43
45
|
@columns = columns
|
44
46
|
@into = into
|
45
47
|
|
@@ -54,7 +56,7 @@ module Simple
|
|
54
56
|
cols += timestamp_columns
|
55
57
|
vals += timestamp_columns.map { "now()" }
|
56
58
|
|
57
|
-
returning = into ?
|
59
|
+
returning = into ? "*" : "id"
|
58
60
|
|
59
61
|
@sql = "INSERT INTO #{table_name} (#{cols.join(',')}) VALUES(#{vals.join(',')}) #{confict_handling(on_conflict)} RETURNING #{returning}"
|
60
62
|
end
|
@@ -46,6 +46,13 @@ module Simple
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def column_info(table_name)
|
49
|
+
@column_info ||= {}
|
50
|
+
@column_info[table_name] ||= _column_info(table_name)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def _column_info(table_name)
|
49
56
|
schema, table_name = parse_table_name(table_name)
|
50
57
|
recs = all <<~SQL, schema, table_name, into: Hash
|
51
58
|
SELECT
|
@@ -58,8 +65,6 @@ module Simple
|
|
58
65
|
records_by_attr(recs, :column_name)
|
59
66
|
end
|
60
67
|
|
61
|
-
private
|
62
|
-
|
63
68
|
def parse_table_name(table_name)
|
64
69
|
p1, p2 = table_name.split(".", 2)
|
65
70
|
if p2
|
@@ -75,6 +80,24 @@ module Simple
|
|
75
80
|
hsh.update record[attr] => OpenStruct.new(record)
|
76
81
|
end
|
77
82
|
end
|
83
|
+
|
84
|
+
public
|
85
|
+
|
86
|
+
def lookup_pg_class(oid)
|
87
|
+
@pg_classes ||= {}
|
88
|
+
@pg_classes[oid] ||= _lookup_pg_class(oid)
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def _lookup_pg_class(oid)
|
94
|
+
::Simple::SQL.ask <<~SQL, oid
|
95
|
+
SELECT nspname AS schema, relname AS host_table
|
96
|
+
FROM pg_class
|
97
|
+
JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
|
98
|
+
WHERE pg_class.oid=$1
|
99
|
+
SQL
|
100
|
+
end
|
78
101
|
end
|
79
102
|
end
|
80
103
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
# xrubocop:disable Metrics/ParameterLists
|
2
2
|
|
3
3
|
require_relative "association_loader"
|
4
|
+
require "simple/sql/reflection"
|
4
5
|
|
5
6
|
class ::Simple::SQL::Result::Records < ::Simple::SQL::Result
|
7
|
+
Reflection = ::Simple::SQL::Reflection
|
8
|
+
|
6
9
|
def initialize(records, target_type:, pg_source_oid:) # :nodoc:
|
7
10
|
expect! records.first => Hash unless records.empty?
|
8
11
|
|
@@ -45,12 +48,9 @@ class ::Simple::SQL::Result::Records < ::Simple::SQL::Result
|
|
45
48
|
expect! as => [nil, Symbol]
|
46
49
|
|
47
50
|
# resolve oid into table and schema name.
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
|
52
|
-
WHERE pg_class.oid=$1
|
53
|
-
SQL
|
51
|
+
#
|
52
|
+
# [TODO] is this still correct?
|
53
|
+
schema, host_table = Reflection.lookup_pg_class @pg_source_oid
|
54
54
|
|
55
55
|
AssociationLoader.preload @hash_records, association,
|
56
56
|
host_table: host_table, schema: schema, as: as,
|
@@ -68,7 +68,12 @@ class ::Simple::SQL::Result::Records < ::Simple::SQL::Result
|
|
68
68
|
|
69
69
|
def materialize
|
70
70
|
records = @hash_records
|
71
|
-
|
71
|
+
if @target_type != Hash
|
72
|
+
schema, host_table = Reflection.lookup_pg_class(@pg_source_oid)
|
73
|
+
records = RowConverter.convert_row(records, associations: @associations,
|
74
|
+
into: @target_type,
|
75
|
+
fq_table_name: "#{schema}.#{host_table}")
|
76
|
+
end
|
72
77
|
replace(records)
|
73
78
|
end
|
74
79
|
end
|
data/lib/simple/sql/version.rb
CHANGED
data/scripts/stats
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "Simple::SQL.locked" do
|
4
|
+
xit 'acquires and releases an advisory lock' do # pending: "This code was manually tested"
|
5
|
+
one = Simple::SQL.locked(4711) do
|
6
|
+
Simple::SQL.ask "SELECT 1"
|
7
|
+
end
|
8
|
+
|
9
|
+
expect(one).to eq(1)
|
10
|
+
end
|
11
|
+
|
12
|
+
xit 'releases the lock after an exception' do # pending: "This code was manually tested"
|
13
|
+
begin
|
14
|
+
Simple::SQL.locked(4711) do
|
15
|
+
raise "HU"
|
16
|
+
end
|
17
|
+
rescue
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -21,7 +21,8 @@ end
|
|
21
21
|
SQL = Simple::SQL
|
22
22
|
USER_COUNT = 2
|
23
23
|
|
24
|
-
ActiveRecord::Base.logger.level = Logger::
|
24
|
+
ActiveRecord::Base.logger.level = Logger::DEBUG
|
25
|
+
Simple::SQL.logger.level = Logger::DEBUG
|
25
26
|
|
26
27
|
RSpec.configure do |config|
|
27
28
|
config.run_all_when_everything_filtered = true
|
@@ -30,6 +31,10 @@ RSpec.configure do |config|
|
|
30
31
|
config.order = "random"
|
31
32
|
config.example_status_persistence_file_path = ".rspec.data"
|
32
33
|
|
34
|
+
config.backtrace_exclusion_patterns << /spec\/support/
|
35
|
+
config.backtrace_exclusion_patterns << /spec_helper/
|
36
|
+
config.backtrace_exclusion_patterns << /database_cleaner/
|
37
|
+
|
33
38
|
config.around(:each) do |example|
|
34
39
|
Simple::SQL.ask "TRUNCATE TABLE users, unique_users, organizations RESTART IDENTITY CASCADE"
|
35
40
|
example.run
|
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.23
|
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-11-
|
12
|
+
date: 2018-11-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pg_array_parser
|
@@ -175,10 +175,13 @@ files:
|
|
175
175
|
- ".rubocop.yml"
|
176
176
|
- ".tm_properties"
|
177
177
|
- Gemfile
|
178
|
+
- Makefile
|
178
179
|
- README.md
|
179
180
|
- Rakefile
|
180
181
|
- bin/console
|
182
|
+
- bin/pg
|
181
183
|
- bin/rake
|
184
|
+
- config/console-init.rb
|
182
185
|
- config/database.yml
|
183
186
|
- lib/simple-sql.rb
|
184
187
|
- lib/simple/sql.rb
|
@@ -189,6 +192,7 @@ files:
|
|
189
192
|
- lib/simple/sql/helpers.rb
|
190
193
|
- lib/simple/sql/helpers/decoder.rb
|
191
194
|
- lib/simple/sql/helpers/encoder.rb
|
195
|
+
- lib/simple/sql/helpers/immutable.rb
|
192
196
|
- lib/simple/sql/helpers/row_converter.rb
|
193
197
|
- lib/simple/sql/insert.rb
|
194
198
|
- lib/simple/sql/logging.rb
|
@@ -203,6 +207,7 @@ files:
|
|
203
207
|
- lib/simple/sql/simple_transactions.rb
|
204
208
|
- lib/simple/sql/version.rb
|
205
209
|
- log/.gitkeep
|
210
|
+
- scripts/stats
|
206
211
|
- scripts/watch
|
207
212
|
- simple-sql.gemspec
|
208
213
|
- spec/manual/threadtest.rb
|
@@ -217,6 +222,7 @@ files:
|
|
217
222
|
- spec/simple/sql/reflection_spec.rb
|
218
223
|
- spec/simple/sql/scope_spec.rb
|
219
224
|
- spec/simple/sql/version_spec.rb
|
225
|
+
- spec/simple/sql_locked_spec.rb
|
220
226
|
- spec/spec_helper.rb
|
221
227
|
- spec/support/001_database.rb
|
222
228
|
- spec/support/002_database_cleaner.rb
|
@@ -260,6 +266,7 @@ test_files:
|
|
260
266
|
- spec/simple/sql/reflection_spec.rb
|
261
267
|
- spec/simple/sql/scope_spec.rb
|
262
268
|
- spec/simple/sql/version_spec.rb
|
269
|
+
- spec/simple/sql_locked_spec.rb
|
263
270
|
- spec/spec_helper.rb
|
264
271
|
- spec/support/001_database.rb
|
265
272
|
- spec/support/002_database_cleaner.rb
|