From b11b4568cd5d2db4f41446f82f0d62e55f29e151 Mon Sep 17 00:00:00 2001 From: Jordan Sweeting Date: Tue, 2 Sep 2025 05:03:42 +0800 Subject: [PATCH 1/4] Add example/test for table dump --- examples/parse_db.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/examples/parse_db.py b/examples/parse_db.py index 1d96ef7..9fa7ec8 100644 --- a/examples/parse_db.py +++ b/examples/parse_db.py @@ -1,5 +1,6 @@ from access_parser import AccessParser from tabulate import tabulate +import json import argparse @@ -16,12 +17,30 @@ def print_tables(db_path, only_catalog=False, specific_table=None): else: db.print_database() +def dump_tables(db_path, specific_table=None): + db = AccessParser(db_path) + if specific_table: + print(f'TABLE NAME: {specific_table}\r\n') + table = db.get_table(specific_table) + print(table.dump()) + else: + for table_name in db.catalog.keys(): + print(f'TABLE NAME: {table_name}\r\n') + table = db.get_table(table_name) + dumped_table = table.dump() + for row_number, row in enumerate(dumped_table): + print(f'{row_number}:\t {row}') + print("\n\n\n\n") if __name__ == '__main__': parser = argparse.ArgumentParser() + parser.add_argument("-d", "--dump", action="store_true", required=False, help="Dumps to a dictionary object", default=None) parser.add_argument("-c", "--catalog", required=False, help="Print DB table names", action="store_true") parser.add_argument("-f", "--file", required=True, help="*.mdb / *.accdb File") parser.add_argument("-t", "--table", required=False, help="Table to print", default=None) args = parser.parse_args() - print_tables(args.file, args.catalog, args.table) + if args.dump: + dump_tables(args.file) + else: + print_tables(args.file, args.catalog, args.table) From e50f5283fc4bf94d1ad98ad5833fad8acda9841c Mon Sep 17 00:00:00 2001 From: Jordan Sweeting Date: Tue, 2 Sep 2025 05:03:59 +0800 Subject: [PATCH 2/4] Add uv --- .python-version | 1 + pyproject.toml | 17 +++++++++++++++++ uv.lock | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 .python-version create mode 100644 pyproject.toml create mode 100644 uv.lock diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..78edba3 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,17 @@ +[project] +name = "access-parser" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [ + "construct>=2.10.70", + "tabulate>=0.9.0", +] + +[dependency-groups] +dev = [] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" \ No newline at end of file diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..1929b3d --- /dev/null +++ b/uv.lock @@ -0,0 +1,38 @@ +version = 1 +requires-python = ">=3.13" + +[[package]] +name = "access-parser" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "construct" }, + { name = "tabulate" }, +] + +[package.metadata] +requires-dist = [ + { name = "construct", specifier = ">=2.10.70" }, + { name = "tabulate", specifier = ">=0.9.0" }, +] + +[package.metadata.requires-dev] +dev = [] + +[[package]] +name = "construct" +version = "2.10.70" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/77/8c84b98eca70d245a2a956452f21d57930d22ab88cbeed9290ca630cf03f/construct-2.10.70.tar.gz", hash = "sha256:4d2472f9684731e58cc9c56c463be63baa1447d674e0d66aeb5627b22f512c29", size = 86337 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl", hash = "sha256:c80be81ef595a1a821ec69dc16099550ed22197615f4320b57cc9ce2a672cb30", size = 63020 }, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, +] From 0b359cfe53c49d7f97d92fe4789711934403f14e Mon Sep 17 00:00:00 2001 From: Jordan Sweeting Date: Tue, 2 Sep 2025 05:04:39 +0800 Subject: [PATCH 3/4] Add dump function to table --- access_parser/access_parser.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/access_parser/access_parser.py b/access_parser/access_parser.py index 2cdfc09..0ff3432 100644 --- a/access_parser/access_parser.py +++ b/access_parser/access_parser.py @@ -257,6 +257,15 @@ def parse(self): if record: self._parse_row(record) return self.parsed_table + + def dump(self): + """ + Convert table structure to list of dictionaries. + :return defaultdict(list) from parsed table + """ + parsed_table = self.parse() + rows = list(zip(*parsed_table.values(), strict=False)) + return [dict(zip(parsed_table.keys(), row)) for row in rows] def _parse_row(self, record): """ From d42316d53393377308ec6a469d23a8aa11e2301d Mon Sep 17 00:00:00 2001 From: Jordan Sweeting Date: Tue, 2 Sep 2025 05:14:52 +0800 Subject: [PATCH 4/4] remove uv --- .python-version | 1 - pyproject.toml | 17 ----------------- uv.lock | 38 -------------------------------------- 3 files changed, 56 deletions(-) delete mode 100644 .python-version delete mode 100644 pyproject.toml delete mode 100644 uv.lock diff --git a/.python-version b/.python-version deleted file mode 100644 index 24ee5b1..0000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.13 diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 78edba3..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,17 +0,0 @@ -[project] -name = "access-parser" -version = "0.1.0" -description = "Add your description here" -readme = "README.md" -requires-python = ">=3.13" -dependencies = [ - "construct>=2.10.70", - "tabulate>=0.9.0", -] - -[dependency-groups] -dev = [] - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" \ No newline at end of file diff --git a/uv.lock b/uv.lock deleted file mode 100644 index 1929b3d..0000000 --- a/uv.lock +++ /dev/null @@ -1,38 +0,0 @@ -version = 1 -requires-python = ">=3.13" - -[[package]] -name = "access-parser" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "construct" }, - { name = "tabulate" }, -] - -[package.metadata] -requires-dist = [ - { name = "construct", specifier = ">=2.10.70" }, - { name = "tabulate", specifier = ">=0.9.0" }, -] - -[package.metadata.requires-dev] -dev = [] - -[[package]] -name = "construct" -version = "2.10.70" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/02/77/8c84b98eca70d245a2a956452f21d57930d22ab88cbeed9290ca630cf03f/construct-2.10.70.tar.gz", hash = "sha256:4d2472f9684731e58cc9c56c463be63baa1447d674e0d66aeb5627b22f512c29", size = 86337 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl", hash = "sha256:c80be81ef595a1a821ec69dc16099550ed22197615f4320b57cc9ce2a672cb30", size = 63020 }, -] - -[[package]] -name = "tabulate" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, -]