diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2017-08-16 04:49:59 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2017-08-16 11:16:25 +0200 |
commit | e5d9b5ffc423cbb314cde1f66f7bebf4db30b1e6 (patch) | |
tree | b4c7bfbc175e5d179c9c86822797d78a3f5e7817 /sc/workben | |
parent | 4ad52186048e023234039f8344612b5123bb5700 (diff) |
add python script to interpret the calc cache format
Change-Id: I5d66024024b8150fad67397a0debc40aab1ae5fc
Reviewed-on: https://gerrit.libreoffice.org/41200
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Tested-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Diffstat (limited to 'sc/workben')
-rw-r--r-- | sc/workben/cache.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/sc/workben/cache.py b/sc/workben/cache.py new file mode 100644 index 000000000000..da2fe2e82290 --- /dev/null +++ b/sc/workben/cache.py @@ -0,0 +1,76 @@ +# -*- Mode: python; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +import sys +import struct + +column_block_type = { + 0 : "empty block", + 1 : "numeric block", + 2 : "string block" + } + + +def parse_block(data, index): + start_row = struct.unpack('Q', data[index:index+8])[0] + index += 8 + data_size = struct.unpack('Q', data[index:index+8])[0] + index += 8 + block_type = struct.unpack('B', data[index:index+1])[0] + index += 1 + vals = {} + if block_type == 1: + # numeric block + for i in range(data_size): + vals[start_row + i] = struct.unpack('d', data[index:index+8])[0] + index += 8 + elif block_type == 2: + # string block + for i in range(data_size): + str_length = struct.unpack('i', data[index:index+4])[0] + index += 4 + vals[start_row + i] = data[index:index+str_length].decode("utf-8") + index += str_length + + return index, data_size, vals + + +def parse_column(data, index): + column_index = struct.unpack('Q', data[index:index+8])[0] + index += 8 + column_entries = struct.unpack('Q', data[index:index+8])[0] + index += 8 + imported_columns = 0 + column_values = {} + while imported_columns < column_entries: + index, block_size, vals = parse_block(data, index) + imported_columns += block_size + column_values.update(vals) + return index, column_values + +def parse_columns(data, index): + column_count = struct.unpack('Q', data[index:index+8])[0] + index += 8 + columns = {} + for i in range(column_count): + index, column_values = parse_column(data, index) + columns[i] = column_values + + return columns + +def main(): + filename = sys.argv[1] + with open(filename, "rb") as f: + content = f.read() + index = 0 + columns = parse_columns(content, index) + print(columns) + +if __name__ == "__main__": + main() + +# vim:set shiftwidth=4 softtabstop=4 expandtab: */ |