plsqlwks 0.2.4__tar.gz → 0.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/PKG-INFO +78 -15
  2. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/README.md +77 -14
  3. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/doc/PLUGIN_CATALOG.md +1 -1
  4. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/__init__.py +1 -1
  5. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/metadata.py +59 -13
  6. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/session.py +43 -0
  7. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/__init__.py +5 -0
  8. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/app.py +3 -0
  9. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/browser.py +9 -4
  10. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/catalog.py +104 -25
  11. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/clipboard.py +3 -3
  12. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/commands.py +8 -2
  13. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/constants.py +23 -5
  14. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/db_session.py +29 -0
  15. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/dialogs.py +59 -0
  16. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/input_controller.py +15 -1
  17. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/keys.py +12 -0
  18. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/ports.py +2 -0
  19. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/renderer.py +10 -1
  20. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/state.py +3 -0
  21. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/viewport.py +16 -2
  22. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/tests/fixtures/ui_exports.txt +5 -0
  23. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/tools/putty_keys.ps1 +22 -1
  24. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/doc/API.md +0 -0
  25. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/doc/ARCHITECTURE.md +0 -0
  26. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/doc/COMPATIBILITY.md +0 -0
  27. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/doc/PLUGINS.md +0 -0
  28. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/doc/QUICKSTART.html +0 -0
  29. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/doc/QUICKSTART.md +0 -0
  30. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/license.txt +0 -0
  31. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/__main__.py +0 -0
  32. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/cli.py +0 -0
  33. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/config/__init__.py +0 -0
  34. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/config/loader.py +0 -0
  35. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/config/models.py +0 -0
  36. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/config/paths.py +0 -0
  37. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/config/session.py +0 -0
  38. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/config/settings.py +0 -0
  39. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/__init__.py +0 -0
  40. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/ddl_remap.py +0 -0
  41. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/dependencies.py +0 -0
  42. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/editing.py +0 -0
  43. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/execution.py +0 -0
  44. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/explain.py +0 -0
  45. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/health.py +0 -0
  46. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/identifiers.py +0 -0
  47. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/models.py +0 -0
  48. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/schema_compare.py +0 -0
  49. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/schema_diagram.py +0 -0
  50. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/sql_analysis.py +0 -0
  51. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/table_export.py +0 -0
  52. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/table_export_catalog.py +0 -0
  53. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/timestamps.py +0 -0
  54. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/db/transactions.py +0 -0
  55. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/exporting.py +0 -0
  56. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/plugins/__init__.py +0 -0
  57. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/plugins/api.py +0 -0
  58. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/plugins/loader.py +0 -0
  59. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/plugins/management.py +0 -0
  60. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/sqlbinds.py +0 -0
  61. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/sqlsplit.py +0 -0
  62. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/application_controller.py +0 -0
  63. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/buffer.py +0 -0
  64. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/code_generation.py +0 -0
  65. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/command_dispatcher.py +0 -0
  66. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/completion.py +0 -0
  67. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/db_operations.py +0 -0
  68. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/db_worker.py +0 -0
  69. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/dependency_walker.py +0 -0
  70. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/display.py +0 -0
  71. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/documents.py +0 -0
  72. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/editor_controller.py +0 -0
  73. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/errors.py +0 -0
  74. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/help.py +0 -0
  75. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/key_reader.py +0 -0
  76. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/menu.py +0 -0
  77. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/output_selection.py +0 -0
  78. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/plugin_host.py +0 -0
  79. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/query_controller.py +0 -0
  80. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/result_controller.py +0 -0
  81. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/result_export.py +0 -0
  82. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/result_presenter.py +0 -0
  83. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/results.py +0 -0
  84. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/schema_compare.py +0 -0
  85. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/schema_diagram.py +0 -0
  86. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/sql.py +0 -0
  87. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/sqlplus.py +0 -0
  88. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/syntax.py +0 -0
  89. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/ui/table_export.py +0 -0
  90. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks/workspace.py +0 -0
  91. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plsqlwks.egg-info/SOURCES.txt +0 -0
  92. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/csv-export/install.plw +0 -0
  93. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/csv-export/payload/__init__.py +0 -0
  94. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/csv-export/payload/plugin.py +0 -0
  95. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/csv-export/payload/support.py +0 -0
  96. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/csv-export/payload/writer.py +0 -0
  97. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/csv2oratab/install.plw +0 -0
  98. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/csv2oratab/payload/__init__.py +0 -0
  99. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/csv2oratab/payload/csv2oratab.py +0 -0
  100. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/csv2oratab/payload/plugin.py +0 -0
  101. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/dependencies-walker/install.plw +0 -0
  102. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/dependencies-walker/payload/__init__.py +0 -0
  103. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/dependencies-walker/payload/plugin.py +0 -0
  104. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/er-diagram/install.plw +0 -0
  105. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/er-diagram/payload/__init__.py +0 -0
  106. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/er-diagram/payload/plugin.py +0 -0
  107. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/er-diagram/payload/writer.py +0 -0
  108. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/html-export/install.plw +0 -0
  109. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/html-export/payload/__init__.py +0 -0
  110. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/html-export/payload/html_exporting.py +0 -0
  111. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/html-export/payload/plugin.py +0 -0
  112. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/html-export/payload/support.py +0 -0
  113. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/html-export/payload/writer.py +0 -0
  114. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/packages/csv-export-1.0.0.plwgn +0 -0
  115. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/packages/csv2oratab-0.1.0.plwgn +0 -0
  116. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/packages/dependencies-walker-0.1.0.plwgn +0 -0
  117. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/packages/er-diagram-0.1.3.plwgn +0 -0
  118. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/packages/html-export-1.0.0.plwgn +0 -0
  119. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/packages/schema-compare-0.1.0.plwgn +0 -0
  120. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/packages/sqlplus-0.1.0.plwgn +0 -0
  121. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/packages/table-ddl-export-0.1.1.plwgn +0 -0
  122. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/packages/xlsx-export-1.0.0.plwgn +0 -0
  123. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/schema-compare/install.plw +0 -0
  124. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/schema-compare/payload/__init__.py +0 -0
  125. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/schema-compare/payload/plugin.py +0 -0
  126. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/schema-compare/payload/writer.py +0 -0
  127. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/sqlplus/install.plw +0 -0
  128. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/sqlplus/payload/__init__.py +0 -0
  129. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/sqlplus/payload/plugin.py +0 -0
  130. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/table-ddl-export/install.plw +0 -0
  131. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/table-ddl-export/payload/__init__.py +0 -0
  132. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/table-ddl-export/payload/plugin.py +0 -0
  133. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/xlsx-export/install.plw +0 -0
  134. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/xlsx-export/payload/__init__.py +0 -0
  135. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/xlsx-export/payload/plugin.py +0 -0
  136. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/xlsx-export/payload/support.py +0 -0
  137. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/plugins/xlsx-export/payload/xlsx_exporting.py +0 -0
  138. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/pyproject.toml +0 -0
  139. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/pytest.ini +0 -0
  140. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/rchar.py +0 -0
  141. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/requirements.txt +0 -0
  142. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/setup.cfg +0 -0
  143. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/tests/conftest.py +0 -0
  144. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/tests/fixtures/config_exports.txt +0 -0
  145. {plsqlwks-0.2.4 → plsqlwks-0.2.5}/tools/windows_keys.cmd +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plsqlwks
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: An ncurses SQL and PL/SQL workspace for Oracle databases.
5
5
  Author: unu2000
