This is an automated email from the ASF dual-hosted git repository.

smiklosovic pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 61333964f4 Add HISTORY command for CQLSH
61333964f4 is described below

commit 61333964f42e27ec78fec5b4ec25d9313dfc4eee
Author: Brad Schoening <[email protected]>
AuthorDate: Fri May 19 13:52:33 2023 -0400

    Add HISTORY command for CQLSH
    
    patch by Brad Schoening; reviewed by Stefan Miklosovic and Brandon Williams 
for CASSANDRA-15046
---
 CHANGES.txt                                        |  1 +
 .../cassandra/pages/managing/tools/cqlsh.adoc      | 14 +++++
 pylib/cqlshlib/cqlshhandling.py                    | 10 +++-
 pylib/cqlshlib/cqlshmain.py                        | 65 ++++++++++++++--------
 pylib/cqlshlib/test/test_cqlsh_completion.py       |  4 +-
 5 files changed, 69 insertions(+), 25 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index a5a6dffab7..12741fad68 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 5.0
+ * Add HISTORY command for CQLSH (CASSANDRA-15046)
  * Fix sstable formats configuration (CASSANDRA-18441)
  * Add guardrail to bound timestamps (CASSANDRA-18352)
  * Add keyspace_name column to system_views.clients (CASSANDRA-18525)
diff --git a/doc/modules/cassandra/pages/managing/tools/cqlsh.adoc 
b/doc/modules/cassandra/pages/managing/tools/cqlsh.adoc
index afafa1d875..b5209e9b4c 100644
--- a/doc/modules/cassandra/pages/managing/tools/cqlsh.adoc
+++ b/doc/modules/cassandra/pages/managing/tools/cqlsh.adoc
@@ -266,6 +266,20 @@ Gives information about cqlsh commands. To see available 
topics, enter
 `HELP <topic>`. Also see the `--browser` argument for controlling what
 browser is used to display help.
 
+=== `HISTORY`
+
+Prints to the screen the last `n` cqlsh commands executed on the server.
+The number of lines defaults to 50 if not specified. `n` is set for
+the current CQL session so if you set it e.g. to `10`, from that point
+there will be at most 10 last commands returned to you.
+
+`Usage`:
+
+[source,none]
+----
+HISTORY <n>
+----
+
 === `TRACING`
 
 Enables or disables tracing for queries. When tracing is enabled, once a
diff --git a/pylib/cqlshlib/cqlshhandling.py b/pylib/cqlshlib/cqlshhandling.py
index 57ec28b763..e6a121fd80 100644
--- a/pylib/cqlshlib/cqlshhandling.py
+++ b/pylib/cqlshlib/cqlshhandling.py
@@ -37,7 +37,8 @@ my_commands_ending_with_newline = (
     'exit',
     'quit',
     'clear',
-    'cls'
+    'cls',
+    'history'
 )
 
 cqlsh_syntax_completers = []
@@ -73,6 +74,7 @@ cqlsh_special_cmd_command_syntax_rules = r'''
                    | <exitCommand>
                    | <pagingCommand>
                    | <clearCommand>
+                   | <historyCommand>
                    ;
 '''
 
@@ -207,6 +209,11 @@ cqlsh_clear_cmd_syntax_rules = r'''
                  ;
 '''
 
+cqlsh_history_cmd_syntax_rules = r'''
+<historyCommand> ::= "history" (n=<wholenumber>)?
+                    ;
+'''
+
 cqlsh_question_mark = r'''
 <qmark> ::= "?" ;
 '''
@@ -232,6 +239,7 @@ cqlsh_extra_syntax_rules = cqlsh_cmd_syntax_rules + \
     cqlsh_login_cmd_syntax_rules + \
     cqlsh_exit_cmd_syntax_rules + \
     cqlsh_clear_cmd_syntax_rules + \
+    cqlsh_history_cmd_syntax_rules + \
     cqlsh_question_mark
 
 
diff --git a/pylib/cqlshlib/cqlshmain.py b/pylib/cqlshlib/cqlshmain.py
index c550ed84c6..7cffd68e0e 100755
--- a/pylib/cqlshlib/cqlshmain.py
+++ b/pylib/cqlshlib/cqlshmain.py
@@ -1836,6 +1836,26 @@ class Shell(cmd.Cmd):
             else:
                 self.printerr("*** No help on %s" % (t,))
 
