Files
scylladb/tools/scylla-sstable-scripts/dump.lua
Avi Kivity f3eade2f62 treewide: relicense to ScyllaDB-Source-Available-1.0
Drop the AGPL license in favor of a source-available license.
See the blog post [1] for details.

[1] https://www.scylladb.com/2024/12/18/why-were-moving-to-a-source-available-license/
2024-12-18 17:45:13 +02:00

255 lines
5.3 KiB
Lua

--
-- Copyright (C) 2022-present ScyllaDB
--
-- SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
--
-- Dumps the content of the sstable(s).
--
-- Mirrors the dump-data operation. Useful for testing the lua bindings and
-- showcasing how to use the lua API to traverse all corners of the data, as well
-- as how to generate custom JSON.
-- For dumping the content of sstables, prefer the dump-data operation, it is
-- much more performant.
writer = Scylla.new_json_writer()
clustering_array_created = false
function write_key(obj)
writer:start_object()
if obj.token then
writer:key("token")
writer:string(tostring(obj.token))
end
writer:key("raw")
writer:string(obj.key:to_hex())
writer:key("value")
writer:string(tostring(obj.key))
writer:end_object()
end
function write_tombstone(tombstone)
writer:start_object()
if tombstone then
writer:key("timestamp")
writer:int(tombstone.timestamp)
writer:key("deletion_time")
writer:string(tostring(tombstone.deletion_time))
end
writer:end_object()
end
function write_ttl(obj)
writer:key("ttl")
writer:string(string.format("%is", obj.ttl))
writer:key("expiry")
writer:string(tostring(obj.expiry))
end
function maybe_start_clustering_array()
if clustering_array_created then
return
end
writer:key("clustering_elements")
writer:start_array()
clustering_array_created = true
end
function write_atomic_cell(cell)
writer:key("is_live")
writer:bool(cell.is_live)
writer:key("type")
writer:string(cell.type)
writer:key("timestamp")
writer:int(cell.timestamp)
if cell.type == "counter-shards" then
writer:key("value")
writer:start_array()
for _, shard in ipairs(cell.value.shards) do
writer:start_object()
writer:key("id")
writer:string(shard.id)
writer:key("value")
writer:int(shard.value)
writer:key("clock")
writer:int(shard.clock)
writer:end_object()
end
writer:end_array()
elseif cell.is_live then -- type == "regular" | "frozen-collection" | "counter-update"
writer:key("value")
writer:string(tostring(cell.value))
end
if cell.is_live and cell.has_ttl then
write_ttl(cell)
end
if not cell.is_live then
writer:key("deletion_time")
writer:string(tostring(cell.deletion_time))
end
end
function write_collection(cell)
if cell.tombstone then
writer:key("tombstone")
write_tombstone(cell.tombstone)
end
writer:key("cells")
writer:start_array()
for _, v in ipairs(cell.values) do
writer:start_object()
writer:key("key")
writer:string(tostring(v.key))
writer:key("value")
writer:start_object()
write_atomic_cell(v.value)
writer:end_object()
writer:end_object()
end
writer:end_array()
end
function write_cells(cells)
writer:start_object()
for name, cell in pairs(cells) do
writer:key(name)
writer:start_object()
if cell.type == "collection" then
write_collection(cell)
else
write_atomic_cell(cell)
end
writer:end_object()
end
writer:end_object()
end
function consume_stream_start()
writer:start_object()
writer:key("sstables")
writer:start_object()
end
function consume_sstable_start(sst)
if sst == nil then
writer:key("anonymous")
else
writer:key(sst.filename)
end
writer:start_array()
end
function consume_partition_start(ps)
writer:start_object()
clustering_array_created = false
writer:key("key")
write_key(ps)
if ps.tombstone then
writer:key("tombstone")
write_tombstone(ps.tombstone)
end
end
function consume_static_row(sr)
writer:key("static_row")
write_cells(sr.cells)
end
function consume_clustering_row(cr)
maybe_start_clustering_array()
writer:start_object()
writer:key("type")
writer:string("clustering-row")
writer:key("key")
write_key(cr)
if cr.tombstone then
writer:key("tombstone")
write_tombstone(cr.tombstone)
writer:key("shadowable_tombstone")
write_tombstone(cr.shadowable_tombstone)
end
if cr.marker then
writer:key("marker")
writer:start_object()
writer:key("timestamp")
writer:int(cr.marker.timestamp)
if cr.marker.is_live and cr.marker.has_ttl then
write_ttl(cr.marker)
end
writer:end_object()
end
writer:key("columns")
write_cells(cr.cells)
writer:end_object()
end
function consume_range_tombstone_change(crt)
maybe_start_clustering_array()
writer:start_object()
writer:key("type")
writer:string("range-tombstone-change")
if crt.key then
writer:key("key")
write_key(crt)
end
writer:key("weight")
writer:int(crt.key_weight)
writer:key("tombstone")
write_tombstone(crt.tombstone)
writer:end_object()
end
function consume_partition_end()
if clustering_array_created then
writer:end_array()
end
writer:end_object()
end
function consume_sstable_end()
writer:end_array()
end
function consume_stream_end()
writer:end_object()
writer:end_object()
end