6
6
  License-Expression: LicenseRef-plsqlwks-Donationware
@@ -619,7 +619,7 @@ Use left Alt for application shortcuts; AltGr remains available for characters
619
619
  on international keyboards. Shortcut digits and symbols refer to the character
620
620
  on the active Windows layout: for example, Czech top-row digits need Shift,
621
621
  so Alt-1 is typed with Alt-Shift-1. Use the layout's `+` or `=` character for
622
- autocomplete refresh. Ctrl-C/Ctrl-P copy/paste internally, Ctrl-Shift-C/Ctrl-Shift-P
622
+ autocomplete refresh. Ctrl-C/Ctrl-Alt-P copy/paste internally, Ctrl-Shift-C/Ctrl-Shift-P
623
623
  use the Windows system clipboard, and Alt-Shift-C/Alt-Shift-P use the Linux
624
624
  clipboard. Ctrl-V and Ctrl-Shift-V retain their configured paste sources;
625
625
  Ctrl-Shift-V defaults to internal paste. SSH does not expose the Windows clipboard to the host. Use
@@ -698,12 +698,14 @@ two external methods may access shared contents.
698
698
  | --- | --- | --- |
699
699
  | System (Windows) | `Ctrl-Shift-C` | `Ctrl-Shift-P` |
700
700
  | WSL/Linux | `Alt-Shift-C` | `Alt-Shift-P` |
701
- | Internal | `Ctrl-C` | `Ctrl-P` |
701
+ | Internal | `Ctrl-C` | `Ctrl-Alt-P` |
702
702
 
703
703
  Each fixed shortcut uses only its assigned target. Copying externally leaves
704
704
  the internal clipboard unchanged. `Ctrl-C` interrupts a running database
705
705
  operation first; otherwise it copies internally. `Ctrl-Alt-C` still commits or
706
- applies the active insert draft, and `Ctrl-Alt-R` rolls back.
706
+ applies the active insert draft, and `Ctrl-Alt-R` rolls back. `Ctrl-P` finds the
707
+ previous occurrence of the last search string, retaining case sensitivity and
708
+ wrapping at the start of the worksheet.
707
709
  The copy shortcuts work for editor selections, result cells/ranges,
708
710
  DBMS_OUTPUT selections and schema-browser object names. Paste works in the
709
711
  worksheet, paste-enabled prompts and editable cell text dialogs.
@@ -741,7 +743,8 @@ entries to `actions`, keeping the other actions:
741
743
 
742
744
  ```json
743
745
  { "command": { "action": "sendInput", "input": "\u0003" }, "id": "User.PlsqlwksInternalCopy" },
744
- { "command": { "action": "sendInput", "input": "\u0010" }, "id": "User.PlsqlwksInternalPaste" },
746
+ { "command": { "action": "sendInput", "input": "\u001b[112;7u" }, "id": "User.PlsqlwksInternalPaste" },
747
+ { "command": { "action": "sendInput", "input": "\u0010" }, "id": "User.PlsqlwksPreviousMatch" },
745
748
  { "command": { "action": "sendInput", "input": "\u001b[99;6u" }, "id": "User.PlsqlwksSystemCopy" },
746
749
  { "command": { "action": "sendInput", "input": "\u001b[112;6u" }, "id": "User.PlsqlwksSystemPaste" },
747
750
  { "command": { "action": "sendInput", "input": "\u001b[99;4u" }, "id": "User.PlsqlwksWslCopy" },
@@ -755,7 +758,8 @@ the entries below, keeping the other keybindings:
755
758
 
756
759
  ```json
757
760
  { "id": "User.PlsqlwksInternalCopy", "keys": "ctrl+c" },
758
- { "id": "User.PlsqlwksInternalPaste", "keys": "ctrl+p" },
761
+ { "id": "User.PlsqlwksInternalPaste", "keys": "ctrl+alt+p" },
762
+ { "id": "User.PlsqlwksPreviousMatch", "keys": "ctrl+p" },
759
763
  { "id": "User.PlsqlwksSystemCopy", "keys": "ctrl+shift+c" },
760
764
  { "id": "User.PlsqlwksSystemPaste", "keys": "ctrl+shift+p" },
761
765
  { "id": "User.PlsqlwksWslCopy", "keys": "alt+shift+c" },
@@ -793,11 +797,14 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
793
797
  | Key | Action |
794
798
  | --- | --- |
795
799
  | `Alt-O` | Open the top-left commands menu |
800
+ | `Alt-I` | Show connection information for the active tab |
796
801
  | `F1` | Help |
797
802
  | `F6` | Switch between DBMS_OUTPUT and normal results |
798
803
  | `F7` | Cycle fullscreen grid, fullscreen editor, and 2/3 editor + 1/3 grid |
799
804
  | `F8` | Toggle result grid / row-detail output |
800
805
  | `F9` | Show/focus/hide schema browser |
806
+ | `Shift-F9` | Toggle Schema Browser between normal and half-screen width |
807
+ | `Shift-Alt-F9` | Toggle Schema Browser between full-screen and its previous width |
801
808
  | `F12` | Choose autocommit or manual transaction mode |
802
809
  | `Ctrl-Up` / `Ctrl-Down` | Scroll the focused pane or visible DBMS_OUTPUT by one line |
803
810
  | `Ctrl-W` | Close current file tab |
@@ -808,6 +815,25 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
808
815
  | `Ctrl-Alt-C` | Insert the active result-grid draft, or commit when no draft is active |
809
816
  | `Ctrl-Alt-R` | Roll back the current transaction |