+    def do_history(self, parsed):
+        """
+        HISTORY [cqlsh only]
+
+           Displays the most recent commands executed in cqlsh
+
+        HISTORY (<n>)
+
+           If n is specified, the history display length is set to n for this 
session
+        """
+
+        history_length = readline.get_current_history_length()
+
+        n = parsed.get_binding('n')
+        if (n is not None):
+            self.max_history_length_shown = int(n)
+
+        for index in range(max(1, history_length - 
self.max_history_length_shown), history_length):
+            print(readline.get_history_item(index))
+
     def do_unicode(self, parsed):
         """
         Textual input/output
@@ -1913,6 +1933,27 @@ class Shell(cmd.Cmd):
             self.cov.save()
             self.cov = None
 
+    def init_history(self):
+        if readline is not None:
+            try:
+                readline.read_history_file(HISTORY)
+            except IOError:
+                pass
+            delims = readline.get_completer_delims()
+            delims.replace("'", "")
+            delims += '.'
+            readline.set_completer_delims(delims)
+
+            # configure length of history shown
+            self.max_history_length_shown = 50
+
+    def save_history(self):
+        if readline is not None:
+            try:
+                readline.write_history_file(HISTORY)
+            except IOError:
+                pass
+
 
 class SwitchCommand(object):
     command = None
@@ -2193,26 +2234,6 @@ def setup_docspath(path):
         CASSANDRA_CQL_HTML = CASSANDRA_CQL_HTML_FALLBACK
 
 
-def init_history():
-    if readline is not None:
-        try:
-            readline.read_history_file(HISTORY)
-        except IOError:
-            pass
-        delims = readline.get_completer_delims()
-        delims.replace("'", "")
-        delims += '.'
-        readline.set_completer_delims(delims)
-
-
-def save_history():
-    if readline is not None:
-        try:
-            readline.write_history_file(HISTORY)
-        except IOError:
-            pass
-
-
 def insert_driver_hooks():
 
     class DateOverFlowWarning(RuntimeWarning):
@@ -2245,7 +2266,6 @@ def main(cmdline, pkgpath):
     setup_docspath(pkgpath)
     setup_cqlruleset(options.cqlmodule)
     setup_cqldocs(options.cqlmodule)
-    init_history()
     csv.field_size_limit(options.field_size_limit)
 
     if options.file is None:
@@ -2343,8 +2363,9 @@ def main(cmdline, pkgpath):
 
         signal.signal(signal.SIGHUP, handle_sighup)
 
+    shell.init_history()
     shell.cmdloop()
-    save_history()
+    shell.save_history()
 
     if shell.batch_mode and shell.statement_error:
         sys.exit(2)
diff --git a/pylib/cqlshlib/test/test_cqlsh_completion.py 
b/pylib/cqlshlib/test/test_cqlsh_completion.py
index 61a95b9389..b0f0b87a1c 100644
--- a/pylib/cqlshlib/test/test_cqlsh_completion.py
+++ b/pylib/cqlshlib/test/test_cqlsh_completion.py
@@ -164,7 +164,7 @@ class TestCqlshCompletion(CqlshCompletionCase):
                                          'COPY', 'CREATE', 'DEBUG', 'DELETE', 
'DESC', 'DESCRIBE',
                                          'DROP', 'GRANT', 'HELP', 'INSERT', 
'LIST', 'LOGIN', 'PAGING', 'REVOKE',
                                          'SELECT', 'SHOW', 'SOURCE', 
'TRACING', 'EXPAND', 'SERIAL', 'TRUNCATE',
-                                         'UPDATE', 'USE', 'exit', 'quit', 
'CLEAR', 'CLS'))
+                                         'UPDATE', 'USE', 'exit', 'quit', 
'CLEAR', 'CLS', 'history'))
 
     def test_complete_command_words(self):
         self.trycompletions('alt', '\b\b\bALTER ')
@@ -250,7 +250,7 @@ class TestCqlshCompletion(CqlshCompletionCase):
                      'CREATE', 'DEBUG', 'DELETE', 'DESC', 'DESCRIBE', 'DROP',
                      'EXPAND', 'GRANT', 'HELP', 'INSERT', 'LIST', 'LOGIN', 
'PAGING',
                      'REVOKE', 'SELECT', 'SHOW', 'SOURCE', 'SERIAL', 'TRACING',
-                     'TRUNCATE', 'UPDATE', 'USE', 'exit', 'quit',
+                     'TRUNCATE', 'UPDATE', 'USE', 'exit', 'history', 'quit',
                      'CLEAR', 'CLS'])
 
         self.trycompletions(


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to