plsqlwks 0.1.9.0__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 (125) hide show
  1. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/PKG-INFO +178 -1
  2. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/README.md +177 -0
  3. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/doc/API.md +67 -3
  4. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/doc/COMPATIBILITY.md +96 -33
  5. {plsqlwks-0.1.9.0 → 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.0 → 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.0 → plsqlwks-0.2.0}/plsqlwks/db/execution.py +33 -3
  10. {plsqlwks-0.1.9.0 → 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.0 → plsqlwks-0.2.0}/plsqlwks/plugins/api.py +13 -0
  13. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/app.py +49 -2
  14. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/buffer.py +6 -0
  15. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/commands.py +1 -0
  16. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/constants.py +79 -8
  17. {plsqlwks-0.1.9.0 → 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.0 → plsqlwks-0.2.0}/plsqlwks/ui/display.py +34 -0
  20. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/errors.py +1 -1
  21. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/key_reader.py +51 -7
  22. {plsqlwks-0.1.9.0 → 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.0 → plsqlwks-0.2.0}/plsqlwks/ui/plugin_host.py +18 -0
  25. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/renderer.py +50 -22
  26. {plsqlwks-0.1.9.0 → 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.0 → plsqlwks-0.2.0}/plsqlwks/ui/state.py +2 -0
  29. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/viewport.py +28 -4
  30. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks.egg-info/SOURCES.txt +16 -2
  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.0/MANIFEST.in +0 -116
  42. plsqlwks-0.1.9.0/doc/PLUGIN_CATALOG.md +0 -100
  43. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/doc/ARCHITECTURE.md +0 -0
  44. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/doc/QUICKSTART.html +0 -0
  45. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/doc/QUICKSTART.md +0 -0
  46. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/license.txt +0 -0
  47. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/__main__.py +0 -0
  48. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/cli.py +0 -0
  49. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/config/__init__.py +0 -0
  50. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/config/loader.py +0 -0
  51. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/config/models.py +0 -0
  52. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/config/paths.py +0 -0
  53. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/config/session.py +0 -0
  54. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/config/settings.py +0 -0
  55. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/db/__init__.py +0 -0
  56. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/db/editing.py +0 -0
  57. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/db/explain.py +0 -0
  58. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/db/health.py +0 -0
  59. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/db/identifiers.py +0 -0
  60. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/db/metadata.py +0 -0
  61. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/db/session.py +0 -0
  62. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/db/sql_analysis.py +0 -0
  63. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/db/transactions.py +0 -0
  64. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/exporting.py +0 -0
  65. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/plugins/__init__.py +0 -0
  66. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/plugins/loader.py +0 -0
  67. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/plugins/management.py +0 -0
  68. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/sqlbinds.py +0 -0
  69. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/sqlsplit.py +0 -0
  70. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/__init__.py +0 -0
  71. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/application_controller.py +0 -0
  72. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/browser.py +0 -0
  73. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/catalog.py +0 -0
  74. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/clipboard.py +0 -0
  75. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/code_generation.py +0 -0
  76. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/command_dispatcher.py +0 -0
  77. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/completion.py +0 -0
  78. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/db_session.py +0 -0
  79. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/db_worker.py +0 -0
  80. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/dialogs.py +0 -0
  81. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/documents.py +0 -0
  82. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/editor_controller.py +0 -0
  83. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/help.py +0 -0
  84. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/input_controller.py +0 -0
  85. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/menu.py +0 -0
  86. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/ports.py +0 -0
  87. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/query_controller.py +0 -0
  88. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/result_export.py +0 -0
  89. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/result_presenter.py +0 -0
  90. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/results.py +0 -0
  91. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/sql.py +0 -0
  92. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/ui/syntax.py +0 -0
  93. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plsqlwks/workspace.py +0 -0
  94. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/csv-export/install.plw +0 -0
  95. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/csv-export/payload/__init__.py +0 -0
  96. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/csv-export/payload/plugin.py +0 -0
  97. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/csv-export/payload/support.py +0 -0
  98. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/csv-export/payload/writer.py +0 -0
  99. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/csv2oratab/install.plw +0 -0
  100. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/csv2oratab/payload/__init__.py +0 -0
  101. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/csv2oratab/payload/csv2oratab.py +0 -0
  102. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/csv2oratab/payload/plugin.py +0 -0
  103. {plsqlwks-0.1.9.0/plugins/html-export → plsqlwks-0.2.0/plugins/dependencies-walker}/payload/__init__.py +0 -0
  104. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/html-export/install.plw +0 -0
  105. {plsqlwks-0.1.9.0/plugins/xlsx-export → plsqlwks-0.2.0/plugins/html-export}/payload/__init__.py +0 -0
  106. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/html-export/payload/html_exporting.py +0 -0
  107. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/html-export/payload/plugin.py +0 -0
  108. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/html-export/payload/support.py +0 -0
  109. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/html-export/payload/writer.py +0 -0
  110. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/packages/csv-export-1.0.0.plwgn +0 -0
  111. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/packages/csv2oratab-0.1.0.plwgn +0 -0
  112. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/packages/html-export-1.0.0.plwgn +0 -0
  113. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/packages/xlsx-export-1.0.0.plwgn +0 -0
  114. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/xlsx-export/install.plw +0 -0
  115. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/xlsx-export/payload/plugin.py +0 -0
  116. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/xlsx-export/payload/support.py +0 -0
  117. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/plugins/xlsx-export/payload/xlsx_exporting.py +0 -0
  118. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/pyproject.toml +0 -0
  119. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/pytest.ini +0 -0
  120. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/rchar.py +0 -0
  121. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/requirements.txt +0 -0
  122. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/setup.cfg +0 -0
  123. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/tests/conftest.py +0 -0
  124. {plsqlwks-0.1.9.0 → plsqlwks-0.2.0}/tests/fixtures/config_exports.txt +0 -0
  125. {plsqlwks-0.1.9.0 → 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.0
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.