[Python-modules-commits] [python-mysqldb] 01/04: New upstream version 1.3.10

Brian May bam at debian.org
Wed Jul 12 09:13:56 UTC 2017


This is an automated email from the git hooks/post-receive script.

bam pushed a commit to branch debian/master
in repository python-mysqldb.

commit 58d01854e049c01c4008d9b6584708cc69b81b32
Author: Brian May <bam at debian.org>
Date:   Wed Jul 12 19:06:48 2017 +1000

    New upstream version 1.3.10
---
 GPL-2.0                            | 339 ---------------------
 HISTORY => HISTORY.md              |  47 +++
 INSTALL => INSTALL.rst             |   2 +-
 MANIFEST.in                        |  26 +-
 MySQLdb/__init__.py                |   9 +-
 MySQLdb/connections.py             | 225 +++++++-------
 MySQLdb/constants/CR.py            |  76 ++++-
 MySQLdb/constants/ER.py            | 597 ++++++++++++++++++++++++++++++++++++-
 MySQLdb/cursors.py                 | 274 +++++++++--------
 MySQLdb/release.py                 |   4 +-
 PKG-INFO                           |  11 +-
 README.md                          |   8 +-
 _mysql.c                           | 304 +++++++------------
 _mysql_exceptions.py               |   2 +-
 doc/FAQ.rst                        |   4 +-
 doc/MySQLdb.rst                    | 100 +++----
 doc/conf.py                        |   2 +-
 doc/index.rst                      |   5 -
 doc/user_guide.rst                 |  12 +-
 metadata.cfg                       |  20 +-
 mysqlclient.egg-info/PKG-INFO      |  11 +-
 mysqlclient.egg-info/SOURCES.txt   |   9 +-
 setup.cfg                          |   6 +-
 tests/capabilities.py              |   8 +-
 tests/dbapi20.py                   |  10 +-
 tests/test_MySQLdb_capabilities.py |  52 +++-
 tests/test_MySQLdb_dbapi20.py      |   8 +-
 tests/test_MySQLdb_nonstandard.py  |   4 +-
 tests/test__mysql.py               |   7 +
 tests/test_cursor.py               |  74 +++++
 30 files changed, 1360 insertions(+), 896 deletions(-)