810
817
 
818
+ ### Connection information
819
+
820
+ Press `Alt-I`, or choose **Alt-O → Database → Connection information**, from the
821
+ editor, results or schema browser. A centered dialog shows the connected user,
822
+ current schema, service, database and unique database name, container, instance,
823
+ server host, session SID, server timestamp with fractional seconds and timezone,
824
+ database/session time zones, Oracle version, driver version and Thin/Thick mode,
825
+ autocommit and read-only mode. The information is refreshed from the active tab's
826
+ existing session without changing worksheet results, transactions or unread
827
+ DBMS_OUTPUT. A busy active session uses the existing operation-running feedback;
828
+ a disconnected session shows `Not connected` without reconnecting.
829
+
830
+ The dialog keeps **[ OK ]** visible. Press Enter or Space to accept, or Esc/Ctrl-Q
831
+ to close. Use Up/Down, PageUp/PageDown or Home/End to scroll long details; resize
832
+ the terminal to change the layout. Requests cancelled or completed after switching
833
+ away from their tab do not open a late dialog. The Windows keyboard helper forwards
834
+ Alt-I; a Windows Terminal profile that consumes it can forward `\u001bi` with a
835
+ `sendInput` action bound to `alt+i`.
836
+
811
837
  ### Editor
812
838
 
813
839
  | Key | Action |
@@ -845,10 +871,10 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
845
871
  | `Alt-O` -> **Editor** -> **Replace text** | Open Find/Replace at the replacement field |
846
872
  | `Ctrl-G` | Go to line |
847
873
  | `Ctrl-N` | Move to the next search occurrence |
848
- | `Alt-O → Editor → Previous search match` | Move to the previous search occurrence |
874
+ | `Ctrl-P` / `Alt-O → Editor → Previous search match` | Move to the previous search occurrence |
849
875
  | `Ctrl-U` | Uppercase selected SQL code |
850
876
  | `Ctrl-L` | Lowercase selected SQL code |
851
- | `Ctrl-C` / `Ctrl-P` | Copy/paste internally |
877
+ | `Ctrl-C` / `Ctrl-Alt-P` | Copy/paste internally |
852
878
  | `Ctrl-Shift-C` / `Ctrl-Shift-P` | Copy/paste the System (Windows) clipboard |
853
879
  | `Alt-Shift-C` / `Alt-Shift-P` | Copy/paste the WSL/Linux clipboard |
854
880
  | `Ctrl-X` | Cut selected text |
@@ -889,9 +915,9 @@ The dialog provides `Find next`, `Replace`, `Replace all`, and `Cancel` actions.
889
915
  and lowercase letters. `Replace` changes the selected matching occurrence, or
890
916
  the next match from the cursor, and then selects the following match. `Replace
891
917
  all` changes every match in the current buffer. Either replacement operation is
892
- recorded as one undoable edit. `Ctrl-N` repeats the last search forward;
893
- **Alt-O → Editor → Previous search match** repeats it backward. Both retain the
894
- case setting and wrap around.
918
+ recorded as one undoable edit. `Ctrl-N` repeats the last search forward and
919
+ `Ctrl-P` repeats it backward. Both retain the case setting and wrap around.
920
+ **Alt-O → Editor → Previous search match** provides the same backward search.
895
921
 
896
922
  Editor paste expands every tab character to two spaces and keeps multiline
897
923
  text in one undoable edit. This applies to all fixed and configured paste shortcuts and
@@ -1212,7 +1238,28 @@ validate this opt-in mode with the applications in use.
1212
1238
 
1213
1239
  ### Schema Browser
1214
1240
 
1215
- The `F9` schema browser groups tables, views, procedures, functions, package specifications, package bodies, triggers, sequences, indexes, and private synonyms from the current schema. Type while the browser is focused to filter object names with a case-insensitive substring match; groups without matches are hidden and matching groups expand automatically without changing their saved expansion state. Exact quoted and mixed-case names are preserved when columns, routines or definitions are loaded, with Oracle-safe quoting applied to metadata requests.
1241
+ Press `F9` to open or focus Schema Browser. While it is focused, `F9` closes it
1242
+ and returns to the SQL buffer. Press `Tab` to keep the browser open and focus
1243
+ the SQL buffer, so you can edit SQL beside the tree; press `F9` to return to it.
1244
+ Filters, selected objects, expanded branches and cached metadata are retained.
1245
+
1246
+ `Shift-F9` opens/focuses the browser and toggles its normal width with a left
1247
+ half-screen pane; the SQL buffer and results stay on the right. `Shift-Alt-F9`
1248
+ opens/focuses a full-screen browser with its filter header and status line, and
1249
+ pressing it again restores the previous normal or half-screen width. From a
1250
+ full-screen browser, Tab, returning to the editor with Esc, or loading/inserting
1251
+ SQL also restores that previous width. Shift-F9 switches a full-screen browser
1252
+ to half-screen. Closing it with F9 retains the side-by-side width for reopening.
1253
+ Browser sizes last for the current application session.
1254
+
1255
+ Opening/focusing the browser exits an incompatible F7 editor/grid fullscreen
1256
+ view, restoring the saved SQL/results split or the two-thirds-editor layout.
1257
+ F7 retains its existing editor/grid layout cycle. A terminal that consumes the
1258
+ new shortcuts can forward `\u001b[20;2~` for Shift-F9 and `\u001b[20;4~` for
1259
+ Shift-Alt-F9 with Windows Terminal `sendInput` actions. The Windows keyboard
1260
+ helper forwards both shortcuts while preserving AltGr combinations.
1261
+
1262
+ The `F9` schema browser groups tables, views, procedures, functions, package specifications, package bodies, types, type bodies, triggers, sequences, indexes, and private synonyms from the current schema. Type while the browser is focused to filter object names with a case-insensitive substring match; groups without matches are hidden and matching groups expand automatically without changing their saved expansion state. Exact quoted and mixed-case names are preserved when columns, routines or definitions are loaded, with Oracle-safe quoting applied to metadata requests.
1216
1263
 
