summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMinijackson <minijackson@riseup.net>2018-07-26 17:00:03 +0200
committerMinijackson <minijackson@riseup.net>2018-07-26 17:00:03 +0200
commit6c5d7a65899f3b322184628c2be68fd3f3fdd5da (patch)
tree2f28fea8c0f39f45b97e3277d75bfa457db7f939
parenta49c078fde2597a05a6b9f6eb2fba5c7fa0b53c9 (diff)
downloadsink-key-for-sinksh.tar.gz
sink-key-for-sinksh.zip
Parse Keys in SinkSH inspectkey-for-sinksh
-rw-r--r--common/storage/key.cpp76
-rw-r--r--common/storage/key.h18
-rw-r--r--sinksh/syntax_modules/sink_inspect.cpp25
3 files changed, 111 insertions, 8 deletions
diff --git a/common/storage/key.cpp b/common/storage/key.cpp
index cfeb016..215e155 100644
--- a/common/storage/key.cpp
+++ b/common/storage/key.cpp
@@ -84,6 +84,27 @@ bool Identifier::isNull() const
84 return uid.isNull(); 84 return uid.isNull();
85} 85}
86 86
87bool Identifier::isValidInternal(const QByteArray &bytes)
88{
89 return !QUuid::fromRfc4122(bytes).isNull();
90}
91
92bool Identifier::isValidDisplay(const QByteArray &bytes)
93{
94 return !QUuid(bytes).isNull();
95}
96
97bool Identifier::isValid(const QByteArray &bytes)
98{
99 switch (bytes.size()) {
100 case Identifier::INTERNAL_REPR_SIZE:
101 return isValidInternal(bytes);
102 case Identifier::DISPLAY_REPR_SIZE:
103 return isValidDisplay(bytes);
104 }
105 return false;
106}
107
87bool Identifier::operator==(const Identifier &other) const 108bool Identifier::operator==(const Identifier &other) const
88{ 109{
89 return uid == other.uid; 110 return uid == other.uid;
@@ -128,6 +149,27 @@ qint64 Revision::toQint64() const
128 return rev; 149 return rev;
129} 150}
130 151
152bool Revision::isValidInternal(const QByteArray &bytes)
153{
154 if (bytes.size() != Revision::INTERNAL_REPR_SIZE) {
155 return false;
156 }
157
158 bool ok;
159 bytes.toLongLong(&ok);
160 return ok;
161}
162
163bool Revision::isValidDisplay(const QByteArray &bytes)
164{
165 isValidInternal(bytes);
166}
167
168bool Revision::isValid(const QByteArray &bytes)
169{
170 isValidInternal(bytes);
171}
172
131bool Revision::operator==(const Revision &other) const 173bool Revision::operator==(const Revision &other) const
132{ 174{
133 return rev == other.rev; 175 return rev == other.rev;
@@ -191,6 +233,39 @@ bool Key::isNull() const
191 return id.isNull(); 233 return id.isNull();
192} 234}
193 235
236bool Key::isValidInternal(const QByteArray &bytes)
237{
238 if (bytes.size() != Key::INTERNAL_REPR_SIZE) {
239 return false;
240 }
241
242 auto idBytes = bytes.mid(0, Identifier::INTERNAL_REPR_SIZE);
243 auto revBytes = bytes.mid(Identifier::INTERNAL_REPR_SIZE);
244 return Identifier::isValidInternal(idBytes) && Revision::isValidInternal(revBytes);
245}
246
247bool Key::isValidDisplay(const QByteArray &bytes)
248{
249 if (bytes.size() != Key::DISPLAY_REPR_SIZE) {
250 return false;
251 }
252
253 auto idBytes = bytes.mid(0, Identifier::DISPLAY_REPR_SIZE);
254 auto revBytes = bytes.mid(Identifier::DISPLAY_REPR_SIZE);
255 return Key::isValidDisplay(idBytes) && Revision::isValidDisplay(revBytes);
256}
257
258bool Key::isValid(const QByteArray &bytes)
259{
260 switch (bytes.size()) {
261 case Key::INTERNAL_REPR_SIZE:
262 return isValidInternal(bytes);
263 case Key::DISPLAY_REPR_SIZE:
264 return isValidDisplay(bytes);
265 }
266 return false;
267}
268
194bool Key::operator==(const Key &other) const 269bool Key::operator==(const Key &other) const
195{ 270{
196 return (id == other.id) && (rev == other.rev); 271 return (id == other.id) && (rev == other.rev);
@@ -200,4 +275,3 @@ bool Key::operator!=(const Key &other) const
200{ 275{
201 return !(*this == other); 276 return !(*this == other);
202} 277}
203
diff --git a/common/storage/key.h b/common/storage/key.h
index a5b92bb..211aea7 100644
--- a/common/storage/key.h
+++ b/common/storage/key.h
@@ -48,6 +48,10 @@ public:
48 48
49 bool isNull() const; 49 bool isNull() const;
50 50
51 static bool isValidInternal(const QByteArray &);
52 static bool isValidDisplay(const QByteArray &);
53 static bool isValid(const QByteArray &);
54
51 bool operator==(const Identifier &other) const; 55 bool operator==(const Identifier &other) const;
52 bool operator!=(const Identifier &other) const; 56 bool operator!=(const Identifier &other) const;
53 57
@@ -72,6 +76,10 @@ public:
72 static Revision fromDisplayByteArray(const QByteArray &bytes); 76 static Revision fromDisplayByteArray(const QByteArray &bytes);
73 qint64 toQint64() const; 77 qint64 toQint64() const;
74 78
79 static bool isValidInternal(const QByteArray &);
80 static bool isValidDisplay(const QByteArray &);
81 static bool isValid(const QByteArray &);
82
75 bool operator==(const Revision &other) const; 83 bool operator==(const Revision &other) const;
76 bool operator!=(const Revision &other) const; 84 bool operator!=(const Revision &other) const;
77 85
@@ -99,6 +107,10 @@ public:
99 107
100 bool isNull() const; 108 bool isNull() const;
101 109
110 static bool isValidInternal(const QByteArray &);
111 static bool isValidDisplay(const QByteArray &);
112 static bool isValid(const QByteArray &);
113
102 bool operator==(const Key &other) const; 114 bool operator==(const Key &other) const;
103 bool operator!=(const Key &other) const; 115 bool operator!=(const Key &other) const;
104 116
@@ -110,6 +122,6 @@ private:
110} // namespace Storage 122} // namespace Storage
111} // namespace Sink 123} // namespace Sink
112 124
113SINK_EXPORT QDebug& operator<<(QDebug &dbg, const Sink::Storage::Identifier &); 125SINK_EXPORT QDebug &operator<<(QDebug &dbg, const Sink::Storage::Identifier &);
114SINK_EXPORT QDebug& operator<<(QDebug &dbg, const Sink::Storage::Revision &); 126SINK_EXPORT QDebug &operator<<(QDebug &dbg, const Sink::Storage::Revision &);
115SINK_EXPORT QDebug& operator<<(QDebug &dbg, const Sink::Storage::Key &); 127SINK_EXPORT QDebug &operator<<(QDebug &dbg, const Sink::Storage::Key &);
diff --git a/sinksh/syntax_modules/sink_inspect.cpp b/sinksh/syntax_modules/sink_inspect.cpp
index 1b3d77c..646a8cc 100644
--- a/sinksh/syntax_modules/sink_inspect.cpp
+++ b/sinksh/syntax_modules/sink_inspect.cpp
@@ -43,6 +43,20 @@
43namespace SinkInspect 43namespace SinkInspect
44{ 44{
45 45
46using Sink::Storage::Key;
47using Sink::Storage::Identifier;
48
49QString parse(const QByteArray &bytes)
50{
51 if (Key::isValidInternal(bytes)) {
52 return Key::fromInternalByteArray(bytes).toDisplayString();
53 } else if (Identifier::isValidInternal(bytes)) {
54 return Identifier::fromInternalByteArray(bytes).toDisplayString();
55 } else {
56 return QString::fromUtf8(bytes);
57 }
58}
59
46bool inspect(const QStringList &args, State &state) 60bool inspect(const QStringList &args, State &state)
47{ 61{
48 if (args.isEmpty()) { 62 if (args.isEmpty()) {
@@ -92,7 +106,7 @@ bool inspect(const QStringList &args, State &state)
92 106
93 QSet<QByteArray> uids; 107 QSet<QByteArray> uids;
94 db.scan("", [&] (const QByteArray &key, const QByteArray &data) { 108 db.scan("", [&] (const QByteArray &key, const QByteArray &data) {
95 uids.insert(Sink::Storage::Key::fromInternalByteArray(key).identifier().toDisplayByteArray()); 109 uids.insert(Key::fromInternalByteArray(key).identifier().toDisplayByteArray());
96 return true; 110 return true;
97 }, 111 },
98 [&](const Sink::Storage::DataStore::Error &e) { 112 [&](const Sink::Storage::DataStore::Error &e) {
@@ -202,13 +216,16 @@ bool inspect(const QStringList &args, State &state)
202 auto count = db.scan(filter, [&] (const QByteArray &key, const QByteArray &data) { 216 auto count = db.scan(filter, [&] (const QByteArray &key, const QByteArray &data) {
203 keySizeTotal += key.size(); 217 keySizeTotal += key.size();
204 valueSizeTotal += data.size(); 218 valueSizeTotal += data.size();
219
220 const auto parsedKey = parse(key);
221
205 if (isMainDb) { 222 if (isMainDb) {
206 Sink::EntityBuffer buffer(const_cast<const char *>(data.data()), data.size()); 223 Sink::EntityBuffer buffer(const_cast<const char *>(data.data()), data.size());
207 if (!buffer.isValid()) { 224 if (!buffer.isValid()) {
208 state.printError("Read invalid buffer from disk: " + key); 225 state.printError("Read invalid buffer from disk: " + parsedKey);
209 } else { 226 } else {
210 const auto metadata = flatbuffers::GetRoot<Sink::Metadata>(buffer.metadataBuffer()); 227 const auto metadata = flatbuffers::GetRoot<Sink::Metadata>(buffer.metadataBuffer());
211 state.printLine("Key: " + key 228 state.printLine("Key: " + parsedKey
212 + " Operation: " + QString::number(metadata->operation()) 229 + " Operation: " + QString::number(metadata->operation())
213 + " Replay: " + (metadata->replayToSource() ? "true" : "false") 230 + " Replay: " + (metadata->replayToSource() ? "true" : "false")
214 + ((metadata->modifiedProperties() && metadata->modifiedProperties()->size() != 0) ? (" [" + Sink::BufferUtils::fromVector(*metadata->modifiedProperties()).join(", ")) + "]": "") 231 + ((metadata->modifiedProperties() && metadata->modifiedProperties()->size() != 0) ? (" [" + Sink::BufferUtils::fromVector(*metadata->modifiedProperties()).join(", ")) + "]": "")
@@ -216,7 +233,7 @@ bool inspect(const QStringList &args, State &state)
216 ); 233 );
217 } 234 }
218 } else { 235 } else {
219 state.printLine("Key: " + key + "\tValue: " + QString::fromUtf8(data)); 236 state.printLine("Key: " + parsedKey + "\tValue: " + parse(data));
220 } 237 }
221 return true; 238 return true;
222 }, 239 },