flounder 0.9.3 → 0.9.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.
- checksums.yaml +4 -4
- data/HISTORY +2 -1
- data/flounder.gemspec +9 -4
- data/lib/flounder/domain.rb +41 -6
- data/lib/flounder/exceptions.rb +3 -0
- data/qed/database_technicalities.md +19 -9
- metadata +8 -7
- data/flounder-0.9.1.gem +0 -0
- data/flounder-0.9.2.gem +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2a4bab6f9430ad7169aafe13673bb79debf2d1a
|
4
|
+
data.tar.gz: ddaa62449b7848ba338f79e48c22eab8d95da823
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef55ee6011bb3a31c99161529775800e347691a93b39b685eb6561c7ad0364a2f1b37d03e8c4236dd99e32d63cfd656900aed69404ffe2143e846dafaac34f91
|
7
|
+
data.tar.gz: c86cfee4eb453d63af98b23da4a5faeaad3292a3023b983631c159c53ad7bb7037eacd3cc2a8c341b73e0144f79db3166d9377eea5ac0bf10b1f34182f93fad4
|
data/HISTORY
CHANGED
data/flounder.gemspec
CHANGED
@@ -2,21 +2,26 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "flounder"
|
5
|
-
s.version = '0.9.
|
5
|
+
s.version = '0.9.4'
|
6
6
|
s.summary = "Flounder is a way to write SQL simply in Ruby. It deals with everything BUT object relational mapping. "
|
7
7
|
s.email = "kaspar.schiess@technologyastronauts.ch"
|
8
8
|
s.homepage = "https://bitbucket.org/technologyastronauts/oss_flounder"
|
9
9
|
s.authors = ['Kaspar Schiess', 'Florian Hanke']
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
s.description = <<-EOF
|
12
|
+
Flounder is the missing piece between the database and your Ruby code. It
|
13
|
+
allows very simple access to database tables without going all the way to
|
14
|
+
begin an object mapper.
|
15
|
+
EOF
|
13
16
|
|
14
17
|
s.add_runtime_dependency 'arel', '~> 5', '> 5.0.1'
|
15
|
-
s.add_runtime_dependency 'pg', '
|
18
|
+
s.add_runtime_dependency 'pg', '~> 0.17'
|
16
19
|
s.add_runtime_dependency 'hashie', '~> 3', '>= 3.2'
|
17
20
|
s.add_runtime_dependency 'connection_pool', '~> 2'
|
18
21
|
|
19
22
|
s.files = Dir['**/*']
|
20
23
|
s.test_files = Dir['qed/**/*']
|
21
24
|
s.require_paths = ["lib"]
|
25
|
+
|
26
|
+
s.licenses = 'MIT'
|
22
27
|
end
|
data/lib/flounder/domain.rb
CHANGED
@@ -3,10 +3,6 @@ require 'forwardable'
|
|
3
3
|
require 'logger'
|
4
4
|
|
5
5
|
module Flounder
|
6
|
-
# Raised when an entity name cannot be found in this domain.
|
7
|
-
class NoSuchEntity < StandardError
|
8
|
-
end
|
9
|
-
|
10
6
|
class Domain
|
11
7
|
# A device that discards all logging made to it. This is used to be silent
|
12
8
|
# by default while still allowing the logging of all queries.
|
@@ -29,8 +25,11 @@ module Flounder
|
|
29
25
|
@oids_entity_map = {}
|
30
26
|
|
31
27
|
@logger = Logger.new(NilDevice.new)
|
28
|
+
|
29
|
+
@savepoints = Hash.new(0)
|
32
30
|
end
|
33
31
|
|
32
|
+
attr_reader :savepoints
|
34
33
|
attr_reader :connection_pool
|
35
34
|
attr_accessor :logger
|
36
35
|
|
@@ -39,8 +38,12 @@ module Flounder
|
|
39
38
|
|
40
39
|
def transaction &block
|
41
40
|
with_connection do |conn|
|
42
|
-
conn
|
43
|
-
block.call(conn)
|
41
|
+
if in_transaction?(conn)
|
42
|
+
savepoint(conn) { block.call(conn) }
|
43
|
+
else
|
44
|
+
conn.transaction do
|
45
|
+
savepoint(conn) { block.call(conn) }
|
46
|
+
end
|
44
47
|
end
|
45
48
|
end
|
46
49
|
end
|
@@ -89,6 +92,38 @@ module Flounder
|
|
89
92
|
end
|
90
93
|
|
91
94
|
private
|
95
|
+
def sp_count connection
|
96
|
+
savepoints[connection.object_id]
|
97
|
+
end
|
98
|
+
def inc_sp connection
|
99
|
+
savepoints[connection.object_id] += 1
|
100
|
+
end
|
101
|
+
def dec_sp connection
|
102
|
+
savepoints[connection.object_id] -= 1
|
103
|
+
if savepoints[connection.object_id] < 0
|
104
|
+
fail "ASSERTION FAILURE: Savepoint count cannot drop below zero!"
|
105
|
+
end
|
106
|
+
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
def in_transaction? connection
|
110
|
+
sp_count(connection) > 0
|
111
|
+
end
|
112
|
+
def savepoint connection, &block
|
113
|
+
sp_number = inc_sp(connection)
|
114
|
+
sp_name = "s#{sp_number}"
|
115
|
+
|
116
|
+
connection.exec("SAVEPOINT #{sp_name};")
|
117
|
+
begin
|
118
|
+
yield
|
119
|
+
rescue Exception
|
120
|
+
connection.exec("ROLLBACK TO SAVEPOINT #{sp_name};")
|
121
|
+
raise
|
122
|
+
ensure
|
123
|
+
dec_sp(connection)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
92
127
|
def table_oid table_name
|
93
128
|
connection_pool.with_connection do |conn|
|
94
129
|
# TBD
|
data/lib/flounder/exceptions.rb
CHANGED
@@ -4,26 +4,36 @@ Transactions are supported on the domain and on entities. Since you need to make
|
|
4
4
|
|
5
5
|
~~~ruby
|
6
6
|
expect RuntimeError do
|
7
|
-
domain.
|
8
|
-
|
9
|
-
|
10
|
-
fail 'rollback'
|
11
|
-
end
|
7
|
+
domain.transaction do |conn|
|
8
|
+
posts.update(title: 'A single title for everyone').kick(conn)
|
9
|
+
fail 'rollback'
|
12
10
|
end
|
13
11
|
end
|
14
12
|
|
15
13
|
posts.first.title.assert != 'A single title for everyone'
|
16
14
|
~~~
|
17
15
|
|
18
|
-
The same works on any entity from the domain.
|
16
|
+
The same works on any entity from the domain.
|
19
17
|
|
20
18
|
~~~ruby
|
21
|
-
|
19
|
+
posts.transaction do |conn|
|
22
20
|
posts.all(conn)
|
23
21
|
end
|
22
|
+
~~~
|
24
23
|
|
25
|
-
|
26
|
-
|
24
|
+
Domain transactions can be nested. Internally, this is realized using PostgreSQL savepoints.
|
25
|
+
|
26
|
+
~~~ruby
|
27
|
+
domain.transaction do |connection|
|
28
|
+
begin
|
29
|
+
domain.transaction do |conn|
|
30
|
+
posts.update(title: 'A single title for everyone').kick(conn)
|
31
|
+
fail 'rollback'
|
32
|
+
end
|
33
|
+
rescue RuntimeError
|
34
|
+
end
|
35
|
+
|
36
|
+
posts.first.title.assert != 'A single title for everyone'
|
27
37
|
end
|
28
38
|
~~~
|
29
39
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flounder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kaspar Schiess
|
@@ -35,14 +35,14 @@ dependencies:
|
|
35
35
|
name: pg
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0.17'
|
41
41
|
type: :runtime
|
42
42
|
prerelease: false
|
43
43
|
version_requirements: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0.17'
|
48
48
|
- !ruby/object:Gem::Dependency
|
@@ -79,7 +79,9 @@ dependencies:
|
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
81
|
version: '2'
|
82
|
-
description:
|
82
|
+
description: " Flounder is the missing piece between the database and your Ruby
|
83
|
+
code. It \n allows very simple access to database tables without going all the
|
84
|
+
way to\n begin an object mapper. \n"
|
83
85
|
email: kaspar.schiess@technologyastronauts.ch
|
84
86
|
executables: []
|
85
87
|
extensions: []
|
@@ -90,8 +92,6 @@ files:
|
|
90
92
|
- HISTORY
|
91
93
|
- LICENSE
|
92
94
|
- README
|
93
|
-
- flounder-0.9.1.gem
|
94
|
-
- flounder-0.9.2.gem
|
95
95
|
- flounder.gemspec
|
96
96
|
- lib/flounder.rb
|
97
97
|
- lib/flounder/connection.rb
|
@@ -128,7 +128,8 @@ files:
|
|
128
128
|
- qed/selects.md
|
129
129
|
- qed/updates.md
|
130
130
|
homepage: https://bitbucket.org/technologyastronauts/oss_flounder
|
131
|
-
licenses:
|
131
|
+
licenses:
|
132
|
+
- MIT
|
132
133
|
metadata: {}
|
133
134
|
post_install_message:
|
134
135
|
rdoc_options: []
|
data/flounder-0.9.1.gem
DELETED
Binary file
|
data/flounder-0.9.2.gem
DELETED
Binary file
|