1217
1264
  Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load DDL`, or `Copy object name`. `Insert SELECT` adds a `select *` statement for the SQL-safe, unqualified object name to the current buffer and focuses the editor; it does not execute the query. `Copy object name` places that SQL-ready, unqualified identifier on the clipboard. For standalone procedures, functions and other object types, `Enter` offers `Load DDL` (the default) and `Copy object name`.
1218
1265
 
@@ -1237,6 +1284,18 @@ Edit the input values before running it. Insertion does not execute or compile
1237
1284
  the call. Unsupported or incomplete signatures report a reason and leave the
1238
1285
  buffer unchanged.
1239
1286
 
1287
+ Press `Space` on a standalone procedure or function to expand its callable
1288
+ signature with parameter directions, types and the function return type. Press
1289
+ `Enter` on the signature to insert the same owner-qualified call template as for
1290
+ package routines. The parent object's Enter menu still offers Load DDL and Copy
1291
+ object name. Signatures load asynchronously and are cached until refresh.
1292
+
1293
+ The **Types** group includes object and collection types; **Type bodies** lists
1294
+ their implementations separately. Enter offers Load DDL or Copy object name.
1295
+ Loading a type fetches its specification only; loading a type body fetches its
1296
+ body only, with owner-qualified DDL and a single slash terminator. Type attributes
1297
+ and methods do not expand into child rows.
1298
+
1240
1299
  Press `Space` on a table or view to expand or collapse its column subtree,
1241
1300
  including while filtering. Column names appear in database order and are loaded
1242
1301
  in the background on first expansion, then cached. Columns are informational
@@ -1253,8 +1312,12 @@ object branches, retaining the filter and group expansion state.
1253
1312
  | `Esc` | Clear a nonempty filter, or return to the editor when the filter is empty |
1254
1313
  | `Up` / `Down` | Move through browser entries |
1255
1314
  | `PageUp` / `PageDown` | Move through browser entries by page |
1256
- | `Enter` | Expand a group, choose an object action, or insert a package routine call |
1257
- | `Space` | Expand/collapse table/view columns or package routines; on groups, expand/collapse with an empty filter or add a space to an active filter |
1315
+ | `Tab` | Focus the SQL buffer, keeping the browser open |
1316
+ | `F9` | Close the browser and focus the SQL buffer |
1317
+ | `Shift-F9` | Toggle normal/half-screen width and focus the browser |
1318
+ | `Shift-Alt-F9` | Toggle full-screen/previous width and focus the browser |
1319
+ | `Enter` | Expand a group, choose an object action, or insert a routine call |
1320
+ | `Space` | Expand/collapse table/view columns, package routines or standalone signatures; on groups, expand/collapse with an empty filter or add a space to an active filter |
1258
1321
  | `Ctrl-F` | Edit the object-name filter, including spaces |
1259
1322
  | `Ctrl-R` | Refresh database objects/statuses and clear column/routine subtrees and caches |
1260
1323
 
@@ -1268,7 +1331,7 @@ object branches, retaining the filter and group expansion state.
1268
1331
  | `PageUp` / `PageDown` | Scroll cell text by page |
1269
1332
  | `Home` / `End` | Move to the first/last cell-viewer line |
1270
1333
  | `Ctrl-S` (editor) | Save the multiline edit |
1271
- | `Ctrl-P` / `Ctrl-Shift-P` / `Alt-Shift-P` / configured V keys / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1334
+ | `Ctrl-Alt-P` / `Ctrl-Shift-P` / `Alt-Shift-P` / configured V keys / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1272
1335
  | `Enter` (editor) | Insert a newline |
1273
1336
  | `F10` / `Esc` / `Ctrl-Q` (editor) | Cancel the multiline edit |
1274
1337
 
@@ -583,7 +583,7 @@ Use left Alt for application shortcuts; AltGr remains available for characters
583
583
  on international keyboards. Shortcut digits and symbols refer to the character
584
584
  on the active Windows layout: for example, Czech top-row digits need Shift,
585
585
  so Alt-1 is typed with Alt-Shift-1. Use the layout's `+` or `=` character for
586
- autocomplete refresh. Ctrl-C/Ctrl-P copy/paste internally, Ctrl-Shift-C/Ctrl-Shift-P
586
+ autocomplete refresh. Ctrl-C/Ctrl-Alt-P copy/paste internally, Ctrl-Shift-C/Ctrl-Shift-P
587
587
  use the Windows system clipboard, and Alt-Shift-C/Alt-Shift-P use the Linux
588
588
  clipboard. Ctrl-V and Ctrl-Shift-V retain their configured paste sources;
589
589
  Ctrl-Shift-V defaults to internal paste. SSH does not expose the Windows clipboard to the host. Use
@@ -662,12 +662,14 @@ two external methods may access shared contents.
662
662
  | --- | --- | --- |
663
663
  | System (Windows) | `Ctrl-Shift-C` | `Ctrl-Shift-P` |
664
664
  | WSL/Linux | `Alt-Shift-C` | `Alt-Shift-P` |
665
- | Internal | `Ctrl-C` | `Ctrl-P` |
665
+ | Internal | `Ctrl-C` | `Ctrl-Alt-P` |
666
666
 
667
667
  Each fixed shortcut uses only its assigned target. Copying externally leaves
668
668
  the internal clipboard unchanged. `Ctrl-C` interrupts a running database
669
669
  operation first; otherwise it copies internally. `Ctrl-Alt-C` still commits or
670
- applies the active insert draft, and `Ctrl-Alt-R` rolls back.
670
+ applies the active insert draft, and `Ctrl-Alt-R` rolls back. `Ctrl-P` finds the
671
+ previous occurrence of the last search string, retaining case sensitivity and
672
+ wrapping at the start of the worksheet.
671
673
  The copy shortcuts work for editor selections, result cells/ranges,
672
674
  DBMS_OUTPUT selections and schema-browser object names. Paste works in the
673
675
  worksheet, paste-enabled prompts and editable cell text dialogs.
@@ -705,7 +707,8 @@ entries to `actions`, keeping the other actions:
705
707
 
706
708
  ```json
707
709
  { "command": { "action": "sendInput", "input": "\u0003" }, "id": "User.PlsqlwksInternalCopy" },
708
- { "command": { "action": "sendInput", "input": "\u0010" }, "id": "User.PlsqlwksInternalPaste" },
710
+ { "command": { "action": "sendInput", "input": "\u001b[112;7u" }, "id": "User.PlsqlwksInternalPaste" },
711
+ { "command": { "action": "sendInput", "input": "\u0010" }, "id": "User.PlsqlwksPreviousMatch" },
709
712
  { "command": { "action": "sendInput", "input": "\u001b[99;6u" }, "id": "User.PlsqlwksSystemCopy" },
710
713
  { "command": { "action": "sendInput", "input": "\u001b[112;6u" }, "id": "User.PlsqlwksSystemPaste" },
