pgoutput-parser 0.1.1 → 0.2.0
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/CHANGELOG.md +36 -4
- data/README.md +69 -7
- data/docs/glossary.md +145 -0
- data/docs/index.md +239 -0
- data/docs/relation_tracker.md +168 -0
- data/lib/pgoutput/binary_parser.rb +47 -11
- data/lib/pgoutput/errors.rb +10 -4
- data/lib/pgoutput/messages.rb +40 -2
- data/lib/pgoutput/relation_tracker.rb +79 -18
- data/lib/pgoutput/version.rb +1 -1
- data/lib/pgoutput.rb +1 -1
- data/sig/pgoutput.rbs +85 -30
- metadata +7 -102
data/sig/pgoutput.rbs
CHANGED
|
@@ -3,10 +3,14 @@ module Pgoutput
|
|
|
3
3
|
|
|
4
4
|
type message =
|
|
5
5
|
Messages::Begin |
|
|
6
|
+
Messages::Message |
|
|
7
|
+
Messages::Origin |
|
|
6
8
|
Messages::Relation |
|
|
9
|
+
Messages::Type |
|
|
7
10
|
Messages::Insert |
|
|
8
11
|
Messages::Update |
|
|
9
12
|
Messages::Delete |
|
|
13
|
+
Messages::Truncate |
|
|
10
14
|
Messages::Commit
|
|
11
15
|
|
|
12
16
|
class Error < StandardError
|
|
@@ -21,6 +25,10 @@ module Pgoutput
|
|
|
21
25
|
class UnknownRelationError < Error
|
|
22
26
|
end
|
|
23
27
|
|
|
28
|
+
class TupleArityError < Error
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Immutable message model classes for the PostgreSQL pgoutput protocol.
|
|
24
32
|
module Messages
|
|
25
33
|
class Begin < Data
|
|
26
34
|
attr_reader final_lsn: Integer
|
|
@@ -39,6 +47,22 @@ module Pgoutput
|
|
|
39
47
|
def self.new: (Integer flags, String name, Integer oid, Integer type_modifier) -> Column
|
|
40
48
|
end
|
|
41
49
|
|
|
50
|
+
class Message < Data
|
|
51
|
+
attr_reader flags: Integer
|
|
52
|
+
attr_reader lsn: Integer
|
|
53
|
+
attr_reader prefix: String
|
|
54
|
+
attr_reader content: String
|
|
55
|
+
|
|
56
|
+
def self.new: (Integer flags, Integer lsn, String prefix, String content) -> Message
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
class Origin < Data
|
|
60
|
+
attr_reader origin_lsn: Integer
|
|
61
|
+
attr_reader name: String
|
|
62
|
+
|
|
63
|
+
def self.new: (Integer origin_lsn, String name) -> Origin
|
|
64
|
+
end
|
|
65
|
+
|
|
42
66
|
class Relation < Data
|
|
43
67
|
attr_reader relation_id: Integer
|
|
44
68
|
attr_reader schema: String
|
|
@@ -46,13 +70,15 @@ module Pgoutput
|
|
|
46
70
|
attr_reader replica_identity: Integer
|
|
47
71
|
attr_reader columns: Array[Column]
|
|
48
72
|
|
|
49
|
-
def self.new: (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
73
|
+
def self.new: (Integer relation_id, String schema, String table, Integer replica_identity, Array[Column] columns) -> Relation
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
class Type < Data
|
|
77
|
+
attr_reader oid: Integer
|
|
78
|
+
attr_reader schema: String
|
|
79
|
+
attr_reader name: String
|
|
80
|
+
|
|
81
|
+
def self.new: (Integer oid, String schema, String name) -> Type
|
|
56
82
|
end
|
|
57
83
|
|
|
58
84
|
class TupleValue < Data
|
|
@@ -60,11 +86,7 @@ module Pgoutput
|
|
|
60
86
|
attr_reader raw: String?
|
|
61
87
|
attr_reader oid: Integer?
|
|
62
88
|
|
|
63
|
-
def self.new: (
|
|
64
|
-
:null | :unchanged_toast | :text | :binary format,
|
|
65
|
-
String? raw,
|
|
66
|
-
Integer? oid
|
|
67
|
-
) -> TupleValue
|
|
89
|
+
def self.new: (:null | :unchanged_toast | :text | :binary format, String? raw, Integer? oid) -> TupleValue
|
|
68
90
|
end
|
|
69
91
|
|
|
70
92
|
class Insert < Data
|
|
@@ -80,12 +102,7 @@ module Pgoutput
|
|
|
80
102
|
attr_reader old_tuple: Array[TupleValue]?
|
|
81
103
|
attr_reader new_tuple: Array[TupleValue]
|
|
82
104
|
|
|
83
|
-
def self.new: (
|
|
84
|
-
Integer relation_id,
|
|
85
|
-
Array[TupleValue]? old_key_tuple,
|
|
86
|
-
Array[TupleValue]? old_tuple,
|
|
87
|
-
Array[TupleValue] new_tuple
|
|
88
|
-
) -> Update
|
|
105
|
+
def self.new: (Integer relation_id, Array[TupleValue]? old_key_tuple, Array[TupleValue]? old_tuple, Array[TupleValue] new_tuple) -> Update
|
|
89
106
|
end
|
|
90
107
|
|
|
91
108
|
class Delete < Data
|
|
@@ -93,11 +110,14 @@ module Pgoutput
|
|
|
93
110
|
attr_reader old_key_tuple: Array[TupleValue]?
|
|
94
111
|
attr_reader old_tuple: Array[TupleValue]?
|
|
95
112
|
|
|
96
|
-
def self.new: (
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
113
|
+
def self.new: (Integer relation_id, Array[TupleValue]? old_key_tuple, Array[TupleValue]? old_tuple) -> Delete
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
class Truncate < Data
|
|
117
|
+
attr_reader relation_ids: Array[Integer]
|
|
118
|
+
attr_reader options: Integer
|
|
119
|
+
|
|
120
|
+
def self.new: (Array[Integer] relation_ids, Integer options) -> Truncate
|
|
101
121
|
end
|
|
102
122
|
|
|
103
123
|
class Commit < Data
|
|
@@ -106,24 +126,59 @@ module Pgoutput
|
|
|
106
126
|
attr_reader transaction_end_lsn: Integer
|
|
107
127
|
attr_reader commit_timestamp: Integer
|
|
108
128
|
|
|
109
|
-
def self.new: (
|
|
110
|
-
Integer flags,
|
|
111
|
-
Integer commit_lsn,
|
|
112
|
-
Integer transaction_end_lsn,
|
|
113
|
-
Integer commit_timestamp
|
|
114
|
-
) -> Commit
|
|
129
|
+
def self.new: (Integer flags, Integer commit_lsn, Integer transaction_end_lsn, Integer commit_timestamp) -> Commit
|
|
115
130
|
end
|
|
116
131
|
end
|
|
117
132
|
|
|
118
133
|
class BinaryParser
|
|
134
|
+
@payload: String
|
|
135
|
+
@offset: Integer
|
|
136
|
+
|
|
119
137
|
def initialize: (String payload) -> void
|
|
120
138
|
|
|
121
139
|
def parse: () -> message
|
|
140
|
+
|
|
141
|
+
private
|
|
142
|
+
|
|
143
|
+
def parse_begin: () -> Messages::Begin
|
|
144
|
+
def parse_message: () -> Messages::Message
|
|
145
|
+
def parse_origin: () -> Messages::Origin
|
|
146
|
+
def parse_relation: () -> Messages::Relation
|
|
147
|
+
def parse_type: () -> Messages::Type
|
|
148
|
+
def parse_insert: () -> Messages::Insert
|
|
149
|
+
def parse_update: () -> Messages::Update
|
|
150
|
+
def parse_delete: () -> Messages::Delete
|
|
151
|
+
def parse_truncate: () -> Messages::Truncate
|
|
152
|
+
def parse_commit: () -> Messages::Commit
|
|
153
|
+
def parse_tuple_data: () -> Array[Messages::TupleValue]
|
|
154
|
+
def read_uint8: () -> Integer
|
|
155
|
+
def read_uint16: () -> Integer
|
|
156
|
+
def read_uint32: () -> Integer
|
|
157
|
+
def read_int32: () -> Integer
|
|
158
|
+
def read_uint64: () -> Integer
|
|
159
|
+
def read_byte_chr: () -> String
|
|
160
|
+
def read_cstring: () -> String
|
|
161
|
+
def read_bytes: (Integer length) -> String
|
|
162
|
+
def share: [T < message] (T message) -> T
|
|
122
163
|
end
|
|
123
164
|
|
|
124
165
|
class RelationTracker
|
|
125
|
-
|
|
166
|
+
@relations: Hash[Integer, Messages::Relation]
|
|
167
|
+
|
|
168
|
+
def initialize: (?relation_cache: untyped) -> void
|
|
126
169
|
|
|
127
170
|
def process: (String payload) -> message
|
|
171
|
+
|
|
172
|
+
def decode: (String payload) -> message
|
|
173
|
+
|
|
174
|
+
private
|
|
175
|
+
|
|
176
|
+
def annotate_insert: (Messages::Insert message) -> Messages::Insert
|
|
177
|
+
def annotate_update: (Messages::Update message) -> Messages::Update
|
|
178
|
+
def annotate_delete: (Messages::Delete message) -> Messages::Delete
|
|
179
|
+
def annotate_optional_tuple: (Array[Messages::TupleValue]? tuple, Messages::Relation relation) -> Array[Messages::TupleValue]?
|
|
180
|
+
def annotate_tuple: (Array[Messages::TupleValue] tuple, Messages::Relation relation) -> Array[Messages::TupleValue]
|
|
181
|
+
def validate_tuple_arity!: (Array[Messages::TupleValue] tuple, Messages::Relation relation) -> void
|
|
182
|
+
def relation_for: (Integer relation_id) -> Messages::Relation
|
|
128
183
|
end
|
|
129
184
|
end
|
metadata
CHANGED
|
@@ -1,112 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pgoutput-parser
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ken C. Demanawa
|
|
8
8
|
bindir: bin
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
-
dependencies:
|
|
12
|
-
- !ruby/object:Gem::Dependency
|
|
13
|
-
name: minitest
|
|
14
|
-
requirement: !ruby/object:Gem::Requirement
|
|
15
|
-
requirements:
|
|
16
|
-
- - "~>"
|
|
17
|
-
- !ruby/object:Gem::Version
|
|
18
|
-
version: '5.27'
|
|
19
|
-
type: :development
|
|
20
|
-
prerelease: false
|
|
21
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
-
requirements:
|
|
23
|
-
- - "~>"
|
|
24
|
-
- !ruby/object:Gem::Version
|
|
25
|
-
version: '5.27'
|
|
26
|
-
- !ruby/object:Gem::Dependency
|
|
27
|
-
name: pry
|
|
28
|
-
requirement: !ruby/object:Gem::Requirement
|
|
29
|
-
requirements:
|
|
30
|
-
- - "~>"
|
|
31
|
-
- !ruby/object:Gem::Version
|
|
32
|
-
version: 0.16.0
|
|
33
|
-
type: :development
|
|
34
|
-
prerelease: false
|
|
35
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
-
requirements:
|
|
37
|
-
- - "~>"
|
|
38
|
-
- !ruby/object:Gem::Version
|
|
39
|
-
version: 0.16.0
|
|
40
|
-
- !ruby/object:Gem::Dependency
|
|
41
|
-
name: rake
|
|
42
|
-
requirement: !ruby/object:Gem::Requirement
|
|
43
|
-
requirements:
|
|
44
|
-
- - "~>"
|
|
45
|
-
- !ruby/object:Gem::Version
|
|
46
|
-
version: '13.4'
|
|
47
|
-
type: :development
|
|
48
|
-
prerelease: false
|
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
-
requirements:
|
|
51
|
-
- - "~>"
|
|
52
|
-
- !ruby/object:Gem::Version
|
|
53
|
-
version: '13.4'
|
|
54
|
-
- !ruby/object:Gem::Dependency
|
|
55
|
-
name: rubocop
|
|
56
|
-
requirement: !ruby/object:Gem::Requirement
|
|
57
|
-
requirements:
|
|
58
|
-
- - "~>"
|
|
59
|
-
- !ruby/object:Gem::Version
|
|
60
|
-
version: '1.87'
|
|
61
|
-
type: :development
|
|
62
|
-
prerelease: false
|
|
63
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
-
requirements:
|
|
65
|
-
- - "~>"
|
|
66
|
-
- !ruby/object:Gem::Version
|
|
67
|
-
version: '1.87'
|
|
68
|
-
- !ruby/object:Gem::Dependency
|
|
69
|
-
name: simplecov
|
|
70
|
-
requirement: !ruby/object:Gem::Requirement
|
|
71
|
-
requirements:
|
|
72
|
-
- - "~>"
|
|
73
|
-
- !ruby/object:Gem::Version
|
|
74
|
-
version: '0.22'
|
|
75
|
-
type: :development
|
|
76
|
-
prerelease: false
|
|
77
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
-
requirements:
|
|
79
|
-
- - "~>"
|
|
80
|
-
- !ruby/object:Gem::Version
|
|
81
|
-
version: '0.22'
|
|
82
|
-
- !ruby/object:Gem::Dependency
|
|
83
|
-
name: steep
|
|
84
|
-
requirement: !ruby/object:Gem::Requirement
|
|
85
|
-
requirements:
|
|
86
|
-
- - "~>"
|
|
87
|
-
- !ruby/object:Gem::Version
|
|
88
|
-
version: '1.10'
|
|
89
|
-
type: :development
|
|
90
|
-
prerelease: false
|
|
91
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
-
requirements:
|
|
93
|
-
- - "~>"
|
|
94
|
-
- !ruby/object:Gem::Version
|
|
95
|
-
version: '1.10'
|
|
96
|
-
- !ruby/object:Gem::Dependency
|
|
97
|
-
name: yard
|
|
98
|
-
requirement: !ruby/object:Gem::Requirement
|
|
99
|
-
requirements:
|
|
100
|
-
- - "~>"
|
|
101
|
-
- !ruby/object:Gem::Version
|
|
102
|
-
version: 0.9.44
|
|
103
|
-
type: :development
|
|
104
|
-
prerelease: false
|
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
-
requirements:
|
|
107
|
-
- - "~>"
|
|
108
|
-
- !ruby/object:Gem::Version
|
|
109
|
-
version: 0.9.44
|
|
11
|
+
dependencies: []
|
|
110
12
|
description: A pure Ruby parser for PostgreSQL pgoutput logical replication CopyData
|
|
111
13
|
payloads.
|
|
112
14
|
email:
|
|
@@ -118,6 +20,9 @@ files:
|
|
|
118
20
|
- CHANGELOG.md
|
|
119
21
|
- LICENSE.txt
|
|
120
22
|
- README.md
|
|
23
|
+
- docs/glossary.md
|
|
24
|
+
- docs/index.md
|
|
25
|
+
- docs/relation_tracker.md
|
|
121
26
|
- lib/pgoutput.rb
|
|
122
27
|
- lib/pgoutput/binary_parser.rb
|
|
123
28
|
- lib/pgoutput/errors.rb
|
|
@@ -140,14 +45,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
140
45
|
requirements:
|
|
141
46
|
- - ">="
|
|
142
47
|
- !ruby/object:Gem::Version
|
|
143
|
-
version: '
|
|
48
|
+
version: '4.0'
|
|
144
49
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
50
|
requirements:
|
|
146
51
|
- - ">="
|
|
147
52
|
- !ruby/object:Gem::Version
|
|
148
53
|
version: '0'
|
|
149
54
|
requirements: []
|
|
150
|
-
rubygems_version:
|
|
55
|
+
rubygems_version: 4.0.10
|
|
151
56
|
specification_version: 4
|
|
152
57
|
summary: Ractor-safe PostgreSQL pgoutput logical replication protocol parser.
|
|
153
58
|
test_files: []
|