plsqlwks 0.1.9.3__tar.gz → 0.2.0__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 (124) hide show
  1. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/PKG-INFO +178 -1
  2. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/README.md +177 -0
  3. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/doc/API.md +67 -3
  4. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/doc/COMPATIBILITY.md +46 -17
  5. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/doc/PLUGINS.md +18 -0
  6. plsqlwks-0.2.0/doc/PLUGIN_CATALOG.md +193 -0
  7. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/__init__.py +1 -1
  8. plsqlwks-0.2.0/plsqlwks/db/dependencies.py +151 -0
  9. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/execution.py +33 -3
  10. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/models.py +3 -0
  11. plsqlwks-0.2.0/plsqlwks/db/timestamps.py +131 -0
  12. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/plugins/api.py +13 -0
  13. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/app.py +49 -2
  14. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/buffer.py +6 -0
  15. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/commands.py +1 -0
  16. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/constants.py +79 -8
  17. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/db_operations.py +4 -3
  18. plsqlwks-0.2.0/plsqlwks/ui/dependency_walker.py +290 -0
  19. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/display.py +34 -0
  20. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/errors.py +1 -1
  21. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/key_reader.py +51 -7
  22. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/keys.py +59 -61
  23. plsqlwks-0.2.0/plsqlwks/ui/output_selection.py +163 -0
  24. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/plugin_host.py +18 -0
  25. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/renderer.py +50 -22
  26. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/result_controller.py +42 -0
  27. plsqlwks-0.2.0/plsqlwks/ui/sqlplus.py +182 -0
  28. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/state.py +2 -0
  29. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/viewport.py +28 -4
  30. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks.egg-info/SOURCES.txt +16 -1
  31. plsqlwks-0.2.0/plugins/dependencies-walker/install.plw +7 -0
  32. plsqlwks-0.2.0/plugins/dependencies-walker/payload/plugin.py +22 -0
  33. plsqlwks-0.2.0/plugins/packages/dependencies-walker-0.1.0.plwgn +0 -0
  34. plsqlwks-0.2.0/plugins/packages/sqlplus-0.1.0.plwgn +0 -0
  35. plsqlwks-0.2.0/plugins/sqlplus/install.plw +7 -0
  36. plsqlwks-0.2.0/plugins/sqlplus/payload/__init__.py +0 -0
  37. plsqlwks-0.2.0/plugins/sqlplus/payload/plugin.py +22 -0
  38. plsqlwks-0.2.0/plugins/xlsx-export/payload/__init__.py +0 -0
  39. plsqlwks-0.2.0/tools/putty_keys.ps1 +286 -0
  40. plsqlwks-0.2.0/tools/windows_keys.cmd +4 -0
  41. plsqlwks-0.1.9.3/doc/PLUGIN_CATALOG.md +0 -100
  42. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/doc/ARCHITECTURE.md +0 -0
  43. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/doc/QUICKSTART.html +0 -0
  44. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/doc/QUICKSTART.md +0 -0
  45. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/license.txt +0 -0
  46. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/__main__.py +0 -0
  47. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/cli.py +0 -0
  48. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/config/__init__.py +0 -0
  49. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/config/loader.py +0 -0
  50. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/config/models.py +0 -0
  51. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/config/paths.py +0 -0
  52. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/config/session.py +0 -0
  53. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/config/settings.py +0 -0
  54. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/__init__.py +0 -0
  55. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/editing.py +0 -0
  56. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/explain.py +0 -0
  57. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/health.py +0 -0
  58. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/identifiers.py +0 -0
  59. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/metadata.py +0 -0
  60. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/session.py +0 -0
  61. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/sql_analysis.py +0 -0
  62. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/db/transactions.py +0 -0
  63. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/exporting.py +0 -0
  64. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/plugins/__init__.py +0 -0
  65. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/plugins/loader.py +0 -0
  66. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/plugins/management.py +0 -0
  67. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/sqlbinds.py +0 -0
  68. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/sqlsplit.py +0 -0
  69. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/__init__.py +0 -0
  70. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/application_controller.py +0 -0
  71. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/browser.py +0 -0
  72. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/catalog.py +0 -0
  73. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/clipboard.py +0 -0
  74. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/code_generation.py +0 -0
  75. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/command_dispatcher.py +0 -0
  76. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/completion.py +0 -0
  77. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/db_session.py +0 -0
  78. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/db_worker.py +0 -0
  79. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/dialogs.py +0 -0
  80. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/documents.py +0 -0
  81. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/editor_controller.py +0 -0
  82. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/help.py +0 -0
  83. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/input_controller.py +0 -0
  84. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/menu.py +0 -0
  85. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/ports.py +0 -0
  86. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/query_controller.py +0 -0
  87. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/result_export.py +0 -0
  88. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/result_presenter.py +0 -0
  89. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/results.py +0 -0
  90. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/sql.py +0 -0
  91. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/ui/syntax.py +0 -0
  92. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plsqlwks/workspace.py +0 -0
  93. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/csv-export/install.plw +0 -0
  94. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/csv-export/payload/__init__.py +0 -0
  95. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/csv-export/payload/plugin.py +0 -0
  96. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/csv-export/payload/support.py +0 -0
  97. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/csv-export/payload/writer.py +0 -0
  98. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/csv2oratab/install.plw +0 -0
  99. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/csv2oratab/payload/__init__.py +0 -0
  100. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/csv2oratab/payload/csv2oratab.py +0 -0
  101. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/csv2oratab/payload/plugin.py +0 -0
  102. {plsqlwks-0.1.9.3/plugins/html-export → plsqlwks-0.2.0/plugins/dependencies-walker}/payload/__init__.py +0 -0
  103. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/html-export/install.plw +0 -0
  104. {plsqlwks-0.1.9.3/plugins/xlsx-export → plsqlwks-0.2.0/plugins/html-export}/payload/__init__.py +0 -0
  105. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/html-export/payload/html_exporting.py +0 -0
  106. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/html-export/payload/plugin.py +0 -0
  107. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/html-export/payload/support.py +0 -0
  108. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/html-export/payload/writer.py +0 -0
  109. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/packages/csv-export-1.0.0.plwgn +0 -0
  110. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/packages/csv2oratab-0.1.0.plwgn +0 -0
  111. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/packages/html-export-1.0.0.plwgn +0 -0
  112. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/packages/xlsx-export-1.0.0.plwgn +0 -0
  113. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/xlsx-export/install.plw +0 -0
  114. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/xlsx-export/payload/plugin.py +0 -0
  115. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/xlsx-export/payload/support.py +0 -0
  116. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/plugins/xlsx-export/payload/xlsx_exporting.py +0 -0
  117. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/pyproject.toml +0 -0
  118. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/pytest.ini +0 -0
  119. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/rchar.py +0 -0
  120. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/requirements.txt +0 -0
  121. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/setup.cfg +0 -0
  122. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/tests/conftest.py +0 -0
  123. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/tests/fixtures/config_exports.txt +0 -0
  124. {plsqlwks-0.1.9.3 → plsqlwks-0.2.0}/tests/fixtures/ui_exports.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plsqlwks