diff --git a/GPL-2.0 b/GPL-2.0
deleted file mode 100644
index d159169..0000000
--- a/GPL-2.0
+++ /dev/null
@@ -1,339 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                            NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/HISTORY b/HISTORY.md
similarity index 86%
rename from HISTORY
rename to HISTORY.md
index 97ffe20..861e28e 100644
--- a/HISTORY
+++ b/HISTORY.md
@@ -1,3 +1,50 @@
+======================
+ What's new in 1.3.10
+======================
+
+Added `binary_prefix` option (disabled by default) to support
+`_binary` prefix again. (#134)
+
+Fix SEGV of `_mysql.result()` when argument's type is unexpected. (#138)
+
+Deprecate context interface of Connection object. (#149)
+
+Don't use workaround of `bytes.decode('ascii', 'surrogateescape')` on Python 3.6+. (#150)
+
+
+=====================
+ What's new in 1.3.9
+=====================
+
+Revert adding _binary prefix for bytes/bytearray parameter. It broke backward compatibility.
+
+Fix Windows compile error on MSVC.
+
+
+=====================
+ What's new in 1.3.8
+=====================
+
+Update error constants (#113)
+
+Use _binary prefix for bytes/bytearray parameters (#106)
+
+Use mysql_real_escape_string_quote() if exists (#109)
+
+Better Warning propagation (#101)
+
+Fix conversion error when mysql_affected_rows returns -1
+
+Fix Cursor.callproc may raise TypeError (#90, #91)
+
+connect() supports the 'database' and 'password' keyword arguments.
+
+Fix accessing dangling pointer when using ssl (#78)
+
+Accept %% in Cursor.executemany (#83)
+
+Fix warning that caused TypeError on Python 3 (#68)
+
 =====================
  What's new in 1.3.7
 =====================
diff --git a/INSTALL b/INSTALL.rst
similarity index 98%
rename from INSTALL
rename to INSTALL.rst
index 9caf5bc..616b590 100644
--- a/INSTALL
+++ b/INSTALL.rst
@@ -175,7 +175,7 @@ Packaged as `mysql-python`_. ::
       # emerge mysql-python
       # emerge zmysqlda # if you use Zope
 
-.. _`mysql-python`: http://packages.gentoo.org/search/?sstring=mysql-python
+.. _`mysql-python`: https://packages.gentoo.org/packages/search?q=mysql-python
 
 
 BSD
diff --git a/MANIFEST.in b/MANIFEST.in
index 4e03cc4..b6bc8b6 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,13 +1,13 @@
-recursive-include doc *.rst
-recursive-include tests *.py
-include doc/conf.py
-include MANIFEST.in
-include HISTORY
-include INSTALL
-include README.md
-include GPL-2.0
-include metadata.cfg
-include site.cfg
-include setup_common.py
-include setup_posix.py
-include setup_windows.py
+recursive-include doc *.rst
+recursive-include tests *.py
+include doc/conf.py
+include MANIFEST.in
+include HISTORY.md
+include INSTALL.rst
+include README.md
+include GPL-2.0
+include metadata.cfg
+include site.cfg
+include setup_common.py
+include setup_posix.py
+include setup_windows.py
diff --git a/MySQLdb/__init__.py b/MySQLdb/__init__.py
index fc41481..9dc8dab 100644
--- a/MySQLdb/__init__.py
+++ b/MySQLdb/__init__.py
@@ -27,6 +27,7 @@ apilevel = "2.0"
 paramstyle = "format"
 
 from _mysql import *
+from MySQLdb.compat import PY2
 from MySQLdb.constants import FIELD_TYPE
 from MySQLdb.times import Date, Time, Timestamp, \
     DateFromTicks, TimeFromTicks, TimestampFromTicks
@@ -72,8 +73,12 @@ def test_DBAPISet_set_equality_membership():
 def test_DBAPISet_set_inequality_membership():
     assert FIELD_TYPE.DATE != STRING
 
-def Binary(x):
-    return bytes(x)
+if PY2:
+    def Binary(x):
+        return bytearray(x)
+else:
+    def Binary(x):
+        return bytes(x)
 
 def Connect(*args, **kwargs):
     """Factory function for connections.Connection."""
diff --git a/MySQLdb/connections.py b/MySQLdb/connections.py
index 7ac040b..1511024 100644
--- a/MySQLdb/connections.py
+++ b/MySQLdb/connections.py
@@ -1,18 +1,32 @@
 """
-
 This module implements connections for MySQLdb. Presently there is
 only one class: Connection. Others are unlikely. However, you might
 want to make your own subclasses. In most cases, you will probably
 override Connection.default_cursor with a non-standard Cursor class.
-
 """
+import re
+import sys
+
 from MySQLdb import cursors
 from MySQLdb.compat import unicode, PY2
-from _mysql_exceptions import Warning, Error, InterfaceError, DataError, \
-     DatabaseError, OperationalError, IntegrityError, InternalError, \
-     NotSupportedError, ProgrammingError
+from _mysql_exceptions import (
+    Warning, Error, InterfaceError, DataError,
+    DatabaseError, OperationalError, IntegrityError, InternalError,
+    NotSupportedError, ProgrammingError,
+)
 import _mysql
-import re
+
+
+if not PY2:
+    if sys.version_info[:2] < (3, 6):
+        # See http://bugs.python.org/issue24870
+        _surrogateescape_table = [chr(i) if i < 0x80 else chr(i + 0xdc00) for i in range(256)]
+
+        def _fast_surrogateescape(s):
+            return s.decode('latin1').translate(_surrogateescape_table)
+    else:
+        def _fast_surrogateescape(s):
+            return s.decode('ascii', 'surrogateescape')
 
 
 def defaulterrorhandler(connection, cursor, errorclass, errorvalue):
@@ -34,7 +48,7 @@ def defaulterrorhandler(connection, cursor, errorclass, errorvalue):
     del connection
     if isinstance(errorvalue, BaseException):
         raise errorvalue
-    if errorclass is not None:    
+    if errorclass is not None:
         raise errorclass(errorvalue)
     else:
         raise Exception(errorvalue)
@@ -59,7 +73,6 @@ def numeric_part(s):
 
 
 class Connection(_mysql.connection):
-
     """MySQL Database Connection Object"""
 
     default_cursor = cursors.Cursor
@@ -71,89 +84,70 @@ class Connection(_mysql.connection):
         that you only use keyword parameters. Consult the MySQL C API
         documentation for more information.
 
-        host
-          string, host to connect
-
-        user
-          string, user to connect as
-
-        passwd
-          string, password to use
-
-        db
-          string, database to use
-
-        port
-          integer, TCP/IP port to connect to
-
-        unix_socket
-          string, location of unix_socket to use
-
-        conv
-          conversion dictionary, see MySQLdb.converters
-
-        connect_timeout
-          number of seconds to wait before the connection attempt
-          fails.
-
-        compress
-          if set, compression is enabled
-
-        named_pipe
-          if set, a named pipe is used to connect (Windows only)
-
-        init_command
-          command which is run once the connection is created
-
-        read_default_file
-          file from which default client values are read
-
-        read_default_group
-          configuration group to use from the default file
-
-        cursorclass
-          class object, used to create cursors (keyword only)
-
-        use_unicode
-          If True, text-like columns are returned as unicode objects
-          using the connection's character set.  Otherwise, text-like
-          columns are returned as strings.  columns are returned as
-          normal strings. Unicode objects will always be encoded to
-          the connection's character set regardless of this setting.
-          Default to False on Python 2 and True on Python 3.
-
-        charset
-          If supplied, the connection character set will be changed
-          to this character set (MySQL-4.1 and newer). This implies
-          use_unicode=True.
-
-        sql_mode
-          If supplied, the session SQL mode will be changed to this
-          setting (MySQL-4.1 and newer). For more details and legal
-          values, see the MySQL documentation.
-
-        client_flag
-          integer, flags to use or 0
-          (see MySQL docs or constants/CLIENTS.py)
-
-        ssl
-          dictionary or mapping, contains SSL connection parameters;
-          see the MySQL documentation for more details
-          (mysql_ssl_set()).  If this is set, and the client does not
-          support SSL, NotSupportedError will be raised.
-
-        local_infile
-          integer, non-zero enables LOAD LOCAL INFILE; zero disables
-
-        autocommit
-          If False (default), autocommit is disabled.
-          If True, autocommit is enabled.
-          If None, autocommit isn't set and server default is used.
-
-        waiter
-          Callable accepts fd as an argument. It is called after sending
-          query and before reading response.
-          This is useful when using with greenlet and async io.
+        :param str host:        host to connect
+        :param str user:        user to connect as
+        :param str password:    password to use
+        :param str passwd:      alias of password, for backward compatibility
+        :param str database:    database to use
+        :param str db:          alias of database, for backward compatibility
+        :param int port:        TCP/IP port to connect to
+        :param str unix_socket: location of unix_socket to use
+        :param dict conv:       conversion dictionary, see MySQLdb.converters
+        :param int connect_timeout:
+            number of seconds to wait before the connection attempt fails.
+
+        :param bool compress:   if set, compression is enabled
+        :param str named_pipe:  if set, a named pipe is used to connect (Windows only)
+        :param str init_command:
+            command which is run once the connection is created
+
+        :param str read_default_file:
+            file from which default client values are read
+
+        :param str read_default_group:
+            configuration group to use from the default file
+
+        :param type cursorclass:
+            class object, used to create cursors (keyword only)
+
+        :param str use_unicode:
+            If True, text-like columns are returned as unicode objects
+            using the connection's character set.  Otherwise, text-like
+            columns are returned as strings.  columns are returned as
+            normal strings. Unicode objects will always be encoded to
+            the connection's character set regardless of this setting.
+            Default to False on Python 2 and True on Python 3.
+
+        :param str charset:
+            If supplied, the connection character set will be changed
+            to this character set (MySQL-4.1 and newer). This implies
+            use_unicode=True.
+
+        :param str sql_mode:
+            If supplied, the session SQL mode will be changed to this
+            setting (MySQL-4.1 and newer). For more details and legal
+            values, see the MySQL documentation.
+
+        :param int client_flag:
+            flags to use or 0 (see MySQL docs or constants/CLIENTS.py)
+
+        :param dict ssl:
+            dictionary or mapping contains SSL connection parameters;
+            see the MySQL documentation for more details
+            (mysql_ssl_set()).  If this is set, and the client does not
+            support SSL, NotSupportedError will be raised.
+
+        :param bool local_infile:
+            enables LOAD LOCAL INFILE; zero disables
+
+        :param bool autocommit:
+            If False (default), autocommit is disabled.
+            If True, autocommit is enabled.
+            If None, autocommit isn't set and server default is used.
+
+        :param bool binary_prefix:
+            If set, the '_binary' prefix will be used for raw byte query
+            arguments (e.g. Binary). This is disabled by default.
 
         There are a number of undocumented, non-standard methods. See the
         documentation for the MySQL C API for some hints on what they do.
@@ -164,6 +158,11 @@ class Connection(_mysql.connection):
 
         kwargs2 = kwargs.copy()
 
+        if 'database' in kwargs2:
+            kwargs2['db'] = kwargs2.pop('database')
+        if 'password' in kwargs2:
+            kwargs2['passwd'] = kwargs2.pop('password')
+
         if 'conv' in kwargs:
             conv = kwargs['conv']
         else:
@@ -187,6 +186,7 @@ class Connection(_mysql.connection):
 
         use_unicode = kwargs2.pop('use_unicode', use_unicode)
         sql_mode = kwargs2.pop('sql_mode', '')
+        binary_prefix = kwargs2.pop('binary_prefix', False)
 
         client_flag = kwargs.get('client_flag', 0)
         client_version = tuple([ numeric_part(n) for n in _mysql.get_client_info().split('.')[:2] ])
@@ -210,7 +210,7 @@ class Connection(_mysql.connection):
 
         db = proxy(self)
         def _get_string_literal():
-            # Note: string_literal() is called for bytes object on Python 3.
+            # Note: string_literal() is called for bytes object on Python 3 (via bytes_literal)
             def string_literal(obj, dummy=None):
                 return db.string_literal(obj)
             return string_literal
@@ -219,13 +219,18 @@ class Connection(_mysql.connection):
             if PY2:
                 # unicode_literal is called for only unicode object.
                 def unicode_literal(u, dummy=None):
-                    return db.literal(u.encode(unicode_literal.charset))
+                    return db.string_literal(u.encode(unicode_literal.charset))
             else:
                 # unicode_literal() is called for arbitrary object.
                 def unicode_literal(u, dummy=None):
-                    return db.literal(str(u).encode(unicode_literal.charset))
+                    return db.string_literal(str(u).encode(unicode_literal.charset))
             return unicode_literal
 
+        def _get_bytes_literal():
+            def bytes_literal(obj, dummy=None):
+                return b'_binary' + db.string_literal(obj)
+            return bytes_literal
+
         def _get_string_decoder():
             def string_decoder(s):
                 return s.decode(string_decoder.charset)
@@ -233,6 +238,7 @@ class Connection(_mysql.connection):
 
         string_literal = _get_string_literal()
         self.unicode_literal = unicode_literal = _get_unicode_literal()
+        bytes_literal = _get_bytes_literal()
         self.string_decoder = string_decoder = _get_string_decoder()
         if not charset:
             charset = self.character_set_name()
@@ -247,7 +253,12 @@ class Connection(_mysql.connection):
             self.converter[FIELD_TYPE.VARCHAR].append((None, string_decoder))
             self.converter[FIELD_TYPE.BLOB].append((None, string_decoder))
 
-        self.encoders[bytes] = string_literal
+        if binary_prefix:
+            self.encoders[bytes] = string_literal if PY2 else bytes_literal
+            self.encoders[bytearray] = bytes_literal
+        else:
+            self.encoders[bytes] = string_literal
+
         self.encoders[unicode] = unicode_literal
         self._transactional = self.server_capabilities & CLIENT.TRANSACTIONS
         if self._transactional:
@@ -262,16 +273,17 @@ class Connection(_mysql.connection):
 
     def cursor(self, cursorclass=None):
         """
-
         Create a cursor on which queries may be performed. The
         optional cursorclass parameter is used to create the
         Cursor. By default, self.cursorclass=cursors.Cursor is
         used.
-
         """
         return (cursorclass or self.cursorclass)(self)
 
     def query(self, query):
+        # Since _mysql releases GIL while querying, we need immutable buffer.
+        if isinstance(query, bytearray):
+            query = bytes(query)
         if self.waiter is not None:
             self.send_query(query)
             self.waiter(self.fileno())
@@ -280,6 +292,9 @@ class Connection(_mysql.connection):
             _mysql.connection.query(self, query)
 
     def __enter__(self):
+        from warnings import warn
+        warn("context interface will be changed.  Use explicit conn.commit() or conn.rollback().",
+             DeprecationWarning, 2)
         if self.get_autocommit():
             self.query("BEGIN")
         return self.cursor()
@@ -291,24 +306,21 @@ class Connection(_mysql.connection):
             self.commit()
 
     def literal(self, o):
-        """
-
-        If o is a single object, returns an SQL literal as a string.
+        """If o is a single object, returns an SQL literal as a string.
         If o is a non-string sequence, the items of the sequence are
         converted and returned as a sequence.
 
         Non-standard. For internal use; do not use this in your
         applications.
-
         """
         s = self.escape(o, self.encoders)
-        # Python 3 doesn't support % operation for bytes object.
+        # Python 3(~3.4) doesn't support % operation for bytes object.
         # We should decode it before using %.
         # Decoding with ascii and surrogateescape allows convert arbitrary
         # bytes to unicode and back again.
         # See http://python.org/dev/peps/pep-0383/
-        if not PY2 and isinstance(s, bytes):
-            return s.decode('ascii', 'surrogateescape')
+        if not PY2 and isinstance(s, (bytes, bytearray)):
+            return _fast_surrogateescape(s)
         return s
 
     def begin(self):
@@ -316,7 +328,7 @@ class Connection(_mysql.connection):
         DEPRECATED: Will be removed in 1.3.
         Use an SQL BEGIN statement instead."""
         from warnings import warn
-        warn("begin() is non-standard and will be removed in 1.3",
+        warn("begin() is non-standard and will be removed in 1.4",
              DeprecationWarning, 2)
         self.query("BEGIN")
 
@@ -350,6 +362,7 @@ class Connection(_mysql.connection):
                 self.store_result()
         self.string_decoder.charset = py_charset
         self.unicode_literal.charset = py_charset
+        self.encoding = py_charset
 
     def set_sql_mode(self, sql_mode):
         """Set the connection sql_mode. See MySQL documentation for
@@ -382,3 +395,5 @@ class Connection(_mysql.connection):
     NotSupportedError = NotSupportedError
 
     errorhandler = defaulterrorhandler
+
+# vim: colorcolumn=100
diff --git a/MySQLdb/constants/CR.py b/MySQLdb/constants/CR.py
index 249dfec..1b04724 100644
--- a/MySQLdb/constants/CR.py
+++ b/MySQLdb/constants/CR.py
@@ -5,8 +5,35 @@ raises ProgrammingError.
 
 """
 
+if __name__ == "__main__":
+    """
+    Usage: python CR.py [/path/to/mysql/errmsg.h ...] >> CR.py
+    """
+    import fileinput, re
+    data = {}
+    error_last = None
+    for line in fileinput.input():
+        line = re.sub(r'/\*.*?\*/', '', line)
+        m = re.match(r'^\s*#define\s+CR_([A-Z0-9_]+)\s+(\d+)(\s.*|$)', line)
+        if m:
+            name = m.group(1)
+            value = int(m.group(2))
+            if name == 'ERROR_LAST':
+                if error_last is None or error_last < value:
+                    error_last = value
+                continue
+            if value not in data:
+                data[value] = set()
+            data[value].add(name)
+    for value, names in sorted(data.items()):
+        for name in sorted(names):
+            print('%s = %s' % (name, value))
+    if error_last is not None:
+        print('ERROR_LAST = %s' % error_last)
+
+
+ERROR_FIRST = 2000
 MIN_ERROR = 2000
-MAX_ERROR = 2999
 UNKNOWN_ERROR = 2000
 SOCKET_CREATE_ERROR = 2001
 CONNECTION_ERROR = 2002
@@ -28,3 +55,50 @@ NAMEDPIPEOPEN_ERROR = 2017
 NAMEDPIPESETSTATE_ERROR = 2018
 CANT_READ_CHARSET = 2019
 NET_PACKET_TOO_LARGE = 2020
+EMBEDDED_CONNECTION = 2021
+PROBE_SLAVE_STATUS = 2022
+PROBE_SLAVE_HOSTS = 2023
+PROBE_SLAVE_CONNECT = 2024
+PROBE_MASTER_CONNECT = 2025
+SSL_CONNECTION_ERROR = 2026
+MALFORMED_PACKET = 2027
+WRONG_LICENSE = 2028
+NULL_POINTER = 2029
+NO_PREPARE_STMT = 2030
+PARAMS_NOT_BOUND = 2031
+DATA_TRUNCATED = 2032
+NO_PARAMETERS_EXISTS = 2033
+INVALID_PARAMETER_NO = 2034
+INVALID_BUFFER_USE = 2035
+UNSUPPORTED_PARAM_TYPE = 2036
+SHARED_MEMORY_CONNECTION = 2037
+SHARED_MEMORY_CONNECT_REQUEST_ERROR = 2038
+SHARED_MEMORY_CONNECT_ANSWER_ERROR = 2039
+SHARED_MEMORY_CONNECT_FILE_MAP_ERROR = 2040
+SHARED_MEMORY_CONNECT_MAP_ERROR = 2041
+SHARED_MEMORY_FILE_MAP_ERROR = 2042
+SHARED_MEMORY_MAP_ERROR = 2043
+SHARED_MEMORY_EVENT_ERROR = 2044
+SHARED_MEMORY_CONNECT_ABANDONED_ERROR = 2045
+SHARED_MEMORY_CONNECT_SET_ERROR = 2046
+CONN_UNKNOW_PROTOCOL = 2047
+INVALID_CONN_HANDLE = 2048
+SECURE_AUTH = 2049
+UNUSED_1 = 2049
+FETCH_CANCELED = 2050
+NO_DATA = 2051
+NO_STMT_METADATA = 2052
+NO_RESULT_SET = 2053
+NOT_IMPLEMENTED = 2054
+SERVER_LOST_EXTENDED = 2055
+STMT_CLOSED = 2056
+NEW_STMT_METADATA = 2057
+ALREADY_CONNECTED = 2058
+AUTH_PLUGIN_CANNOT_LOAD = 2058
+ALREADY_CONNECTED = 2059
+AUTH_PLUGIN_CANNOT_LOAD = 2059
+DUPLICATE_CONNECTION_ATTR = 2060
+PLUGIN_FUNCTION_NOT_SUPPORTED = 2060
+AUTH_PLUGIN_ERR = 2061
+MAX_ERROR = 2999
+ERROR_LAST = 2061
diff --git a/MySQLdb/constants/ER.py b/MySQLdb/constants/ER.py
index ed45f3a..59db2e1 100644
--- a/MySQLdb/constants/ER.py
+++ b/MySQLdb/constants/ER.py
@@ -5,6 +5,36 @@ that may occur.
 
 """
 
+if __name__ == "__main__":
+    """
+    Usage: python ER.py [/path/to/mysql/mysqld_error.h ...] >> ER.py
+    """
+    import fileinput, re
+    data = {}
+    error_last = None
+    for line in fileinput.input():
+        line = re.sub(r'/\*.*?\*/', '', line)
+        m = re.match(r'^\s*#define\s+((ER|WARN)_[A-Z0-9_]+)\s+(\d+)\s*', line)
+        if m:
+            name = m.group(1)
+            if name.startswith('ER_'):
+                name = name[3:]
+            value = int(m.group(3))
+            if name == 'ERROR_LAST':
+                if error_last is None or error_last < value:
... 2777 lines suppressed ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-mysqldb.git



More information about the Python-modules-commits mailing list