Index: pkg/pip/setup_pip.py IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- pkg/pip/setup_pip.py (revision a000dc6f60cc4bcf527ecab264ca9261e5c8172f) +++ pkg/pip/setup_pip.py (date 1545392222000) @@ -96,7 +96,6 @@ "Flask-BabelEx==0.9.3" ], ":python_version<='2.7'": [ - "backports.csv==1.0.5", "importlib==1.0.3" ], ":python_version>='2.7'": [ Index: web/pgadmin/utils/csv.py IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- web/pgadmin/utils/csv.py (date 1545392222000) +++ web/pgadmin/utils/csv.py (date 1545392222000) @@ -0,0 +1,761 @@ +""" +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,2010 +2011, 2012, 2013, 2014, 2015, 2016, 2017 Python Software Foundation; All Rights +Reserved" are retained in Python alone or in any derivative version prepared by +Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. +""" + +############################################################################ +# Changes: +# Added new parameter in dialect 'replace_nulls_with' to compare it against +# the value to be quoted or not. +# Handle the null value if value is None or equal to +# 'replace_nulls_with' then it represents the null value, so no need to +# quote it. +############################################################################ + +from __future__ import unicode_literals, absolute_import + +__all__ = ["QUOTE_MINIMAL", "QUOTE_ALL", "QUOTE_NONNUMERIC", "QUOTE_NONE", + "Error", "Dialect", "__doc__", "excel", "excel_tab", + "field_size_limit", "reader", "writer", "register_dialect", + "get_dialect", "list_dialects", "unregister_dialect", + "__version__", "DictReader", "DictWriter"] + +import re +import numbers +from io import StringIO +from csv import ( + QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE, + __version__, __doc__, Error, field_size_limit, +) + +# Stuff needed from six +import sys +PY3 = sys.version_info[0] == 3 +if PY3: + string_types = str + text_type = str + binary_type = bytes + unichr = chr +else: + string_types = basestring + text_type = unicode + binary_type = str + + +class QuoteStrategy(object): + quoting = None + + def __init__(self, dialect): + if self.quoting is not None: + assert dialect.quoting == self.quoting + self.dialect = dialect + self.setup() + + escape_pattern_quoted = r'({quotechar})'.format( + quotechar=re.escape(self.dialect.quotechar or '"')) + escape_pattern_unquoted = r'([{specialchars}])'.format( + specialchars=re.escape(self.specialchars)) + + self.escape_re_quoted = re.compile(escape_pattern_quoted) + self.escape_re_unquoted = re.compile(escape_pattern_unquoted) + + def setup(self): + """Optional method for strategy-wide optimizations.""" + + def quoted(self, field=None, raw_field=None, only=None): + """Determine whether this field should be quoted.""" + raise NotImplementedError( + 'quoted must be implemented by a subclass') + + @property + def specialchars(self): + """The special characters that need to be escaped.""" + raise NotImplementedError( + 'specialchars must be implemented by a subclass') + + def escape_re(self, quoted=None): + if quoted: + return self.escape_re_quoted + return self.escape_re_unquoted + + def escapechar(self, quoted=None): + if quoted and self.dialect.doublequote: + return self.dialect.quotechar + return self.dialect.escapechar + + def prepare(self, raw_field, only=None): + field = text_type(raw_field if raw_field is not None else '') + quoted = self.quoted(field=field, raw_field=raw_field, only=only) + + escape_re = self.escape_re(quoted=quoted) + escapechar = self.escapechar(quoted=quoted) + + if escape_re.search(field): + escapechar = '\\\\' if escapechar == '\\' else escapechar + if not escapechar: + raise Error('No escapechar is set') + escape_replace = r'{escapechar}\1'.format(escapechar=escapechar) + field = escape_re.sub(escape_replace, field) + + if quoted: + field = '{quotechar}{field}{quotechar}'.format( + quotechar=self.dialect.quotechar, field=field) + + return field + + +class QuoteMinimalStrategy(QuoteStrategy): + quoting = QUOTE_MINIMAL + + def setup(self): + self.quoted_re = re.compile(r'[{specialchars}]'.format( + specialchars=re.escape(self.specialchars))) + + @property + def specialchars(self): + return ( + self.dialect.lineterminator + + self.dialect.quotechar + + self.dialect.delimiter + + (self.dialect.escapechar or '') + ) + + def quoted(self, field, only, **kwargs): + if field == self.dialect.quotechar and not self.dialect.doublequote: + # If the only character in the field is the quotechar, and + # doublequote is false, then just escape without outer quotes. + return False + return field == '' and only or bool(self.quoted_re.search(field)) + + +class QuoteAllStrategy(QuoteStrategy): + quoting = QUOTE_ALL + + @property + def specialchars(self): + return self.dialect.quotechar + + def quoted(self, raw_field, **kwargs): + # Handle the null value if raw_field is None or equal to + # replace_nulls_with then it represents the null value, so no need to + # quote it. + if raw_field is None or raw_field == self.dialect.replace_nulls_with: + return False + return True + + +class QuoteNonnumericStrategy(QuoteStrategy): + quoting = QUOTE_NONNUMERIC + + @property + def specialchars(self): + return ( + self.dialect.lineterminator + + self.dialect.quotechar + + self.dialect.delimiter + + (self.dialect.escapechar or '') + ) + + def quoted(self, raw_field, **kwargs): + # Handle the null value if raw_field is None or equal to + # replace_nulls_with then it represents the null value, so no need to + # quote it. + if raw_field is None or raw_field == self.dialect.replace_nulls_with: + return False + return not isinstance(raw_field, numbers.Number) + + +class QuoteNoneStrategy(QuoteStrategy): + quoting = QUOTE_NONE + + @property + def specialchars(self): + return ( + self.dialect.lineterminator + + (self.dialect.quotechar or '') + + self.dialect.delimiter + + (self.dialect.escapechar or '') + ) + + def quoted(self, field, only, **kwargs): + if field == '' and only: + raise Error('single empty field record must be quoted') + return False + + +class writer(object): + def __init__(self, fileobj, dialect='excel', **fmtparams): + if fileobj is None: + raise TypeError('fileobj must be file-like, not None') + + self.fileobj = fileobj + + if isinstance(dialect, text_type): + dialect = get_dialect(dialect) + + try: + self.dialect = Dialect.combine(dialect, fmtparams) + except Error as e: + raise TypeError(*e.args) + + strategies = { + QUOTE_MINIMAL: QuoteMinimalStrategy, + QUOTE_ALL: QuoteAllStrategy, + QUOTE_NONNUMERIC: QuoteNonnumericStrategy, + QUOTE_NONE: QuoteNoneStrategy, + } + self.strategy = strategies[self.dialect.quoting](self.dialect) + + def writerow(self, row): + if row is None: + raise Error('row must be an iterable') + + row = list(row) + only = len(row) == 1 + row = [self.strategy.prepare(field, only=only) for field in row] + + line = self.dialect.delimiter.join(row) + self.dialect.lineterminator + return self.fileobj.write(line) + + def writerows(self, rows): + for row in rows: + self.writerow(row) + + +START_RECORD = 0 +START_FIELD = 1 +ESCAPED_CHAR = 2 +IN_FIELD = 3 +IN_QUOTED_FIELD = 4 +ESCAPE_IN_QUOTED_FIELD = 5 +QUOTE_IN_QUOTED_FIELD = 6 +EAT_CRNL = 7 +AFTER_ESCAPED_CRNL = 8 + + +class reader(object): + def __init__(self, fileobj, dialect='excel', **fmtparams): + self.input_iter = iter(fileobj) + + if isinstance(dialect, text_type): + dialect = get_dialect(dialect) + + try: + self.dialect = Dialect.combine(dialect, fmtparams) + except Error as e: + raise TypeError(*e.args) + + self.fields = None + self.field = None + self.line_num = 0 + + def parse_reset(self): + self.fields = [] + self.field = [] + self.state = START_RECORD + self.numeric_field = False + + def parse_save_field(self): + field = ''.join(self.field) + self.field = [] + if self.numeric_field: + field = float(field) + self.numeric_field = False + self.fields.append(field) + + def parse_add_char(self, c): + if len(self.field) >= field_size_limit(): + raise Error('field size limit exceeded') + self.field.append(c) + + def parse_process_char(self, c): + switch = { + START_RECORD: self._parse_start_record, + START_FIELD: self._parse_start_field, + ESCAPED_CHAR: self._parse_escaped_char, + AFTER_ESCAPED_CRNL: self._parse_after_escaped_crnl, + IN_FIELD: self._parse_in_field, + IN_QUOTED_FIELD: self._parse_in_quoted_field, + ESCAPE_IN_QUOTED_FIELD: self._parse_escape_in_quoted_field, + QUOTE_IN_QUOTED_FIELD: self._parse_quote_in_quoted_field, + EAT_CRNL: self._parse_eat_crnl, + } + return switch[self.state](c) + + def _parse_start_record(self, c): + if c == '\0': + return + elif c == '\n' or c == '\r': + self.state = EAT_CRNL + return + + self.state = START_FIELD + return self._parse_start_field(c) + + def _parse_start_field(self, c): + if c == '\n' or c == '\r' or c == '\0': + self.parse_save_field() + self.state = START_RECORD if c == '\0' else EAT_CRNL + elif (c == self.dialect.quotechar and + self.dialect.quoting != QUOTE_NONE): + self.state = IN_QUOTED_FIELD + elif c == self.dialect.escapechar: + self.state = ESCAPED_CHAR + elif c == ' ' and self.dialect.skipinitialspace: + pass # Ignore space at start of field + elif c == self.dialect.delimiter: + # Save empty field + self.parse_save_field() + else: + # Begin new unquoted field + if self.dialect.quoting == QUOTE_NONNUMERIC: + self.numeric_field = True + self.parse_add_char(c) + self.state = IN_FIELD + + def _parse_escaped_char(self, c): + if c == '\n' or c == '\r': + self.parse_add_char(c) + self.state = AFTER_ESCAPED_CRNL + return + if c == '\0': + c = '\n' + self.parse_add_char(c) + self.state = IN_FIELD + + def _parse_after_escaped_crnl(self, c): + if c == '\0': + return + return self._parse_in_field(c) + + def _parse_in_field(self, c): + # In unquoted field + if c == '\n' or c == '\r' or c == '\0': + # End of line - return [fields] + self.parse_save_field() + self.state = START_RECORD if c == '\0' else EAT_CRNL + elif c == self.dialect.escapechar: + self.state = ESCAPED_CHAR + elif c == self.dialect.delimiter: + self.parse_save_field() + self.state = START_FIELD + else: + # Normal character - save in field + self.parse_add_char(c) + + def _parse_in_quoted_field(self, c): + if c == '\0': + pass + elif c == self.dialect.escapechar: + self.state = ESCAPE_IN_QUOTED_FIELD + elif (c == self.dialect.quotechar and + self.dialect.quoting != QUOTE_NONE): + if self.dialect.doublequote: + self.state = QUOTE_IN_QUOTED_FIELD + else: + self.state = IN_FIELD + else: + self.parse_add_char(c) + + def _parse_escape_in_quoted_field(self, c): + if c == '\0': + c = '\n' + + self.parse_add_char(c) + self.state = IN_QUOTED_FIELD + + def _parse_quote_in_quoted_field(self, c): + if (self.dialect.quoting != QUOTE_NONE and + c == self.dialect.quotechar): + # save "" as " + self.parse_add_char(c) + self.state = IN_QUOTED_FIELD + elif c == self.dialect.delimiter: + self.parse_save_field() + self.state = START_FIELD + elif c == '\n' or c == '\r' or c == '\0': + # End of line = return [fields] + self.parse_save_field() + self.state = START_RECORD if c == '\0' else EAT_CRNL + elif not self.dialect.strict: + self.parse_add_char(c) + self.state = IN_FIELD + else: + # illegal + raise Error("{delimiter}' expected after '{quotechar}".format( + delimiter=self.dialect.delimiter, + quotechar=self.dialect.quotechar, + )) + + def _parse_eat_crnl(self, c): + if c == '\n' or c == '\r': + pass + elif c == '\0': + self.state = START_RECORD + else: + raise Error('new-line character seen in unquoted field - do you ' + 'need to open the file in universal-newline mode?') + + def __iter__(self): + return self + + def __next__(self): + self.parse_reset() + + while True: + try: + lineobj = next(self.input_iter) + except StopIteration: + if len(self.field) != 0 or self.state == IN_QUOTED_FIELD: + if self.dialect.strict: + raise Error('unexpected end of data') + self.parse_save_field() + if self.fields: + break + raise + + if not isinstance(lineobj, text_type): + typ = type(lineobj) + typ_name = 'bytes' if typ == bytes else typ.__name__ + err_str = ('iterator should return strings, not {0}' + ' (did you open the file in text mode?)') + raise Error(err_str.format(typ_name)) + + self.line_num += 1 + for c in lineobj: + if c == '\0': + raise Error('line contains NULL byte') + self.parse_process_char(c) + + self.parse_process_char('\0') + + if self.state == START_RECORD: + break + + fields = self.fields + self.fields = None + return fields + + next = __next__ + + +_dialect_registry = {} + + +def register_dialect(name, dialect='excel', **fmtparams): + if not isinstance(name, text_type): + raise TypeError('"name" must be a string') + + dialect = Dialect.extend(dialect, fmtparams) + + try: + Dialect.validate(dialect) + except Exception as e: + raise TypeError('dialect is invalid') + + assert name not in _dialect_registry + _dialect_registry[name] = dialect + + +def unregister_dialect(name): + try: + _dialect_registry.pop(name) + except KeyError: + raise Error('"{name}" not a registered dialect'.format(name=name)) + + +def get_dialect(name): + try: + return _dialect_registry[name] + except KeyError: + raise Error('Could not find dialect {0}'.format(name)) + + +def list_dialects(): + return list(_dialect_registry) + + +class Dialect(object): + """Describe a CSV dialect. + This must be subclassed (see csv.excel). Valid attributes are: + delimiter, quotechar, escapechar, doublequote, skipinitialspace, + lineterminator, quoting, strict. + """ + _name = "" + _valid = False + # placeholders + delimiter = None + quotechar = None + escapechar = None + doublequote = None + skipinitialspace = None + lineterminator = None + quoting = None + strict = None + + def __init__(self): + self.validate(self) + if self.__class__ != Dialect: + self._valid = True + + @classmethod + def validate(cls, dialect): + dialect = cls.extend(dialect) + + if not isinstance(dialect.quoting, int): + raise Error('"quoting" must be an integer') + + if dialect.delimiter is None: + raise Error('delimiter must be set') + cls.validate_text(dialect, 'delimiter') + + if dialect.lineterminator is None: + raise Error('lineterminator must be set') + if not isinstance(dialect.lineterminator, text_type): + raise Error('"lineterminator" must be a string') + + if dialect.quoting not in [ + QUOTE_NONE, QUOTE_MINIMAL, QUOTE_NONNUMERIC, QUOTE_ALL]: + raise Error('Invalid quoting specified') + + if dialect.quoting != QUOTE_NONE: + if dialect.quotechar is None and dialect.escapechar is None: + raise Error('quotechar must be set if quoting enabled') + if dialect.quotechar is not None: + cls.validate_text(dialect, 'quotechar') + + @staticmethod + def validate_text(dialect, attr): + val = getattr(dialect, attr) + if not isinstance(val, text_type): + if type(val) == bytes: + raise Error('"{0}" must be string, not bytes'.format(attr)) + raise Error('"{0}" must be string, not {1}'.format( + attr, type(val).__name__)) + + if len(val) != 1: + raise Error('"{0}" must be a 1-character string'.format(attr)) + + @staticmethod + def defaults(): + return { + 'delimiter': ',', + 'doublequote': True, + 'escapechar': None, + 'lineterminator': '\r\n', + 'quotechar': '"', + 'quoting': QUOTE_MINIMAL, + 'skipinitialspace': False, + 'strict': False, + 'replace_nulls_with': None + } + + @classmethod + def extend(cls, dialect, fmtparams=None): + if isinstance(dialect, string_types): + dialect = get_dialect(dialect) + + if fmtparams is None: + return dialect + + defaults = cls.defaults() + + if any(param not in defaults for param in fmtparams): + raise TypeError('Invalid fmtparam') + + specified = dict( + (attr, getattr(dialect, attr, None)) + for attr in cls.defaults() + ) + + specified.update(fmtparams) + return type(str('ExtendedDialect'), (cls,), specified) + + @classmethod + def combine(cls, dialect, fmtparams): + """Create a new dialect with defaults and added parameters.""" + dialect = cls.extend(dialect, fmtparams) + defaults = cls.defaults() + specified = dict( + (attr, getattr(dialect, attr, None)) + for attr in defaults + if getattr(dialect, attr, None) is not None or + attr in ['quotechar', 'delimiter', 'lineterminator', 'quoting'] + ) + + defaults.update(specified) + dialect = type(str('CombinedDialect'), (cls,), defaults) + cls.validate(dialect) + return dialect() + + def __delattr__(self, attr): + if self._valid: + raise AttributeError('dialect is immutable.') + super(Dialect, self).__delattr__(attr) + + def __setattr__(self, attr, value): + if self._valid: + raise AttributeError('dialect is immutable.') + super(Dialect, self).__setattr__(attr, value) + + +class excel(Dialect): + """Describe the usual properties of Excel-generated CSV files.""" + delimiter = ',' + quotechar = '"' + doublequote = True + skipinitialspace = False + lineterminator = '\r\n' + quoting = QUOTE_MINIMAL + + +register_dialect("excel", excel) + + +class excel_tab(excel): + """Describe the usual properties of Excel-generated TAB-delimited files.""" + delimiter = '\t' + + +register_dialect("excel-tab", excel_tab) + + +class unix_dialect(Dialect): + """Describe the usual properties of Unix-generated CSV files.""" + delimiter = ',' + quotechar = '"' + doublequote = True + skipinitialspace = False + lineterminator = '\n' + quoting = QUOTE_ALL + + +register_dialect("unix", unix_dialect) + + +class DictReader(object): + def __init__(self, f, fieldnames=None, restkey=None, restval=None, + dialect="excel", *args, **kwds): + self._fieldnames = fieldnames # list of keys for the dict + self.restkey = restkey # key to catch long rows + self.restval = restval # default value for short rows + self.reader = reader(f, dialect, *args, **kwds) + self.dialect = dialect + self.line_num = 0 + + def __iter__(self): + return self + + @property + def fieldnames(self): + if self._fieldnames is None: + try: + self._fieldnames = next(self.reader) + except StopIteration: + pass + self.line_num = self.reader.line_num + return self._fieldnames + + @fieldnames.setter + def fieldnames(self, value): + self._fieldnames = value + + def __next__(self): + if self.line_num == 0: + # Used only for its side effect. + self.fieldnames + row = next(self.reader) + self.line_num = self.reader.line_num + + # unlike the basic reader, we prefer not to return blanks, + # because we will typically wind up with a dict full of None + # values + while row == []: + row = next(self.reader) + d = dict(zip(self.fieldnames, row)) + lf = len(self.fieldnames) + lr = len(row) + if lf < lr: + d[self.restkey] = row[lf:] + elif lf > lr: + for key in self.fieldnames[lr:]: + d[key] = self.restval + return d + + next = __next__ + + +class DictWriter(object): + def __init__(self, f, fieldnames, restval="", extrasaction="raise", + dialect="excel", *args, **kwds): + self.fieldnames = fieldnames # list of keys for the dict + self.restval = restval # for writing short dicts + if extrasaction.lower() not in ("raise", "ignore"): + raise ValueError("extrasaction (%s) must be 'raise' or 'ignore'" + % extrasaction) + self.extrasaction = extrasaction + self.writer = writer(f, dialect, *args, **kwds) + + def writeheader(self): + header = dict(zip(self.fieldnames, self.fieldnames)) + self.writerow(header) + + def _dict_to_list(self, rowdict): + if self.extrasaction == "raise": + wrong_fields = [k for k in rowdict if k not in self.fieldnames] + if wrong_fields: + raise ValueError("dict contains fields not in fieldnames: " + + ", ".join([repr(x) for x in wrong_fields])) + return (rowdict.get(key, self.restval) for key in self.fieldnames) + + def writerow(self, rowdict): + return self.writer.writerow(self._dict_to_list(rowdict)) + + def writerows(self, rowdicts): + return self.writer.writerows(map(self._dict_to_list, rowdicts)) Index: pkg/mac/build.sh IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- pkg/mac/build.sh (revision a000dc6f60cc4bcf527ecab264ca9261e5c8172f) +++ pkg/mac/build.sh (date 1545392222000) @@ -144,11 +144,6 @@ if test -d $DIR_PYMODULES_PATH; then ln -s $(basename $DIR_PYMODULES_PATH) $DIR_PYMODULES_PATH/../python fi - - # Fix the backports module which will have no __init__.py file - if [ "$PYTHON_VERSION" -lt "30" ]; then - touch $BUILDROOT/$VIRTUALENV/lib/python/site-packages/backports/__init__.py - fi } _build_runtime() { Index: web/pgadmin/utils/driver/psycopg2/connection.py IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- web/pgadmin/utils/driver/psycopg2/connection.py (revision a000dc6f60cc4bcf527ecab264ca9261e5c8172f) +++ web/pgadmin/utils/driver/psycopg2/connection.py (date 1545392222000) @@ -37,16 +37,13 @@ register_string_typecasters, register_binary_typecasters, \ register_array_to_string_typecasters, ALL_JSON_TYPES from .encoding import getEncoding +from pgadmin.utils import csv if sys.version_info < (3,): - # Python2 in-built csv module do not handle unicode - # backports.csv module ported from PY3 csv module for unicode handling - from backports import csv from StringIO import StringIO IS_PY2 = True else: from io import StringIO - import csv IS_PY2 = False _ = gettext @@ -765,7 +762,31 @@ ) return new_results - def gen(quote='strings', quote_char="'", field_separator=','): + def handle_null_values(results, replace_nulls_with): + """ + This function is used to replace null values with the given string + + :param results: + :param replace_nulls_with: null values will be replaced by this + string. + :return: modified result + """ + + temp_results = [] + for row in results: + res = dict() + for k, v in row.items(): + if v is None: + res[k] = replace_nulls_with + else: + res[k] = v + temp_results.append(res) + results = temp_results + + return results + + def gen(quote='strings', quote_char="'", field_separator=',', + replace_nulls_with=None): results = cur.fetchmany(records) if not results: @@ -815,11 +836,15 @@ csv_writer = csv.DictWriter( res_io, fieldnames=header, delimiter=field_separator, quoting=quote, - quotechar=quote_char + quotechar=quote_char, + replace_nulls_with=replace_nulls_with ) csv_writer.writeheader() results = handle_json_data(json_columns, results) + # Replace the null values with given string if configured. + if replace_nulls_with is not None: + results = handle_null_values(results, replace_nulls_with) csv_writer.writerows(results) yield res_io.getvalue() @@ -836,13 +861,17 @@ csv_writer = csv.DictWriter( res_io, fieldnames=header, delimiter=field_separator, quoting=quote, - quotechar=quote_char + quotechar=quote_char, + replace_nulls_with=replace_nulls_with ) if IS_PY2: results = convert_keys_to_unicode(results, conn_encoding) results = handle_json_data(json_columns, results) + # Replace the null values with given string if configured. + if replace_nulls_with is not None: + results = handle_null_values(results, replace_nulls_with) csv_writer.writerows(results) yield res_io.getvalue() Index: Make.bat IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- Make.bat (revision a000dc6f60cc4bcf527ecab264ca9261e5c8172f) +++ Make.bat (date 1545392222000) @@ -255,11 +255,6 @@ ECHO Removing Sphinx CALL pip uninstall -y sphinx Pygments alabaster colorama docutils imagesize requests snowballstemmer - IF %PYTHON_MAJOR% == 2 ( - ECHO Fixing backports.csv for Python 2 by adding missing __init__.py - type nul >> "%PGBUILDPATH%\%VIRTUALENV%\Lib\site-packages\backports\__init__.py" - ) - IF %PYTHON_MAJOR% == 3 ( ECHO Fixing PyCrypto module for Python 3... CALL "%PYTHON_HOME%\python" "%WD%\pkg\win32\replace.py" "-i" "%PGBUILDPATH%\%VIRTUALENV%\Lib\site-packages\Crypto\Random\OSRNG\nt.py" "-o" "%PGBUILDPATH%\%VIRTUALENV%\Lib\site-packages\Crypto\Random\OSRNG\nt.py.new" "-s" "import winrandom" -r "from . import winrandom" Index: requirements.txt IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- requirements.txt (revision a000dc6f60cc4bcf527ecab264ca9261e5c8172f) +++ requirements.txt (date 1545392222000) @@ -44,7 +44,6 @@ ############################################################### # Modules specifically required for Python2.7 or lesser version ############################################################### -backports.csv==1.0.5; python_version <= '2.7' importlib==1.0.3; python_version <= '2.7' ############################################################### Index: docs/en_US/preferences.rst IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- docs/en_US/preferences.rst (revision a000dc6f60cc4bcf527ecab264ca9261e5c8172f) +++ docs/en_US/preferences.rst (date 1545392477000) @@ -146,6 +146,7 @@ * Use the *CSV field separator* drop-down listbox to specify the separator character that will be used in CSV output. * Use the *CSV quote character* drop-down listbox to specify the quote character that will be used in CSV output. * Use the *CSV quoting* drop-down listbox to select the fields that will be quoted in the CSV output; select *Strings*, *All*, or *None*. +* Use the *Replace null values with* option to replace null values with specified string in the output file. Default is set to 'NULL'. .. image:: images/preferences_sql_display.png :alt: Preferences dialog sqleditor display options Index: web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py (revision a000dc6f60cc4bcf527ecab264ca9261e5c8172f) +++ web/pgadmin/tools/sqleditor/utils/query_tool_preferences.py (date 1545392477000) @@ -198,6 +198,16 @@ } ) + self.replace_nulls_with = self.preference.register( + 'CSV_output', 'csv_replace_nulls_with', + gettext("Replace null values with"), 'text', 'NULL', + category_label=gettext('CSV output'), + help_str=gettext('Specifies the string that represents a null value ' + 'while downloading query results as CSV. You can ' + 'specify any arbitrary string to represent a ' + 'null value, with quotes if desired.') + ) + self.results_grid_quoting = self.preference.register( 'Results_grid', 'results_grid_quoting', gettext("Result copy quoting"), 'options', 'strings', Index: web/pgadmin/tools/sqleditor/__init__.py IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- web/pgadmin/tools/sqleditor/__init__.py (revision a000dc6f60cc4bcf527ecab264ca9261e5c8172f) +++ web/pgadmin/tools/sqleditor/__init__.py (date 1545392222000) @@ -1434,7 +1434,8 @@ gen( quote=blueprint.csv_quoting.get(), quote_char=blueprint.csv_quote_char.get(), - field_separator=blueprint.csv_field_separator.get() + field_separator=blueprint.csv_field_separator.get(), + replace_nulls_with=blueprint.replace_nulls_with.get() ), mimetype='text/csv' ) diff --git docs/en_US/images/preferences_sql_csv_output.png docs/en_US/images/preferences_sql_csv_output.png index 48dee9c62a87640af5085cefad9dbd400912c867..ee3475d57ce9865cfe1552f3ebe09fac96767519 GIT binary patch literal 71521 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 z