3
- Version: 0.1.9.3
3
+ Version: 0.2.0
4
4
  Summary: An ncurses SQL and PL/SQL workspace for Oracle databases.
5
5
  Author: unu2000
6
6
  License-Expression: LicenseRef-plsqlwks-Donationware
@@ -488,6 +488,149 @@ plsqlwks and asks whether to overwrite it, save under another name, or cancel.
488
488
  Undo and redo update the unsaved-change marker by comparing the current content
489
489
  with the last successful save.
490
490
 
491
+ ## Windows PuTTY keyboard setup
492
+
493
+ For Windows PuTTY 0.83 and 0.85, use a saved session with these settings before
494
+ starting plsqlwks on the Linux/Unix host:
495
+
496
+ | PuTTY panel | Setting |
497
+ | --- | --- |
498
+ | Connection → Data | Terminal-type string: `xterm-256color` |
499
+ | Window → Translation | Remote character set: `UTF-8` |
500
+ | Terminal → Keyboard | Backspace: `Control-? (127)`; Home/End: `Standard` |
501
+ | Terminal → Keyboard | Function keys and keypad: `Xterm 216+` |
502
+ | Terminal → Keyboard | Shifted arrow keys: `xterm-style bitmap` |
503
+ | Terminal → Keyboard | Keep **Control-Alt is different from AltGr** enabled |
504
+ | Terminal → Features | Enable **Disable application cursor keys mode** and **Disable application keypad mode** |
505
+ | Terminal → Features | Leave **Disable bracketed paste mode** unchecked |
506
+ | Terminal | Local echo and local line editing: `Force off` |
507
+
508
+ Save the session and use a UTF-8 locale on the host. Disabling application cursor
509
+ keys is necessary because curses enables that mode, and PuTTY otherwise drops
510
+ arrow modifiers even when bitmap mode is selected.
511
+
512
+ ### Exact Ctrl shortcuts with the Windows helper
513
+
514
+ Stock Windows PuTTY does not send Ctrl-Home/End, Ctrl-Shift-Home/End, or
515
+ Ctrl-Delete at all, and consumes modified PageUp/PageDown for scrollback.
516
+ Use the optional [Windows helper](tools/putty_keys.ps1) to make the original
517
+ shortcuts work. Run it on the **Windows computer running PuTTY**; from a checkout:
518
+
519
+ ```powershell
520
+ powershell.exe -NoProfile -File .\tools\putty_keys.ps1
521
+ ```
522
+
523
+ Focus the PuTTY window running plsqlwks, then press **Ctrl-Alt-F12** to enable
524
+ remapping for that window. The helper console confirms activation. It remaps
525
+ one selected PuTTY window while the helper is running. Press Ctrl-Alt-F12 again
526
+ to disable it before using another program in that terminal, or press Ctrl-C
527
+ in the helper console to stop it. Enabling a different PuTTY window switches
528
+ the selection to that window.
529
+
530
+ With the helper enabled, `Ctrl-Home` / `Ctrl-End` move to the beginning/end of
531
+ the editor buffer or the first/last result row. `Ctrl-Shift-Home` /
532
+ `Ctrl-Shift-End` select to buffer boundaries. The helper also restores
533
+ `Ctrl-Delete`, `Ctrl-Backspace`, `Ctrl-Enter`, `Ctrl-PageUp` / `Ctrl-PageDown`,
534
+ `Shift-PageUp` / `Shift-PageDown`, and `Ctrl+=`. Plain Enter and Backspace keep
535
+ their normal meaning. The helper requires only Windows PowerShell and its
536
+ included .NET runtime; it requires no administrator rights or installation.
537
+ Run the same command with `-SelfTest` to check its mappings without enabling it.
538
+
539
+ ### Alternatives without the helper
540
+
541
+ Some physical combinations cannot reach plsqlwks distinctly in stock Windows
542
+ PuTTY. Use the following alternatives; they also work in terminals that send
543
+ these sequences, and the original bindings remain available elsewhere:
544
+
545
+ | Existing shortcut | PuTTY alternative | Action |
546
+ | --- | --- | --- |
547
+ | `Ctrl-Home` / `Ctrl-End` | `Alt-Home` / `Alt-End` | Editor buffer start/end; first/last result row |
548
+ | `Ctrl-Shift-Home` / `Ctrl-Shift-End` | `Alt-Shift-Home` / `Alt-Shift-End` | Select to editor buffer boundaries |
549
+ | `Ctrl-Delete` | `Alt-Delete` | Delete next word |
550
+ | `Ctrl-Enter` | `F5` or `Alt-X` | Execute selection/current statement |
551
+ | `Ctrl-PageUp` / `Ctrl-PageDown` | `Alt-PageUp` / `Alt-PageDown` | Page focused results; otherwise switch file tabs |
552
+ | `Shift-PageUp` / `Shift-PageDown` | `Ctrl-Shift-Up` / `Ctrl-Shift-Down` | Extend editor selection by page |
553
+ | `Ctrl-Backspace` | `Alt-Backspace` | Delete previous word |
554
+ | `Ctrl+=` | `Alt-O` → **Database** → **Reconnect** | Reconnect |
555
+
556
+ PuTTY sends the same carriage return for Enter and Ctrl-Enter, and the same
557
+ DEL byte for Backspace and Ctrl-Backspace. plsqlwks preserves newline and
558
+ single-character deletion for those bytes. PuTTY consumes Ctrl/Shift-PageUp
559
+ and PageDown for its own scrollback; changing the function-key setting does
560
+ not free them. See the [PuTTY keyboard settings](https://the.earth.li/~sgtatham/putty/0.85/htmldoc/Chapter4.html#config-keyboard)
561
+ and [scrollback shortcuts](https://the.earth.li/~sgtatham/putty/0.85/htmldoc/Chapter3.html#using-scrollback).
562
+
563
+ Use left Alt for application shortcuts; AltGr remains available for characters
564
+ on international keyboards. Shortcut digits and symbols refer to the character
565
+ on the active Windows layout: for example, Czech top-row digits need Shift,
566
+ so Alt-1 is typed with Alt-Shift-1. Use the layout's `+` or `=` character for
567
+ autocomplete refresh. `Ctrl-C`, `Ctrl-X`, and `Ctrl-V` operate on the
568
+ application/host clipboard with the existing internal fallback. SSH does not
569
+ make that the Windows clipboard. Use PuTTY's native paste (`Shift-Insert` or
570
+ right-click) to insert Windows clipboard text as bracketed paste, and PuTTY
571
+ mouse selection to copy to Windows. Leave plsqlwks' Ctrl-letter shortcuts
572
+ available to the server when customizing PuTTY clipboard settings.
573
+
574
+ For troubleshooting, run `python3 rchar.py` from the checkout in the same PuTTY
575
+ session to capture a key's actual bytes. Verify the session settings above
576
+ before reporting a shortcut failure.
577
+
578
+ ## Windows Command Prompt keyboard setup
579
+
580
+ Use plsqlwks through `ssh.exe` or WSL inside **Command Prompt (`cmd.exe`)**.
581
+ The helper supports both the classic Windows console and Command Prompt hosted
582
+ by Windows Terminal. plsqlwks itself runs on the Linux/Unix host or inside WSL,
583
+ where Python provides curses.
584
+
585
+ In one Command Prompt window, connect to the host or start WSL:
586
+
587
+ ```bat
588
+ ssh user@host
589
+ ```
590
+
591
+ or:
592
+
593
+ ```bat
594
+ wsl.exe
595
+ ```
596
+
597
+ Then run the installed application in that Linux/Unix shell:
598
+
599
+ ```sh
600
+ TERM=xterm-256color plsqlwks
601
+ ```
602
+
603
+ In a **second Command Prompt window**, start the Windows helper from the checkout:
604
+
605
+ ```bat
606
+ tools\windows_keys.cmd
607
+ ```
608
+
609
+ Keep that helper window open. Focus the terminal running plsqlwks and press
610
+ **Ctrl-Alt-F12**; the helper confirms activation. The original shortcuts now
611
+ reach the application, including **Ctrl-Home/End**, **Ctrl-Shift-Home/End**,
612
+ modified arrows, word deletion, execution, paging, and `Ctrl+=`. `F11` executes
613
+ the script instead of switching Windows Terminal to fullscreen.
614
+
615
+ Use a dedicated terminal window for plsqlwks. The helper selects a window, so
616
+ disable it with Ctrl-Alt-F12 before switching that window to another tab, pane,
617
+ or program. Press Ctrl-C in the helper window to stop it. Left Alt is used for
618
+ shortcuts; AltGr remains available for typing. Leave the classic console's
619
+ **Use legacy console** option off. Use a UTF-8 locale on the Linux/Unix host.
620
+
621
+ For Windows Terminal, set `"altGrAliasing": false` in the Command Prompt
622
+ profile in its JSON settings. This keeps left Ctrl-Alt-C/R available for
623
+ commit/rollback on international keyboards while preserving the real AltGr
624
+ key. See Microsoft's [AltGr aliasing setting](https://learn.microsoft.com/en-us/windows/terminal/customize-settings/profile-advanced#altgr-aliasing).
625
+
626
+ The `.cmd` launcher uses the included Windows PowerShell runtime and applies
627
+ its script execution policy only to that helper process. No administrator
628
+ rights, installation, or permanent policy change is needed. Keep
629
+ `windows_keys.cmd` and `putty_keys.ps1` together when copying them elsewhere.
630
+ Run `tools\windows_keys.cmd -SelfTest` to check the helper without enabling it.
631
+ The original `powershell.exe -NoProfile -File .\tools\putty_keys.ps1` command
632
+ also works from Command Prompt and continues to support PuTTY.
633
+
491
634
  ## Keys
492
635
 
493
636
  ### Global
@@ -716,6 +859,19 @@ current Thin driver.
716
859
  Displayed CLOB and BLOB values are limited to the first 65,536 characters or
717
860
  bytes and include a truncation marker with the full size. Truncated LOB cells
718
861
  cannot be edited safely. Schema-browser DDL is always read in full.
862
+ To copy DBMS_OUTPUT, show it with **F6** and focus it with **Tab**. Use
863
+ **Shift+navigation** to select text and **Ctrl+C** to copy; **Ctrl+A** selects
864
+ all output. **Alt-O -> Results -> Copy all DBMS_OUTPUT** also copies the whole
865
+ buffer while another pane is focused. Tab/Esc returns to the editor. Home/End
866
+ move within a displayed line; Ctrl+Home/End move to the output boundaries.
867
+
868
+ Copying preserves the stored text, whitespace, blank lines, and statement
869
+ headings, without screen wrapping or padding. The existing system clipboard
870
+ providers are used when available, with the internal clipboard as a fallback
871
+ (including remote PuTTY sessions). Ctrl+C still cancels a running operation
872
+ before performing a copy. Selection belongs to its file tab, survives appended
873
+ output and resizing, and resets when execution replaces the output.
874
+
719
875
  DBMS_OUTPUT is collected after each statement and after every fetched result
720
876
  page without replacing a real query grid. Output-read or cursor-cleanup failures
721
877
  are displayed as warnings while preserving successfully fetched rows. PL/SQL
@@ -980,6 +1136,27 @@ lifecycle change requires a restart. See the
980
1136
  [managed-package guide](https://gitlab.com/unununu/plsqlwks/-/blob/main/doc/PLUGINS.md#managed-plugin-packages)
981
1137
  for the exact manifest, source layout, validation, replacement, and trust rules.
982
1138
 
1139
+ ### Dependencies walker
1140
+
1141
+ Install the optional dependency browser and restart PLSQLWKS:
1142
+
1143
+ ```bash
1144
+ plsqlwks plugin install plugins/packages/dependencies-walker-0.1.0.plwgn
1145
+ ```
1146
+
1147
+ Choose **Alt-O -> Database -> Dependencies walker** and enter an object name,
1148
+ optionally qualified by schema. Expand with Enter/Right, collapse with Left,
1149
+ and use **D** (Depends on) or **U** (Used by) to follow the selected object in
1150
+ either direction. Backspace restores the previous tree; **R** refreshes and
1151
+ Esc closes. Packages combine specification/body relationships with labels.
1152
+
1153
+ The walker reads only visible Oracle-recorded dependencies, loads branches
1154
+ on demand, marks cycles, and leaves database-link references unexpanded.
1155
+ Dynamic SQL and foreign-key graphs are outside this view. See the
1156
+ [plugin catalog](https://gitlab.com/unununu/plsqlwks/-/blob/main/doc/PLUGIN_CATALOG.md#dependencies-walker)
1157
+ for all controls and installation details. No additional runtime dependency is
1158
+ required.
1159
+
983
1160
  ### Maintained csv2oratab integration
984
1161
 
985
1162
  The maintained `csv2oratab-0.1.0.plwgn` catalog package adds **Alt-O -> Data ->
@@ -454,6 +454,149 @@ plsqlwks and asks whether to overwrite it, save under another name, or cancel.
454
454
  Undo and redo update the unsaved-change marker by comparing the current content
455
455
  with the last successful save.
456
456
 
457
+ ## Windows PuTTY keyboard setup
458
+
459
+ For Windows PuTTY 0.83 and 0.85, use a saved session with these settings before
460
+ starting plsqlwks on the Linux/Unix host:
461
+
462
+ | PuTTY panel | Setting |
463
+ | --- | --- |
464
+ | Connection → Data | Terminal-type string: `xterm-256color` |
465
+ | Window → Translation | Remote character set: `UTF-8` |
466
+ | Terminal → Keyboard | Backspace: `Control-? (127)`; Home/End: `Standard` |
467
+ | Terminal → Keyboard | Function keys and keypad: `Xterm 216+` |
468
+ | Terminal → Keyboard | Shifted arrow keys: `xterm-style bitmap` |
469
+ | Terminal → Keyboard | Keep **Control-Alt is different from AltGr** enabled |
470
+ | Terminal → Features | Enable **Disable application cursor keys mode** and **Disable application keypad mode** |
471
+ | Terminal → Features | Leave **Disable bracketed paste mode** unchecked |
472
+ | Terminal | Local echo and local line editing: `Force off` |
473
+
474
+ Save the session and use a UTF-8 locale on the host. Disabling application cursor
475
+ keys is necessary because curses enables that mode, and PuTTY otherwise drops
476
+ arrow modifiers even when bitmap mode is selected.
477
+
478
+ ### Exact Ctrl shortcuts with the Windows helper
479
+
480
+ Stock Windows PuTTY does not send Ctrl-Home/End, Ctrl-Shift-Home/End, or
481
+ Ctrl-Delete at all, and consumes modified PageUp/PageDown for scrollback.
482
+ Use the optional [Windows helper](tools/putty_keys.ps1) to make the original
483
+ shortcuts work. Run it on the **Windows computer running PuTTY**; from a checkout:
484
+
485
+ ```powershell
486
+ powershell.exe -NoProfile -File .\tools\putty_keys.ps1
487
+ ```
488
+
489
+ Focus the PuTTY window running plsqlwks, then press **Ctrl-Alt-F12** to enable
490
+ remapping for that window. The helper console confirms activation. It remaps
491
+ one selected PuTTY window while the helper is running. Press Ctrl-Alt-F12 again
492
+ to disable it before using another program in that terminal, or press Ctrl-C
493
+ in the helper console to stop it. Enabling a different PuTTY window switches
494
+ the selection to that window.
495
+
496
+ With the helper enabled, `Ctrl-Home` / `Ctrl-End` move to the beginning/end of
497
+ the editor buffer or the first/last result row. `Ctrl-Shift-Home` /
498
+ `Ctrl-Shift-End` select to buffer boundaries. The helper also restores
499
+ `Ctrl-Delete`, `Ctrl-Backspace`, `Ctrl-Enter`, `Ctrl-PageUp` / `Ctrl-PageDown`,
500
+ `Shift-PageUp` / `Shift-PageDown`, and `Ctrl+=`. Plain Enter and Backspace keep
501
+ their normal meaning. The helper requires only Windows PowerShell and its
502
+ included .NET runtime; it requires no administrator rights or installation.
503
+ Run the same command with `-SelfTest` to check its mappings without enabling it.
504
+
505
+ ### Alternatives without the helper
506
+
507
+ Some physical combinations cannot reach plsqlwks distinctly in stock Windows
508
+ PuTTY. Use the following alternatives; they also work in terminals that send
509
+ these sequences, and the original bindings remain available elsewhere:
510
+
511
+ | Existing shortcut | PuTTY alternative | Action |
512
+ | --- | --- | --- |
513
+ | `Ctrl-Home` / `Ctrl-End` | `Alt-Home` / `Alt-End` | Editor buffer start/end; first/last result row |
514
+ | `Ctrl-Shift-Home` / `Ctrl-Shift-End` | `Alt-Shift-Home` / `Alt-Shift-End` | Select to editor buffer boundaries |
515
+ | `Ctrl-Delete` | `Alt-Delete` | Delete next word |
516
+ | `Ctrl-Enter` | `F5` or `Alt-X` | Execute selection/current statement |
517
+ | `Ctrl-PageUp` / `Ctrl-PageDown` | `Alt-PageUp` / `Alt-PageDown` | Page focused results; otherwise switch file tabs |
518
+ | `Shift-PageUp` / `Shift-PageDown` | `Ctrl-Shift-Up` / `Ctrl-Shift-Down` | Extend editor selection by page |
519
+ | `Ctrl-Backspace` | `Alt-Backspace` | Delete previous word |
520
+ | `Ctrl+=` | `Alt-O` → **Database** → **Reconnect** | Reconnect |
521
+
522
+ PuTTY sends the same carriage return for Enter and Ctrl-Enter, and the same
523
+ DEL byte for Backspace and Ctrl-Backspace. plsqlwks preserves newline and
524
+ single-character deletion for those bytes. PuTTY consumes Ctrl/Shift-PageUp
525
+ and PageDown for its own scrollback; changing the function-key setting does
526
+ not free them. See the [PuTTY keyboard settings](https://the.earth.li/~sgtatham/putty/0.85/htmldoc/Chapter4.html#config-keyboard)
527
+ and [scrollback shortcuts](https://the.earth.li/~sgtatham/putty/0.85/htmldoc/Chapter3.html#using-scrollback).
528
+
529
+ Use left Alt for application shortcuts; AltGr remains available for characters
530
+ on international keyboards. Shortcut digits and symbols refer to the character
531
+ on the active Windows layout: for example, Czech top-row digits need Shift,
532
+ so Alt-1 is typed with Alt-Shift-1. Use the layout's `+` or `=` character for
533
+ autocomplete refresh. `Ctrl-C`, `Ctrl-X`, and `Ctrl-V` operate on the
534
+ application/host clipboard with the existing internal fallback. SSH does not
535
+ make that the Windows clipboard. Use PuTTY's native paste (`Shift-Insert` or
536
+ right-click) to insert Windows clipboard text as bracketed paste, and PuTTY
537
+ mouse selection to copy to Windows. Leave plsqlwks' Ctrl-letter shortcuts
538
+ available to the server when customizing PuTTY clipboard settings.
539
+
540
+ For troubleshooting, run `python3 rchar.py` from the checkout in the same PuTTY
541
+ session to capture a key's actual bytes. Verify the session settings above
542
+ before reporting a shortcut failure.
543
+
544
+ ## Windows Command Prompt keyboard setup
545
+
546
+ Use plsqlwks through `ssh.exe` or WSL inside **Command Prompt (`cmd.exe`)**.
547
+ The helper supports both the classic Windows console and Command Prompt hosted
548
+ by Windows Terminal. plsqlwks itself runs on the Linux/Unix host or inside WSL,
549
+ where Python provides curses.
550
+
551
+ In one Command Prompt window, connect to the host or start WSL:
552
+
553
+ ```bat
554
+ ssh user@host
555
+ ```
556
+
557
+ or:
558
+
559
+ ```bat
560
+ wsl.exe
561
+ ```
562
+
563
+ Then run the installed application in that Linux/Unix shell:
564
+
565
+ ```sh
566
+ TERM=xterm-256color plsqlwks
567
+ ```
568
+
569
+ In a **second Command Prompt window**, start the Windows helper from the checkout:
570
+
571
+ ```bat
572
+ tools\windows_keys.cmd
573
+ ```
574
+
575
+ Keep that helper window open. Focus the terminal running plsqlwks and press
576
+ **Ctrl-Alt-F12**; the helper confirms activation. The original shortcuts now
577
+ reach the application, including **Ctrl-Home/End**, **Ctrl-Shift-Home/End**,
578
+ modified arrows, word deletion, execution, paging, and `Ctrl+=`. `F11` executes
579
+ the script instead of switching Windows Terminal to fullscreen.
580
+
581
+ Use a dedicated terminal window for plsqlwks. The helper selects a window, so
582
+ disable it with Ctrl-Alt-F12 before switching that window to another tab, pane,
583
+ or program. Press Ctrl-C in the helper window to stop it. Left Alt is used for
584
+ shortcuts; AltGr remains available for typing. Leave the classic console's
585
+ **Use legacy console** option off. Use a UTF-8 locale on the Linux/Unix host.
586
+
587
+ For Windows Terminal, set `"altGrAliasing": false` in the Command Prompt
588
+ profile in its JSON settings. This keeps left Ctrl-Alt-C/R available for
589
+ commit/rollback on international keyboards while preserving the real AltGr
590
+ key. See Microsoft's [AltGr aliasing setting](https://learn.microsoft.com/en-us/windows/terminal/customize-settings/profile-advanced#altgr-aliasing).
591
+
592
+ The `.cmd` launcher uses the included Windows PowerShell runtime and applies
593
+ its script execution policy only to that helper process. No administrator
594
+ rights, installation, or permanent policy change is needed. Keep
595
+ `windows_keys.cmd` and `putty_keys.ps1` together when copying them elsewhere.
596
+ Run `tools\windows_keys.cmd -SelfTest` to check the helper without enabling it.
597
+ The original `powershell.exe -NoProfile -File .\tools\putty_keys.ps1` command
598
+ also works from Command Prompt and continues to support PuTTY.
599
+
457
600
  ## Keys
458
601
 
459
602
  ### Global
@@ -682,6 +825,19 @@ current Thin driver.
682
825
  Displayed CLOB and BLOB values are limited to the first 65,536 characters or
683
826
  bytes and include a truncation marker with the full size. Truncated LOB cells
684
827
  cannot be edited safely. Schema-browser DDL is always read in full.
828
+ To copy DBMS_OUTPUT, show it with **F6** and focus it with **Tab**. Use
829
+ **Shift+navigation** to select text and **Ctrl+C** to copy; **Ctrl+A** selects
830
+ all output. **Alt-O -> Results -> Copy all DBMS_OUTPUT** also copies the whole
831
+ buffer while another pane is focused. Tab/Esc returns to the editor. Home/End
832
+ move within a displayed line; Ctrl+Home/End move to the output boundaries.
833
+
834
+ Copying preserves the stored text, whitespace, blank lines, and statement
835
+ headings, without screen wrapping or padding. The existing system clipboard
836
+ providers are used when available, with the internal clipboard as a fallback
837
+ (including remote PuTTY sessions). Ctrl+C still cancels a running operation
838
+ before performing a copy. Selection belongs to its file tab, survives appended
839
+ output and resizing, and resets when execution replaces the output.
840
+
685
841
  DBMS_OUTPUT is collected after each statement and after every fetched result
686
842
  page without replacing a real query grid. Output-read or cursor-cleanup failures
687
843
  are displayed as warnings while preserving successfully fetched rows. PL/SQL
@@ -946,6 +1102,27 @@ lifecycle change requires a restart. See the
946
1102
  [managed-package guide](https://gitlab.com/unununu/plsqlwks/-/blob/main/doc/PLUGINS.md#managed-plugin-packages)
947
1103
  for the exact manifest, source layout, validation, replacement, and trust rules.
948
1104
 
1105
+ ### Dependencies walker
1106
+
1107
+ Install the optional dependency browser and restart PLSQLWKS:
1108
+
1109
+ ```bash
1110
+ plsqlwks plugin install plugins/packages/dependencies-walker-0.1.0.plwgn
1111
+ ```
1112
+
1113
+ Choose **Alt-O -> Database -> Dependencies walker** and enter an object name,
1114
+ optionally qualified by schema. Expand with Enter/Right, collapse with Left,
1115
+ and use **D** (Depends on) or **U** (Used by) to follow the selected object in
1116
+ either direction. Backspace restores the previous tree; **R** refreshes and
1117
+ Esc closes. Packages combine specification/body relationships with labels.
1118
+
1119
+ The walker reads only visible Oracle-recorded dependencies, loads branches
1120
+ on demand, marks cycles, and leaves database-link references unexpanded.
1121
+ Dynamic SQL and foreign-key graphs are outside this view. See the
1122
+ [plugin catalog](https://gitlab.com/unununu/plsqlwks/-/blob/main/doc/PLUGIN_CATALOG.md#dependencies-walker)
1123
+ for all controls and installation details. No additional runtime dependency is
1124
+ required.
1125
+
949
1126
  ### Maintained csv2oratab integration
950
1127
 
951
1128
  The maintained `csv2oratab-0.1.0.plwgn` catalog package adds **Alt-O -> Data ->
@@ -189,6 +189,8 @@ class PluginContext(Protocol):
189
189
  def get_suggested_table(self) -> str: ...
190
190
  def start_result_export(self, request: ResultExportRequest) -> None: ...
191
191
  def start_code_generation(self, request: CodeGenerationRequest) -> None: ...
192
+ def start_dependency_walk(self) -> None: ...
193
+ def start_sqlplus(self, executable: str = "sqlplus") -> None: ...
192
194
  ```
193
195
 
194
196
  - `results_dir` is the configured result-file directory.
@@ -216,6 +218,12 @@ class PluginContext(Protocol):
216
218
  default and must still be validated through a host-managed request.
217
219
  - `start_result_export()` and `start_code_generation()` transfer work to the
218
220
  workflows below.
221
+ - `start_dependency_walk()` opens the host-managed dependency walker described
222
+ below. It takes no database objects or callbacks and returns immediately after
223
+ the initial object prompt, before asynchronous metadata work completes.
224
+ - `start_sqlplus(executable="sqlplus")` runs the host-managed interactive
225
+ SQL*Plus launcher described below. It returns after SQL*Plus exits and the
226
+ user presses a key to return to PLSQLWKS.
219
227
 
220
228
  Context properties and synchronous UI methods belong to the handler/UI thread.
221
229
  Do not call a saved context from an export writer or another plugin-created
@@ -524,6 +532,27 @@ def generate_select(context: PluginContext) -> None:
524
532
  ordinary exceptions are also reported through the plugin error UI. The exact
525
533
  wording of either presentation is not part of the API.
526
534
 
535
+ ## Dependency walking
536
+
537
+ `PluginContext.start_dependency_walk()` is an additive API v1 capability. The
538
+ host prompts for `OBJECT` or `SCHEMA.OBJECT`, suggests the selected schema-browser
539
+ object when available, resolves quoted identifiers and ambiguous types, then
540
+ opens a keyboard-driven dependency tree. Metadata reads use the initiating
541
+ tab's session and its normal worker/cancellation mechanism. Closing the walker
542
+ preserves the editor, result table, and output; no transaction is committed or
543
+ rolled back by the walker.
544
+
545
+ The tree follows visible `ALL_DEPENDENCIES` relationships in either direction.
546
+ Package specifications and bodies share a node with labeled edges. Expansion
547
+ loads one page at a time; cycles and remote references are leaves. The host
548
+ does not expose SQL, cursors, or a general-purpose job or UI interface to the
549
+ plugin. See the [catalog guide](PLUGIN_CATALOG.md#dependencies-walker) for keys,
550
+ visibility limits, and installation.
551
+
552
+ A plugin using this added public method may check whether it is callable and
553
+ report an upgrade requirement on older hosts. Existing API v1 plugins need no
554
+ changes.
555
+
527
556
  ## Managed packages and lifecycle
528
557
 
529
558
  Managed packages provide offline distribution for the same API-v1 factories.
@@ -619,17 +648,52 @@ access process data, perform I/O, and otherwise act with the user's authority.
619
648
  Review source and verify provenance before installing, and keep secrets out of
620
649
  plugin settings when code from another publisher can run in the same process.
621
650
 
651
+ ## SQL*Plus launching
652
+
653
+ `PluginContext.start_sqlplus(executable="sqlplus")` is an additive API v1
654
+ capability. The host requires a connected active session and no database
655
+ operation running in any tab. It reads the loaded configuration's username,
656
+ DSN, and password file, then launches the selected executable directly, without
657
+ a shell, in the workspace directory. An executable name is resolved through
658
+ `PATH`; a path selects a particular client. Credentials never enter the plugin
659
+ context or process arguments. A private temporary symlink gives SQL*Plus access
660
+ to a startup script through an inherited pipe; no password-bearing regular
661
+ file is created.
662
+
663
+ The host suspends curses and keyboard reporting, leaves SQL*Plus in control of
664
+ the terminal, and handles Ctrl+C without closing PLSQLWKS. After SQL*Plus exits,
665
+ including on login failure, its output remains visible until a fresh keypress
666
+ (no Enter needed). Terminal modes and the workspace display are restored on
667
+ exit and failure. Pre-launch errors use the normal host UI.
668
+
669
+ The child has an independent database session. Host transactions, results,
670
+ and editor state are preserved; host read-only, autocommit, and other session
671
+ settings are not applied to SQL*Plus. Launching is allowed in read-only mode.
672
+ The password file is reread each time, preserving spaces and removing only
673
+ final CR/LF, as with normal host connection setup. This is not a transfer of
674
+ the existing Oracle connection or its session state.
675
+
676
+ This capability requires a POSIX terminal, `/dev/fd`, and an installed SQL*Plus
677
+ client. Connection fields must be nonempty, contain no control characters or
678
+ embedded double quotes, and produce a CONNECT line of at most 2400 UTF-8
679
+ bytes (also subject to the platform pipe limit). Explicitly quoted usernames
680
+ are supported. Unsupported values are rejected without displaying credentials.
681
+ Older hosts can be detected with `getattr(context, "start_sqlplus", None)`;
682
+ the maintained plugin reports an upgrade requirement when unavailable.
683
+
622
684
  ## Compatibility boundary
623
685
 
624
686
  API v1 supports command registration, immutable loaded-result snapshots,
625
687
  plugin-scoped string settings, host-managed export, and metadata-only current-
626
- schema code generation. It does not promise internal module names, status
688
+ schema code generation, host-managed dependency walking, and SQL*Plus launching.
689
+ It does not promise internal module names, status
627
690
  wording, curses layout, database/session objects, mutable grid state, event
628
691
  hooks, lifecycle callbacks, arbitrary shortcuts, arbitrary queries or jobs,
629
692
  workspace-local Python-file discovery, or hot reload.
630
693
 
631
- Authors should use feature checks only for their own optional dependencies and
632
- must not probe host internals to extend this surface. A future incompatible
694
+ Authors may check their own optional dependencies and explicitly documented
695
+ additive public capabilities; they must not probe host internals to extend this
696
+ surface. A future incompatible
633
697
  contract requires a different `PLUGIN_API_VERSION`; factories and managed
634
698
  manifests with a nonmatching version are rejected instead of being loaded
635
699
  partially.
@@ -57,22 +57,42 @@ zone of `TIMESTAMP WITH TIME ZONE` and `TIMESTAMP WITH LOCAL TIME ZONE` values,
57
57
  and it truncates precision beyond Python microseconds. Returning the resulting
58
58
  naive datetime would falsely imply a lossless value.
59
59
 
60
- For that reason, non-null zoned timestamp cells are read-only and use these
61
- fail-safe display and export values:
60
+ For ordinary `SELECT` and `WITH` queries, PLSQLWKS describes the result without
61
+ executing it and formats zoned columns on Oracle before fetching them. The grid,
62
+ cell viewer, clipboard, and exports receive the same readable strings:
63
+
64
+ - `2026-01-17 10:11:12.123456789 GMT+05:45`
65
+ - `2026-07-17 10:11:12 GMT+02:00 [EUROPE/PRAGUE]`
66
+
67
+ Significant fractional digits are preserved through nanosecond precision;
68
+ trailing zeroes are omitted. `TIMESTAMP WITH TIME ZONE` retains its stored
69
+ numeric offset or named region, including the offset at that date.
70
+ `TIMESTAMP WITH LOCAL TIME ZONE` follows `SESSIONTIMEZONE` captured when the
71
+ query starts, including when later pages are fetched after a session-zone change.
72
+ Original headings, bind values, ordering, row limits, and timestamp metadata
73
+ are preserved. Zoned cells remain read-only; neighboring editable columns are
74
+ unaffected. Plain `DATE` and `TIMESTAMP` behavior is unchanged.
75
+
76
+ The projection is parsed before executing the user query, which executes once.
77
+ Special forms such as `SELECT FOR UPDATE`, inline `WITH FUNCTION/PROCEDURE`, and
78
+ results containing LONG, REF CURSOR, or object columns use the existing native
79
+ fetch path. If Oracle cannot describe a bound expression without its values,
80
+ or rejects the projection's syntax or types, the original query runs instead.
81
+ Non-null zoned cells on this fallback path retain a warning
82
+ and these fail-safe display/export values:
62
83
 
63
84
  - `<TIMESTAMP WITH TIME ZONE: lossless Thin-mode fetch unavailable; use TO_CHAR>`
64
85
  - `<TIMESTAMP WITH LOCAL TIME ZONE: lossless Thin-mode fetch unavailable; use TO_CHAR>`
65
86
 
66
- The result also carries a warning. Select a lossless companion string explicitly
67
- when exact data is required, for example:
87
+ Named-zone values on that native fallback path can still raise Thin-mode
88
+ `DPY-3022`. Select a lossless companion string explicitly for these query forms:
68
89
 
69
90
  ```sql
70
- to_char(zoned_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF9 TZH:TZM')
91
+ to_char(zoned_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF9 TZH:TZM TZR')
71
92
  ```
72
93
 
73
94
  For a local-time-zone column, first cast it at the required precision to
74
95
  `TIMESTAMP(9) WITH TIME ZONE`; its rendered value follows `SESSIONTIMEZONE`.
75
- Named-zone timestamp fetches remain an explicit Thin-mode limitation.
76
96
 
77
97
  ### Experimental connection matrices
78
98
 
@@ -94,11 +114,10 @@ compulsory on protected pipelines and independently meeting the same ten-run,
94
114
  30-day evidence rule.
95
115
 
96
116
  The schema browser and metadata completion deliberately enumerate the current
97
- login schema. Qualified cross-schema SQL is covered by the DML-only and
98
- read-only profiles, but it does not add cross-schema objects to the browser.
99
- ROWID-backed grid editing and insertion also remain limited to one base table
100
- in the current schema. Exact quoted and Unicode table/column names are covered;
101
- qualified cross-schema results are viewable but not grid-editable.
117
+ login schema. The mandatory matrix does not claim DML-only, read-only, or
118
+ cross-schema UI behavior. ROWID-backed grid editing and insertion remain
119
+ limited to one base table in the current schema. Exact quoted and Unicode
120
+ table/column names are covered.
102
121
 
103
122
  ## Fail-closed safety gate
104
123
 
@@ -122,7 +141,7 @@ preflight performs all of these checks:
122
141
  assigned to each distinct account below; restricted schemas own no objects,
123
142
  every grant option is `NO`, and DBA,
124
143
  user-administration, `ANY`, unlimited-tablespace, and public mutation paths
125
- are rejected;
144
+ on non-Oracle-maintained schemas are rejected;
126
145
  - on 26ai, both effective and directly received schema privileges are empty.
127
146
  - the developer's effective `CONNECT_TIME` and `IDLE_TIME` profile limits are
128
147
  both `UNLIMITED`, so they cannot terminate and roll back the guard session.
@@ -160,8 +179,8 @@ what rejects DML and DDL.
160
179
 
161
180
  When profile names share an Oracle account, the harness validates that account
162
181
  against the strongest assigned contract (`developer`, then DML-only, then
163
- read-only). Tests that require a weaker database privilege boundary are skipped
164
- for that aliased profile because one Oracle session user cannot simultaneously
182
+ read-only). The live suite does not attempt a weaker database privilege boundary
183
+ for an aliased profile because one Oracle session user cannot simultaneously
165
184
  have and lack the same privilege. Endpoint, identity, version, direct-grant,
166
185
  guard-token, and guard-lock checks remain active. A one-account run therefore
167
186
  provides functional compatibility coverage, but it does not claim independent
@@ -202,8 +221,7 @@ For an account assigned to multiple profiles, provision the strongest of its
202
221
  contracts in this order: developer, DML-only, read-only. In the common
203
222
  single-license setup, all three variables name `<DEV_USER>`, all three password
204
223
  file variables may name the same private file, and only the developer contract
205
- is provisioned. The restricted-profile enforcement tests are then reported as
206
- skipped rather than misrepresented as tested.
224
+ is provisioned. The run does not claim restricted-profile enforcement coverage.
207
225
 
208
226
  The effective rows from `SESSION_PRIVS` must be exactly:
209
227
 
@@ -225,7 +243,9 @@ by distinct restricted accounts; no grant is made to the owner itself, and a
225
243
  shared DML/read-only account receives the stronger DML grant set once. The
226
244
  developer must have no outgoing column grants, no grant on the guard table, and
227
245
  no grant to `PUBLIC`. The preflight also rejects any effective public
228
- table/column mutation privilege visible to a profile.
246
+ table/column mutation privilege visible to a profile on a non-Oracle-maintained
247
+ schema. Oracle-supplied grants on owners reported by `ALL_USERS` with
248
+ `ORACLE_MAINTAINED = 'Y'` are treated as part of the database baseline.
229
249
 
230
250
  Assign the developer a dedicated profile whose `CONNECT_TIME` and `IDLE_TIME`
231
251
  are both `UNLIMITED`; the preflight verifies the effective values through
@@ -264,6 +284,15 @@ grant select on sys.v_$sql_plan_statistics_all to <DEV_USER>;
264
284
  grant select on sys.v_$session to <DEV_USER>;
265
285
  ```
266
286
 
287
+ Oracle grants `INHERIT PRIVILEGES` on a newly created user to `PUBLIC` by
288
+ default. The matrix outgoing-grant contract intentionally rejects that path.
289
+ As the provisioning DBA, run the following once for each distinct developer,
290
+ DML-only, and read-only account (only once when profiles share an account):
291
+
292
+ ```sql
293
+ revoke inherit privileges on user <PROFILE_USER> from public;
294
+ ```
295
+
267
296
  These are exact allowlists, not minimums. An additional direct system or object
268
297
  grant, an admin/grant option, or any received role makes preflight fail.
269
298
 
@@ -159,6 +159,24 @@ and reported as a startup warning rather than preventing PLSQLWKS from
159
159
  starting. An ordinary exception raised by a command is reported through the UI
160
160
  instead of terminating the application.
161
161
 
162
+ ## SQL*Plus launcher package
163
+
164
+ `sqlplus-0.1.0.plwgn` adds **Database -> Open SQL*Plus** through the public
165
+ `PluginContext.start_sqlplus()` capability. The host supplies the connection
166
+ credentials, suspends the terminal UI, and waits for a fresh keypress after
167
+ SQL*Plus exits before restoring PLSQLWKS. SQL*Plus has its own session and
168
+ transaction settings, including when launched from a read-only host. Install
169
+ and configuration instructions are in the [catalog](PLUGIN_CATALOG.md#sqlplus-launcher).
170
+
171
+ ## Dependencies walker package
172
+
173
+ `dependencies-walker-0.1.0.plwgn` adds **Database -> Dependencies walker** through
174
+ the public `PluginContext.start_dependency_walk()` capability. The host owns
175
+ the lazy forward/reverse tree, metadata queries, cancellation, and keyboard UI.
176
+ The plugin does not receive a connection or import private UI/database modules.
177
+ It needs no dependency extra. See the [catalog instructions](PLUGIN_CATALOG.md#dependencies-walker)
178
+ for installation, controls, package grouping, and visibility limits.
179
+
162
180
  ## Maintained csv2oratab package
163
181
 
164
182
  The catalog's `csv2oratab-0.1.0.plwgn` package registers **Alt-O -> Data ->