This is an automated email from the ASF dual-hosted git repository.
brandonwilliams 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 abe09cff34 Clean up obsolete functions and simplify cql_version
handling in cqlsh
abe09cff34 is described below
commit abe09cff346c6f9cb5bc6dbd8e873364c05e026a
Author: Brad Schoening <[email protected]>
AuthorDate: Wed Aug 30 23:07:48 2023 -0400
Clean up obsolete functions and simplify cql_version handling in cqlsh
Patch by Brad Schoening; reviewed by brandonwilliams and edimitrova for
CASSANDRA-18787
---
CHANGES.txt | 1 +
conf/cqlshrc.sample | 7 ---
pylib/cqlshlib/cqlshmain.py | 85 ++++++++++++-------------------------
pylib/cqlshlib/formatting.py | 19 ++++-----
pylib/cqlshlib/test/test_unicode.py | 4 +-
pylib/cqlshlib/util.py | 22 ----------
6 files changed, 40 insertions(+), 98 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index 1ef6464363..18b8622715 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
5.1
+ * Clean up obsolete functions and simplify cql_version handling in cqlsh
(CASSANDRA-18787)
Merged from 5.0:
* Fix Depends and Build-Depends for Java for Debian packages (CASSANDRA-18809)
* Update command line flags --add-exports and --add-opens for JDK17
(CASSANDRA-18439)
diff --git a/conf/cqlshrc.sample b/conf/cqlshrc.sample
index 56011f4927..c396edfed9 100644
--- a/conf/cqlshrc.sample
+++ b/conf/cqlshrc.sample
@@ -99,18 +99,11 @@ port = 9042
-[csv]
-;; The size limit for parsed fields
-; field_size_limit = 131072
-
-
-
[tracing]
;; The max number of seconds to wait for a trace to complete
; max_trace_wait = 10.0
-
;[ssl]
; certfile = ~/keys/cassandra.cert
diff --git a/pylib/cqlshlib/cqlshmain.py b/pylib/cqlshlib/cqlshmain.py
index 8161885ffa..84be503668 100755
--- a/pylib/cqlshlib/cqlshmain.py
+++ b/pylib/cqlshlib/cqlshmain.py
@@ -17,7 +17,6 @@
import cmd
import codecs
import configparser
-import csv
import getpass
import argparse
import os
@@ -277,22 +276,10 @@ class DecodeError(Exception):
return '<%s %s>' % (self.__class__.__name__, self.message())
-def maybe_ensure_text(val):
- return str(val) if val else val
-
-
class FormatError(DecodeError):
verb = 'format'
-def full_cql_version(ver):
- while ver.count('.') < 2:
- ver += '.0'
- ver_parts = ver.split('-', 1) + ['']
- vertuple = tuple(list(map(int, ver_parts[0].split('.'))) + [ver_parts[1]])
- return ver, vertuple
-
-
def format_value(val, cqltype, encoding, addcolor=False, date_time_format=None,
float_precision=None, colormap=None, nullval=None):
if isinstance(val, DecodeError):
@@ -412,7 +399,7 @@ class Shell(cmd.Cmd):
self.session.row_factory = ordered_dict_factory
self.session.default_consistency_level = cassandra.ConsistencyLevel.ONE
self.get_connection_versions()
- self.set_expanded_cql_version(self.connection_versions['cql'])
+ self.set_cql_version(self.connection_versions['cql'])
self.current_keyspace = keyspace
@@ -450,6 +437,13 @@ class Shell(cmd.Cmd):
self.single_statement = single_statement
self.is_subshell = is_subshell
+ self.cql_version = None
+ self.cql_version_str = None
+
+ # configure length of history shown
+ self.max_history_length_shown = 50
+ self.lastcmd = ""
+
def check_build_versions(self):
baseversion = self.connection_versions['build']
extra = baseversion.rfind('-')
@@ -462,13 +456,12 @@ class Shell(cmd.Cmd):
def batch_mode(self):
return not self.tty
- def set_expanded_cql_version(self, ver):
- ver, vertuple = full_cql_version(ver)
- self.cql_version = ver
- self.cql_ver_tuple = vertuple
-
- def cqlver_atleast(self, major, minor=0, patch=0):
- return self.cql_ver_tuple[:3] >= (major, minor, patch)
+ def set_cql_version(self, ver):
+ v = list(map(int, (ver.split("."))))
+ while (len(v) < 3):
+ v.append(0)
+ self.cql_version = tuple(v)
+ self.cql_version_str = ".".join(map(str, v))
def myformat_value(self, val, cqltype=None, **kwargs):
if isinstance(val, DecodeError):
@@ -510,12 +503,8 @@ class Shell(cmd.Cmd):
self.port))
def show_version(self):
- vers = self.connection_versions.copy()
- vers['shver'] = version
- # system.Versions['cql'] apparently does not reflect changes with
- # set_cql_version.
- vers['cql'] = self.cql_version
- print("[cqlsh %(shver)s | Cassandra %(build)s | CQL spec %(cql)s |
Native protocol v%(protocol)s]" % vers)
+ vers = self.connection_versions
+ print(f"[cqlsh {version} | Cassandra {vers['build']} | CQL spec
{self.cql_version_str} | Native protocol v{vers['protocol']}]")
def show_session(self, sessionid, partial_session=False):
print_trace_session(self, self.session, sessionid, partial_session)
@@ -1321,7 +1310,7 @@ class Shell(cmd.Cmd):
def describe_list(self, rows):
"""
- Print the output for all the DESCRIBE queries for element names (e.g
DESCRIBE TABLES, DESCRIBE FUNCTIONS ...)
+ Print the output for all the DESCRIBE queries for element names (e.g.
DESCRIBE TABLES, DESCRIBE FUNCTIONS ...)
"""
keyspace = None
names = list()
@@ -1348,7 +1337,7 @@ class Shell(cmd.Cmd):
def describe_element(self, rows):
"""
- Print the output for all the DESCRIBE queries where an element name as
been specified (e.g DESCRIBE TABLE, DESCRIBE INDEX ...)
+ Print the output for all the DESCRIBE queries where an element name as
been specified (e.g. DESCRIBE TABLE, DESCRIBE INDEX ...)
"""
for row in rows:
print('')
@@ -1359,7 +1348,7 @@ class Shell(cmd.Cmd):
"""
Print the output for a DESCRIBE CLUSTER query.
- If a specified keyspace was in use the returned ResultSet will
contains a 'range_ownership' column,
+ If a specified keyspace was in use the returned ResultSet will contain
a 'range_ownership' column,
otherwise not.
"""
for row in rows:
@@ -1957,9 +1946,6 @@ class Shell(cmd.Cmd):
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:
@@ -2057,8 +2043,7 @@ def should_use_color():
if int(stdout.strip()) < 8:
return False
except (OSError, ImportError, ValueError):
- # oh well, we tried. at least we know there's a $TERM and it's
- # not "dumb".
+ # at least it's a $TERM, and it's not "dumb".
pass
return True
@@ -2100,7 +2085,6 @@ def read_options(cmdlineargs, environment=os.environ):
DEFAULT_FLOAT_PRECISION)
argvalues.double_precision = option_with_default(configs.getint, 'ui',
'double_precision',
DEFAULT_DOUBLE_PRECISION)
- argvalues.field_size_limit = option_with_default(configs.getint, 'csv',
'field_size_limit', csv.field_size_limit())
argvalues.max_trace_wait = option_with_default(configs.getfloat,
'tracing', 'max_trace_wait',
DEFAULT_MAX_TRACE_WAIT)
argvalues.timezone = option_with_default(configs.get, 'ui', 'timezone',
None)
@@ -2166,15 +2150,12 @@ def read_options(cmdlineargs, environment=os.environ):
print("\nWarning: Using a password on the command line interface can
be insecure."
"\nRecommendation: use the credentials file to securely provide
the password.\n", file=sys.stderr)
- # Make sure some user values read from the command line are in unicode
- options.execute = maybe_ensure_text(options.execute)
- options.username = maybe_ensure_text(options.username)
- options.password = maybe_ensure_text(options.password)
- options.keyspace = maybe_ensure_text(options.keyspace)
-
hostname = option_with_default(configs.get, 'connection', 'hostname',
DEFAULT_HOST)
port = option_with_default(configs.get, 'connection', 'port', DEFAULT_PORT)
+ hostname = environment.get('CQLSH_HOST', hostname)
+ port = environment.get('CQLSH_PORT', port)
+
try:
options.connect_timeout = int(options.connect_timeout)
except ValueError:
@@ -2187,9 +2168,6 @@ def read_options(cmdlineargs, environment=os.environ):
parser.error('"%s" is not a valid request timeout.' %
(options.request_timeout,))
options.request_timeout = DEFAULT_REQUEST_TIMEOUT_SECONDS
- hostname = environment.get('CQLSH_HOST', hostname)
- port = environment.get('CQLSH_PORT', port)
-
if len(arguments) > 0:
hostname = arguments[0]
if len(arguments) > 1:
@@ -2209,12 +2187,6 @@ def read_options(cmdlineargs, environment=os.environ):
else:
options.color = should_use_color()
- if options.cqlversion is not None:
- options.cqlversion, cqlvertup = full_cql_version(options.cqlversion)
- if cqlvertup[0] < 3:
- parser.error('%r is not a supported CQL version.' %
options.cqlversion)
- options.cqlmodule = cql3handling
-
try:
port = int(port)
except ValueError:
@@ -2222,9 +2194,9 @@ def read_options(cmdlineargs, environment=os.environ):
return options, hostname, port
-def setup_cqlruleset(cqlmodule):
+def setup_cqlruleset():
global cqlruleset
- cqlruleset = cqlmodule.CqlRuleSet
+ cqlruleset = cql3handling.CqlRuleSet
cqlruleset.append_rules(cqlshhandling.cqlsh_extra_syntax_rules)
for rulename, termname, func in cqlshhandling.cqlsh_syntax_completers:
cqlruleset.completer_for(rulename, termname)(func)
@@ -2253,7 +2225,7 @@ def insert_driver_hooks():
pass
# Display milliseconds when datetime overflows (CASSANDRA-10625), E.g.,
the year 10000.
- # Native datetime types blow up outside of datetime.[MIN|MAX]_YEAR. We
will fall back to an int timestamp
+ # Native datetime types blow up outside datetime.[MIN|MAX]_YEAR. We will
fall back to an int timestamp
def deserialize_date_fallback_int(byts, protocol_version):
timestamp_ms = int64_unpack(byts)
try:
@@ -2277,8 +2249,7 @@ def main(cmdline, pkgpath):
(options, hostname, port) = read_options(cmdline)
setup_docspath(pkgpath)
- setup_cqlruleset(options.cqlmodule)
- csv.field_size_limit(options.field_size_limit)
+ setup_cqlruleset()
if options.file is None:
stdin = None
@@ -2331,7 +2302,7 @@ def main(cmdline, pkgpath):
except ImportError:
sys.stderr.write("Warning: Timezone defined and 'pytz' module
for timezone conversion not installed. Timestamps will be displayed in UTC
timezone.\n\n")
- # try auto-detect timezone if tzlocal is installed
+ # try to auto-detect timezone if tzlocal is installed
if not timezone:
try:
from tzlocal import get_localzone
diff --git a/pylib/cqlshlib/formatting.py b/pylib/cqlshlib/formatting.py
index 4eb36581c6..e384221f7f 100644
--- a/pylib/cqlshlib/formatting.py
+++ b/pylib/cqlshlib/formatting.py
@@ -27,10 +27,9 @@ from collections import defaultdict
from cassandra.cqltypes import EMPTY
from cassandra.util import datetime_from_timestamp
from .displaying import colorme, get_str, FormattedValue,
DEFAULT_VALUE_COLORS, NO_COLOR_MAP
-from .util import UTC
-unicode_controlchars_re = re.compile(r'[\x00-\x1f\x7f-\xa0]')
-controlchars_re = re.compile(r'[\x00-\x1f\x7f-\xff]')
+UNICODE_CONTROLCHARS_RE = re.compile(r'[\x00-\x1f\x7f-\xa0]')
+CONTROLCHARS_RE = re.compile(r'[\x00-\x1f\x7f-\xff]')
def _show_control_chars(match):
@@ -84,7 +83,7 @@ def format_by_type(val, cqltype, encoding, colormap=None,
addcolor=False,
def color_text(bval, colormap, displaywidth=None):
# note that here, we render natural backslashes as just backslashes,
# in the same color as surrounding text, when using color. When not
- # using color, we need to double up the backslashes so it's not
+ # using color, we need to double up the backslashes, so it's not
# ambiguous. This introduces the unique difficulty of having different
# display widths for the colored and non-colored versions. To avoid
# adding the smarts to handle that in to FormattedValue, we just
@@ -121,7 +120,7 @@ class DateTimeFormat:
class CqlType:
"""
A class for converting a string into a cql type name that can match a
formatter
- and a list of its sub-types, if any.
+ and a list of its subtypes, if any.
"""
pattern = re.compile('^([^<]*)<(.*)>$') # *<*>
@@ -135,8 +134,8 @@ class CqlType:
def get_n_sub_types(self, num):
"""
- Return the sub-types if the requested number matches the length of the
sub-types (tuples)
- or the first sub-type times the number requested if the length of the
sub-types is one (list, set),
+ Return the subtypes if the requested number matches the length of the
subtypes (tuples)
+ or the first subtype times the number requested if the length of the
subtypes is one (list, set),
otherwise raise an exception
"""
if len(self.sub_types) == num:
@@ -202,7 +201,7 @@ class CqlType:
def format_value_default(val, colormap, **_):
val = str(val)
escapedval = val.replace('\\', '\\\\')
- bval = controlchars_re.sub(_show_control_chars, escapedval)
+ bval = CONTROLCHARS_RE.sub(_show_control_chars, escapedval)
return bval if colormap is NO_COLOR_MAP else color_text(bval, colormap)
@@ -359,7 +358,7 @@ formatter_for('timestamp')(format_value_timestamp)
def strftime(time_format, seconds, microseconds=0, timezone=None):
ret_dt = datetime_from_timestamp(seconds) +
datetime.timedelta(microseconds=microseconds)
- ret_dt = ret_dt.replace(tzinfo=UTC())
+ ret_dt = ret_dt.replace(tzinfo=datetime.timezone.utc)
if timezone:
ret_dt = ret_dt.astimezone(timezone)
try:
@@ -475,7 +474,7 @@ def format_value_text(val, encoding, colormap, quote=False,
**_):
escapedval = val.replace('\\', '\\\\')
if quote:
escapedval = escapedval.replace("'", "''")
- escapedval = unicode_controlchars_re.sub(_show_control_chars, escapedval)
+ escapedval = UNICODE_CONTROLCHARS_RE.sub(_show_control_chars, escapedval)
bval = escapedval
if quote:
bval = "'{}'".format(bval)
diff --git a/pylib/cqlshlib/test/test_unicode.py
b/pylib/cqlshlib/test/test_unicode.py
index d24a78736e..9a2c7cc387 100644
--- a/pylib/cqlshlib/test/test_unicode.py
+++ b/pylib/cqlshlib/test/test_unicode.py
@@ -19,7 +19,7 @@ import os
from .basecase import BaseTestCase
from .cassconnect import (get_cassandra_connection, create_keyspace,
remove_db, testrun_cqlsh)
-from cqlshlib.formatting import unicode_controlchars_re
+from cqlshlib.formatting import UNICODE_CONTROLCHARS_RE
class TestCqlshUnicode(BaseTestCase):
@@ -77,4 +77,4 @@ class TestCqlshUnicode(BaseTestCase):
self.assertIn(v2, output)
def test_unicode_esc(self): # CASSANDRA-17617
- self.assertFalse(unicode_controlchars_re.match("01"))
+ self.assertFalse(UNICODE_CONTROLCHARS_RE.match("01"))
diff --git a/pylib/cqlshlib/util.py b/pylib/cqlshlib/util.py
index 144586aae0..8874be011e 100644
--- a/pylib/cqlshlib/util.py
+++ b/pylib/cqlshlib/util.py
@@ -22,7 +22,6 @@ import os
import errno
import stat
-from datetime import timedelta, tzinfo
from io import StringIO
try:
@@ -31,21 +30,6 @@ try:
except ImportError:
HAS_LINE_PROFILER = False
-ZERO = timedelta(0)
-
-
-class UTC(tzinfo):
- """UTC"""
-
- def utcoffset(self, dt):
- return ZERO
-
- def tzname(self, dt):
- return "UTC"
-
- def dst(self, dt):
- return ZERO
-
def split_list(items, pred):
"""
@@ -108,12 +92,6 @@ def identity(x):
return x
-def trim_if_present(s, prefix):
- if s.startswith(prefix):
- return s[len(prefix):]
- return s
-
-
def is_file_secure(filename):
try:
st = os.stat(filename)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]