711
714
  { "command": { "action": "sendInput", "input": "\u001b[99;4u" }, "id": "User.PlsqlwksWslCopy" },
@@ -719,7 +722,8 @@ the entries below, keeping the other keybindings:
719
722
 
720
723
  ```json
721
724
  { "id": "User.PlsqlwksInternalCopy", "keys": "ctrl+c" },
722
- { "id": "User.PlsqlwksInternalPaste", "keys": "ctrl+p" },
725
+ { "id": "User.PlsqlwksInternalPaste", "keys": "ctrl+alt+p" },
726
+ { "id": "User.PlsqlwksPreviousMatch", "keys": "ctrl+p" },
723
727
  { "id": "User.PlsqlwksSystemCopy", "keys": "ctrl+shift+c" },
724
728
  { "id": "User.PlsqlwksSystemPaste", "keys": "ctrl+shift+p" },
725
729
  { "id": "User.PlsqlwksWslCopy", "keys": "alt+shift+c" },
@@ -757,11 +761,14 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
757
761
  | Key | Action |
758
762
  | --- | --- |
759
763
  | `Alt-O` | Open the top-left commands menu |
764
+ | `Alt-I` | Show connection information for the active tab |
760
765
  | `F1` | Help |
761
766
  | `F6` | Switch between DBMS_OUTPUT and normal results |
762
767
  | `F7` | Cycle fullscreen grid, fullscreen editor, and 2/3 editor + 1/3 grid |
763
768
  | `F8` | Toggle result grid / row-detail output |
764
769
  | `F9` | Show/focus/hide schema browser |
770
+ | `Shift-F9` | Toggle Schema Browser between normal and half-screen width |
771
+ | `Shift-Alt-F9` | Toggle Schema Browser between full-screen and its previous width |
765
772
  | `F12` | Choose autocommit or manual transaction mode |
766
773
  | `Ctrl-Up` / `Ctrl-Down` | Scroll the focused pane or visible DBMS_OUTPUT by one line |
767
774
  | `Ctrl-W` | Close current file tab |
@@ -772,6 +779,25 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
772
779
  | `Ctrl-Alt-C` | Insert the active result-grid draft, or commit when no draft is active |
773
780
  | `Ctrl-Alt-R` | Roll back the current transaction |
774
781
 
782
+ ### Connection information
783
+
784
+ Press `Alt-I`, or choose **Alt-O → Database → Connection information**, from the
785
+ editor, results or schema browser. A centered dialog shows the connected user,
786
+ current schema, service, database and unique database name, container, instance,
787
+ server host, session SID, server timestamp with fractional seconds and timezone,
788
+ database/session time zones, Oracle version, driver version and Thin/Thick mode,
789
+ autocommit and read-only mode. The information is refreshed from the active tab's
790
+ existing session without changing worksheet results, transactions or unread
791
+ DBMS_OUTPUT. A busy active session uses the existing operation-running feedback;
792
+ a disconnected session shows `Not connected` without reconnecting.
793
+
794
+ The dialog keeps **[ OK ]** visible. Press Enter or Space to accept, or Esc/Ctrl-Q
795
+ to close. Use Up/Down, PageUp/PageDown or Home/End to scroll long details; resize
796
+ the terminal to change the layout. Requests cancelled or completed after switching
797
+ away from their tab do not open a late dialog. The Windows keyboard helper forwards
798
+ Alt-I; a Windows Terminal profile that consumes it can forward `\u001bi` with a
799
+ `sendInput` action bound to `alt+i`.
800
+
775
801
  ### Editor
776
802
 
777
803
  | Key | Action |
@@ -809,10 +835,10 @@ See Microsoft's [send input action](https://learn.microsoft.com/en-us/windows/te
809
835
  | `Alt-O` -> **Editor** -> **Replace text** | Open Find/Replace at the replacement field |
810
836
  | `Ctrl-G` | Go to line |
811
837
  | `Ctrl-N` | Move to the next search occurrence |
812
- | `Alt-O → Editor → Previous search match` | Move to the previous search occurrence |
838
+ | `Ctrl-P` / `Alt-O → Editor → Previous search match` | Move to the previous search occurrence |
813
839
  | `Ctrl-U` | Uppercase selected SQL code |
814
840
  | `Ctrl-L` | Lowercase selected SQL code |
815
- | `Ctrl-C` / `Ctrl-P` | Copy/paste internally |
841
+ | `Ctrl-C` / `Ctrl-Alt-P` | Copy/paste internally |
816
842
  | `Ctrl-Shift-C` / `Ctrl-Shift-P` | Copy/paste the System (Windows) clipboard |
817
843
  | `Alt-Shift-C` / `Alt-Shift-P` | Copy/paste the WSL/Linux clipboard |
818
844
  | `Ctrl-X` | Cut selected text |
@@ -853,9 +879,9 @@ The dialog provides `Find next`, `Replace`, `Replace all`, and `Cancel` actions.
853
879
  and lowercase letters. `Replace` changes the selected matching occurrence, or
854
880
  the next match from the cursor, and then selects the following match. `Replace
