From 0dcf9d41976eaabdee98fb034cf9f7ee5c88173e Mon Sep 17 00:00:00 2001 From: Franciszek Stachura Date: Wed, 26 Feb 2025 00:04:09 +0100 Subject: [PATCH] query: Move CLI to utils/query.py Call with python3 -m utils.query --- README.adoc | 4 +- elixir/data.py | 3 ++ elixir/query.py | 118 ------------------------------------------------ utils/query.py | 63 ++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 120 deletions(-) create mode 100644 utils/query.py diff --git a/README.adoc b/README.adoc index 36ffba3..e071592 100644 --- a/README.adoc +++ b/README.adoc @@ -142,8 +142,8 @@ ____ Verify that the queries work: - $ ./elixir/query.py v4.10 ident raw_spin_unlock_irq C - $ ./elixir/query.py v4.10 file /kernel/sched/clock.c + $ python3 -m utils.query ident v4.10 raw_spin_unlock_irq C + $ python3 -m utils.query file v4.10 /kernel/sched/clock.c NOTE: `v4.10` can be replaced with any other tag. NOTE: Don't forget to activate the virtual environment! diff --git a/elixir/data.py b/elixir/data.py index 4ec66e2..b952943 100755 --- a/elixir/data.py +++ b/elixir/data.py @@ -182,6 +182,9 @@ class BsdDB: def close(self): self.db.close() + def __len__(self): + return self.db.stat()["nkeys"] + class DB: def __init__(self, dir, readonly=True, dtscomp=False, shared=False): if os.path.isdir(dir): diff --git a/elixir/query.py b/elixir/query.py index 352f5c9..d001156 100755 --- a/elixir/query.py +++ b/elixir/query.py @@ -79,85 +79,6 @@ class Query: def close(self): self.db.close() - def query(self, cmd, *args): - if cmd == 'versions': - return self.get_versions() - - elif cmd == 'latest': - return self.get_latest_tag() - - elif cmd == 'type': - version = args[0] - path = args[1] - return self.get_file_type(version, path) - - elif cmd == 'exist': - version = args[0] - path = args[1] - return self.file_exists(version, path) - - elif cmd == 'dir': - version = args[0] - path = args[1] - return self.get_dir_contents(version, path) - - elif cmd == 'file': - version = args[0] - path = args[1] - return self.get_tokenized_file(version, path) - - elif cmd == 'family': - # Get the family of a given file - filename = args[0] - - return lib.getFileFamily(filename) - - elif cmd == 'dts-comp': - return self.supports_dts_comp() - - elif cmd == 'dts-comp-exists': - ident = args[0] - return self.dts_comp_exists(ident) - - elif cmd == 'keys': - # Return all keys of a given database - # /!\ This can take a while /!\ - - name = args[0] - - if name == 'vars': - return self.db.vars.get_keys() - elif name == 'blob': - return self.db.blob.get_keys() - elif name == 'hash': - return self.db.hash.get_keys() - elif name == 'file': - return self.db.file.get_keys() - elif name == 'vers': - return self.db.vers.get_keys() - elif name == 'defs': - return self.db.defs.get_keys() - elif name == 'refs': - return self.db.refs.get_keys() - elif name == 'docs': - return self.db.docs.get_keys() - elif name == 'comps' and self.dts_comp_support: - return self.db.comps.get_keys() - elif name == 'comps_docs' and self.dts_comp_support: - return self.db.comps_docs.get_keys() - else: - return [] - - elif cmd == 'ident': - version = args[0] - ident = args[1] - family = args[2] - - return self.search_ident(version, ident, family) - - else: - return 'Unknown subcommand: ' + cmd + '\n' - # Get state of dts_comp_support def supports_dts_comp(self): return self.dts_comp_support @@ -416,42 +337,3 @@ class Query: return symbol_definitions, symbol_references, symbol_doccomments - -def cmd_ident(q, version, ident, family, **kwargs): - symbol_definitions, symbol_references, symbol_doccomments = q.search_ident(version, ident, family) - print("Symbol Definitions:") - for symbol_definition in symbol_definitions: - print(symbol_definition) - - print("\nSymbol References:") - for symbol_reference in symbol_references: - print(symbol_reference) - - print("\nDocumented in:") - for symbol_doccomment in symbol_doccomments: - print(symbol_doccomment) - -def cmd_file(q, version, path, **kwargs): - code = q.get_tokenized_file(version, path) - print(code) - -if __name__ == "__main__": - import argparse - - query = Query(lib.getDataDir(), lib.getRepoDir()) - - parser = argparse.ArgumentParser() - parser.add_argument("version", help="The version of the project", type=str, default="latest") - subparsers = parser.add_subparsers() - - ident_subparser = subparsers.add_parser('ident', help="Get definitions and references of an identifier") - ident_subparser.add_argument('ident', type=str, help="The name of the identifier") - ident_subparser.add_argument('family', type=str, help="The file family requested") - ident_subparser.set_defaults(func=cmd_ident, q=query) - - file_subparser = subparsers.add_parser('file', help="Get a source file") - file_subparser.add_argument('path', type=str, help="The path of the source file") - file_subparser.set_defaults(func=cmd_file, q=query) - - args = parser.parse_args() - args.func(**vars(args)) diff --git a/utils/query.py b/utils/query.py new file mode 100644 index 0000000..fbd35af --- /dev/null +++ b/utils/query.py @@ -0,0 +1,63 @@ +from elixir.query import Query +from elixir import lib + +def cmd_stats(q, **kwargs): + print("Versions: ", len(q.db.vers)) + print("Blobs: ", len(q.db.blob)) + if len(q.db.blob) != len(q.db.hash) or len(q.db.hash) != len(q.db.file): + print("Warning, number of blobs, hashes or files is not equal") + print("Definitions: ", len(q.db.defs)) + print("References: ", len(q.db.refs)) + +def cmd_versions(q, **kwargs): + for major in q.get_versions().values(): + for minor in major.values(): + for v in minor: + print(v) + +def cmd_ident(q, version, ident, family, **kwargs): + symbol_definitions, symbol_references, symbol_doccomments = q.search_ident(version, ident, family) + print("Symbol Definitions:") + for symbol_definition in symbol_definitions: + print(symbol_definition) + + print("\nSymbol References:") + for symbol_reference in symbol_references: + print(symbol_reference) + + print("\nDocumented in:") + for symbol_doccomment in symbol_doccomments: + print(symbol_doccomment) + +def cmd_file(q, version, path, **kwargs): + code = q.get_tokenized_file(version, path) + print(code) + +if __name__ == "__main__": + import argparse + + query = Query(lib.getDataDir(), lib.getRepoDir()) + + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(required=True) + + ident_subparser = subparsers.add_parser('stats', help="Get basic database stats") + ident_subparser.set_defaults(func=cmd_stats, q=query) + + ident_subparser = subparsers.add_parser('versions', help="Get list of versions in the project") + ident_subparser.set_defaults(func=cmd_versions, q=query) + + ident_subparser = subparsers.add_parser('ident', help="Get definitions and references of an identifier") + ident_subparser.add_argument("version", help="The version of the project", type=str, default="latest") + ident_subparser.add_argument('ident', type=str, help="The name of the identifier") + ident_subparser.add_argument('family', type=str, help="The file family requested") + ident_subparser.set_defaults(func=cmd_ident, q=query) + + file_subparser = subparsers.add_parser('file', help="Get a source file") + file_subparser.add_argument("version", help="The version of the project", type=str, default="latest") + file_subparser.add_argument('path', type=str, help="The path of the source file") + file_subparser.set_defaults(func=cmd_file, q=query) + + args = parser.parse_args() + args.func(**vars(args)) +