Mercurial > p > roundup > code
annotate scripts/dump_dbm_sessions_db.py @ 7800:2d4684e4702d
fix: enhancement to history command output and % template fix.
Rather than using the key field, use the label field for descriptions.
Call cls.labelprop(default_to_id=True) so it returns id rather than
the first sorted property name.
If labelprop() returns 'id' or 'title', we return nothing. 'id' means
there is no label set and no properties named 'name' or 'title'. So
have the caller do whatever it wants (prepend classname for example)
when there is no human readable name. This prevents %(name)s%(key)s
from producing: 23(23).
Also don't accept the 'title' property. Titles can be too
long. Arguably we could: '%(name)20s' to limit the title
length. However without ellipses or something truncating the title
might be confusing. So again pretend there is no human readable name.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Tue, 12 Mar 2024 11:52:17 -0400 |
| parents | 9ba04f37896f |
| children |
| rev | line source |
|---|---|
|
6571
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
1 #! /usr/bin/env python3 |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
2 """Usage: dump_dbm_sessions_db.py [filename] |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
3 |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
4 Simple script to dump the otks and sessions dbm databases. Dumps |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
5 sessions db in current directory if no argument is given. |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
6 |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
7 Dump format: |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
8 |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
9 key: <timestamp> data |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
10 |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
11 where <timestamp> is the human readable __timestamp decoded from the |
|
6799
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
12 data object. Data object is dumped in json format. With pretty print |
|
6571
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
13 |
|
6799
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
14 key: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
15 <timestamp> |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
16 { |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
17 key: val, |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
18 ... |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
19 } |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
20 |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
21 if data is not a python object, print will be key: data or |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
22 key: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
23 data |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
24 |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
25 if pretty printed. |
| 6577 | 26 """ |
|
6571
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
27 |
| 7780 | 28 import argparse |
| 29 import dbm | |
| 30 import json | |
| 31 import marshal | |
| 32 import os | |
| 33 import sys | |
|
6571
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
34 from datetime import datetime |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
35 |
| 7780 | 36 |
|
6799
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
37 def indent(text, amount, ch=" "): |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
38 """ Found at: https://stackoverflow.com/a/8348914 |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
39 """ |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
40 padding = amount * ch |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
41 return ''.join(padding+line for line in text.splitlines(True)) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
42 |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
43 def print_marshal(k): |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
44 d = marshal.loads(db[k]) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
45 try: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
46 t = datetime.fromtimestamp(d['__timestamp']) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
47 except (KeyError, TypeError): |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
48 # TypeError raised if marshalled data is not a dict (list, tuple etc) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
49 t = "no_timestamp" |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
50 if args.pretty: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
51 print("%s:\n %s\n%s"%(k, t, indent(json.dumps( |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
52 d, sort_keys=True, indent=4), 4))) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
53 else: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
54 print("%s: %s %s"%(k, t, d)) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
55 |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
56 def print_raw(k): |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
57 if args.pretty: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
58 print("%s:\n %s"%(k, db[k])) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
59 else: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
60 print("%s: %s"%(k, db[k])) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
61 |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
62 parser = argparse.ArgumentParser( |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
63 description='Dump DBM files used by Roundup in storage order.') |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
64 parser.add_argument('-k', '--key', action="append", |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
65 help='dump the entry for a key, can be used multiple times.') |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
66 parser.add_argument('-K', '--keysonly', action='store_true', |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
67 help='print the database keys, sorted in byte order.') |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
68 parser.add_argument('-p', '--pretty', action='store_true', |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
69 help='pretty print the output rather than printing on one line.') |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
70 parser.add_argument('file', nargs='?', |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
71 help='file to be dumped ("sessions" if not provided)') |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
72 args = parser.parse_args() |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
73 |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
74 if args.file: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
75 file = args.file |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
76 else: |
|
6571
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
77 file="sessions" |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
78 |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
79 try: |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
80 db = dbm.open(file) |
|
6799
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
81 except Exception as e: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
82 print("Unable to open database for %s: %s"%(file, e)) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
83 try: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
84 os.stat(file) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
85 print(" perhaps file is invalid or was created with a different version of Python?") |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
86 except OSError: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
87 # the file does exist on disk. |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
88 pass |
| 7780 | 89 sys.exit(1) |
|
6799
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
90 |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
91 if args.keysonly: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
92 for k in sorted(db.keys()): |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
93 print("%s"%k) |
| 7780 | 94 sys.exit(0) |
|
6799
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
95 |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
96 if args.key: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
97 for k in args.key: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
98 try: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
99 print_marshal(k) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
100 except (ValueError): |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
101 print_raw(k) |
| 7780 | 102 sys.exit(0) |
|
6571
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
103 |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
104 k = db.firstkey() |
|
cd408eb748dd
Add small utility script for dumping dbm based databases.
John Rouillard <rouilj@ieee.org>
parents:
diff
changeset
|
105 while k is not None: |
|
6799
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
106 try: |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
107 print_marshal(k) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
108 except (ValueError): # ValueError marshal.loads failed |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
109 print_raw(k) |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
110 |
|
1188bb423f92
Script dumps dbm files without marshalled data like _ids
John Rouillard <rouilj@ieee.org>
parents:
6577
diff
changeset
|
111 k = db.nextkey(k) |