855
881
  all` changes every match in the current buffer. Either replacement operation is
856
- recorded as one undoable edit. `Ctrl-N` repeats the last search forward;
857
- **Alt-O → Editor → Previous search match** repeats it backward. Both retain the
858
- case setting and wrap around.
882
+ recorded as one undoable edit. `Ctrl-N` repeats the last search forward and
883
+ `Ctrl-P` repeats it backward. Both retain the case setting and wrap around.
884
+ **Alt-O → Editor → Previous search match** provides the same backward search.
859
885
 
860
886
  Editor paste expands every tab character to two spaces and keeps multiline
861
887
  text in one undoable edit. This applies to all fixed and configured paste shortcuts and
@@ -1176,7 +1202,28 @@ validate this opt-in mode with the applications in use.
1176
1202
 
1177
1203
  ### Schema Browser
1178
1204
 
1179
- The `F9` schema browser groups tables, views, procedures, functions, package specifications, package bodies, triggers, sequences, indexes, and private synonyms from the current schema. Type while the browser is focused to filter object names with a case-insensitive substring match; groups without matches are hidden and matching groups expand automatically without changing their saved expansion state. Exact quoted and mixed-case names are preserved when columns, routines or definitions are loaded, with Oracle-safe quoting applied to metadata requests.
1205
+ Press `F9` to open or focus Schema Browser. While it is focused, `F9` closes it
1206
+ and returns to the SQL buffer. Press `Tab` to keep the browser open and focus
1207
+ the SQL buffer, so you can edit SQL beside the tree; press `F9` to return to it.
1208
+ Filters, selected objects, expanded branches and cached metadata are retained.
1209
+
1210
+ `Shift-F9` opens/focuses the browser and toggles its normal width with a left
1211
+ half-screen pane; the SQL buffer and results stay on the right. `Shift-Alt-F9`
1212
+ opens/focuses a full-screen browser with its filter header and status line, and
1213
+ pressing it again restores the previous normal or half-screen width. From a
1214
+ full-screen browser, Tab, returning to the editor with Esc, or loading/inserting
1215
+ SQL also restores that previous width. Shift-F9 switches a full-screen browser
1216
+ to half-screen. Closing it with F9 retains the side-by-side width for reopening.
1217
+ Browser sizes last for the current application session.
1218
+
1219
+ Opening/focusing the browser exits an incompatible F7 editor/grid fullscreen
1220
+ view, restoring the saved SQL/results split or the two-thirds-editor layout.
1221
+ F7 retains its existing editor/grid layout cycle. A terminal that consumes the
1222
+ new shortcuts can forward `\u001b[20;2~` for Shift-F9 and `\u001b[20;4~` for
1223
+ Shift-Alt-F9 with Windows Terminal `sendInput` actions. The Windows keyboard
1224
+ helper forwards both shortcuts while preserving AltGr combinations.
1225
+
1226
+ The `F9` schema browser groups tables, views, procedures, functions, package specifications, package bodies, types, type bodies, triggers, sequences, indexes, and private synonyms from the current schema. Type while the browser is focused to filter object names with a case-insensitive substring match; groups without matches are hidden and matching groups expand automatically without changing their saved expansion state. Exact quoted and mixed-case names are preserved when columns, routines or definitions are loaded, with Oracle-safe quoting applied to metadata requests.
1180
1227
 
1181
1228
  Press `Enter` on a table or view to choose `Insert SELECT` (the default), `Load DDL`, or `Copy object name`. `Insert SELECT` adds a `select *` statement for the SQL-safe, unqualified object name to the current buffer and focuses the editor; it does not execute the query. `Copy object name` places that SQL-ready, unqualified identifier on the clipboard. For standalone procedures, functions and other object types, `Enter` offers `Load DDL` (the default) and `Copy object name`.
1182
1229
 
@@ -1201,6 +1248,18 @@ Edit the input values before running it. Insertion does not execute or compile
1201
1248
  the call. Unsupported or incomplete signatures report a reason and leave the
1202
1249
  buffer unchanged.
1203
1250
 
1251
+ Press `Space` on a standalone procedure or function to expand its callable
1252
+ signature with parameter directions, types and the function return type. Press
1253
+ `Enter` on the signature to insert the same owner-qualified call template as for
1254
+ package routines. The parent object's Enter menu still offers Load DDL and Copy
1255
+ object name. Signatures load asynchronously and are cached until refresh.
1256
+
1257
+ The **Types** group includes object and collection types; **Type bodies** lists
1258
+ their implementations separately. Enter offers Load DDL or Copy object name.
1259
+ Loading a type fetches its specification only; loading a type body fetches its
1260
+ body only, with owner-qualified DDL and a single slash terminator. Type attributes
1261
+ and methods do not expand into child rows.
1262
+
1204
1263
  Press `Space` on a table or view to expand or collapse its column subtree,
1205
1264
  including while filtering. Column names appear in database order and are loaded
1206
1265
  in the background on first expansion, then cached. Columns are informational
@@ -1217,8 +1276,12 @@ object branches, retaining the filter and group expansion state.
1217
1276
  | `Esc` | Clear a nonempty filter, or return to the editor when the filter is empty |
1218
1277
  | `Up` / `Down` | Move through browser entries |
1219
1278
  | `PageUp` / `PageDown` | Move through browser entries by page |
1220
- | `Enter` | Expand a group, choose an object action, or insert a package routine call |
1221
- | `Space` | Expand/collapse table/view columns or package routines; on groups, expand/collapse with an empty filter or add a space to an active filter |
1279
+ | `Tab` | Focus the SQL buffer, keeping the browser open |
1280
+ | `F9` | Close the browser and focus the SQL buffer |
1281
+ | `Shift-F9` | Toggle normal/half-screen width and focus the browser |
1282
+ | `Shift-Alt-F9` | Toggle full-screen/previous width and focus the browser |
1283
+ | `Enter` | Expand a group, choose an object action, or insert a routine call |
1284
+ | `Space` | Expand/collapse table/view columns, package routines or standalone signatures; on groups, expand/collapse with an empty filter or add a space to an active filter |
1222
1285
  | `Ctrl-F` | Edit the object-name filter, including spaces |
1223
1286
  | `Ctrl-R` | Refresh database objects/statuses and clear column/routine subtrees and caches |
1224
1287
 
@@ -1232,7 +1295,7 @@ object branches, retaining the filter and group expansion state.
1232
1295
  | `PageUp` / `PageDown` | Scroll cell text by page |
1233
1296
  | `Home` / `End` | Move to the first/last cell-viewer line |
1234
1297
  | `Ctrl-S` (editor) | Save the multiline edit |
1235
- | `Ctrl-P` / `Ctrl-Shift-P` / `Alt-Shift-P` / configured V keys / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1298
+ | `Ctrl-Alt-P` / `Ctrl-Shift-P` / `Alt-Shift-P` / configured V keys / terminal paste (editor) | Paste exact clipboard text as one undoable edit |
1236
1299
  | `Enter` (editor) | Insert a newline |
1237
1300
  | `F10` / `Esc` / `Ctrl-Q` (editor) | Cancel the multiline edit |
1238
1301
 
@@ -65,7 +65,7 @@ plsqlwks plugin install plugins/packages/schema-compare-0.1.0.plwgn
65
65
  ```
66
66
 
67
67
  The `xlsx` extra is optional when only CSV/HTML are needed. From a local source
68
- archive, use `python3 -m pip install './plsqlwks-0.2.4.tar.gz[xlsx]'` in the
68
+ archive, use `python3 -m pip install './plsqlwks-0.2.5.tar.gz[xlsx]'` in the
69
69
  application environment; use `--force-reinstall` when replacing a build with
70
70
  the same version. Installing the extra does not install the managed plugin.
71
71
  No other exporter plugins need to be installed.
@@ -1,3 +1,3 @@
1
1
  """ncurses SQL and PL/SQL workspace."""
2
2
 
3
- __version__ = "0.2.4"
3
+ __version__ = "0.2.5"
@@ -16,6 +16,8 @@ SCHEMA_OBJECT_TYPES = (
16
16
  "FUNCTION",
17
17
  "PACKAGE",
18
18
  "PACKAGE BODY",
19
+ "TYPE",
20
+ "TYPE BODY",
19
21
  "TRIGGER",
20
22
  "SEQUENCE",
21
23
  "INDEX",
@@ -66,7 +68,7 @@ class PackageArgument:
66
68
  @dataclass(frozen=True)
67
69
  class PackageRoutine:
68
70
  owner: str
69
- package_name: str
71
+ package_name: str | None
70
72
  name: str
71
73
  subprogram_id: int
72
74
  overload: str | None
@@ -86,6 +88,8 @@ class MetadataPort(Protocol):
86
88
 
87
89
  def list_package_routines(self, package_name: str) -> tuple[PackageRoutine, ...]: ...
88
90
 
91
+ def list_standalone_routines(self, object_type: str, object_name: str) -> tuple[PackageRoutine, ...]: ...
92
+
89
93
  def get_table_generation_metadata(self, object_name: str) -> TableGenerationMetadata | None: ...
90
94
 
91
95
  def get_column_max(self, object_name: str, column_name: str) -> object | None: ...
@@ -108,7 +112,7 @@ class MetadataService:
108
112
  from user_objects
109
113
  where object_type in (
110
114
  'TABLE', 'VIEW', 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY',
111
- 'TRIGGER', 'SEQUENCE', 'INDEX', 'SYNONYM'
115
+ 'TYPE', 'TYPE BODY', 'TRIGGER', 'SEQUENCE', 'INDEX', 'SYNONYM'
112
116
  )
113
117
  order by
114
118
  case object_type
@@ -118,10 +122,12 @@ class MetadataService:
118
122
  when 'FUNCTION' then 4
119
123
  when 'PACKAGE' then 5
120
124
  when 'PACKAGE BODY' then 6
121
- when 'TRIGGER' then 7
122
- when 'SEQUENCE' then 8
123
- when 'INDEX' then 9
124
- when 'SYNONYM' then 10
125
+ when 'TYPE' then 7
126
+ when 'TYPE BODY' then 8
127
+ when 'TRIGGER' then 9
128
+ when 'SEQUENCE' then 10
129
+ when 'INDEX' then 11
130
+ when 'SYNONYM' then 12
125
131
  else 99
126
132
  end,
127
133
  object_name
@@ -150,7 +156,10 @@ class MetadataService:
150
156
  return terminate_plsql_ddl(spec)
151
157
  ddl_type = metadata_object_type(normalized_type)
152
158
  ddl = fetch_ddl(cursor, ddl_type, normalized_name)
153
- if normalized_type in {"PROCEDURE", "FUNCTION", "TRIGGER", "PACKAGE_SPEC", "PACKAGE_BODY", "PACKAGE BODY"}:
159
+ if normalized_type in {
160
+ "PROCEDURE", "FUNCTION", "TRIGGER", "PACKAGE_SPEC", "PACKAGE_BODY", "PACKAGE BODY",
161
+ "TYPE", "TYPE_SPEC", "TYPE_BODY", "TYPE BODY",
162
+ }:
154
163
  return terminate_plsql_ddl(ddl)
155
164
  return ensure_sql_terminator(ddl)
156
165
  finally:
@@ -171,23 +180,50 @@ class MetadataService:
171
180
  name = normalize_identifier(package_name)
172
181
  if name is None:
173
182
  raise ValueError("Invalid Oracle package identifier")
183
+ return self._list_routines('PACKAGE', name)
184
+
185
+ def list_standalone_routines(self, object_type: str, object_name: str) -> tuple[PackageRoutine, ...]:
186
+ if object_type not in {'PROCEDURE', 'FUNCTION'}:
187
+ raise ValueError("Unsupported standalone routine type")
188
+ name = normalize_identifier(object_name)
189
+ if name is None:
190
+ raise ValueError("Invalid Oracle routine identifier")
191
+ return self._list_routines(object_type, name)
192
+
193
+ def _list_routines(self, object_type: str, name: str) -> tuple[PackageRoutine, ...]:
174
194
  cursor = self._ensure_connected().cursor()
175
195
  try:
176
- cursor.execute("""
196
+ if object_type == 'PACKAGE':
197
+ cursor.execute("""
177
198
  select user, procedure_name, subprogram_id, overload, pipelined, aggregate
178
199
  from user_procedures
179
200
  where object_name = :package_name and object_type = 'PACKAGE'
180
201
  and procedure_name is not null
181
202
  order by procedure_name, subprogram_id
182
- """, package_name=name)
203
+ """, package_name=name)
204
+ else:
205
+ cursor.execute("""
206
+ select user, object_name, subprogram_id, overload, pipelined, aggregate
207
+ from user_procedures
208
+ where object_name = :object_name and object_type = :object_type
209
+ and procedure_name is null
210
+ order by subprogram_id
211
+ """, object_name=name, object_type=object_type)
183
212
  procedures = list(cursor)
184
- cursor.execute("""
213
+ argument_filter = 'package_name = :package_name' if object_type == 'PACKAGE' else (
214
+ 'package_name is null and object_name = :object_name'
215
+ )
216
+ argument_query = f"""
185
217
  select subprogram_id, overload, argument_name, position, in_out, data_type,
186
218
  type_owner, type_name, type_subname, type_object_type, pls_type, char_length, defaulted
187
219
  from user_arguments
188
- where package_name = :package_name and data_level = 0
220
+ where {argument_filter} and data_level = 0
189
221
  order by subprogram_id, sequence
190
- """, package_name=name)
222
+ """
223
+ if object_type == 'PACKAGE':
224
+ cursor.execute(argument_query, package_name=name)
225
+ else:
226
+ cursor.execute(argument_query, object_name=name)
191
227
  arguments: dict[tuple[int, str | None], list[tuple[int, PackageArgument]]] = {}
192
228
  for row in cursor:
193
229
  (subprogram_id, overload, argument_name, position, mode, data_type,
@@ -202,11 +238,14 @@ class MetadataService:
202
238
  for owner, routine_name, subprogram_id, overload, pipelined, aggregate in procedures:
203
239
  signature = arguments.get((int(subprogram_id), overload), [])
204
240
  return_argument = next((arg for position, arg in signature if position == 0), None)
241
+ if object_type == 'FUNCTION' and return_argument is None:
242
+ return_argument = PackageArgument(None, 'OUT', 'UNKNOWN', None)
205
243
  parameters = tuple(arg for position, arg in signature if position > 0)
206
244
  reason = "This SQL-only function cannot be called by an ordinary PL/SQL block" if (
207
245
  pipelined == 'YES' or aggregate == 'YES'
208
246
  ) else None
209
- routines.append(PackageRoutine(str(owner), name, str(routine_name), int(subprogram_id), overload,
247
+ routines.append(PackageRoutine(str(owner), name if object_type == 'PACKAGE' else None,
248
+ str(routine_name), int(subprogram_id), overload,
210
249
  parameters, return_argument, reason))
211
250
  return tuple(routines)
212
251
  finally:
@@ -375,6 +414,9 @@ class MetadataMixin:
375
414
  def list_package_routines(self, package_name: str) -> tuple[PackageRoutine, ...]:
376
415
  return self._metadata_service().list_package_routines(package_name)
377
416
 
417
+ def list_standalone_routines(self, object_type: str, object_name: str) -> tuple[PackageRoutine, ...]:
418
+ return self._metadata_service().list_standalone_routines(object_type, object_name)
419
+
378
420
  def get_table_generation_metadata(self, object_name: str) -> TableGenerationMetadata | None:
379
421
  return self._metadata_service().get_table_generation_metadata(object_name)
380
422
 
@@ -401,6 +443,10 @@ def configure_metadata_transform(cursor: oracledb.Cursor) -> None:
401
443
 
402
444
 
403
445
  def metadata_object_type(object_type: str) -> str:
446
+ if object_type in {'TYPE', 'TYPE_SPEC'}:
447
+ return 'TYPE_SPEC'
448
+ if object_type in {'TYPE BODY', 'TYPE_BODY'}:
449
+ return 'TYPE_BODY'
404
450
  if object_type in {"PACKAGE_SPEC", "PACKAGE_BODY", "PACKAGE BODY"}:
405
451
  return object_type.replace(' ', '_')
406
452
  if object_type not in SCHEMA_OBJECT_TYPES:
@@ -173,6 +173,49 @@ class OracleWorkspace(
173
173
  def list_package_routines(self, package_name: str) -> tuple[PackageRoutine, ...]:
174
174
  return self._metadata.list_package_routines(package_name)
175
175
 
176
+ def list_standalone_routines(self, object_type: str, object_name: str) -> tuple[PackageRoutine, ...]:
177
+ return self._metadata.list_standalone_routines(object_type, object_name)
178
+
179
+ def get_connection_info(self) -> tuple[tuple[str, str], ...]:
180
+ """Inspect the current connection without connecting or changing session state."""
181
+ conn = self.connection
182
+ if conn is None or not self.connection_is_healthy():
183
+ raise RuntimeError("Not connected; reconnect before requesting connection information")
184
+ cursor = conn.cursor()
185
+ try:
186
+ cursor.execute("""
187
+ select user,
188
+ sys_context('USERENV', 'CURRENT_SCHEMA'),
189
+ sys_context('USERENV', 'SERVICE_NAME'),
190
+ sys_context('USERENV', 'DB_NAME'),
191
+ sys_context('USERENV', 'DB_UNIQUE_NAME'),
192
+ sys_context('USERENV', 'CON_NAME'),
193
+ sys_context('USERENV', 'INSTANCE_NAME'),
194
+ sys_context('USERENV', 'SERVER_HOST'),
195
+ sys_context('USERENV', 'SID'),
196
+ to_char(systimestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF9 TZH:TZM'),
197
+ dbtimezone, sessiontimezone
198
+ from dual
199
+ """)
200
+ row = cursor.fetchone()
201
+ if row is None:
202
+ raise RuntimeError("Connection information query returned no row")
203
+ labels = (
204
+ 'Connected user', 'Current schema', 'Service', 'Database', 'Unique database name',
205
+ 'Container', 'Instance', 'Server host', 'Session SID', 'Server time',
206
+ 'Database time zone', 'Session time zone',
207
+ )
208
+ fields = tuple((label, str(value) if value is not None else 'Not available')
209
+ for label, value in zip(labels, row, strict=True))
210
+ return fields + (
211
+ ('Oracle version', conn.version), ('Driver version', oracledb.__version__),
212
+ ('Driver mode', 'Thin' if conn.thin else 'Thick'),
213
+ ('Autocommit', 'On' if self.autocommit else 'Off'),
214
+ ('Read-only mode', 'On' if self.read_only else 'Off'),
215
+ )
216
+ finally:
217
+ cursor.close()
218
+
176
219
  def get_table_generation_metadata(self, object_name: str) -> TableGenerationMetadata | None:
177
220
  return self._metadata.get_table_generation_metadata(object_name)
178
221
 
@@ -42,6 +42,7 @@ from .syntax import * # type: ignore[assignment] # reason: compatibility facad
42
42
 
43
43
  __all__ = (
44
44
  "ALT_G_SEQUENCES",
45
+ "ALT_I_SEQUENCES",
45
46
  "ALT_O_SEQUENCES",
46
47
  "ALT_PLUS_SEQUENCES",
47
48
  "ALT_R_SEQUENCES",
@@ -174,13 +175,16 @@ __all__ = (
174
175
  "INSERT_SEQUENCES",
175
176
  "KEY_ALT_DIGIT_BASE",
176
177
  "KEY_ALT_G",
178
+ "KEY_ALT_I",
177
179
  "KEY_ALT_O",
178
180
  "KEY_ALT_PLUS",
179
181
  "KEY_ALT_R",
180
182
  "KEY_ALT_SHIFT_C",
183
+ "KEY_ALT_SHIFT_F9",
181
184
  "KEY_ALT_SHIFT_P",
182
185
  "KEY_ALT_X",
183
186
  "KEY_CTRL_ALT_C",
187
+ "KEY_CTRL_ALT_P",
184
188
  "KEY_CTRL_ALT_R",
185
189
  "KEY_CTRL_BACKSPACE",
186
190
  "KEY_CTRL_DELETE",
@@ -203,6 +207,7 @@ __all__ = (
203
207
  "KEY_CTRL_UP",
204
208
  "KEY_SHIFT_DOWN",
205
209
  "KEY_SHIFT_END",
210
+ "KEY_SHIFT_F9",
206
211
  "KEY_SHIFT_HOME",
207
212
  "KEY_SHIFT_LEFT",
208
213
  "KEY_SHIFT_PAGEDOWN",