Showing preview only (304K chars total). Download the full file or copy to clipboard to get everything.
Repository: farcepest/MySQLdb1
Branch: master
Commit: d34fac681487
Files: 50
Total size: 288.8 KB
Directory structure:
gitextract_hp90r54w/
├── .gitignore
├── .travis.yml
├── GPL-2.0
├── HISTORY
├── INSTALL
├── MANIFEST.in
├── MySQLdb/
│ ├── __init__.py
│ ├── connections.py
│ ├── constants/
│ │ ├── CLIENT.py
│ │ ├── CR.py
│ │ ├── ER.py
│ │ ├── FIELD_TYPE.py
│ │ ├── FLAG.py
│ │ ├── REFRESH.py
│ │ └── __init__.py
│ ├── converters.py
│ ├── cursors.py
│ ├── release.py
│ └── times.py
├── README.md
├── _mysql.c
├── _mysql_exceptions.py
├── doc/
│ ├── FAQ.rst
│ ├── Makefile
│ ├── MySQLdb.constants.rst
│ ├── MySQLdb.rst
│ ├── _mysql.rst
│ ├── _mysql_exceptions.rst
│ ├── conf.py
│ ├── index.rst
│ ├── make.bat
│ ├── modules.rst
│ └── user_guide.rst
├── metadata.cfg
├── pymemcompat.h
├── setup.cfg
├── setup.py
├── setup_common.py
├── setup_posix.py
├── setup_windows.py
├── site.cfg
├── tests/
│ ├── capabilities.py
│ ├── configdb.py
│ ├── dbapi20.py
│ ├── default.cnf
│ ├── test_MySQLdb_capabilities.py
│ ├── test_MySQLdb_dbapi20.py
│ ├── test_MySQLdb_nonstandard.py
│ └── travis.cnf
└── tox.ini
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.pyc
*.pyo
*.o
*.so
*.pyd
*.gz
*.zip
*.egg
*.egg-info/
.tox/
build/
dist/
================================================
FILE: .travis.yml
================================================
language: python
python:
- "2.6"
- "2.7"
- "pypy"
install: python setup.py install
before_script: mysql -e 'create database mysqldb_test charset utf8;'
script: TESTDB=travis.cnf nosetests
================================================
FILE: GPL-2.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.
================================================
FILE: HISTORY
================================================
=====================
What's new in 1.2.4
=====================
final
=====
No changes.
rc 1
====
Fixed a dangling reference to the old types module.
beta 5
======
Another internal fix for handling remapped character sets.
_mysql.c was broken for the case where read_timeout was *not* available. (Issue #6)
Documentation was converted to sphinx but there is a lot of cleanup left to do.
beta 4
======
Added support for the MySQL read_timeout option. Contributed by
Jean Schurger (jean@schurger.org).
Added a workaround so that the MySQL character set utf8mb4 works with Python; utf8 is substituted
on the Python side.
beta 3
======
Unified test database configuration, and set up CI testing with Travis.
Applied several patches from André Malo (ndparker@users.sf.net) which fix some issues
with exception handling and reference counting and TEXT/BLOB conversion.
beta 2
======
Reverted an accidental change in the exception format. (issue #1)
Reverted some raise statements so that they will continue to work with Python < 2.6
beta 1
======
A lot of work has been done towards Python 3 compatibility, and avoiding warnings with Python 2.7.
This includes import changes, converting dict.has_kay(k) to k in dict, updating some test suite methods, etc.
Due to the difficulties of supporting Python 3 and Python < 2.7, 1.2.4 will support Python 2.4 though 2.7.
1.3.0 will support Python 3 and Python 2.7 and 2.6.
MySQLdb-2.0 is instead going to become moist-1.0. See https://github.com/farcepest/moist
The Windows build has been simplified, and I plan to correct pre-built i386 packages built
against the python.org Python-2.7 package and MySQL Connector/C-6.0. Contact me if you
need ia64 packages.
The connection's cursorclass (if not default) was being lost on reconnect.
Newer versions of MySQL don't use OpenSSL and therefore don't have HAVE_SSL defined, but they do have
a different SSL library. Fixed this so SSL support would be enabled in this case.
The regex that looked for SQL INSERT statement and VALUES in cursor.executemany() was made case-insensitive
again.
=====================
What's new in 1.2.3
=====================
ez_setup.py has been update to include various fixes that affect the build.
Better Python version and dependency detection as well as eliminate exception
warnings under Python 2.6.
Eliminated memory leaks related to Unicode and failed connections.
Corrected connection .escape() functionality.
Miscellaneous cleanups and and expanded testing suite to ensure ongoing release
quality.
=====================
What's new in 1.2.2
=====================
The build system has been completely redone and should now build
on Windows without any patching; uses setuptools.
Added compatibility for Python 2.5, including support for with statement.
connection.ping() now takes an optional boolean argument which can
enable (or disable) automatic reconnection.
Support returning SET columns as Python sets was removed due to an
API bug in MySQL; corresponding test removed.
Added a test for single-character CHAR columns.
BLOB columns are now returned as Python strings instead of byte arrays.
BINARY character columns are always returned as Python strings, and not
unicode.
Fixed a bug introduced in 1.2.1 where the new SHOW WARNINGS support broke
SSCursor.
Only encode the query (convert to a string) when it is a unicode instance;
re-encoding encoded strings would break things.
Make a deep copy of conv when connecting, since it can be modified.
Added support for new VARCHAR and BIT column types.
DBAPISet objects were broken, but nobody noticed.
========================
What's new in 1.2.1_p2
========================
There are some minor build fixes which probably only affect MySQL
older than 4.0.
If you had MySQL older than 4.1, the new charset and sql_mode
parameters didn't work right. In fact, it was impossible to create
a connection due to the charset problem.
If you are using MySQL-4.1 or newer, there is no practical difference
between 1.2.1 and 1.2.1_p2, and you don't need to upgrade.
=====================
What's new in 1.2.1
=====================
Switched to Subversion. Was going to do this for 1.3, but a
SourceForge CVS outage has forced the issue.
Mapped a lot of new 4.1 and 5.0 error codes to Python exceptions
Added an API call for mysql_set_character_set(charset) (MySQL > 5.0.7)
Added an API call for mysql_get_character_set_info() (MySQL > 5.0.10)
Revamped the build system. Edit site.cfg if necessary (probably not
in most cases)
Python-2.3 is now the minimum version.
Dropped support for mx.Datetime and stringtimes; always uses Python
datetime module now.
Improved unit tests
New connect() options:
* charset: sets character set, implies use_unicode
* sql_mode: sets SQL mode (i.e. ANSI, etc.; see MySQL docs)
When using MySQL-4.1 or newer, enables MULTI_STATEMENTS
When using MySQL-5.0 or newer, enables MULTI_RESULTS
When using MySQL-4.1 or newer, more detailed warning messages
are produced
SET columns returned as Python Set types; you can pass a Set as
a parameter to cursor.execute().
Support for the new MySQL-5.0 DECIMAL implementation
Support for Python Decimal type
Some use of weak references internally. Cursors no longer leak
if you don't close them. Connections still do, unfortunately.
ursor.fetchXXXDict() methods raise DeprecationWarning
cursor.begin() is making a brief reappearence.
cursor.callproc() now works, with some limitations.
================================================
FILE: INSTALL
================================================
====================
MySQLdb Installation
====================
.. contents::
..
Prerequisites
-------------
+ Python 2.3.4 or higher
* http://www.python.org/
* Versions lower than 2.3 WON'T WORK.
* 2.4 is the primary test environment.
* Red Hat Linux:
- Make sure you have the Python development headers and libraries
(python-devel).
+ setuptools
* http://pypi.python.org/pypi/setuptools
+ MySQL 3.23.32 or higher
* http://www.mysql.com/downloads/
* Versions lower than 3.22 definitely WON'T WORK.
* Versions lower than 3.22.19 might not work.
* MySQL-3.22 might work but isn't supported anymore. It's very old.
* MySQL-3.23 ought to work, but it's pretty elderly.
* MySQL-4.0 is supported, but not tested and slightly discouraged.
* MySQL-4.1 is supported. The prepared statements API is not
supported, and won't be until MySQLdb-1.3 or 2.0, if ever.
* MySQL-5.0 is supported and tested, including stored procedures.
* MySQL-5.1 is supported (currently a release candidate) but untested.
It should work.
* MySQL-6.0 is sorta-kinda-supported (currently alpha) but untested.
It should work.
* Drizzle <https://launchpad.net/drizzle> is a fork of MySQL. So far
the C API looks really similar except everything is renamed.
Drizzle support probably won't happen in 1.2. There may be have to
be an entirely different module, but still using DB-API.
* MaxDB, formerly known as SAP DB (and maybe Adabas D?), is a
completely different animal. Use the sapdb.sql module that comes
with MaxDB.
* Red Hat Linux packages:
- mysql-devel to compile
- mysql and/or mysql-devel to run
* MySQL.com RPM packages:
- MySQL-devel to compile
- MySQL-shared if you want to use their shared
library. Otherwise you'll get a statically-linked module,
which may or may not be what you want.
- MySQL-shared to run if you compiled with MySQL-shared installed
* Transactions (particularly InnoDB tables) are supported for
MySQL-3.23 and up. You may need a special package from your vendor
with this support turned on.
+ zlib
* Required for MySQL-3.23 and newer.
* Red Hat Linux
- zlib-devel to compile
- zlib to run
+ openssl
* May be needed for MySQL-4.0 or newer, depending on compilation
options. If you need it, you probably already have it.
- you may need openssl-devel on some platforms
+ C compiler
* Most free software-based systems already have this, usually gcc.
* Most commercial UNIX platforms also come with a C compiler, or
you can also use gcc.
* If you have some Windows flavor, you usually have to pay extra
for this, or you can use Cygwin_.
.. _Cygwin: http://www.cygwin.com/
Building and installing
-----------------------
The setup.py script uses mysql_config to find all compiler and linker
options, and should work as is on any POSIX-like platform, so long as
mysql_config is in your path.
Depending on which version of MySQL you have, you may have the option
of using three different client libraries. To select the client library,
edit the [options] section of site.cfg:
embedded
use embedded server library (libmysqld) if True; otherwise use
one of the client libraries (default).
threadsafe
thread-safe client library (libmysqlclient_r) if True (default);
otherwise use non-thread-safe (libmysqlclient). You should
always use the thread-safe library if you have the option;
otherwise you *may* have problems.
static
if True, try to link against a static library; otherwise link
against dynamic libraries (default). You may need static linking
to use the embedded server.
Finally, putting it together::
$ tar xfz MySQL-python-1.2.1.tar.gz
$ cd MySQL-python-1.2.1
$ # edit site.cfg if necessary
$ python setup.py build
$ sudo python setup.py install # or su first
Windows
.......
I don't do Windows. However if someone provides me with a package for
Windows, I'll make it available. Don't ask me for help with Windows
because I can't help you.
Generally, though, running setup.py is similar to above::
C:\...> python setup.py install
C:\...> python setup.py bdist_wininst
The latter example should build a Windows installer package, if you
have the correct tools. In any event, you *must* have a C compiler.
Additionally, you have to set an environment variable (mysqlroot)
which is the path to your MySQL installation. In theory, it would be
possible to get this information out of the registry, but like I said,
I don't do Windows, but I'll accept a patch that does this.
On Windows, you will definitely have to edit site.cfg since there is
no mysql_config in the MySQL package.
Zope
....
If you are using a binary package of Zope, you need run setup.py with
the python executable that came with Zope. Otherwise, you'll install
into the wrong Python tree and Zope (ZMySQLDA) will not be able to
find _mysql.
Binary Packages
---------------
I don't plan to make binary packages any more. However, if someone
contributes one, I will make it available. Several OS vendors have
their own packages available.
RPMs
....
If you prefer to install RPMs, you can use the bdist_rpm command with
setup.py. This only builds the RPM; it does not install it. You may
want to use the --python=XXX option, where XXX is the name of the
Python executable, i.e. python, python2, python2.4; the default is
python. Using this will incorporate the Python executable name into
the package name for the RPM so you have install the package multiple
times if you need to support more than one version of Python. You can
also set this in setup.cfg.
Red Hat Linux
.............
MySQL-python is pre-packaged in Red Hat Linux 7.x and newer. This
includes Fedora Core and Red Hat Enterprise Linux. You can also
build your own RPM packages as described above.
Debian GNU/Linux
................
Packaged as `python-mysqldb`_::
# apt-get install python-mysqldb
Or use Synaptic.
.. _`python-mysqldb`: http://packages.debian.org/python-mysqldb
Ubuntu
......
Same as with Debian.
Gentoo Linux
............
Packaged as `mysql-python`_. ::
# emerge sync
# emerge mysql-python
# emerge zmysqlda # if you use Zope
.. _`mysql-python`: http://packages.gentoo.org/search/?sstring=mysql-python
BSD
...
MySQL-python is a ported package in FreeBSD, NetBSD, and OpenBSD,
although the name may vary to match OS conventions.
License
-------
GPL or the original license based on Python 1.5.2's license.
:Author: Andy Dustman <andy@dustman.net>
:Revision: $Id$
================================================
FILE: MANIFEST.in
================================================
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 pymemcompat.h
include metadata.cfg
include site.cfg
include setup_common.py
include setup_posix.py
include setup_windows.py
================================================
FILE: MySQLdb/__init__.py
================================================
"""MySQLdb - A DB API v2.0 compatible interface to MySQL.
This package is a wrapper around _mysql, which mostly implements the
MySQL C API.
connect() -- connects to server
See the C API specification and the MySQL documentation for more info
on other items.
For information on how MySQLdb handles type conversion, see the
MySQLdb.converters module.
"""
__revision__ = """$Revision$"""[11:-2]
from MySQLdb.release import __version__, version_info, __author__
import _mysql
if version_info != _mysql.version_info:
raise ImportError("this is MySQLdb version %s, but _mysql is version %r" %
(version_info, _mysql.version_info))
threadsafety = 1
apilevel = "2.0"
paramstyle = "format"
from _mysql import *
from MySQLdb.constants import FIELD_TYPE
from MySQLdb.times import Date, Time, Timestamp, \
DateFromTicks, TimeFromTicks, TimestampFromTicks
try:
frozenset
except NameError:
from sets import ImmutableSet as frozenset
class DBAPISet(frozenset):
"""A special type of set for which A == x is true if A is a
DBAPISet and x is a member of that set."""
def __eq__(self, other):
if isinstance(other, DBAPISet):
return not self.difference(other)
return other in self
STRING = DBAPISet([FIELD_TYPE.ENUM, FIELD_TYPE.STRING,
FIELD_TYPE.VAR_STRING])
BINARY = DBAPISet([FIELD_TYPE.BLOB, FIELD_TYPE.LONG_BLOB,
FIELD_TYPE.MEDIUM_BLOB, FIELD_TYPE.TINY_BLOB])
NUMBER = DBAPISet([FIELD_TYPE.DECIMAL, FIELD_TYPE.DOUBLE, FIELD_TYPE.FLOAT,
FIELD_TYPE.INT24, FIELD_TYPE.LONG, FIELD_TYPE.LONGLONG,
FIELD_TYPE.TINY, FIELD_TYPE.YEAR])
DATE = DBAPISet([FIELD_TYPE.DATE, FIELD_TYPE.NEWDATE])
TIME = DBAPISet([FIELD_TYPE.TIME])
TIMESTAMP = DBAPISet([FIELD_TYPE.TIMESTAMP, FIELD_TYPE.DATETIME])
DATETIME = TIMESTAMP
ROWID = DBAPISet()
def test_DBAPISet_set_equality():
assert STRING == STRING
def test_DBAPISet_set_inequality():
assert STRING != NUMBER
def test_DBAPISet_set_equality_membership():
assert FIELD_TYPE.VAR_STRING == STRING
def test_DBAPISet_set_inequality_membership():
assert FIELD_TYPE.DATE != STRING
def Binary(x):
return str(x)
def Connect(*args, **kwargs):
"""Factory function for connections.Connection."""
from MySQLdb.connections import Connection
return Connection(*args, **kwargs)
connect = Connection = Connect
__all__ = [ 'BINARY', 'Binary', 'Connect', 'Connection', 'DATE',
'Date', 'Time', 'Timestamp', 'DateFromTicks', 'TimeFromTicks',
'TimestampFromTicks', 'DataError', 'DatabaseError', 'Error',
'FIELD_TYPE', 'IntegrityError', 'InterfaceError', 'InternalError',
'MySQLError', 'NULL', 'NUMBER', 'NotSupportedError', 'DBAPISet',
'OperationalError', 'ProgrammingError', 'ROWID', 'STRING', 'TIME',
'TIMESTAMP', 'Warning', 'apilevel', 'connect', 'connections',
'constants', 'converters', 'cursors', 'debug', 'escape', 'escape_dict',
'escape_sequence', 'escape_string', 'get_client_info',
'paramstyle', 'string_literal', 'threadsafety', 'version_info']
================================================
FILE: MySQLdb/connections.py
================================================
"""
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.
"""
from MySQLdb import cursors
from _mysql_exceptions import Warning, Error, InterfaceError, DataError, \
DatabaseError, OperationalError, IntegrityError, InternalError, \
NotSupportedError, ProgrammingError
import types, _mysql
import re
def defaulterrorhandler(connection, cursor, errorclass, errorvalue):
"""
If cursor is not None, (errorclass, errorvalue) is appended to
cursor.messages; otherwise it is appended to
connection.messages. Then errorclass is raised with errorvalue as
the value.
You can override this with your own error handler by assigning it
to the instance.
"""
error = errorclass, errorvalue
if cursor:
cursor.messages.append(error)
else:
connection.messages.append(error)
del cursor
del connection
raise errorclass, errorvalue
re_numeric_part = re.compile(r"^(\d+)")
def numeric_part(s):
"""Returns the leading numeric part of a string.
>>> numeric_part("20-alpha")
20
>>> numeric_part("foo")
>>> numeric_part("16b")
16
"""
m = re_numeric_part.match(s)
if m:
return int(m.group(1))
return None
class Connection(_mysql.connection):
"""MySQL Database Connection Object"""
default_cursor = cursors.Cursor
def __init__(self, *args, **kwargs):
"""
Create a connection to the database. It is strongly recommended
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.
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.
There are a number of undocumented, non-standard methods. See the
documentation for the MySQL C API for some hints on what they do.
"""
from MySQLdb.constants import CLIENT, FIELD_TYPE
from MySQLdb.converters import conversions
from weakref import proxy
kwargs2 = kwargs.copy()
if 'conv' in kwargs:
conv = kwargs['conv']
else:
conv = conversions
conv2 = {}
for k, v in conv.items():
if isinstance(k, int) and isinstance(v, list):
conv2[k] = v[:]
else:
conv2[k] = v
kwargs2['conv'] = conv2
cursorclass = kwargs2.pop('cursorclass', self.default_cursor)
charset = kwargs2.pop('charset', '')
if charset:
use_unicode = True
else:
use_unicode = False
use_unicode = kwargs2.pop('use_unicode', use_unicode)
sql_mode = kwargs2.pop('sql_mode', '')
client_flag = kwargs.get('client_flag', 0)
client_version = tuple([ numeric_part(n) for n in _mysql.get_client_info().split('.')[:2] ])
if client_version >= (4, 1):
client_flag |= CLIENT.MULTI_STATEMENTS
if client_version >= (5, 0):
client_flag |= CLIENT.MULTI_RESULTS
kwargs2['client_flag'] = client_flag
# PEP-249 requires autocommit to be initially off
autocommit = kwargs2.pop('autocommit', False)
super(Connection, self).__init__(*args, **kwargs2)
self.cursorclass = cursorclass
self.encoders = dict([ (k, v) for k, v in conv.items()
if type(k) is not int ])
self._server_version = tuple([ numeric_part(n) for n in self.get_server_info().split('.')[:2] ])
db = proxy(self)
def _get_string_literal():
def string_literal(obj, dummy=None):
return db.string_literal(obj)
return string_literal
def _get_unicode_literal():
def unicode_literal(u, dummy=None):
return db.literal(u.encode(unicode_literal.charset))
return unicode_literal
def _get_string_decoder():
def string_decoder(s):
return s.decode(string_decoder.charset)
return string_decoder
string_literal = _get_string_literal()
self.unicode_literal = unicode_literal = _get_unicode_literal()
self.string_decoder = string_decoder = _get_string_decoder()
if not charset:
charset = self.character_set_name()
self.set_character_set(charset)
if sql_mode:
self.set_sql_mode(sql_mode)
if use_unicode:
self.converter[FIELD_TYPE.STRING].append((None, string_decoder))
self.converter[FIELD_TYPE.VAR_STRING].append((None, string_decoder))
self.converter[FIELD_TYPE.VARCHAR].append((None, string_decoder))
self.converter[FIELD_TYPE.BLOB].append((None, string_decoder))
self.encoders[types.StringType] = string_literal
self.encoders[types.UnicodeType] = unicode_literal
self._transactional = self.server_capabilities & CLIENT.TRANSACTIONS
if self._transactional:
if autocommit is not None:
self.autocommit(autocommit)
self.messages = []
def autocommit(self, on):
on = bool(on)
if self.get_autocommit() != on:
_mysql.connection.autocommit(self, on)
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 __enter__(self):
if self.get_autocommit():
self.query("BEGIN")
return self.cursor()
def __exit__(self, exc, value, tb):
if exc:
self.rollback()
else:
self.commit()
def literal(self, o):
"""
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.
"""
return self.escape(o, self.encoders)
def begin(self):
"""Explicitly begin a connection. Non-standard.
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",
DeprecationWarning, 2)
self.query("BEGIN")
if not hasattr(_mysql.connection, 'warning_count'):
def warning_count(self):
"""Return the number of warnings generated from the
last query. This is derived from the info() method."""
from string import atoi
info = self.info()
if info:
return atoi(info.split()[-1])
else:
return 0
def set_character_set(self, charset):
"""Set the connection character set to charset. The character
set can only be changed in MySQL-4.1 and newer. If you try
to change the character set from the current value in an
older version, NotSupportedError will be raised."""
if charset == "utf8mb4":
py_charset = "utf8"
else:
py_charset = charset
if self.character_set_name() != charset:
try:
super(Connection, self).set_character_set(charset)
except AttributeError:
if self._server_version < (4, 1):
raise NotSupportedError("server is too old to set charset")
self.query('SET NAMES %s' % charset)
self.store_result()
self.string_decoder.charset = py_charset
self.unicode_literal.charset = py_charset
def set_sql_mode(self, sql_mode):
"""Set the connection sql_mode. See MySQL documentation for
legal values."""
if self._server_version < (4, 1):
raise NotSupportedError("server is too old to set sql_mode")
self.query("SET SESSION sql_mode='%s'" % sql_mode)
self.store_result()
def show_warnings(self):
"""Return detailed information about warnings as a
sequence of tuples of (Level, Code, Message). This
is only supported in MySQL-4.1 and up. If your server
is an earlier version, an empty sequence is returned."""
if self._server_version < (4,1): return ()
self.query("SHOW WARNINGS")
r = self.store_result()
warnings = r.fetch_row(0)
return warnings
Warning = Warning
Error = Error
InterfaceError = InterfaceError
DatabaseError = DatabaseError
DataError = DataError
OperationalError = OperationalError
IntegrityError = IntegrityError
InternalError = InternalError
ProgrammingError = ProgrammingError
NotSupportedError = NotSupportedError
errorhandler = defaulterrorhandler
================================================
FILE: MySQLdb/constants/CLIENT.py
================================================
"""MySQL CLIENT constants
These constants are used when creating the connection. Use bitwise-OR
(|) to combine options together, and pass them as the client_flags
parameter to MySQLdb.Connection. For more information on these flags,
see the MySQL C API documentation for mysql_real_connect().
"""
LONG_PASSWORD = 1
FOUND_ROWS = 2
LONG_FLAG = 4
CONNECT_WITH_DB = 8
NO_SCHEMA = 16
COMPRESS = 32
ODBC = 64
LOCAL_FILES = 128
IGNORE_SPACE = 256
CHANGE_USER = 512
INTERACTIVE = 1024
SSL = 2048
IGNORE_SIGPIPE = 4096
TRANSACTIONS = 8192 # mysql_com.h was WRONG prior to 3.23.35
RESERVED = 16384
SECURE_CONNECTION = 32768
MULTI_STATEMENTS = 65536
MULTI_RESULTS = 131072
================================================
FILE: MySQLdb/constants/CR.py
================================================
"""MySQL Connection Errors
Nearly all of these raise OperationalError. COMMANDS_OUT_OF_SYNC
raises ProgrammingError.
"""
MIN_ERROR = 2000
MAX_ERROR = 2999
UNKNOWN_ERROR = 2000
SOCKET_CREATE_ERROR = 2001
CONNECTION_ERROR = 2002
CONN_HOST_ERROR = 2003
IPSOCK_ERROR = 2004
UNKNOWN_HOST = 2005
SERVER_GONE_ERROR = 2006
VERSION_ERROR = 2007
OUT_OF_MEMORY = 2008
WRONG_HOST_INFO = 2009
LOCALHOST_CONNECTION = 2010
TCP_CONNECTION = 2011
SERVER_HANDSHAKE_ERR = 2012
SERVER_LOST = 2013
COMMANDS_OUT_OF_SYNC = 2014
NAMEDPIPE_CONNECTION = 2015
NAMEDPIPEWAIT_ERROR = 2016
NAMEDPIPEOPEN_ERROR = 2017
NAMEDPIPESETSTATE_ERROR = 2018
CANT_READ_CHARSET = 2019
NET_PACKET_TOO_LARGE = 2020
================================================
FILE: MySQLdb/constants/ER.py
================================================
"""MySQL ER Constants
These constants are error codes for the bulk of the error conditions
that may occur.
"""
HASHCHK = 1000
NISAMCHK = 1001
NO = 1002
YES = 1003
CANT_CREATE_FILE = 1004
CANT_CREATE_TABLE = 1005
CANT_CREATE_DB = 1006
DB_CREATE_EXISTS = 1007
DB_DROP_EXISTS = 1008
DB_DROP_DELETE = 1009
DB_DROP_RMDIR = 1010
CANT_DELETE_FILE = 1011
CANT_FIND_SYSTEM_REC = 1012
CANT_GET_STAT = 1013
CANT_GET_WD = 1014
CANT_LOCK = 1015
CANT_OPEN_FILE = 1016
FILE_NOT_FOUND = 1017
CANT_READ_DIR = 1018
CANT_SET_WD = 1019
CHECKREAD = 1020
DISK_FULL = 1021
DUP_KEY = 1022
ERROR_ON_CLOSE = 1023
ERROR_ON_READ = 1024
ERROR_ON_RENAME = 1025
ERROR_ON_WRITE = 1026
FILE_USED = 1027
FILSORT_ABORT = 1028
FORM_NOT_FOUND = 1029
GET_ERRNO = 1030
ILLEGAL_HA = 1031
KEY_NOT_FOUND = 1032
NOT_FORM_FILE = 1033
NOT_KEYFILE = 1034
OLD_KEYFILE = 1035
OPEN_AS_READONLY = 1036
OUTOFMEMORY = 1037
OUT_OF_SORTMEMORY = 1038
UNEXPECTED_EOF = 1039
CON_COUNT_ERROR = 1040
OUT_OF_RESOURCES = 1041
BAD_HOST_ERROR = 1042
HANDSHAKE_ERROR = 1043
DBACCESS_DENIED_ERROR = 1044
ACCESS_DENIED_ERROR = 1045
NO_DB_ERROR = 1046
UNKNOWN_COM_ERROR = 1047
BAD_NULL_ERROR = 1048
BAD_DB_ERROR = 1049
TABLE_EXISTS_ERROR = 1050
BAD_TABLE_ERROR = 1051
NON_UNIQ_ERROR = 1052
SERVER_SHUTDOWN = 1053
BAD_FIELD_ERROR = 1054
WRONG_FIELD_WITH_GROUP = 1055
WRONG_GROUP_FIELD = 1056
WRONG_SUM_SELECT = 1057
WRONG_VALUE_COUNT = 1058
TOO_LONG_IDENT = 1059
DUP_FIELDNAME = 1060
DUP_KEYNAME = 1061
DUP_ENTRY = 1062
WRONG_FIELD_SPEC = 1063
PARSE_ERROR = 1064
EMPTY_QUERY = 1065
NONUNIQ_TABLE = 1066
INVALID_DEFAULT = 1067
MULTIPLE_PRI_KEY = 1068
TOO_MANY_KEYS = 1069
TOO_MANY_KEY_PARTS = 1070
TOO_LONG_KEY = 1071
KEY_COLUMN_DOES_NOT_EXITS = 1072
BLOB_USED_AS_KEY = 1073
TOO_BIG_FIELDLENGTH = 1074
WRONG_AUTO_KEY = 1075
READY = 1076
NORMAL_SHUTDOWN = 1077
GOT_SIGNAL = 1078
SHUTDOWN_COMPLETE = 1079
FORCING_CLOSE = 1080
IPSOCK_ERROR = 1081
NO_SUCH_INDEX = 1082
WRONG_FIELD_TERMINATORS = 1083
BLOBS_AND_NO_TERMINATED = 1084
TEXTFILE_NOT_READABLE = 1085
FILE_EXISTS_ERROR = 1086
LOAD_INFO = 1087
ALTER_INFO = 1088
WRONG_SUB_KEY = 1089
CANT_REMOVE_ALL_FIELDS = 1090
CANT_DROP_FIELD_OR_KEY = 1091
INSERT_INFO = 1092
INSERT_TABLE_USED = 1093
NO_SUCH_THREAD = 1094
KILL_DENIED_ERROR = 1095
NO_TABLES_USED = 1096
TOO_BIG_SET = 1097
NO_UNIQUE_LOGFILE = 1098
TABLE_NOT_LOCKED_FOR_WRITE = 1099
TABLE_NOT_LOCKED = 1100
BLOB_CANT_HAVE_DEFAULT = 1101
WRONG_DB_NAME = 1102
WRONG_TABLE_NAME = 1103
TOO_BIG_SELECT = 1104
UNKNOWN_ERROR = 1105
UNKNOWN_PROCEDURE = 1106
WRONG_PARAMCOUNT_TO_PROCEDURE = 1107
WRONG_PARAMETERS_TO_PROCEDURE = 1108
UNKNOWN_TABLE = 1109
FIELD_SPECIFIED_TWICE = 1110
INVALID_GROUP_FUNC_USE = 1111
UNSUPPORTED_EXTENSION = 1112
TABLE_MUST_HAVE_COLUMNS = 1113
RECORD_FILE_FULL = 1114
UNKNOWN_CHARACTER_SET = 1115
TOO_MANY_TABLES = 1116
TOO_MANY_FIELDS = 1117
TOO_BIG_ROWSIZE = 1118
STACK_OVERRUN = 1119
WRONG_OUTER_JOIN = 1120
NULL_COLUMN_IN_INDEX = 1121
CANT_FIND_UDF = 1122
CANT_INITIALIZE_UDF = 1123
UDF_NO_PATHS = 1124
UDF_EXISTS = 1125
CANT_OPEN_LIBRARY = 1126
CANT_FIND_DL_ENTRY = 1127
FUNCTION_NOT_DEFINED = 1128
HOST_IS_BLOCKED = 1129
HOST_NOT_PRIVILEGED = 1130
PASSWORD_ANONYMOUS_USER = 1131
PASSWORD_NOT_ALLOWED = 1132
PASSWORD_NO_MATCH = 1133
UPDATE_INFO = 1134
CANT_CREATE_THREAD = 1135
WRONG_VALUE_COUNT_ON_ROW = 1136
CANT_REOPEN_TABLE = 1137
INVALID_USE_OF_NULL = 1138
REGEXP_ERROR = 1139
MIX_OF_GROUP_FUNC_AND_FIELDS = 1140
NONEXISTING_GRANT = 1141
TABLEACCESS_DENIED_ERROR = 1142
COLUMNACCESS_DENIED_ERROR = 1143
ILLEGAL_GRANT_FOR_TABLE = 1144
GRANT_WRONG_HOST_OR_USER = 1145
NO_SUCH_TABLE = 1146
NONEXISTING_TABLE_GRANT = 1147
NOT_ALLOWED_COMMAND = 1148
SYNTAX_ERROR = 1149
DELAYED_CANT_CHANGE_LOCK = 1150
TOO_MANY_DELAYED_THREADS = 1151
ABORTING_CONNECTION = 1152
NET_PACKET_TOO_LARGE = 1153
NET_READ_ERROR_FROM_PIPE = 1154
NET_FCNTL_ERROR = 1155
NET_PACKETS_OUT_OF_ORDER = 1156
NET_UNCOMPRESS_ERROR = 1157
NET_READ_ERROR = 1158
NET_READ_INTERRUPTED = 1159
NET_ERROR_ON_WRITE = 1160
NET_WRITE_INTERRUPTED = 1161
TOO_LONG_STRING = 1162
TABLE_CANT_HANDLE_BLOB = 1163
TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164
DELAYED_INSERT_TABLE_LOCKED = 1165
WRONG_COLUMN_NAME = 1166
WRONG_KEY_COLUMN = 1167
WRONG_MRG_TABLE = 1168
DUP_UNIQUE = 1169
BLOB_KEY_WITHOUT_LENGTH = 1170
PRIMARY_CANT_HAVE_NULL = 1171
TOO_MANY_ROWS = 1172
REQUIRES_PRIMARY_KEY = 1173
NO_RAID_COMPILED = 1174
UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175
KEY_DOES_NOT_EXITS = 1176
CHECK_NO_SUCH_TABLE = 1177
CHECK_NOT_IMPLEMENTED = 1178
CANT_DO_THIS_DURING_AN_TRANSACTION = 1179
ERROR_DURING_COMMIT = 1180
ERROR_DURING_ROLLBACK = 1181
ERROR_DURING_FLUSH_LOGS = 1182
ERROR_DURING_CHECKPOINT = 1183
NEW_ABORTING_CONNECTION = 1184
DUMP_NOT_IMPLEMENTED = 1185
FLUSH_MASTER_BINLOG_CLOSED = 1186
INDEX_REBUILD = 1187
MASTER = 1188
MASTER_NET_READ = 1189
MASTER_NET_WRITE = 1190
FT_MATCHING_KEY_NOT_FOUND = 1191
LOCK_OR_ACTIVE_TRANSACTION = 1192
UNKNOWN_SYSTEM_VARIABLE = 1193
CRASHED_ON_USAGE = 1194
CRASHED_ON_REPAIR = 1195
WARNING_NOT_COMPLETE_ROLLBACK = 1196
TRANS_CACHE_FULL = 1197
SLAVE_MUST_STOP = 1198
SLAVE_NOT_RUNNING = 1199
BAD_SLAVE = 1200
MASTER_INFO = 1201
SLAVE_THREAD = 1202
TOO_MANY_USER_CONNECTIONS = 1203
SET_CONSTANTS_ONLY = 1204
LOCK_WAIT_TIMEOUT = 1205
LOCK_TABLE_FULL = 1206
READ_ONLY_TRANSACTION = 1207
DROP_DB_WITH_READ_LOCK = 1208
CREATE_DB_WITH_READ_LOCK = 1209
WRONG_ARGUMENTS = 1210
NO_PERMISSION_TO_CREATE_USER = 1211
UNION_TABLES_IN_DIFFERENT_DIR = 1212
LOCK_DEADLOCK = 1213
TABLE_CANT_HANDLE_FT = 1214
CANNOT_ADD_FOREIGN = 1215
NO_REFERENCED_ROW = 1216
ROW_IS_REFERENCED = 1217
CONNECT_TO_MASTER = 1218
QUERY_ON_MASTER = 1219
ERROR_WHEN_EXECUTING_COMMAND = 1220
WRONG_USAGE = 1221
WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222
CANT_UPDATE_WITH_READLOCK = 1223
MIXING_NOT_ALLOWED = 1224
DUP_ARGUMENT = 1225
USER_LIMIT_REACHED = 1226
SPECIFIC_ACCESS_DENIED_ERROR = 1227
LOCAL_VARIABLE = 1228
GLOBAL_VARIABLE = 1229
NO_DEFAULT = 1230
WRONG_VALUE_FOR_VAR = 1231
WRONG_TYPE_FOR_VAR = 1232
VAR_CANT_BE_READ = 1233
CANT_USE_OPTION_HERE = 1234
NOT_SUPPORTED_YET = 1235
MASTER_FATAL_ERROR_READING_BINLOG = 1236
SLAVE_IGNORED_TABLE = 1237
INCORRECT_GLOBAL_LOCAL_VAR = 1238
WRONG_FK_DEF = 1239
KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240
OPERAND_COLUMNS = 1241
SUBQUERY_NO_1_ROW = 1242
UNKNOWN_STMT_HANDLER = 1243
CORRUPT_HELP_DB = 1244
CYCLIC_REFERENCE = 1245
AUTO_CONVERT = 1246
ILLEGAL_REFERENCE = 1247
DERIVED_MUST_HAVE_ALIAS = 1248
SELECT_REDUCED = 1249
TABLENAME_NOT_ALLOWED_HERE = 1250
NOT_SUPPORTED_AUTH_MODE = 1251
SPATIAL_CANT_HAVE_NULL = 1252
COLLATION_CHARSET_MISMATCH = 1253
SLAVE_WAS_RUNNING = 1254
SLAVE_WAS_NOT_RUNNING = 1255
TOO_BIG_FOR_UNCOMPRESS = 1256
ZLIB_Z_MEM_ERROR = 1257
ZLIB_Z_BUF_ERROR = 1258
ZLIB_Z_DATA_ERROR = 1259
CUT_VALUE_GROUP_CONCAT = 1260
WARN_TOO_FEW_RECORDS = 1261
WARN_TOO_MANY_RECORDS = 1262
WARN_NULL_TO_NOTNULL = 1263
WARN_DATA_OUT_OF_RANGE = 1264
WARN_DATA_TRUNCATED = 1265
WARN_USING_OTHER_HANDLER = 1266
CANT_AGGREGATE_2COLLATIONS = 1267
DROP_USER = 1268
REVOKE_GRANTS = 1269
CANT_AGGREGATE_3COLLATIONS = 1270
CANT_AGGREGATE_NCOLLATIONS = 1271
VARIABLE_IS_NOT_STRUCT = 1272
UNKNOWN_COLLATION = 1273
SLAVE_IGNORED_SSL_PARAMS = 1274
SERVER_IS_IN_SECURE_AUTH_MODE = 1275
WARN_FIELD_RESOLVED = 1276
BAD_SLAVE_UNTIL_COND = 1277
MISSING_SKIP_SLAVE = 1278
UNTIL_COND_IGNORED = 1279
WRONG_NAME_FOR_INDEX = 1280
WRONG_NAME_FOR_CATALOG = 1281
WARN_QC_RESIZE = 1282
BAD_FT_COLUMN = 1283
UNKNOWN_KEY_CACHE = 1284
WARN_HOSTNAME_WONT_WORK = 1285
UNKNOWN_STORAGE_ENGINE = 1286
WARN_DEPRECATED_SYNTAX = 1287
NON_UPDATABLE_TABLE = 1288
FEATURE_DISABLED = 1289
OPTION_PREVENTS_STATEMENT = 1290
DUPLICATED_VALUE_IN_TYPE = 1291
TRUNCATED_WRONG_VALUE = 1292
TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293
INVALID_ON_UPDATE = 1294
UNSUPPORTED_PS = 1295
GET_ERRMSG = 1296
GET_TEMPORARY_ERRMSG = 1297
UNKNOWN_TIME_ZONE = 1298
WARN_INVALID_TIMESTAMP = 1299
INVALID_CHARACTER_STRING = 1300
WARN_ALLOWED_PACKET_OVERFLOWED = 1301
CONFLICTING_DECLARATIONS = 1302
SP_NO_RECURSIVE_CREATE = 1303
SP_ALREADY_EXISTS = 1304
SP_DOES_NOT_EXIST = 1305
SP_DROP_FAILED = 1306
SP_STORE_FAILED = 1307
SP_LILABEL_MISMATCH = 1308
SP_LABEL_REDEFINE = 1309
SP_LABEL_MISMATCH = 1310
SP_UNINIT_VAR = 1311
SP_BADSELECT = 1312
SP_BADRETURN = 1313
SP_BADSTATEMENT = 1314
UPDATE_LOG_DEPRECATED_IGNORED = 1315
UPDATE_LOG_DEPRECATED_TRANSLATED = 1316
QUERY_INTERRUPTED = 1317
SP_WRONG_NO_OF_ARGS = 1318
SP_COND_MISMATCH = 1319
SP_NORETURN = 1320
SP_NORETURNEND = 1321
SP_BAD_CURSOR_QUERY = 1322
SP_BAD_CURSOR_SELECT = 1323
SP_CURSOR_MISMATCH = 1324
SP_CURSOR_ALREADY_OPEN = 1325
SP_CURSOR_NOT_OPEN = 1326
SP_UNDECLARED_VAR = 1327
SP_WRONG_NO_OF_FETCH_ARGS = 1328
SP_FETCH_NO_DATA = 1329
SP_DUP_PARAM = 1330
SP_DUP_VAR = 1331
SP_DUP_COND = 1332
SP_DUP_CURS = 1333
SP_CANT_ALTER = 1334
SP_SUBSELECT_NYI = 1335
STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336
SP_VARCOND_AFTER_CURSHNDLR = 1337
SP_CURSOR_AFTER_HANDLER = 1338
SP_CASE_NOT_FOUND = 1339
FPARSER_TOO_BIG_FILE = 1340
FPARSER_BAD_HEADER = 1341
FPARSER_EOF_IN_COMMENT = 1342
FPARSER_ERROR_IN_PARAMETER = 1343
FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344
VIEW_NO_EXPLAIN = 1345
FRM_UNKNOWN_TYPE = 1346
WRONG_OBJECT = 1347
NONUPDATEABLE_COLUMN = 1348
VIEW_SELECT_DERIVED = 1349
VIEW_SELECT_CLAUSE = 1350
VIEW_SELECT_VARIABLE = 1351
VIEW_SELECT_TMPTABLE = 1352
VIEW_WRONG_LIST = 1353
WARN_VIEW_MERGE = 1354
WARN_VIEW_WITHOUT_KEY = 1355
VIEW_INVALID = 1356
SP_NO_DROP_SP = 1357
SP_GOTO_IN_HNDLR = 1358
TRG_ALREADY_EXISTS = 1359
TRG_DOES_NOT_EXIST = 1360
TRG_ON_VIEW_OR_TEMP_TABLE = 1361
TRG_CANT_CHANGE_ROW = 1362
TRG_NO_SUCH_ROW_IN_TRG = 1363
NO_DEFAULT_FOR_FIELD = 1364
DIVISION_BY_ZERO = 1365
TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366
ILLEGAL_VALUE_FOR_TYPE = 1367
VIEW_NONUPD_CHECK = 1368
VIEW_CHECK_FAILED = 1369
PROCACCESS_DENIED_ERROR = 1370
RELAY_LOG_FAIL = 1371
PASSWD_LENGTH = 1372
UNKNOWN_TARGET_BINLOG = 1373
IO_ERR_LOG_INDEX_READ = 1374
BINLOG_PURGE_PROHIBITED = 1375
FSEEK_FAIL = 1376
BINLOG_PURGE_FATAL_ERR = 1377
LOG_IN_USE = 1378
LOG_PURGE_UNKNOWN_ERR = 1379
RELAY_LOG_INIT = 1380
NO_BINARY_LOGGING = 1381
RESERVED_SYNTAX = 1382
WSAS_FAILED = 1383
DIFF_GROUPS_PROC = 1384
NO_GROUP_FOR_PROC = 1385
ORDER_WITH_PROC = 1386
LOGGING_PROHIBIT_CHANGING_OF = 1387
NO_FILE_MAPPING = 1388
WRONG_MAGIC = 1389
PS_MANY_PARAM = 1390
KEY_PART_0 = 1391
VIEW_CHECKSUM = 1392
VIEW_MULTIUPDATE = 1393
VIEW_NO_INSERT_FIELD_LIST = 1394
VIEW_DELETE_MERGE_VIEW = 1395
CANNOT_USER = 1396
XAER_NOTA = 1397
XAER_INVAL = 1398
XAER_RMFAIL = 1399
XAER_OUTSIDE = 1400
XAER_RMERR = 1401
XA_RBROLLBACK = 1402
NONEXISTING_PROC_GRANT = 1403
PROC_AUTO_GRANT_FAIL = 1404
PROC_AUTO_REVOKE_FAIL = 1405
DATA_TOO_LONG = 1406
SP_BAD_SQLSTATE = 1407
STARTUP = 1408
LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409
CANT_CREATE_USER_WITH_GRANT = 1410
WRONG_VALUE_FOR_TYPE = 1411
TABLE_DEF_CHANGED = 1412
SP_DUP_HANDLER = 1413
SP_NOT_VAR_ARG = 1414
SP_NO_RETSET = 1415
CANT_CREATE_GEOMETRY_OBJECT = 1416
FAILED_ROUTINE_BREAK_BINLOG = 1417
BINLOG_UNSAFE_ROUTINE = 1418
BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419
EXEC_STMT_WITH_OPEN_CURSOR = 1420
STMT_HAS_NO_OPEN_CURSOR = 1421
COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422
NO_DEFAULT_FOR_VIEW_FIELD = 1423
SP_NO_RECURSION = 1424
TOO_BIG_SCALE = 1425
TOO_BIG_PRECISION = 1426
M_BIGGER_THAN_D = 1427
WRONG_LOCK_OF_SYSTEM_TABLE = 1428
CONNECT_TO_FOREIGN_DATA_SOURCE = 1429
QUERY_ON_FOREIGN_DATA_SOURCE = 1430
FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431
FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432
FOREIGN_DATA_STRING_INVALID = 1433
CANT_CREATE_FEDERATED_TABLE = 1434
TRG_IN_WRONG_SCHEMA = 1435
STACK_OVERRUN_NEED_MORE = 1436
TOO_LONG_BODY = 1437
WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438
TOO_BIG_DISPLAYWIDTH = 1439
XAER_DUPID = 1440
DATETIME_FUNCTION_OVERFLOW = 1441
CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442
VIEW_PREVENT_UPDATE = 1443
PS_NO_RECURSION = 1444
SP_CANT_SET_AUTOCOMMIT = 1445
MALFORMED_DEFINER = 1446
VIEW_FRM_NO_USER = 1447
VIEW_OTHER_USER = 1448
NO_SUCH_USER = 1449
FORBID_SCHEMA_CHANGE = 1450
ROW_IS_REFERENCED_2 = 1451
NO_REFERENCED_ROW_2 = 1452
SP_BAD_VAR_SHADOW = 1453
TRG_NO_DEFINER = 1454
OLD_FILE_FORMAT = 1455
SP_RECURSION_LIMIT = 1456
SP_PROC_TABLE_CORRUPT = 1457
ERROR_LAST = 1457
================================================
FILE: MySQLdb/constants/FIELD_TYPE.py
================================================
"""MySQL FIELD_TYPE Constants
These constants represent the various column (field) types that are
supported by MySQL.
"""
DECIMAL = 0
TINY = 1
SHORT = 2
LONG = 3
FLOAT = 4
DOUBLE = 5
NULL = 6
TIMESTAMP = 7
LONGLONG = 8
INT24 = 9
DATE = 10
TIME = 11
DATETIME = 12
YEAR = 13
NEWDATE = 14
VARCHAR = 15
BIT = 16
NEWDECIMAL = 246
ENUM = 247
SET = 248
TINY_BLOB = 249
MEDIUM_BLOB = 250
LONG_BLOB = 251
BLOB = 252
VAR_STRING = 253
STRING = 254
GEOMETRY = 255
CHAR = TINY
INTERVAL = ENUM
================================================
FILE: MySQLdb/constants/FLAG.py
================================================
"""MySQL FLAG Constants
These flags are used along with the FIELD_TYPE to indicate various
properties of columns in a result set.
"""
NOT_NULL = 1
PRI_KEY = 2
UNIQUE_KEY = 4
MULTIPLE_KEY = 8
BLOB = 16
UNSIGNED = 32
ZEROFILL = 64
BINARY = 128
ENUM = 256
AUTO_INCREMENT = 512
TIMESTAMP = 1024
SET = 2048
NUM = 32768
PART_KEY = 16384
GROUP = 32768
UNIQUE = 65536
================================================
FILE: MySQLdb/constants/REFRESH.py
================================================
"""MySQL REFRESH Constants
These constants seem to mostly deal with things internal to the
MySQL server. Forget you saw this.
"""
GRANT = 1
LOG = 2
TABLES = 4
HOSTS = 8
STATUS = 16
THREADS = 32
SLAVE = 64
MASTER = 128
READ_LOCK = 16384
FAST = 32768
================================================
FILE: MySQLdb/constants/__init__.py
================================================
__all__ = ['CR', 'FIELD_TYPE','CLIENT','REFRESH','ER','FLAG']
================================================
FILE: MySQLdb/converters.py
================================================
"""MySQLdb type conversion module
This module handles all the type conversions for MySQL. If the default
type conversions aren't what you need, you can make your own. The
dictionary conversions maps some kind of type to a conversion function
which returns the corresponding value:
Key: FIELD_TYPE.* (from MySQLdb.constants)
Conversion function:
Arguments: string
Returns: Python object
Key: Python type object (from types) or class
Conversion function:
Arguments: Python object of indicated type or class AND
conversion dictionary
Returns: SQL literal value
Notes: Most conversion functions can ignore the dictionary, but
it is a required parameter. It is necessary for converting
things like sequences and instances.
Don't modify conversions if you can avoid it. Instead, make copies
(with the copy() method), modify the copies, and then pass them to
MySQL.connect().
"""
from _mysql import string_literal, escape_sequence, escape_dict, escape, NULL
from MySQLdb.constants import FIELD_TYPE, FLAG
from MySQLdb.times import *
try:
from types import IntType, LongType, FloatType, NoneType, TupleType, ListType, DictType, InstanceType, \
StringType, UnicodeType, ObjectType, BooleanType, ClassType, TypeType
except ImportError:
# Python 3
long = int
IntType, LongType, FloatType, NoneType = int, long, float, type(None)
TupleType, ListType, DictType, InstanceType = tuple, list, dict, None
StringType, UnicodeType, ObjectType, BooleanType = bytes, str, object, bool
import array
try:
ArrayType = array.ArrayType
except AttributeError:
ArrayType = array.array
try:
set
except NameError:
from sets import Set as set
def Bool2Str(s, d): return str(int(s))
def Str2Set(s):
return set([ i for i in s.split(',') if i ])
def Set2Str(s, d):
return string_literal(','.join(s), d)
def Thing2Str(s, d):
"""Convert something into a string via str()."""
return str(s)
def Unicode2Str(s, d):
"""Convert a unicode object to a string using the default encoding.
This is only used as a placeholder for the real function, which
is connection-dependent."""
return s.encode()
Long2Int = Thing2Str
def Float2Str(o, d):
return '%.15g' % o
def None2NULL(o, d):
"""Convert None to NULL."""
return NULL # duh
def Thing2Literal(o, d):
"""Convert something into a SQL string literal. If using
MySQL-3.23 or newer, string_literal() is a method of the
_mysql.MYSQL object, and this function will be overridden with
that method when the connection is created."""
return string_literal(o, d)
def Instance2Str(o, d):
"""
Convert an Instance to a string representation. If the __str__()
method produces acceptable output, then you don't need to add the
class to conversions; it will be handled by the default
converter. If the exact class is not found in d, it will use the
first class it can find for which o is an instance.
"""
if o.__class__ in d:
return d[o.__class__](o, d)
cl = filter(lambda x,o=o:
type(x) is ClassType
and isinstance(o, x), d.keys())
if not cl:
cl = filter(lambda x,o=o:
type(x) is TypeType
and isinstance(o, x)
and d[x] is not Instance2Str,
d.keys())
if not cl:
return d[StringType](o,d)
d[o.__class__] = d[cl[0]]
return d[cl[0]](o, d)
def char_array(s):
return array.array('c', s)
def array2Str(o, d):
return Thing2Literal(o.tostring(), d)
def quote_tuple(t, d):
return "(%s)" % (','.join(escape_sequence(t, d)))
conversions = {
IntType: Thing2Str,
LongType: Long2Int,
FloatType: Float2Str,
NoneType: None2NULL,
TupleType: quote_tuple,
ListType: quote_tuple,
DictType: escape_dict,
InstanceType: Instance2Str,
ArrayType: array2Str,
StringType: Thing2Literal, # default
UnicodeType: Unicode2Str,
ObjectType: Instance2Str,
BooleanType: Bool2Str,
DateTimeType: DateTime2literal,
DateTimeDeltaType: DateTimeDelta2literal,
set: Set2Str,
FIELD_TYPE.TINY: int,
FIELD_TYPE.SHORT: int,
FIELD_TYPE.LONG: long,
FIELD_TYPE.FLOAT: float,
FIELD_TYPE.DOUBLE: float,
FIELD_TYPE.DECIMAL: float,
FIELD_TYPE.NEWDECIMAL: float,
FIELD_TYPE.LONGLONG: long,
FIELD_TYPE.INT24: int,
FIELD_TYPE.YEAR: int,
FIELD_TYPE.SET: Str2Set,
FIELD_TYPE.TIMESTAMP: mysql_timestamp_converter,
FIELD_TYPE.DATETIME: DateTime_or_None,
FIELD_TYPE.TIME: TimeDelta_or_None,
FIELD_TYPE.DATE: Date_or_None,
FIELD_TYPE.BLOB: [
(FLAG.BINARY, str),
],
FIELD_TYPE.STRING: [
(FLAG.BINARY, str),
],
FIELD_TYPE.VAR_STRING: [
(FLAG.BINARY, str),
],
FIELD_TYPE.VARCHAR: [
(FLAG.BINARY, str),
],
}
try:
from decimal import Decimal
conversions[FIELD_TYPE.DECIMAL] = Decimal
conversions[FIELD_TYPE.NEWDECIMAL] = Decimal
except ImportError:
pass
================================================
FILE: MySQLdb/cursors.py
================================================
"""MySQLdb Cursors
This module implements Cursors of various types for MySQLdb. By
default, MySQLdb uses the Cursor class.
"""
import re
import sys
try:
from types import ListType, TupleType, UnicodeType
except ImportError:
# Python 3
ListType = list
TupleType = tuple
UnicodeType = str
restr = r"""
\s
values
\s*
(
\(
[^()']*
(?:
(?:
(?:\(
# ( - editor hightlighting helper
.*
\))
|
'
[^\\']*
(?:\\.[^\\']*)*
'
)
[^()']*
)*
\)
)
"""
insert_values = re.compile(restr, re.S | re.I | re.X)
from _mysql_exceptions import Warning, Error, InterfaceError, DataError, \
DatabaseError, OperationalError, IntegrityError, InternalError, \
NotSupportedError, ProgrammingError
class BaseCursor(object):
"""A base for Cursor classes. Useful attributes:
description
A tuple of DB API 7-tuples describing the columns in
the last executed query; see PEP-249 for details.
description_flags
Tuple of column flags for last query, one entry per column
in the result set. Values correspond to those in
MySQLdb.constants.FLAG. See MySQL documentation (C API)
for more information. Non-standard extension.
arraysize
default number of rows fetchmany() will fetch
"""
from _mysql_exceptions import MySQLError, Warning, Error, InterfaceError, \
DatabaseError, DataError, OperationalError, IntegrityError, \
InternalError, ProgrammingError, NotSupportedError
_defer_warnings = False
def __init__(self, connection):
from weakref import proxy
self.connection = proxy(connection)
self.description = None
self.description_flags = None
self.rowcount = -1
self.arraysize = 1
self._executed = None
self.lastrowid = None
self.messages = []
self.errorhandler = connection.errorhandler
self._result = None
self._warnings = 0
self._info = None
self.rownumber = None
def __del__(self):
self.close()
self.errorhandler = None
self._result = None
def close(self):
"""Close the cursor. No further queries will be possible."""
if not self.connection: return
while self.nextset(): pass
self.connection = None
def _check_executed(self):
if not self._executed:
self.errorhandler(self, ProgrammingError, "execute() first")
def _warning_check(self):
from warnings import warn
if self._warnings:
warnings = self._get_db().show_warnings()
if warnings:
# This is done in two loops in case
# Warnings are set to raise exceptions.
for w in warnings:
self.messages.append((self.Warning, w))
for w in warnings:
warn(w[-1], self.Warning, 3)
elif self._info:
self.messages.append((self.Warning, self._info))
warn(self._info, self.Warning, 3)
def nextset(self):
"""Advance to the next result set.
Returns None if there are no more result sets.
"""
if self._executed:
self.fetchall()
del self.messages[:]
db = self._get_db()
nr = db.next_result()
if nr == -1:
return None
self._do_get_result()
self._post_get_result()
self._warning_check()
return 1
def _post_get_result(self): pass
def _do_get_result(self):
db = self._get_db()
self._result = self._get_result()
self.rowcount = db.affected_rows()
self.rownumber = 0
self.description = self._result and self._result.describe() or None
self.description_flags = self._result and self._result.field_flags() or None
self.lastrowid = db.insert_id()
self._warnings = db.warning_count()
self._info = db.info()
def setinputsizes(self, *args):
"""Does nothing, required by DB API."""
def setoutputsizes(self, *args):
"""Does nothing, required by DB API."""
def _get_db(self):
if not self.connection:
self.errorhandler(self, ProgrammingError, "cursor closed")
return self.connection
def execute(self, query, args=None):
"""Execute a query.
query -- string, query to execute on server
args -- optional sequence or mapping, parameters to use with query.
Note: If args is a sequence, then %s must be used as the
parameter placeholder in the query. If a mapping is used,
%(key)s must be used as the placeholder.
Returns long integer rows affected, if any
"""
del self.messages[:]
db = self._get_db()
if isinstance(query, unicode):
query = query.encode(db.unicode_literal.charset)
if args is not None:
if isinstance(args, dict):
query = query % dict((key, db.literal(item))
for key, item in args.iteritems())
else:
query = query % tuple([db.literal(item) for item in args])
try:
r = None
r = self._query(query)
except TypeError, m:
if m.args[0] in ("not enough arguments for format string",
"not all arguments converted"):
self.messages.append((ProgrammingError, m.args[0]))
self.errorhandler(self, ProgrammingError, m.args[0])
else:
self.messages.append((TypeError, m))
self.errorhandler(self, TypeError, m)
except (SystemExit, KeyboardInterrupt):
raise
except:
exc, value, tb = sys.exc_info()
del tb
self.messages.append((exc, value))
self.errorhandler(self, exc, value)
self._executed = query
if not self._defer_warnings: self._warning_check()
return r
def executemany(self, query, args):
"""Execute a multi-row query.
query -- string, query to execute on server
args
Sequence of sequences or mappings, parameters to use with
query.
Returns long integer rows affected, if any.
This method improves performance on multiple-row INSERT and
REPLACE. Otherwise it is equivalent to looping over args with
execute().
"""
del self.messages[:]
db = self._get_db()
if not args: return
if isinstance(query, unicode):
query = query.encode(db.unicode_literal.charset)
m = insert_values.search(query)
if not m:
r = 0
for a in args:
r = r + self.execute(query, a)
return r
p = m.start(1)
e = m.end(1)
qv = m.group(1)
try:
q = []
for a in args:
if isinstance(a, dict):
q.append(qv % dict((key, db.literal(item))
for key, item in a.iteritems()))
else:
q.append(qv % tuple([db.literal(item) for item in a]))
except TypeError, msg:
if msg.args[0] in ("not enough arguments for format string",
"not all arguments converted"):
self.errorhandler(self, ProgrammingError, msg.args[0])
else:
self.errorhandler(self, TypeError, msg)
except (SystemExit, KeyboardInterrupt):
raise
except:
exc, value, tb = sys.exc_info()
del tb
self.errorhandler(self, exc, value)
r = self._query('\n'.join([query[:p], ',\n'.join(q), query[e:]]))
if not self._defer_warnings: self._warning_check()
return r
def callproc(self, procname, args=()):
"""Execute stored procedure procname with args
procname -- string, name of procedure to execute on server
args -- Sequence of parameters to use with procedure
Returns the original args.
Compatibility warning: PEP-249 specifies that any modified
parameters must be returned. This is currently impossible
as they are only available by storing them in a server
variable and then retrieved by a query. Since stored
procedures return zero or more result sets, there is no
reliable way to get at OUT or INOUT parameters via callproc.
The server variables are named @_procname_n, where procname
is the parameter above and n is the position of the parameter
(from zero). Once all result sets generated by the procedure
have been fetched, you can issue a SELECT @_procname_0, ...
query using .execute() to get any OUT or INOUT values.
Compatibility warning: The act of calling a stored procedure
itself creates an empty result set. This appears after any
result sets generated by the procedure. This is non-standard
behavior with respect to the DB-API. Be sure to use nextset()
to advance through all result sets; otherwise you may get
disconnected.
"""
db = self._get_db()
for index, arg in enumerate(args):
q = "SET @_%s_%d=%s" % (procname, index,
db.literal(arg))
if isinstance(q, unicode):
q = q.encode(db.unicode_literal.charset)
self._query(q)
self.nextset()
q = "CALL %s(%s)" % (procname,
','.join(['@_%s_%d' % (procname, i)
for i in range(len(args))]))
if type(q) is UnicodeType:
q = q.encode(db.unicode_literal.charset)
self._query(q)
self._executed = q
if not self._defer_warnings: self._warning_check()
return args
def _do_query(self, q):
db = self._get_db()
self._last_executed = q
db.query(q)
self._do_get_result()
return self.rowcount
def _query(self, q): return self._do_query(q)
def _fetch_row(self, size=1):
if not self._result:
return ()
return self._result.fetch_row(size, self._fetch_type)
def __iter__(self):
return iter(self.fetchone, None)
Warning = Warning
Error = Error
InterfaceError = InterfaceError
DatabaseError = DatabaseError
DataError = DataError
OperationalError = OperationalError
IntegrityError = IntegrityError
InternalError = InternalError
ProgrammingError = ProgrammingError
NotSupportedError = NotSupportedError
class CursorStoreResultMixIn(object):
"""This is a MixIn class which causes the entire result set to be
stored on the client side, i.e. it uses mysql_store_result(). If the
result set can be very large, consider adding a LIMIT clause to your
query, or using CursorUseResultMixIn instead."""
def _get_result(self): return self._get_db().store_result()
def _query(self, q):
rowcount = self._do_query(q)
self._post_get_result()
return rowcount
def _post_get_result(self):
self._rows = self._fetch_row(0)
self._result = None
def fetchone(self):
"""Fetches a single row from the cursor. None indicates that
no more rows are available."""
self._check_executed()
if self.rownumber >= len(self._rows): return None
result = self._rows[self.rownumber]
self.rownumber = self.rownumber+1
return result
def fetchmany(self, size=None):
"""Fetch up to size rows from the cursor. Result set may be smaller
than size. If size is not defined, cursor.arraysize is used."""
self._check_executed()
end = self.rownumber + (size or self.arraysize)
result = self._rows[self.rownumber:end]
self.rownumber = min(end, len(self._rows))
return result
def fetchall(self):
"""Fetchs all available rows from the cursor."""
self._check_executed()
if self.rownumber:
result = self._rows[self.rownumber:]
else:
result = self._rows
self.rownumber = len(self._rows)
return result
def scroll(self, value, mode='relative'):
"""Scroll the cursor in the result set to a new position according
to mode.
If mode is 'relative' (default), value is taken as offset to
the current position in the result set, if set to 'absolute',
value states an absolute target position."""
self._check_executed()
if mode == 'relative':
r = self.rownumber + value
elif mode == 'absolute':
r = value
else:
self.errorhandler(self, ProgrammingError,
"unknown scroll mode %s" % repr(mode))
if r < 0 or r >= len(self._rows):
self.errorhandler(self, IndexError, "out of range")
self.rownumber = r
def __iter__(self):
self._check_executed()
result = self.rownumber and self._rows[self.rownumber:] or self._rows
return iter(result)
class CursorUseResultMixIn(object):
"""This is a MixIn class which causes the result set to be stored
in the server and sent row-by-row to client side, i.e. it uses
mysql_use_result(). You MUST retrieve the entire result set and
close() the cursor before additional queries can be peformed on
the connection."""
_defer_warnings = True
def _get_result(self): return self._get_db().use_result()
def fetchone(self):
"""Fetches a single row from the cursor."""
self._check_executed()
r = self._fetch_row(1)
if not r:
self._warning_check()
return None
self.rownumber = self.rownumber + 1
return r[0]
def fetchmany(self, size=None):
"""Fetch up to size rows from the cursor. Result set may be smaller
than size. If size is not defined, cursor.arraysize is used."""
self._check_executed()
r = self._fetch_row(size or self.arraysize)
self.rownumber = self.rownumber + len(r)
if not r:
self._warning_check()
return r
def fetchall(self):
"""Fetchs all available rows from the cursor."""
self._check_executed()
r = self._fetch_row(0)
self.rownumber = self.rownumber + len(r)
self._warning_check()
return r
def __iter__(self):
return self
def next(self):
row = self.fetchone()
if row is None:
raise StopIteration
return row
class CursorTupleRowsMixIn(object):
"""This is a MixIn class that causes all rows to be returned as tuples,
which is the standard form required by DB API."""
_fetch_type = 0
class CursorDictRowsMixIn(object):
"""This is a MixIn class that causes all rows to be returned as
dictionaries. This is a non-standard feature."""
_fetch_type = 1
def fetchoneDict(self):
"""Fetch a single row as a dictionary. Deprecated:
Use fetchone() instead. Will be removed in 1.3."""
from warnings import warn
warn("fetchoneDict() is non-standard and will be removed in 1.3",
DeprecationWarning, 2)
return self.fetchone()
def fetchmanyDict(self, size=None):
"""Fetch several rows as a list of dictionaries. Deprecated:
Use fetchmany() instead. Will be removed in 1.3."""
from warnings import warn
warn("fetchmanyDict() is non-standard and will be removed in 1.3",
DeprecationWarning, 2)
return self.fetchmany(size)
def fetchallDict(self):
"""Fetch all available rows as a list of dictionaries. Deprecated:
Use fetchall() instead. Will be removed in 1.3."""
from warnings import warn
warn("fetchallDict() is non-standard and will be removed in 1.3",
DeprecationWarning, 2)
return self.fetchall()
class CursorOldDictRowsMixIn(CursorDictRowsMixIn):
"""This is a MixIn class that returns rows as dictionaries with
the same key convention as the old Mysqldb (MySQLmodule). Don't
use this."""
_fetch_type = 2
class Cursor(CursorStoreResultMixIn, CursorTupleRowsMixIn,
BaseCursor):
"""This is the standard Cursor class that returns rows as tuples
and stores the result set in the client."""
class DictCursor(CursorStoreResultMixIn, CursorDictRowsMixIn,
BaseCursor):
"""This is a Cursor class that returns rows as dictionaries and
stores the result set in the client."""
class SSCursor(CursorUseResultMixIn, CursorTupleRowsMixIn,
BaseCursor):
"""This is a Cursor class that returns rows as tuples and stores
the result set in the server."""
class SSDictCursor(CursorUseResultMixIn, CursorDictRowsMixIn,
BaseCursor):
"""This is a Cursor class that returns rows as dictionaries and
stores the result set in the server."""
================================================
FILE: MySQLdb/release.py
================================================
__author__ = "Andy Dustman <farcepest@gmail.com>"
version_info = (1,2,4,'final',1)
__version__ = "1.2.4"
================================================
FILE: MySQLdb/times.py
================================================
"""times module
This module provides some Date and Time classes for dealing with MySQL data.
Use Python datetime module to handle date and time columns."""
import math
from time import localtime
from datetime import date, datetime, time, timedelta
from _mysql import string_literal
Date = date
Time = time
TimeDelta = timedelta
Timestamp = datetime
DateTimeDeltaType = timedelta
DateTimeType = datetime
def DateFromTicks(ticks):
"""Convert UNIX ticks into a date instance."""
return date(*localtime(ticks)[:3])
def TimeFromTicks(ticks):
"""Convert UNIX ticks into a time instance."""
return time(*localtime(ticks)[3:6])
def TimestampFromTicks(ticks):
"""Convert UNIX ticks into a datetime instance."""
return datetime(*localtime(ticks)[:6])
format_TIME = format_DATE = str
def format_TIMEDELTA(v):
seconds = int(v.seconds) % 60
minutes = int(v.seconds / 60) % 60
hours = int(v.seconds / 3600) % 24
return '%d %d:%d:%d' % (v.days, hours, minutes, seconds)
def format_TIMESTAMP(d):
return d.isoformat(" ")
def DateTime_or_None(s):
if ' ' in s:
sep = ' '
elif 'T' in s:
sep = 'T'
else:
return Date_or_None(s)
try:
d, t = s.split(sep, 1)
if '.' in t:
t, ms = t.split('.',1)
ms = ms.ljust(6, '0')
else:
ms = 0
return datetime(*[ int(x) for x in d.split('-')+t.split(':')+[ms] ])
except (SystemExit, KeyboardInterrupt):
raise
except:
return Date_or_None(s)
def TimeDelta_or_None(s):
try:
h, m, s = s.split(':')
if '.' in s:
s, ms = s.split('.')
ms = ms.ljust(6, '0')
else:
ms = 0
h, m, s, ms = int(h), int(m), int(s), int(ms)
td = timedelta(hours=abs(h), minutes=m, seconds=s,
microseconds=ms)
if h < 0:
return -td
else:
return td
except ValueError:
# unpacking or int/float conversion failed
return None
def Time_or_None(s):
try:
h, m, s = s.split(':')
if '.' in s:
s, ms = s.split('.')
ms = ms.ljust(6, '0')
else:
ms = 0
h, m, s, ms = int(h), int(m), int(s), int(ms)
return time(hour=h, minute=m, second=s,
microsecond=ms)
except ValueError:
return None
def Date_or_None(s):
try:
return date(*[ int(x) for x in s.split('-',2)])
except (SystemExit, KeyboardInterrupt):
raise
except:
return None
def DateTime2literal(d, c):
"""Format a DateTime object as an ISO timestamp."""
return string_literal(format_TIMESTAMP(d),c)
def DateTimeDelta2literal(d, c):
"""Format a DateTimeDelta object as a time."""
return string_literal(format_TIMEDELTA(d),c)
def mysql_timestamp_converter(s):
"""Convert a MySQL TIMESTAMP to a Timestamp object."""
# MySQL>4.1 returns TIMESTAMP in the same format as DATETIME
if s[4] == '-': return DateTime_or_None(s)
s = s + "0"*(14-len(s)) # padding
parts = map(int, filter(None, (s[:4],s[4:6],s[6:8],
s[8:10],s[10:12],s[12:14])))
try:
return Timestamp(*parts)
except (SystemExit, KeyboardInterrupt):
raise
except:
return None
================================================
FILE: README.md
================================================
MySQLdb1
========
This is the legacy (1.x) version of MySQLdb. While it is still being
maintained, there will not be a lot of new feature development.
[](http://travis-ci.org/farcepest/MySQLdb1)
TODO
----
* A bugfix 1.2.4 release
* A 1.3.0 release that will support Python 2.7-3.3
* The 2.0 version is being renamed [moist][] and is heavily refactored.
Projects
--------
* [MySQLdb-svn][]
This is the old Subversion repository located on SourceForge.
It has all the early historical development of MySQLdb through 1.2.3,
and also is the working repository for ZMySQLDA. The trunk on this
repository was forked to create the [MySQLdb2][] repository.
* [MySQLdb1][]
This is the new (active) git repository.
Only updates to the 1.x series will happen here.
* [MySQLdb2][]
This is the now obsolete Mercurial repository for MySQLdb-2.0
located on SourceForge. This repository has been migrated to the
[moist][] repository.
[MySQLdb1]: https://github.com/farcepest/MySQLdb1
[moist]: https://github.com/farcepest/moist
[MySQLdb-svn]: https://sourceforge.net/p/mysql-python/svn/
[MySQLdb2]: https://sourceforge.net/p/mysql-python/mysqldb-2/
================================================
FILE: _mysql.c
================================================
/*
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, or (at your option)
any later version. Alternatively, you may use the original license
reproduced below.
Copyright 1999 by Comstar.net, Inc., Atlanta, GA, US.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Comstar.net, Inc.
or COMSTAR not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.
COMSTAR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL COMSTAR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
*/
#include "Python.h"
#if PY_MAJOR_VERSION >= 3
#define IS_PY3K
#define PyInt_FromLong(n) PyLong_FromLong(n)
#define PyInt_Check(n) PyLong_Check(n)
#define PyInt_AS_LONG(n) PyLong_AS_LONG(n)
#endif
#if PY_VERSION_HEX > 0x02060000
#include "bytesobject.h"
#endif
#include "pymemcompat.h"
#include "structmember.h"
#if defined(MS_WINDOWS)
#include <config-win.h>
#else
#include "my_config.h"
#endif
#include "mysql.h"
#include "mysqld_error.h"
#include "errmsg.h"
#if PY_VERSION_HEX < 0x02020000
# define MyTuple_Resize(t,n,d) _PyTuple_Resize(t, n, d)
# define MyMember(a,b,c,d,e) {a,b,c,d}
# define MyMemberlist(x) struct memberlist x
# define MyAlloc(s,t) PyObject_New(s,&t)
# define MyFree(o) PyObject_Del(o)
#else
# define MyTuple_Resize(t,n,d) _PyTuple_Resize(t, n)
# define MyMember(a,b,c,d,e) {a,b,c,d,e}
# define MyMemberlist(x) struct PyMemberDef x
# define MyAlloc(s,t) (s *) t.tp_alloc(&t,0)
#ifdef IS_PY3K
# define MyFree(o) PyObject_Del(o)
#else
# define MyFree(ob) ob->ob_type->tp_free((PyObject *)ob)
#endif
#endif
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
typedef int Py_ssize_t;
#define PY_SSIZE_T_MAX INT_MAX
#define PY_SSIZE_T_MIN INT_MIN
#endif
static PyObject *_mysql_MySQLError;
static PyObject *_mysql_Warning;
static PyObject *_mysql_Error;
static PyObject *_mysql_DatabaseError;
static PyObject *_mysql_InterfaceError;
static PyObject *_mysql_DataError;
static PyObject *_mysql_OperationalError;
static PyObject *_mysql_IntegrityError;
static PyObject *_mysql_InternalError;
static PyObject *_mysql_ProgrammingError;
static PyObject *_mysql_NotSupportedError;
typedef struct {
PyObject_HEAD
MYSQL connection;
int open;
PyObject *converter;
} _mysql_ConnectionObject;
#define check_connection(c) if (!(c->open)) return _mysql_Exception(c)
#define result_connection(r) ((_mysql_ConnectionObject *)r->conn)
#define check_result_connection(r) check_connection(result_connection(r))
extern PyTypeObject _mysql_ConnectionObject_Type;
typedef struct {
PyObject_HEAD
PyObject *conn;
MYSQL_RES *result;
int nfields;
int use;
PyObject *converter;
} _mysql_ResultObject;
extern PyTypeObject _mysql_ResultObject_Type;
static int _mysql_server_init_done = 0;
#if MYSQL_VERSION_ID >= 40000
#define check_server_init(x) if (!_mysql_server_init_done) { if (mysql_server_init(0, NULL, NULL)) { _mysql_Exception(NULL); return x; } else { _mysql_server_init_done = 1;} }
#else
#define check_server_init(x) if (!_mysql_server_init_done) _mysql_server_init_done = 1
#endif
#if MYSQL_VERSION_ID >= 50500
#define HAVE_OPENSSL 1
#endif
/* According to https://dev.mysql.com/doc/refman/5.1/en/mysql-options.html
The MYSQL_OPT_READ_TIMEOUT apear in the version 5.1.12 */
#if MYSQL_VERSION_ID > 50112
#define HAVE_MYSQL_OPT_TIMEOUTS 1
#endif
PyObject *
_mysql_Exception(_mysql_ConnectionObject *c)
{
PyObject *t, *e;
int merr;
if (!(t = PyTuple_New(2))) return NULL;
if (!_mysql_server_init_done) {
e = _mysql_InternalError;
PyTuple_SET_ITEM(t, 0, PyInt_FromLong(-1L));
#ifdef IS_PY3K
PyTuple_SET_ITEM(t, 1, PyUnicode_FromString("server not initialized"));
#else
PyTuple_SET_ITEM(t, 1, PyString_FromString("server not initialized"));
#endif
PyErr_SetObject(e, t);
Py_DECREF(t);
return NULL;
}
merr = mysql_errno(&(c->connection));
if (!merr)
e = _mysql_InterfaceError;
else if (merr > CR_MAX_ERROR) {
PyTuple_SET_ITEM(t, 0, PyInt_FromLong(-1L));
#ifdef IS_PY3K
PyTuple_SET_ITEM(t, 1, PyUnicode_FromString("error totally whack"));
#else
PyTuple_SET_ITEM(t, 1, PyString_FromString("error totally whack"));
#endif
PyErr_SetObject(_mysql_InterfaceError, t);
Py_DECREF(t);
return NULL;
}
else switch (merr) {
case CR_COMMANDS_OUT_OF_SYNC:
case ER_DB_CREATE_EXISTS:
case ER_SYNTAX_ERROR:
case ER_PARSE_ERROR:
case ER_NO_SUCH_TABLE:
case ER_WRONG_DB_NAME:
case ER_WRONG_TABLE_NAME:
case ER_FIELD_SPECIFIED_TWICE:
case ER_INVALID_GROUP_FUNC_USE:
case ER_UNSUPPORTED_EXTENSION:
case ER_TABLE_MUST_HAVE_COLUMNS:
#ifdef ER_CANT_DO_THIS_DURING_AN_TRANSACTION
case ER_CANT_DO_THIS_DURING_AN_TRANSACTION:
#endif
e = _mysql_ProgrammingError;
break;
#ifdef WARN_DATA_TRUNCATED
case WARN_DATA_TRUNCATED:
#ifdef WARN_NULL_TO_NOTNULL
case WARN_NULL_TO_NOTNULL:
#endif
#ifdef ER_WARN_DATA_OUT_OF_RANGE
case ER_WARN_DATA_OUT_OF_RANGE:
#endif
#ifdef ER_NO_DEFAULT
case ER_NO_DEFAULT:
#endif
#ifdef ER_PRIMARY_CANT_HAVE_NULL
case ER_PRIMARY_CANT_HAVE_NULL:
#endif
#ifdef ER_DATA_TOO_LONG
case ER_DATA_TOO_LONG:
#endif
#ifdef ER_DATETIME_FUNCTION_OVERFLOW
case ER_DATETIME_FUNCTION_OVERFLOW:
#endif
e = _mysql_DataError;
break;
#endif
case ER_DUP_ENTRY:
#ifdef ER_DUP_UNIQUE
case ER_DUP_UNIQUE:
#endif
#ifdef ER_NO_REFERENCED_ROW
case ER_NO_REFERENCED_ROW:
#endif
#ifdef ER_NO_REFERENCED_ROW_2
case ER_NO_REFERENCED_ROW_2:
#endif
#ifdef ER_ROW_IS_REFERENCED
case ER_ROW_IS_REFERENCED:
#endif
#ifdef ER_ROW_IS_REFERENCED_2
case ER_ROW_IS_REFERENCED_2:
#endif
#ifdef ER_CANNOT_ADD_FOREIGN
case ER_CANNOT_ADD_FOREIGN:
#endif
e = _mysql_IntegrityError;
break;
#ifdef ER_WARNING_NOT_COMPLETE_ROLLBACK
case ER_WARNING_NOT_COMPLETE_ROLLBACK:
#endif
#ifdef ER_NOT_SUPPORTED_YET
case ER_NOT_SUPPORTED_YET:
#endif
#ifdef ER_FEATURE_DISABLED
case ER_FEATURE_DISABLED:
#endif
#ifdef ER_UNKNOWN_STORAGE_ENGINE
case ER_UNKNOWN_STORAGE_ENGINE:
#endif
e = _mysql_NotSupportedError;
break;
default:
if (merr < 1000)
e = _mysql_InternalError;
else
e = _mysql_OperationalError;
break;
}
PyTuple_SET_ITEM(t, 0, PyInt_FromLong((long)merr));
#ifdef IS_PY3K
PyTuple_SET_ITEM(t, 1, PyUnicode_FromString(mysql_error(&(c->connection))));
#else
PyTuple_SET_ITEM(t, 1, PyString_FromString(mysql_error(&(c->connection))));
#endif
PyErr_SetObject(e, t);
Py_DECREF(t);
return NULL;
}
static char _mysql_server_init__doc__[] =
"Initialize embedded server. If this client is not linked against\n\
the embedded server library, this function does nothing.\n\
\n\
args -- sequence of command-line arguments\n\
groups -- sequence of groups to use in defaults files\n\
";
static PyObject *_mysql_server_init(
PyObject *self,
PyObject *args,
PyObject *kwargs) {
static char *kwlist[] = {"args", "groups", NULL};
char **cmd_args_c=NULL, **groups_c=NULL, *s;
int cmd_argc=0, i, groupc;
PyObject *cmd_args=NULL, *groups=NULL, *ret=NULL, *item;
if (_mysql_server_init_done) {
PyErr_SetString(_mysql_ProgrammingError,
"already initialized");
return NULL;
}
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OO", kwlist,
&cmd_args, &groups))
return NULL;
#if MYSQL_VERSION_ID >= 40000
if (cmd_args) {
if (!PySequence_Check(cmd_args)) {
PyErr_SetString(PyExc_TypeError,
"args must be a sequence");
goto finish;
}
cmd_argc = PySequence_Size(cmd_args);
if (cmd_argc == -1) {
PyErr_SetString(PyExc_TypeError,
"args could not be sized");
goto finish;
}
cmd_args_c = (char **) PyMem_Malloc(cmd_argc*sizeof(char *));
for (i=0; i< cmd_argc; i++) {
item = PySequence_GetItem(cmd_args, i);
#ifdef IS_PY3K
s = PyUnicode_AS_DATA(item);
#else
s = PyString_AsString(item);
#endif
Py_DECREF(item);
if (!s) {
PyErr_SetString(PyExc_TypeError,
"args must contain strings");
goto finish;
}
cmd_args_c[i] = s;
}
}
if (groups) {
if (!PySequence_Check(groups)) {
PyErr_SetString(PyExc_TypeError,
"groups must be a sequence");
goto finish;
}
groupc = PySequence_Size(groups);
if (groupc == -1) {
PyErr_SetString(PyExc_TypeError,
"groups could not be sized");
goto finish;
}
groups_c = (char **) PyMem_Malloc((1+groupc)*sizeof(char *));
for (i=0; i< groupc; i++) {
item = PySequence_GetItem(groups, i);
#ifdef IS_PY3K
s = PyUnicode_AS_DATA(item);
#else
s = PyString_AsString(item);
#endif
Py_DECREF(item);
if (!s) {
PyErr_SetString(PyExc_TypeError,
"groups must contain strings");
goto finish;
}
groups_c[i] = s;
}
groups_c[groupc] = (char *)NULL;
}
/* even though this may block, don't give up the interpreter lock
so that the server can't be initialized multiple times. */
if (mysql_server_init(cmd_argc, cmd_args_c, groups_c)) {
_mysql_Exception(NULL);
goto finish;
}
#endif
ret = Py_None;
Py_INCREF(Py_None);
_mysql_server_init_done = 1;
finish:
PyMem_Free(groups_c);
PyMem_Free(cmd_args_c);
return ret;
}
static char _mysql_server_end__doc__[] =
"Shut down embedded server. If not using an embedded server, this\n\
does nothing.";
static PyObject *_mysql_server_end(
PyObject *self,
PyObject *args) {
if (_mysql_server_init_done) {
#if MYSQL_VERSION_ID >= 40000
mysql_server_end();
#endif
_mysql_server_init_done = 0;
Py_INCREF(Py_None);
return Py_None;
}
return _mysql_Exception(NULL);
}
#if MYSQL_VERSION_ID >= 32314
static char _mysql_thread_safe__doc__[] =
"Indicates whether the client is compiled as thread-safe.";
static PyObject *_mysql_thread_safe(
PyObject *self,
PyObject *args) {
PyObject *flag;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_server_init(NULL);
if (!(flag=PyInt_FromLong((long)mysql_thread_safe()))) return NULL;
return flag;
}
#endif
static char _mysql_ResultObject__doc__[] =
"result(connection, use=0, converter={}) -- Result set from a query.\n\
\n\
Creating instances of this class directly is an excellent way to\n\
shoot yourself in the foot. If using _mysql.connection directly,\n\
use connection.store_result() or connection.use_result() instead.\n\
If using MySQLdb.Connection, this is done by the cursor class.\n\
Just forget you ever saw this. Forget... FOR-GET...";
static int
_mysql_ResultObject_Initialize(
_mysql_ResultObject *self,
PyObject *args,
PyObject *kwargs)
{
static char *kwlist[] = {"connection", "use", "converter", NULL};
MYSQL_RES *result;
_mysql_ConnectionObject *conn=NULL;
int use=0;
PyObject *conv=NULL;
int n, i;
MYSQL_FIELD *fields;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|iO", kwlist,
&conn, &use, &conv))
return -1;
if (!conv) {
if (!(conv = PyDict_New()))
return -1;
}
else
Py_INCREF(conv);
self->conn = (PyObject *) conn;
Py_INCREF(conn);
self->use = use;
Py_BEGIN_ALLOW_THREADS ;
if (use)
result = mysql_use_result(&(conn->connection));
else
result = mysql_store_result(&(conn->connection));
self->result = result;
Py_END_ALLOW_THREADS ;
if (!result) {
if (mysql_field_count(&(conn->connection)) > 0) {
_mysql_Exception(conn);
return -1;
}
self->converter = PyTuple_New(0);
Py_DECREF(conv);
return 0;
}
n = mysql_num_fields(result);
self->nfields = n;
if (!(self->converter = PyTuple_New(n))) {
Py_DECREF(conv);
return -1;
}
fields = mysql_fetch_fields(result);
for (i=0; i<n; i++) {
PyObject *tmp, *fun;
tmp = PyInt_FromLong((long) fields[i].type);
if (!tmp) {
Py_DECREF(conv);
return -1;
}
fun = PyObject_GetItem(conv, tmp);
Py_DECREF(tmp);
if (!fun) {
if (PyErr_Occurred()) {
if (!PyErr_ExceptionMatches(PyExc_KeyError)) {
Py_DECREF(conv);
return -1;
}
PyErr_Clear();
}
fun = Py_None;
Py_INCREF(Py_None);
}
else if (PySequence_Check(fun)) {
int j, n2=PySequence_Size(fun);
PyObject *fun2=NULL;
for (j=0; j<n2; j++) {
PyObject *t = PySequence_GetItem(fun, j);
if (!t) {
Py_DECREF(fun);
Py_DECREF(conv);
return -1;
}
if (PyTuple_Check(t) && PyTuple_GET_SIZE(t) == 2) {
long mask, flags;
PyObject *pmask=NULL;
pmask = PyTuple_GET_ITEM(t, 0);
fun2 = PyTuple_GET_ITEM(t, 1);
Py_XINCREF(fun2);
if (PyInt_Check(pmask)) {
mask = PyInt_AS_LONG(pmask);
flags = fields[i].flags;
if (fields[i].charsetnr != 63) { /* maaagic */
flags &= ~BINARY_FLAG;
}
if (mask & flags) {
Py_DECREF(t);
break;
}
else {
fun2 = NULL;
}
} else {
Py_DECREF(t);
break;
}
}
Py_DECREF(t);
}
if (!fun2) {
fun2 = Py_None;
Py_INCREF(fun2);
}
Py_DECREF(fun);
fun = fun2;
}
PyTuple_SET_ITEM(self->converter, i, fun);
}
Py_DECREF(conv);
return 0;
}
#if PY_VERSION_HEX >= 0x02020000
static int _mysql_ResultObject_traverse(
_mysql_ResultObject *self,
visitproc visit,
void *arg)
{
int r;
if (self->converter) {
if (!(r = visit(self->converter, arg))) return r;
}
if (self->conn)
return visit(self->conn, arg);
return 0;
}
#endif
static int _mysql_ResultObject_clear(
_mysql_ResultObject *self)
{
Py_XDECREF(self->converter);
self->converter = NULL;
Py_XDECREF(self->conn);
self->conn = NULL;
return 0;
}
static int
_mysql_ConnectionObject_Initialize(
_mysql_ConnectionObject *self,
PyObject *args,
PyObject *kwargs)
{
MYSQL *conn = NULL;
PyObject *conv = NULL;
PyObject *ssl = NULL;
#if HAVE_OPENSSL
char *key = NULL, *cert = NULL, *ca = NULL,
*capath = NULL, *cipher = NULL;
#endif
char *host = NULL, *user = NULL, *passwd = NULL,
*db = NULL, *unix_socket = NULL;
unsigned int port = 0;
unsigned int client_flag = 0;
static char *kwlist[] = { "host", "user", "passwd", "db", "port",
"unix_socket", "conv",
"connect_timeout", "compress",
"named_pipe", "init_command",
"read_default_file", "read_default_group",
"client_flag", "ssl",
"local_infile",
#ifdef HAVE_MYSQL_OPT_TIMEOUTS
"read_timeout",
"write_timeout",
#endif
NULL } ;
int connect_timeout = 0;
#ifdef HAVE_MYSQL_OPT_TIMEOUTS
int read_timeout = 0;
int write_timeout = 0;
#endif
int compress = -1, named_pipe = -1, local_infile = -1;
char *init_command=NULL,
*read_default_file=NULL,
*read_default_group=NULL;
self->converter = NULL;
self->open = 0;
check_server_init(-1);
if (!PyArg_ParseTupleAndKeywords(args, kwargs,
#ifdef HAVE_MYSQL_OPT_TIMEOUTS
"|ssssisOiiisssiOiii:connect",
#else
"|ssssisOiiisssiOi:connect",
#endif
kwlist,
&host, &user, &passwd, &db,
&port, &unix_socket, &conv,
&connect_timeout,
&compress, &named_pipe,
&init_command, &read_default_file,
&read_default_group,
&client_flag, &ssl,
&local_infile
#ifdef HAVE_MYSQL_OPT_TIMEOUTS
, &read_timeout
, &write_timeout
#endif
))
return -1;
#ifdef IS_PY3K
#define _stringsuck(d,t,s) {t=PyMapping_GetItemString(s,#d);\
if(t){d=PyUnicode_AS_DATA(t);Py_DECREF(t);}\
PyErr_Clear();}
#else
#define _stringsuck(d,t,s) {t=PyMapping_GetItemString(s,#d);\
if(t){d=PyString_AsString(t);Py_DECREF(t);}\
PyErr_Clear();}
#endif
if (ssl) {
#if HAVE_OPENSSL
PyObject *value = NULL;
_stringsuck(ca, value, ssl);
_stringsuck(capath, value, ssl);
_stringsuck(cert, value, ssl);
_stringsuck(key, value, ssl);
_stringsuck(cipher, value, ssl);
#else
PyErr_SetString(_mysql_NotSupportedError,
"client library does not have SSL support");
return -1;
#endif
}
Py_BEGIN_ALLOW_THREADS ;
conn = mysql_init(&(self->connection));
if (connect_timeout) {
unsigned int timeout = connect_timeout;
mysql_options(&(self->connection), MYSQL_OPT_CONNECT_TIMEOUT,
(char *)&timeout);
}
#ifdef HAVE_MYSQL_OPT_TIMEOUTS
if (read_timeout) {
unsigned int timeout = read_timeout;
mysql_options(&(self->connection), MYSQL_OPT_READ_TIMEOUT,
(char *)&timeout);
}
if (write_timeout) {
unsigned int timeout = write_timeout;
mysql_options(&(self->connection), MYSQL_OPT_WRITE_TIMEOUT,
(char *)&timeout);
}
#endif
if (compress != -1) {
mysql_options(&(self->connection), MYSQL_OPT_COMPRESS, 0);
client_flag |= CLIENT_COMPRESS;
}
if (named_pipe != -1)
mysql_options(&(self->connection), MYSQL_OPT_NAMED_PIPE, 0);
if (init_command != NULL)
mysql_options(&(self->connection), MYSQL_INIT_COMMAND, init_command);
if (read_default_file != NULL)
mysql_options(&(self->connection), MYSQL_READ_DEFAULT_FILE, read_default_file);
if (read_default_group != NULL)
mysql_options(&(self->connection), MYSQL_READ_DEFAULT_GROUP, read_default_group);
if (local_infile != -1)
mysql_options(&(self->connection), MYSQL_OPT_LOCAL_INFILE, (char *) &local_infile);
#if HAVE_OPENSSL
if (ssl)
mysql_ssl_set(&(self->connection),
key, cert, ca, capath, cipher);
#endif
conn = mysql_real_connect(&(self->connection), host, user, passwd, db,
port, unix_socket, client_flag);
Py_END_ALLOW_THREADS ;
if (!conn) {
_mysql_Exception(self);
return -1;
}
/* Internal references to python-land objects */
if (!conv)
conv = PyDict_New();
else
Py_INCREF(conv);
if (!conv)
return -1;
self->converter = conv;
/*
PyType_GenericAlloc() automatically sets up GC allocation and
tracking for GC objects, at least in 2.2.1, so it does not need to
be done here. tp_dealloc still needs to call PyObject_GC_UnTrack(),
however.
*/
self->open = 1;
return 0;
}
static char _mysql_connect__doc__[] =
"Returns a MYSQL connection object. Exclusive use of\n\
keyword parameters strongly recommended. Consult the\n\
MySQL C API documentation for more details.\n\
\n\
host\n\
string, host to connect\n\
\n\
user\n\
string, user to connect as\n\
\n\
passwd\n\
string, password to use\n\
\n\
db\n\
string, database to use\n\
\n\
port\n\
integer, TCP/IP port to connect to\n\
\n\
unix_socket\n\
string, location of unix_socket (UNIX-ish only)\n\
\n\
conv\n\
mapping, maps MySQL FIELD_TYPE.* to Python functions which\n\
convert a string to the appropriate Python type\n\
\n\
connect_timeout\n\
number of seconds to wait before the connection\n\
attempt fails.\n\
\n\
compress\n\
if set, gzip compression is enabled\n\
\n\
named_pipe\n\
if set, connect to server via named pipe (Windows only)\n\
\n\
init_command\n\
command which is run once the connection is created\n\
\n\
read_default_file\n\
see the MySQL documentation for mysql_options()\n\
\n\
read_default_group\n\
see the MySQL documentation for mysql_options()\n\
\n\
client_flag\n\
client flags from MySQLdb.constants.CLIENT\n\
\n\
load_infile\n\
int, non-zero enables LOAD LOCAL INFILE, zero disables\n\
\n\
";
static PyObject *
_mysql_connect(
PyObject *self,
PyObject *args,
PyObject *kwargs)
{
_mysql_ConnectionObject *c=NULL;
c = MyAlloc(_mysql_ConnectionObject, _mysql_ConnectionObject_Type);
if (c == NULL) return NULL;
if (_mysql_ConnectionObject_Initialize(c, args, kwargs)) {
Py_DECREF(c);
c = NULL;
}
return (PyObject *) c;
}
#if PY_VERSION_HEX >= 0x02020000
static int _mysql_ConnectionObject_traverse(
_mysql_ConnectionObject *self,
visitproc visit,
void *arg)
{
if (self->converter)
return visit(self->converter, arg);
return 0;
}
#endif
static int _mysql_ConnectionObject_clear(
_mysql_ConnectionObject *self)
{
Py_XDECREF(self->converter);
self->converter = NULL;
return 0;
}
static char _mysql_ConnectionObject_close__doc__[] =
"Close the connection. No further activity possible.";
static PyObject *
_mysql_ConnectionObject_close(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (args) {
if (!PyArg_ParseTuple(args, "")) return NULL;
}
if (self->open) {
Py_BEGIN_ALLOW_THREADS
mysql_close(&(self->connection));
Py_END_ALLOW_THREADS
self->open = 0;
} else {
PyErr_SetString(_mysql_ProgrammingError,
"closing a closed connection");
return NULL;
}
_mysql_ConnectionObject_clear(self);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_affected_rows__doc__ [] =
"Return number of rows affected by the last query.\n\
Non-standard. Use Cursor.rowcount.\n\
";
static PyObject *
_mysql_ConnectionObject_affected_rows(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
return PyLong_FromUnsignedLongLong(mysql_affected_rows(&(self->connection)));
}
static char _mysql_debug__doc__[] =
"Does a DBUG_PUSH with the given string.\n\
mysql_debug() uses the Fred Fish debug library.\n\
To use this function, you must compile the client library to\n\
support debugging.\n\
";
static PyObject *
_mysql_debug(
PyObject *self,
PyObject *args)
{
char *debug;
if (!PyArg_ParseTuple(args, "s", &debug)) return NULL;
mysql_debug(debug);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_dump_debug_info__doc__[] =
"Instructs the server to write some debug information to the\n\
log. The connected user must have the process privilege for\n\
this to work. Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_dump_debug_info(
_mysql_ConnectionObject *self,
PyObject *args)
{
int err;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
Py_BEGIN_ALLOW_THREADS
err = mysql_dump_debug_info(&(self->connection));
Py_END_ALLOW_THREADS
if (err) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_autocommit__doc__[] =
"Set the autocommit mode. True values enable; False value disable.\n\
";
static PyObject *
_mysql_ConnectionObject_autocommit(
_mysql_ConnectionObject *self,
PyObject *args)
{
int flag, err;
if (!PyArg_ParseTuple(args, "i", &flag)) return NULL;
Py_BEGIN_ALLOW_THREADS
#if MYSQL_VERSION_ID >= 40100
err = mysql_autocommit(&(self->connection), flag);
#else
{
char query[256];
snprintf(query, 256, "SET AUTOCOMMIT=%d", flag);
err = mysql_query(&(self->connection), query);
}
#endif
Py_END_ALLOW_THREADS
if (err) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_get_autocommit__doc__[] =
"Get the autocommit mode. True when enable; False when disable.\n";
static PyObject *
_mysql_ConnectionObject_get_autocommit(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (self->connection.server_status & SERVER_STATUS_AUTOCOMMIT) {
Py_RETURN_TRUE;
}
Py_RETURN_FALSE;
}
static char _mysql_ConnectionObject_commit__doc__[] =
"Commits the current transaction\n\
";
static PyObject *
_mysql_ConnectionObject_commit(
_mysql_ConnectionObject *self,
PyObject *args)
{
int err;
if (!PyArg_ParseTuple(args, "")) return NULL;
Py_BEGIN_ALLOW_THREADS
#if MYSQL_VERSION_ID >= 40100
err = mysql_commit(&(self->connection));
#else
err = mysql_query(&(self->connection), "COMMIT");
#endif
Py_END_ALLOW_THREADS
if (err) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_rollback__doc__[] =
"Rolls backs the current transaction\n\
";
static PyObject *
_mysql_ConnectionObject_rollback(
_mysql_ConnectionObject *self,
PyObject *args)
{
int err;
if (!PyArg_ParseTuple(args, "")) return NULL;
Py_BEGIN_ALLOW_THREADS
#if MYSQL_VERSION_ID >= 40100
err = mysql_rollback(&(self->connection));
#else
err = mysql_query(&(self->connection), "ROLLBACK");
#endif
Py_END_ALLOW_THREADS
if (err) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_next_result__doc__[] =
"If more query results exist, next_result() reads the next query\n\
results and returns the status back to application.\n\
\n\
After calling next_result() the state of the connection is as if\n\
you had called query() for the next query. This means that you can\n\
now call store_result(), warning_count(), affected_rows()\n\
, and so forth. \n\
\n\
Returns 0 if there are more results; -1 if there are no more results\n\
\n\
Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_next_result(
_mysql_ConnectionObject *self,
PyObject *args)
{
int err;
if (!PyArg_ParseTuple(args, "")) return NULL;
Py_BEGIN_ALLOW_THREADS
#if MYSQL_VERSION_ID >= 40100
err = mysql_next_result(&(self->connection));
#else
err = -1;
#endif
Py_END_ALLOW_THREADS
if (err > 0) return _mysql_Exception(self);
return PyInt_FromLong(err);
}
#if MYSQL_VERSION_ID >= 40100
static char _mysql_ConnectionObject_set_server_option__doc__[] =
"set_server_option(option) -- Enables or disables an option\n\
for the connection.\n\
\n\
Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_set_server_option(
_mysql_ConnectionObject *self,
PyObject *args)
{
int err, flags=0;
if (!PyArg_ParseTuple(args, "i", &flags))
return NULL;
Py_BEGIN_ALLOW_THREADS
err = mysql_set_server_option(&(self->connection), flags);
Py_END_ALLOW_THREADS
if (err) return _mysql_Exception(self);
return PyInt_FromLong(err);
}
static char _mysql_ConnectionObject_sqlstate__doc__[] =
"Returns a string containing the SQLSTATE error code\n\
for the last error. The error code consists of five characters.\n\
'00000' means \"no error.\" The values are specified by ANSI SQL\n\
and ODBC. For a list of possible values, see section 23\n\
Error Handling in MySQL in the MySQL Manual.\n\
\n\
Note that not all MySQL errors are yet mapped to SQLSTATE's.\n\
The value 'HY000' (general error) is used for unmapped errors.\n\
\n\
Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_sqlstate(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
#ifdef IS_PY3K
return PyUnicode_FromString(mysql_sqlstate(&(self->connection)));
#else
return PyString_FromString(mysql_sqlstate(&(self->connection)));
#endif
}
static char _mysql_ConnectionObject_warning_count__doc__[] =
"Returns the number of warnings generated during execution\n\
of the previous SQL statement.\n\
\n\
Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_warning_count(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
return PyInt_FromLong(mysql_warning_count(&(self->connection)));
}
#endif
static char _mysql_ConnectionObject_errno__doc__[] =
"Returns the error code for the most recently invoked API function\n\
that can succeed or fail. A return value of zero means that no error\n\
occurred.\n\
";
static PyObject *
_mysql_ConnectionObject_errno(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
return PyInt_FromLong((long)mysql_errno(&(self->connection)));
}
static char _mysql_ConnectionObject_error__doc__[] =
"Returns the error message for the most recently invoked API function\n\
that can succeed or fail. An empty string ("") is returned if no error\n\
occurred.\n\
";
static PyObject *
_mysql_ConnectionObject_error(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
#ifdef IS_PY3K
return PyUnicode_FromString(mysql_error(&(self->connection)));
#else
return PyString_FromString(mysql_error(&(self->connection)));
#endif
}
static char _mysql_escape_string__doc__[] =
"escape_string(s) -- quote any SQL-interpreted characters in string s.\n\
\n\
Use connection.escape_string(s), if you use it at all.\n\
_mysql.escape_string(s) cannot handle character sets. You are\n\
probably better off using connection.escape(o) instead, since\n\
it will escape entire sequences as well as strings.";
static PyObject *
_mysql_escape_string(
_mysql_ConnectionObject *self,
PyObject *args)
{
PyObject *str;
char *in, *out;
int len, size;
if (!PyArg_ParseTuple(args, "s#:escape_string", &in, &size)) return NULL;
#ifdef IS_PY3K
str = PyUnicode_FromStringAndSize((char *) NULL, size*2+1);
#else
str = PyString_FromStringAndSize((char *) NULL, size*2+1);
#endif
if (!str) return PyErr_NoMemory();
#ifdef IS_PY3K
out = PyUnicode_AS_DATA(str);
#else
out = PyString_AS_STRING(str);
#endif
#if MYSQL_VERSION_ID < 32321
len = mysql_escape_string(out, in, size);
#else
check_server_init(NULL);
if (self && self->open)
len = mysql_real_escape_string(&(self->connection), out, in, size);
else
len = mysql_escape_string(out, in, size);
#endif
#ifdef IS_PY3K
if (PyUnicode_Resize(&str, len) < 0) return NULL;
#else
if (_PyString_Resize(&str, len) < 0) return NULL;
#endif
return (str);
}
static char _mysql_string_literal__doc__[] =
"string_literal(obj) -- converts object obj into a SQL string literal.\n\
This means, any special SQL characters are escaped, and it is enclosed\n\
within single quotes. In other words, it performs:\n\
\n\
\"'%s'\" % escape_string(str(obj))\n\
\n\
Use connection.string_literal(obj), if you use it at all.\n\
_mysql.string_literal(obj) cannot handle character sets.";
static PyObject *
_mysql_string_literal(
_mysql_ConnectionObject *self,
PyObject *args)
{
PyObject *str, *s, *o, *d;
char *in, *out;
int len, size;
if (!PyArg_ParseTuple(args, "O|O:string_literal", &o, &d)) return NULL;
s = PyObject_Str(o);
if (!s) return NULL;
#ifdef IS_PY3K
in = PyUnicode_AS_DATA(s);
size = PyUnicode_GetSize(s);
str = PyUnicode_FromStringAndSize((char *) NULL, size*2+3);
if (!str) return PyErr_NoMemory();
out = PyUnicode_AS_DATA(str);
#else
in = PyString_AsString(s);
size = PyString_GET_SIZE(s);
str = PyString_FromStringAndSize((char *) NULL, size*2+3);
if (!str) return PyErr_NoMemory();
out = PyString_AS_STRING(str);
#endif
#if MYSQL_VERSION_ID < 32321
len = mysql_escape_string(out+1, in, size);
#else
check_server_init(NULL);
if (self && self->open)
len = mysql_real_escape_string(&(self->connection), out+1, in, size);
else
len = mysql_escape_string(out+1, in, size);
#endif
*out = *(out+len+1) = '\'';
#ifdef IS_PY3K
if (PyUnicode_Resize(&str, len+2) < 0) return NULL;
#else
if (_PyString_Resize(&str, len+2) < 0) return NULL;
#endif
Py_DECREF(s);
return (str);
}
static PyObject *_mysql_NULL;
static PyObject *
_escape_item(
PyObject *item,
PyObject *d)
{
PyObject *quoted=NULL, *itemtype, *itemconv;
if (!(itemtype = PyObject_Type(item)))
goto error;
itemconv = PyObject_GetItem(d, itemtype);
Py_DECREF(itemtype);
if (!itemconv) {
PyErr_Clear();
itemconv = PyObject_GetItem(d,
#ifdef IS_PY3K
(PyObject *) &PyUnicode_Type);
#else
(PyObject *) &PyString_Type);
#endif
}
if (!itemconv) {
PyErr_SetString(PyExc_TypeError,
"no default type converter defined");
goto error;
}
Py_INCREF(d);
quoted = PyObject_CallFunction(itemconv, "OO", item, d);
Py_DECREF(d);
Py_DECREF(itemconv);
error:
return quoted;
}
static char _mysql_escape__doc__[] =
"escape(obj, dict) -- escape any special characters in object obj\n\
using mapping dict to provide quoting functions for each type.\n\
Returns a SQL literal string.";
static PyObject *
_mysql_escape(
PyObject *self,
PyObject *args)
{
PyObject *o=NULL, *d=NULL;
if (!PyArg_ParseTuple(args, "O|O:escape", &o, &d))
return NULL;
if (d) {
if (!PyMapping_Check(d)) {
PyErr_SetString(PyExc_TypeError,
"argument 2 must be a mapping");
return NULL;
}
return _escape_item(o, d);
} else {
if (!self) {
PyErr_SetString(PyExc_TypeError,
"argument 2 must be a mapping");
return NULL;
}
return _escape_item(o,
((_mysql_ConnectionObject *) self)->converter);
}
}
static char _mysql_escape_sequence__doc__[] =
"escape_sequence(seq, dict) -- escape any special characters in sequence\n\
seq using mapping dict to provide quoting functions for each type.\n\
Returns a tuple of escaped items.";
static PyObject *
_mysql_escape_sequence(
PyObject *self,
PyObject *args)
{
PyObject *o=NULL, *d=NULL, *r=NULL, *item, *quoted;
int i, n;
if (!PyArg_ParseTuple(args, "OO:escape_sequence", &o, &d))
goto error;
if (!PyMapping_Check(d)) {
PyErr_SetString(PyExc_TypeError,
"argument 2 must be a mapping");
return NULL;
}
if ((n = PyObject_Length(o)) == -1) goto error;
if (!(r = PyTuple_New(n))) goto error;
for (i=0; i<n; i++) {
item = PySequence_GetItem(o, i);
if (!item) goto error;
quoted = _escape_item(item, d);
Py_DECREF(item);
if (!quoted) goto error;
PyTuple_SET_ITEM(r, i, quoted);
}
return r;
error:
Py_XDECREF(r);
return NULL;
}
static char _mysql_escape_dict__doc__[] =
"escape_sequence(d, dict) -- escape any special characters in\n\
dictionary d using mapping dict to provide quoting functions for each type.\n\
Returns a dictionary of escaped items.";
static PyObject *
_mysql_escape_dict(
PyObject *self,
PyObject *args)
{
PyObject *o=NULL, *d=NULL, *r=NULL, *item, *quoted, *pkey;
Py_ssize_t ppos = 0;
if (!PyArg_ParseTuple(args, "O!O:escape_dict", &PyDict_Type, &o, &d))
goto error;
if (!PyMapping_Check(d)) {
PyErr_SetString(PyExc_TypeError,
"argument 2 must be a mapping");
return NULL;
}
if (!(r = PyDict_New())) goto error;
while (PyDict_Next(o, &ppos, &pkey, &item)) {
quoted = _escape_item(item, d);
if (!quoted) goto error;
if (PyDict_SetItem(r, pkey, quoted)==-1) goto error;
Py_DECREF(quoted);
}
return r;
error:
Py_XDECREF(r);
return NULL;
}
static char _mysql_ResultObject_describe__doc__[] =
"Returns the sequence of 7-tuples required by the DB-API for\n\
the Cursor.description attribute.\n\
";
static PyObject *
_mysql_ResultObject_describe(
_mysql_ResultObject *self,
PyObject *args)
{
PyObject *d;
MYSQL_FIELD *fields;
unsigned int i, n;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_result_connection(self);
n = mysql_num_fields(self->result);
fields = mysql_fetch_fields(self->result);
if (!(d = PyTuple_New(n))) return NULL;
for (i=0; i<n; i++) {
PyObject *t;
t = Py_BuildValue("(siiiiii)",
fields[i].name,
(long) fields[i].type,
(long) fields[i].max_length,
(long) fields[i].length,
(long) fields[i].length,
(long) fields[i].decimals,
(long) !(IS_NOT_NULL(fields[i].flags)));
if (!t) goto error;
PyTuple_SET_ITEM(d, i, t);
}
return d;
error:
Py_XDECREF(d);
return NULL;
}
static char _mysql_ResultObject_field_flags__doc__[] =
"Returns a tuple of field flags, one for each column in the result.\n\
" ;
static PyObject *
_mysql_ResultObject_field_flags(
_mysql_ResultObject *self,
PyObject *args)
{
PyObject *d;
MYSQL_FIELD *fields;
unsigned int i, n;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_result_connection(self);
n = mysql_num_fields(self->result);
fields = mysql_fetch_fields(self->result);
if (!(d = PyTuple_New(n))) return NULL;
for (i=0; i<n; i++) {
PyObject *f;
if (!(f = PyInt_FromLong((long)fields[i].flags))) goto error;
PyTuple_SET_ITEM(d, i, f);
}
return d;
error:
Py_XDECREF(d);
return NULL;
}
static PyObject *
_mysql_field_to_python(
PyObject *converter,
char *rowitem,
unsigned long length)
{
PyObject *v;
if (rowitem) {
if (converter != Py_None)
v = PyObject_CallFunction(converter,
"s#",
rowitem,
(int)length);
else
#ifdef IS_PY3K
v = PyUnicode_FromStringAndSize(rowitem,
(int)length);
#else
v = PyString_FromStringAndSize(rowitem,
(int)length);
#endif
if (!v)
return NULL;
} else {
Py_INCREF(Py_None);
v = Py_None;
}
return v;
}
static PyObject *
_mysql_row_to_tuple(
_mysql_ResultObject *self,
MYSQL_ROW row)
{
unsigned int n, i;
unsigned long *length;
PyObject *r, *c;
n = mysql_num_fields(self->result);
if (!(r = PyTuple_New(n))) return NULL;
length = mysql_fetch_lengths(self->result);
for (i=0; i<n; i++) {
PyObject *v;
c = PyTuple_GET_ITEM(self->converter, i);
v = _mysql_field_to_python(c, row[i], length[i]);
if (!v) goto error;
PyTuple_SET_ITEM(r, i, v);
}
return r;
error:
Py_XDECREF(r);
return NULL;
}
static PyObject *
_mysql_row_to_dict(
_mysql_ResultObject *self,
MYSQL_ROW row)
{
unsigned int n, i;
unsigned long *length;
PyObject *r, *c;
MYSQL_FIELD *fields;
n = mysql_num_fields(self->result);
if (!(r = PyDict_New())) return NULL;
length = mysql_fetch_lengths(self->result);
fields = mysql_fetch_fields(self->result);
for (i=0; i<n; i++) {
PyObject *v;
c = PyTuple_GET_ITEM(self->converter, i);
v = _mysql_field_to_python(c, row[i], length[i]);
if (!v) goto error;
if (!PyMapping_HasKeyString(r, fields[i].name)) {
PyMapping_SetItemString(r, fields[i].name, v);
} else {
int len;
char buf[256];
strncpy(buf, fields[i].table, 256);
len = strlen(buf);
strncat(buf, ".", 256-len);
len = strlen(buf);
strncat(buf, fields[i].name, 256-len);
PyMapping_SetItemString(r, buf, v);
}
Py_DECREF(v);
}
return r;
error:
Py_XDECREF(r);
return NULL;
}
static PyObject *
_mysql_row_to_dict_old(
_mysql_ResultObject *self,
MYSQL_ROW row)
{
unsigned int n, i;
unsigned long *length;
PyObject *r, *c;
MYSQL_FIELD *fields;
n = mysql_num_fields(self->result);
if (!(r = PyDict_New())) return NULL;
length = mysql_fetch_lengths(self->result);
fields = mysql_fetch_fields(self->result);
for (i=0; i<n; i++) {
PyObject *v;
c = PyTuple_GET_ITEM(self->converter, i);
v = _mysql_field_to_python(c, row[i], length[i]);
if (!v) goto error;
{
int len=0;
char buf[256]="";
if (strlen(fields[i].table)) {
strncpy(buf, fields[i].table, 256);
len = strlen(buf);
strncat(buf, ".", 256-len);
len = strlen(buf);
}
strncat(buf, fields[i].name, 256-len);
PyMapping_SetItemString(r, buf, v);
}
Py_DECREF(v);
}
return r;
error:
Py_XDECREF(r);
return NULL;
}
typedef PyObject *_PYFUNC(_mysql_ResultObject *, MYSQL_ROW);
int
_mysql__fetch_row(
_mysql_ResultObject *self,
PyObject **r,
int skiprows,
int maxrows,
_PYFUNC *convert_row)
{
unsigned int i;
MYSQL_ROW row;
for (i = skiprows; i<(skiprows+maxrows); i++) {
PyObject *v;
if (!self->use)
row = mysql_fetch_row(self->result);
else {
Py_BEGIN_ALLOW_THREADS;
row = mysql_fetch_row(self->result);
Py_END_ALLOW_THREADS;
}
if (!row && mysql_errno(&(((_mysql_ConnectionObject *)(self->conn))->connection))) {
_mysql_Exception((_mysql_ConnectionObject *)self->conn);
goto error;
}
if (!row) {
if (MyTuple_Resize(r, i, 0) == -1) goto error;
break;
}
v = convert_row(self, row);
if (!v) goto error;
PyTuple_SET_ITEM(*r, i, v);
}
return i-skiprows;
error:
return -1;
}
static char _mysql_ResultObject_fetch_row__doc__[] =
"fetch_row([maxrows, how]) -- Fetches up to maxrows as a tuple.\n\
The rows are formatted according to how:\n\
\n\
0 -- tuples (default)\n\
1 -- dictionaries, key=column or table.column if duplicated\n\
2 -- dictionaries, key=table.column\n\
";
static PyObject *
_mysql_ResultObject_fetch_row(
_mysql_ResultObject *self,
PyObject *args,
PyObject *kwargs)
{
typedef PyObject *_PYFUNC(_mysql_ResultObject *, MYSQL_ROW);
static char *kwlist[] = { "maxrows", "how", NULL };
static _PYFUNC *row_converters[] =
{
_mysql_row_to_tuple,
_mysql_row_to_dict,
_mysql_row_to_dict_old
};
_PYFUNC *convert_row;
unsigned int maxrows=1, how=0, skiprows=0, rowsadded;
PyObject *r=NULL;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ii:fetch_row", kwlist,
&maxrows, &how))
return NULL;
check_result_connection(self);
if (how < 0 || how >= sizeof(row_converters)) {
PyErr_SetString(PyExc_ValueError, "how out of range");
return NULL;
}
convert_row = row_converters[how];
if (maxrows) {
if (!(r = PyTuple_New(maxrows))) goto error;
rowsadded = _mysql__fetch_row(self, &r, skiprows, maxrows,
convert_row);
if (rowsadded == -1) goto error;
} else {
if (self->use) {
maxrows = 1000;
if (!(r = PyTuple_New(maxrows))) goto error;
while (1) {
rowsadded = _mysql__fetch_row(self, &r, skiprows,
maxrows, convert_row);
if (rowsadded == -1) goto error;
skiprows += rowsadded;
if (rowsadded < maxrows) break;
if (MyTuple_Resize(&r, skiprows+maxrows, 0) == -1)
goto error;
}
} else {
/* XXX if overflow, maxrows<0? */
maxrows = (int) mysql_num_rows(self->result);
if (!(r = PyTuple_New(maxrows))) goto error;
rowsadded = _mysql__fetch_row(self, &r, 0,
maxrows, convert_row);
if (rowsadded == -1) goto error;
}
}
return r;
error:
Py_XDECREF(r);
return NULL;
}
#if MYSQL_VERSION_ID >= 32303
static char _mysql_ConnectionObject_change_user__doc__[] =
"Changes the user and causes the database specified by db to\n\
become the default (current) database on the connection\n\
specified by mysql. In subsequent queries, this database is\n\
the default for table references that do not include an\n\
explicit database specifier.\n\
\n\
This function was introduced in MySQL Version 3.23.3.\n\
\n\
Fails unless the connected user can be authenticated or if he\n\
doesn't have permission to use the database. In this case the\n\
user and database are not changed.\n\
\n\
The db parameter may be set to None if you don't want to have\n\
a default database.\n\
";
static PyObject *
_mysql_ConnectionObject_change_user(
_mysql_ConnectionObject *self,
PyObject *args,
PyObject *kwargs)
{
char *user, *pwd=NULL, *db=NULL;
int r;
static char *kwlist[] = { "user", "passwd", "db", NULL } ;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|ss:change_user",
kwlist, &user, &pwd, &db))
return NULL;
check_connection(self);
Py_BEGIN_ALLOW_THREADS
r = mysql_change_user(&(self->connection), user, pwd, db);
Py_END_ALLOW_THREADS
if (r) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
#endif
static char _mysql_ConnectionObject_character_set_name__doc__[] =
"Returns the default character set for the current connection.\n\
Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_character_set_name(
_mysql_ConnectionObject *self,
PyObject *args)
{
const char *s;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
#if MYSQL_VERSION_ID >= 32321
s = mysql_character_set_name(&(self->connection));
#else
s = "latin1";
#endif
#ifdef IS_PY3K
return PyUnicode_FromString(s);
#else
return PyString_FromString(s);
#endif
}
#if MYSQL_VERSION_ID >= 50007
static char _mysql_ConnectionObject_set_character_set__doc__[] =
"Sets the default character set for the current connection.\n\
Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_set_character_set(
_mysql_ConnectionObject *self,
PyObject *args)
{
const char *s;
int err;
if (!PyArg_ParseTuple(args, "s", &s)) return NULL;
check_connection(self);
Py_BEGIN_ALLOW_THREADS
err = mysql_set_character_set(&(self->connection), s);
Py_END_ALLOW_THREADS
if (err) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
#endif
#if MYSQL_VERSION_ID >= 50010
static char _mysql_ConnectionObject_get_character_set_info__doc__[] =
"Returns a dict with information about the current character set:\n\
\n\
collation\n\
collation name\n\
name\n\
character set name\n\
comment\n\
comment or descriptive name\n\
dir\n\
character set directory\n\
mbminlen\n\
min. length for multibyte string\n\
mbmaxlen\n\
max. length for multibyte string\n\
\n\
Not all keys may be present, particularly dir.\n\
\n\
Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_get_character_set_info(
_mysql_ConnectionObject *self,
PyObject *args)
{
PyObject *result;
MY_CHARSET_INFO cs;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
mysql_get_character_set_info(&(self->connection), &cs);
if (!(result = PyDict_New())) return NULL;
#ifdef IS_PY3K
if (cs.csname)
PyDict_SetItemString(result, "name", PyUnicode_FromString(cs.csname));
if (cs.name)
PyDict_SetItemString(result, "collation", PyUnicode_FromString(cs.name));
if (cs.comment)
PyDict_SetItemString(result, "comment", PyUnicode_FromString(cs.comment));
if (cs.dir)
PyDict_SetItemString(result, "dir", PyUnicode_FromString(cs.dir));
PyDict_SetItemString(result, "mbminlen", PyInt_FromLong(cs.mbminlen));
PyDict_SetItemString(result, "mbmaxlen", PyInt_FromLong(cs.mbmaxlen));
#else
if (cs.csname)
PyDict_SetItemString(result, "name", PyString_FromString(cs.csname));
if (cs.name)
PyDict_SetItemString(result, "collation", PyString_FromString(cs.name));
if (cs.comment)
PyDict_SetItemString(result, "comment", PyString_FromString(cs.comment));
if (cs.dir)
PyDict_SetItemString(result, "dir", PyString_FromString(cs.dir));
PyDict_SetItemString(result, "mbminlen", PyInt_FromLong(cs.mbminlen));
PyDict_SetItemString(result, "mbmaxlen", PyInt_FromLong(cs.mbmaxlen));
#endif
return result;
}
#endif
static char _mysql_get_client_info__doc__[] =
"get_client_info() -- Returns a string that represents\n\
the client library version.";
static PyObject *
_mysql_get_client_info(
PyObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
check_server_init(NULL);
#ifdef IS_PY3K
return PyUnicode_FromString(mysql_get_client_info());
#else
return PyString_FromString(mysql_get_client_info());
#endif
}
static char _mysql_ConnectionObject_get_host_info__doc__[] =
"Returns a string that represents the MySQL client library\n\
version. Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_get_host_info(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
#ifdef IS_PY3K
return PyUnicode_FromString(mysql_get_host_info(&(self->connection)));
#else
return PyString_FromString(mysql_get_host_info(&(self->connection)));
#endif
}
static char _mysql_ConnectionObject_get_proto_info__doc__[] =
"Returns an unsigned integer representing the protocol version\n\
used by the current connection. Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_get_proto_info(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
return PyInt_FromLong((long)mysql_get_proto_info(&(self->connection)));
}
static char _mysql_ConnectionObject_get_server_info__doc__[] =
"Returns a string that represents the server version number.\n\
Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_get_server_info(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
#ifdef IS_PY3K
return PyUnicode_FromString(mysql_get_server_info(&(self->connection)));
#else
return PyString_FromString(mysql_get_server_info(&(self->connection)));
#endif
}
static char _mysql_ConnectionObject_info__doc__[] =
"Retrieves a string providing information about the most\n\
recently executed query. Non-standard. Use messages or\n\
Cursor.messages.\n\
";
static PyObject *
_mysql_ConnectionObject_info(
_mysql_ConnectionObject *self,
PyObject *args)
{
const char *s;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
s = mysql_info(&(self->connection));
#ifdef IS_PY3K
if (s) return PyUnicode_FromString(s);
#else
if (s) return PyString_FromString(s);
#endif
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_insert_id__doc__[] =
"Returns the ID generated for an AUTO_INCREMENT column by the previous\n\
query. Use this function after you have performed an INSERT query into a\n\
table that contains an AUTO_INCREMENT field.\n\
\n\
Note that this returns 0 if the previous query does not\n\
generate an AUTO_INCREMENT value. If you need to save the value for\n\
later, be sure to call this immediately after the query\n\
that generates the value.\n\
\n\
The ID is updated after INSERT and UPDATE statements that generate\n\
an AUTO_INCREMENT value or that set a column value to\n\
LAST_INSERT_ID(expr). See section 6.3.5.2 Miscellaneous Functions\n\
in the MySQL documentation.\n\
\n\
Also note that the value of the SQL LAST_INSERT_ID() function always\n\
contains the most recently generated AUTO_INCREMENT value, and is not\n\
reset between queries because the value of that function is maintained\n\
in the server.\n\
" ;
static PyObject *
_mysql_ConnectionObject_insert_id(
_mysql_ConnectionObject *self,
PyObject *args)
{
my_ulonglong r;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
Py_BEGIN_ALLOW_THREADS
r = mysql_insert_id(&(self->connection));
Py_END_ALLOW_THREADS
return PyLong_FromUnsignedLongLong(r);
}
static char _mysql_ConnectionObject_kill__doc__[] =
"Asks the server to kill the thread specified by pid.\n\
Non-standard.";
static PyObject *
_mysql_ConnectionObject_kill(
_mysql_ConnectionObject *self,
PyObject *args)
{
unsigned long pid;
int r;
if (!PyArg_ParseTuple(args, "k:kill", &pid)) return NULL;
check_connection(self);
Py_BEGIN_ALLOW_THREADS
r = mysql_kill(&(self->connection), pid);
Py_END_ALLOW_THREADS
if (r) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_field_count__doc__[] =
"Returns the number of columns for the most recent query on the\n\
connection. Non-standard. Will probably give you bogus results\n\
on most cursor classes. Use Cursor.rowcount.\n\
";
static PyObject *
_mysql_ConnectionObject_field_count(
_mysql_ConnectionObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
#if MYSQL_VERSION_ID < 32224
return PyInt_FromLong((long)mysql_num_fields(&(self->connection)));
#else
return PyInt_FromLong((long)mysql_field_count(&(self->connection)));
#endif
}
static char _mysql_ResultObject_num_fields__doc__[] =
"Returns the number of fields (column) in the result." ;
static PyObject *
_mysql_ResultObject_num_fields(
_mysql_ResultObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
check_result_connection(self);
return PyInt_FromLong((long)mysql_num_fields(self->result));
}
static char _mysql_ResultObject_num_rows__doc__[] =
"Returns the number of rows in the result set. Note that if\n\
use=1, this will not return a valid value until the entire result\n\
set has been read.\n\
";
static PyObject *
_mysql_ResultObject_num_rows(
_mysql_ResultObject *self,
PyObject *args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
check_result_connection(self);
return PyLong_FromUnsignedLongLong(mysql_num_rows(self->result));
}
static char _mysql_ConnectionObject_ping__doc__[] =
"Checks whether or not the connection to the server is\n\
working. If it has gone down, an automatic reconnection is\n\
attempted.\n\
\n\
This function can be used by clients that remain idle for a\n\
long while, to check whether or not the server has closed the\n\
connection and reconnect if necessary.\n\
\n\
New in 1.2.2: Accepts an optional reconnect parameter. If True,\n\
then the client will attempt reconnection. Note that this setting\n\
is persistent. By default, this is on in MySQL<5.0.3, and off\n\
thereafter.\n\
\n\
Non-standard. You should assume that ping() performs an\n\
implicit rollback; use only when starting a new transaction.\n\
You have been warned.\n\
";
static PyObject *
_mysql_ConnectionObject_ping(
_mysql_ConnectionObject *self,
PyObject *args)
{
int r, reconnect = -1;
if (!PyArg_ParseTuple(args, "|I", &reconnect)) return NULL;
check_connection(self);
if ( reconnect != -1 ) self->connection.reconnect = reconnect;
Py_BEGIN_ALLOW_THREADS
r = mysql_ping(&(self->connection));
Py_END_ALLOW_THREADS
if (r) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_query__doc__[] =
"Execute a query. store_result() or use_result() will get the\n\
result set, if any. Non-standard. Use cursor() to create a cursor,\n\
then cursor.execute().\n\
" ;
static PyObject *
_mysql_ConnectionObject_query(
_mysql_ConnectionObject *self,
PyObject *args)
{
char *query;
int len, r;
if (!PyArg_ParseTuple(args, "s#:query", &query, &len)) return NULL;
check_connection(self);
Py_BEGIN_ALLOW_THREADS
r = mysql_real_query(&(self->connection), query, len);
Py_END_ALLOW_THREADS
if (r) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_select_db__doc__[] =
"Causes the database specified by db to become the default\n\
(current) database on the connection specified by mysql. In subsequent\n\
queries, this database is the default for table references that do not\n\
include an explicit database specifier.\n\
\n\
Fails unless the connected user can be authenticated as having\n\
permission to use the database.\n\
\n\
Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_select_db(
_mysql_ConnectionObject *self,
PyObject *args)
{
char *db;
int r;
if (!PyArg_ParseTuple(args, "s:select_db", &db)) return NULL;
check_connection(self);
Py_BEGIN_ALLOW_THREADS
r = mysql_select_db(&(self->connection), db);
Py_END_ALLOW_THREADS
if (r) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_shutdown__doc__[] =
"Asks the database server to shut down. The connected user must\n\
have shutdown privileges. Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_shutdown(
_mysql_ConnectionObject *self,
PyObject *args)
{
int r;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
Py_BEGIN_ALLOW_THREADS
r = mysql_shutdown(&(self->connection)
#if MYSQL_VERSION_ID >= 40103
, SHUTDOWN_DEFAULT
#endif
);
Py_END_ALLOW_THREADS
if (r) return _mysql_Exception(self);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ConnectionObject_stat__doc__[] =
"Returns a character string containing information similar to\n\
that provided by the mysqladmin status command. This includes\n\
uptime in seconds and the number of running threads,\n\
questions, reloads, and open tables. Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_stat(
_mysql_ConnectionObject *self,
PyObject *args)
{
const char *s;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
Py_BEGIN_ALLOW_THREADS
s = mysql_stat(&(self->connection));
Py_END_ALLOW_THREADS
if (!s) return _mysql_Exception(self);
#ifdef IS_PY3K
return PyUnicode_FromString(s);
#else
return PyString_FromString(s);
#endif
}
static char _mysql_ConnectionObject_store_result__doc__[] =
"Returns a result object acquired by mysql_store_result\n\
(results stored in the client). If no results are available,\n\
None is returned. Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_store_result(
_mysql_ConnectionObject *self,
PyObject *args)
{
PyObject *arglist=NULL, *kwarglist=NULL, *result=NULL;
_mysql_ResultObject *r=NULL;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
arglist = Py_BuildValue("(OiO)", self, 0, self->converter);
if (!arglist) goto error;
kwarglist = PyDict_New();
if (!kwarglist) goto error;
r = MyAlloc(_mysql_ResultObject, _mysql_ResultObject_Type);
if (!r) goto error;
if (_mysql_ResultObject_Initialize(r, arglist, kwarglist))
goto error;
result = (PyObject *) r;
if (!(r->result)) {
Py_DECREF(result);
Py_INCREF(Py_None);
result = Py_None;
}
error:
Py_XDECREF(arglist);
Py_XDECREF(kwarglist);
return result;
}
static char _mysql_ConnectionObject_thread_id__doc__[] =
"Returns the thread ID of the current connection. This value\n\
can be used as an argument to kill() to kill the thread.\n\
\n\
If the connection is lost and you reconnect with ping(), the\n\
thread ID will change. This means you should not get the\n\
thread ID and store it for later. You should get it when you\n\
need it.\n\
\n\
Non-standard.";
static PyObject *
_mysql_ConnectionObject_thread_id(
_mysql_ConnectionObject *self,
PyObject *args)
{
unsigned long pid;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
Py_BEGIN_ALLOW_THREADS
pid = mysql_thread_id(&(self->connection));
Py_END_ALLOW_THREADS
return PyInt_FromLong((long)pid);
}
static char _mysql_ConnectionObject_use_result__doc__[] =
"Returns a result object acquired by mysql_use_result\n\
(results stored in the server). If no results are available,\n\
None is returned. Non-standard.\n\
";
static PyObject *
_mysql_ConnectionObject_use_result(
_mysql_ConnectionObject *self,
PyObject *args)
{
PyObject *arglist=NULL, *kwarglist=NULL, *result=NULL;
_mysql_ResultObject *r=NULL;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_connection(self);
arglist = Py_BuildValue("(OiO)", self, 1, self->converter);
if (!arglist) return NULL;
kwarglist = PyDict_New();
if (!kwarglist) goto error;
r = MyAlloc(_mysql_ResultObject, _mysql_ResultObject_Type);
if (!r) goto error;
result = (PyObject *) r;
if (_mysql_ResultObject_Initialize(r, arglist, kwarglist))
goto error;
if (!(r->result)) {
Py_DECREF(result);
Py_INCREF(Py_None);
result = Py_None;
}
error:
Py_DECREF(arglist);
Py_XDECREF(kwarglist);
return result;
}
static void
_mysql_ConnectionObject_dealloc(
_mysql_ConnectionObject *self)
{
PyObject *o;
PyObject_GC_UnTrack(self);
if (self->open) {
o = _mysql_ConnectionObject_close(self, NULL);
Py_XDECREF(o);
}
MyFree(self);
}
static PyObject *
_mysql_ConnectionObject_repr(
_mysql_ConnectionObject *self)
{
char buf[300];
if (self->open)
sprintf(buf, "<_mysql.connection open to '%.256s' at %lx>",
self->connection.host,
(long)self);
else
sprintf(buf, "<_mysql.connection closed at %lx>",
(long)self);
#ifdef IS_PY3K
return PyUnicode_FromString(buf);
#else
return PyString_FromString(buf);
#endif
}
static char _mysql_ResultObject_data_seek__doc__[] =
"data_seek(n) -- seek to row n of result set";
static PyObject *
_mysql_ResultObject_data_seek(
_mysql_ResultObject *self,
PyObject *args)
{
unsigned int row;
if (!PyArg_ParseTuple(args, "i:data_seek", &row)) return NULL;
check_result_connection(self);
mysql_data_seek(self->result, row);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ResultObject_row_seek__doc__[] =
"row_seek(n) -- seek by offset n rows of result set";
static PyObject *
_mysql_ResultObject_row_seek(
_mysql_ResultObject *self,
PyObject *args)
{
int offset;
MYSQL_ROW_OFFSET r;
if (!PyArg_ParseTuple(args, "i:row_seek", &offset)) return NULL;
check_result_connection(self);
if (self->use) {
PyErr_SetString(_mysql_ProgrammingError,
"cannot be used with connection.use_result()");
return NULL;
}
r = mysql_row_tell(self->result);
mysql_row_seek(self->result, r+offset);
Py_INCREF(Py_None);
return Py_None;
}
static char _mysql_ResultObject_row_tell__doc__[] =
"row_tell() -- return the current row number of the result set.";
static PyObject *
_mysql_ResultObject_row_tell(
_mysql_ResultObject *self,
PyObject *args)
{
MYSQL_ROW_OFFSET r;
if (!PyArg_ParseTuple(args, "")) return NULL;
check_result_connection(self);
if (self->use) {
PyErr_SetString(_mysql_ProgrammingError,
"cannot be used with connection.use_result()");
return NULL;
}
r = mysql_row_tell(self->result);
return PyInt_FromLong(r-self->result->data->data);
}
static void
_mysql_ResultObject_dealloc(
_mysql_ResultObject *self)
{
PyObject_GC_UnTrack((PyObject *)self);
mysql_free_result(self->result);
_mysql_ResultObject_clear(self);
MyFree(self);
}
static PyObject *
_mysql_ResultObject_repr(
_mysql_ResultObject *self)
{
char buf[300];
sprintf(buf, "<_mysql.result object at %lx>",
(long)self);
#ifdef IS_PY3K
return PyUnicode_FromString(buf);
#else
return PyString_FromString(buf);
#endif
}
static PyMethodDef _mysql_ConnectionObject_methods[] = {
{
"affected_rows",
(PyCFunction)_mysql_ConnectionObject_affected_rows,
METH_VARARGS,
_mysql_ConnectionObject_affected_rows__doc__
},
{
"autocommit",
(PyCFunction)_mysql_ConnectionObject_autocommit,
METH_VARARGS,
_mysql_ConnectionObject_autocommit__doc__
},
{
"get_autocommit",
(PyCFunction)_mysql_ConnectionObject_get_autocommit,
METH_NOARGS,
_mysql_ConnectionObject_get_autocommit__doc__
},
{
"commit",
(PyCFunction)_mysql_ConnectionObject_commit,
METH_VARARGS,
_mysql_ConnectionObject_commit__doc__
},
{
"rollback",
(PyCFunction)_mysql_ConnectionObject_rollback,
METH_VARARGS,
_mysql_ConnectionObject_rollback__doc__
},
{
"next_result",
(PyCFunction)_mysql_ConnectionObject_next_result,
METH_VARARGS,
_mysql_ConnectionObject_next_result__doc__
},
#if MYSQL_VERSION_ID >= 40100
{
"set_server_option",
(PyCFunction)_mysql_ConnectionObject_set_server_option,
METH_VARARGS,
_mysql_ConnectionObject_set_server_option__doc__
},
{
"sqlstate",
(PyCFunction)_mysql_ConnectionObject_sqlstate,
METH_VARARGS,
_mysql_ConnectionObject_sqlstate__doc__
},
{
"warning_count",
(PyCFunction)_mysql_ConnectionObject_warning_count,
METH_VARARGS,
_mysql_ConnectionObject_warning_count__doc__
},
#endif
#if MYSQL_VERSION_ID >= 32303
{
"change_user",
(PyCFunction)_mysql_ConnectionObject_change_user,
METH_VARARGS | METH_KEYWORDS,
_mysql_ConnectionObject_change_user__doc__
},
#endif
{
"character_set_name",
(PyCFunction)_mysql_ConnectionObject_character_set_name,
METH_VARARGS,
_mysql_ConnectionObject_character_set_name__doc__
},
#if MYSQL_VERSION_ID >= 50007
{
"set_character_set",
(PyCFunction)_mysql_ConnectionObject_set_character_set,
METH_VARARGS,
_mysql_ConnectionObject_set_character_set__doc__
},
#endif
#if MYSQL_VERSION_ID >= 50010
{
"get_character_set_info",
(PyCFunction)_mysql_ConnectionObject_get_character_set_info,
METH_VARARGS,
_mysql_ConnectionObject_get_character_set_info__doc__
},
#endif
{
"close",
(PyCFunction)_mysql_ConnectionObject_close,
METH_VARARGS,
_mysql_ConnectionObject_close__doc__
},
{
"dump_debug_info",
(PyCFunction)_mysql_ConnectionObject_dump_debug_info,
METH_VARARGS,
_mysql_ConnectionObject_dump_debug_info__doc__
},
{
"escape",
(PyCFunction)_mysql_escape,
METH_VARARGS,
_mysql_escape__doc__
},
{
"escape_string",
(PyCFunction)_mysql_escape_string,
METH_VARARGS,
_mysql_escape_string__doc__
},
{
"error",
(PyCFunction)_mysql_ConnectionObject_error,
METH_VARARGS,
_mysql_ConnectionObject_error__doc__
},
{
"errno",
(PyCFunction)_mysql_ConnectionObject_errno,
METH_VARARGS,
_mysql_ConnectionObject_errno__doc__
},
{
"field_count",
(PyCFunction)_mysql_ConnectionObject_field_count,
METH_VARARGS,
_mysql_ConnectionObject_field_count__doc__
},
{
"get_host_info",
(PyCFunction)_mysql_ConnectionObject_get_host_info,
METH_VARARGS,
_mysql_ConnectionObject_get_host_info__doc__
},
{
"get_proto_info",
(PyCFunction)_mysql_ConnectionObject_get_proto_info,
METH_VARARGS,
_mysql_ConnectionObject_get_proto_info__doc__
},
{
"get_server_info",
(PyCFunction)_mysql_ConnectionObject_get_server_info,
METH_VARARGS,
_mysql_ConnectionObject_get_server_info__doc__
},
{
"info",
(PyCFunction)_mysql_ConnectionObject_info,
METH_VARARGS,
_mysql_ConnectionObject_info__doc__
},
{
"insert_id",
(PyCFunction)_mysql_ConnectionObject_insert_id,
METH_VARARGS,
_mysql_ConnectionObject_insert_id__doc__
},
{
"kill",
(PyCFunction)_mysql_ConnectionObject_kill,
METH_VARARGS,
_mysql_ConnectionObject_kill__doc__
},
{
"ping",
(PyCFunction)_mysql_ConnectionObject_ping,
METH_VARARGS,
_mysql_ConnectionObject_ping__doc__
},
{
"query",
(PyCFunction)_mysql_ConnectionObject_query,
METH_VARARGS,
_mysql_ConnectionObject_query__doc__
},
{
"select_db",
(PyCFunction)_mysql_ConnectionObject_select_db,
METH_VARARGS,
_mysql_ConnectionObject_select_db__doc__
},
{
"shutdown",
(PyCFunction)_mysql_ConnectionObject_shutdown,
METH_VARARGS,
_mysql_ConnectionObject_shutdown__doc__
},
{
"stat",
(PyCFunction)_mysql_ConnectionObject_stat,
METH_VARARGS,
_mysql_ConnectionObject_stat__doc__
},
{
"store_result",
(PyCFunction)_mysql_ConnectionObject_store_result,
METH_VARARGS,
_mysql_ConnectionObject_store_result__doc__
},
{
"string_literal",
(PyCFunction)_mysql_string_literal,
METH_VARARGS,
_mysql_string_literal__doc__},
{
"thread_id",
(PyCFunction)_mysql_ConnectionObject_thread_id,
METH_VARARGS,
_mysql_ConnectionObject_thread_id__doc__
},
{
"use_result",
(PyCFunction)_mysql_ConnectionObject_use_result,
METH_VARARGS,
_mysql_ConnectionObject_use_result__doc__
},
{NULL, NULL} /* sentinel */
};
static MyMemberlist(_mysql_ConnectionObject_memberlist)[] = {
MyMember(
"open",
T_INT,
offsetof(_mysql_ConnectionObject,open),
READONLY,
"True if connection is open"
),
MyMember(
"converter",
T_OBJECT,
offsetof(_mysql_ConnectionObject,converter),
0,
"Type conversion mapping"
),
MyMember(
"server_capabilities",
T_UINT,
offsetof(_mysql_ConnectionObject,connection.server_capabilities),
READONLY,
"Capabilites of server; consult MySQLdb.constants.CLIENT"
),
MyMember(
"port",
T_UINT,
offsetof(_mysql_ConnectionObject,connection.port),
READONLY,
"TCP/IP port of the server connection"
),
MyMember(
"client_flag",
T_UINT,
READONLY,
offsetof(_mysql_ConnectionObject,connection.client_flag),
"Client flags; refer to MySQLdb.constants.CLIENT"
),
{NULL} /* Sentinel */
};
static PyMethodDef _mysql_ResultObject_methods[] = {
{
"data_seek",
(PyCFunction)_mysql_ResultObject_data_seek,
METH_VARARGS,
_mysql_ResultObject_data_seek__doc__
},
{
"row_seek",
(PyCFunction)_mysql_ResultObject_row_seek,
METH_VARARGS,
_mysql_ResultObject_row_seek__doc__
},
{
"row_tell",
(PyCFunction)_mysql_ResultObject_row_tell,
METH_VARARGS,
_mysql_ResultObject_row_tell__doc__
},
{
"describe",
(PyCFunction)_mysql_ResultObject_describe,
METH_VARARGS,
_mysql_ResultObject_describe__doc__
},
{
"fetch_row",
(PyCFunction)_mysql_ResultObject_fetch_row,
METH_VARARGS | METH_KEYWORDS,
_mysql_ResultObject_fetch_row__doc__
},
{
"field_flags",
(PyCFunction)_mysql_ResultObject_field_flags,
METH_VARARGS,
_mysql_ResultObject_field_flags__doc__
},
{
"num_fields",
(PyCFunction)_mysql_ResultObject_num_fields,
METH_VARARGS,
_mysql_ResultObject_num_fields__doc__
},
{
"num_rows",
(PyCFunction)_mysql_ResultObject_num_rows,
METH_VARARGS,
_mysql_ResultObject_num_rows__doc__
},
{NULL, NULL} /* sentinel */
};
static MyMemberlist(_mysql_ResultObject_memberlist)[] = {
MyMember(
"converter",
T_OBJECT,
offsetof(_mysql_ResultObject,converter),
READONLY,
"Type conversion mapping"
),
{NULL} /* Sentinel */
};
static PyObject *
_mysql_ConnectionObject_getattr(
_mysql_ConnectionObject *self,
char *name)
{
#ifndef IS_PY3K
PyObject *res;
res = Py_FindMethod(_mysql_ConnectionObject_methods, (PyObject *)self, name);
if (res != NULL)
return res;
PyErr_Clear();
#endif
if (strcmp(name, "closed") == 0)
return PyInt_FromLong((long)!(self->open));
#if PY_VERSION_HEX < 0x02020000
return PyMember_Get((char *)self, _mysql_ConnectionObject_memberlist, name);
#else
{
MyMemberlist(*l);
for (l = _mysql_ConnectionObject_memberlist; l->name != NULL; l++) {
if (strcmp(l->name, name) == 0)
return PyMember_GetOne((char *)self, l);
}
PyErr_SetString(PyExc_AttributeError, name);
return NULL;
}
#endif
}
static PyObject *
_mysql_ResultObject_getattr(
_mysql_ResultObject *self,
char *name)
{
#ifndef IS_PY3K
PyObject *res;
res = Py_FindMethod(_mysql_ResultObject_methods, (PyObject *)self, name);
if (res != NULL)
return res;
PyErr_Clear();
#endif
#if PY_VERSION_HEX < 0x02020000
return PyMember_Get((char *)self, _mysql_ResultObject_memberlist, name);
#else
{
MyMemberlist(*l);
for (l = _mysql_ResultObject_memberlist; l->name != NULL; l++) {
if (strcmp(l->name, name) == 0)
return PyMember_GetOne((char *)self, l);
}
PyErr_SetString(PyExc_AttributeError, name);
return NULL;
}
#endif
}
static int
_mysql_ConnectionObject_setattr(
_mysql_ConnectionObject *self,
char *name,
PyObject *v)
{
if (v == NULL) {
PyErr_SetString(PyExc_AttributeError,
"can't delete connection attributes");
return -1;
}
#if PY_VERSION_HEX < 0x02020000
return PyMember_Set((char *)self, _mysql_ConnectionObject_memberlist, name, v);
#else
{
MyMemberlist(*l);
for (l = _mysql_ConnectionObject_memberlist; l->name != NULL; l++)
if (strcmp(l->name, name) == 0)
return PyMember_SetOne((char *)self, l, v);
}
PyErr_SetString(PyExc_AttributeError, name);
return -1;
#endif
}
static int
_mysql_ResultObject_setattr(
_mysql_ResultObject *self,
char *name,
PyObject *v)
{
if (v == NULL) {
PyErr_SetString(PyExc_AttributeError,
"can't delete connection attributes");
return -1;
}
#if PY_VERSION_HEX < 0x02020000
return PyMember_Set((char *)self, _mysql_ResultObject_memberlist, name, v);
#else
{
MyMemberlist(*l);
for (l = _mysql_ResultObject_memberlist; l->name != NULL; l++)
if (strcmp(l->name, name) == 0)
return PyMember_SetOne((char *)self, l, v);
}
PyErr_SetString(PyExc_AttributeError, name);
return -1;
#endif
}
PyTypeObject _mysql_ConnectionObject_Type = {
#ifdef IS_PY3K
PyVarObject_HEAD_INIT(NULL, 0)
#else
PyObject_HEAD_INIT(NULL)
0,
#endif
"_mysql.connection", /* (char *)tp_name For printing */
sizeof(_mysql_ConnectionObject),
0,
(destructor)_mysql_ConnectionObject_dealloc, /* tp_dealloc */
0, /*tp_print*/
(getattrfunc)_mysql_ConnectionObject_getattr, /* tp_getattr */
(setattrfunc)_mysql_ConnectionObject_setattr, /* tp_setattr */
0, /*tp_compare*/
(reprfunc)_mysql_ConnectionObject_repr, /* tp_repr */
/* Method suites for standard classes */
0, /* (PyNumberMethods *) tp_as_number */
0, /* (PySequenceMethods *) tp_as_sequence */
0, /* (PyMappingMethods *) tp_as_mapping */
/* More standard operations (here for binary compatibility) */
0, /* (hashfunc) tp_hash */
0, /* (ternaryfunc) tp_call */
0, /* (reprfunc) tp_str */
0, /* (getattrofunc) tp_getattro */
0, /* (setattrofunc) tp_setattro */
/* Functions to access object as input/output buffer */
0, /* (PyBufferProcs *) tp_as_buffer */
/* Flags to define presence of optional/expanded features */
#if PY_VERSION_HEX < 0x02020000
Py_TPFLAGS_DEFAULT, /* (long) tp_flags */
#else
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE,
#endif
_mysql_connect__doc__, /* (char *) tp_doc Documentation string */
#if PY_VERSION_HEX >= 0x02000000
/* Assigned meaning in release 2.0 */
#if PY_VERSION_HEX >= 0x02020000
/* call function for all accessible objects */
(traverseproc) _mysql_ConnectionObject_traverse, /* tp_traverse */
/* delete references to contained objects */
(inquiry) _mysql_ConnectionObject_clear, /* tp_clear */
#else
/* not supporting pre-2.2 GC */
0,
0,
#endif
#if PY_VERSION_HEX >= 0x02010000
/* Assigned meaning in release 2.1 */
/* rich comparisons */
0, /* (richcmpfunc) tp_richcompare */
/* weak reference enabler */
0, /* (long) tp_weaklistoffset */
#if PY_VERSION_HEX >= 0x02020000
/* Added in release 2.2 */
/* Iterators */
0, /* (getiterfunc) tp_iter */
0, /* (iternextfunc) tp_iternext */
/* Attribute descriptor and subclassing stuff */
(struct PyMethodDef *)_mysql_ConnectionObject_methods, /* tp_methods */
(MyMemberlist(*))_mysql_ConnectionObject_memberlist, /* tp_members */
0, /* (struct getsetlist *) tp_getset; */
0, /* (struct _typeobject *) tp_base; */
0, /* (PyObject *) tp_dict */
0, /* (descrgetfunc) tp_descr_get */
0, /* (descrsetfunc) tp_descr_set */
0, /* (long) tp_dictoffset */
(initproc)_mysql_ConnectionObject_Initialize, /* tp_init */
NULL, /* tp_alloc */
NULL, /* tp_new */
NULL, /* tp_free Low-level free-memory routine */
0, /* (PyObject *) tp_bases */
0, /* (PyObject *) tp_mro method resolution order */
0, /* (PyObject *) tp_defined */
#endif /* python 2.2 */
#endif /* python 2.1 */
#endif /* python 2.0 */
} ;
PyTypeObject _mysql_ResultObject_Type = {
#ifdef IS_PY3K
PyVarObject_HEAD_INIT(NULL, 0)
#else
PyObject_HEAD_INIT(NULL)
0,
#endif
"_mysql.result",
sizeof(_mysql_ResultObject),
0,
(destructor)_mysql_ResultObject_dealloc, /* tp_dealloc */
0, /*tp_print*/
(getattrfunc)_mysql_ResultObject_getattr, /* tp_getattr */
(setattrfunc)_mysql_ResultObject_setattr, /* tp_setattr */
0, /*tp_compare*/
(reprfunc)_mysql_ResultObject_repr, /* tp_repr */
/* Method suites for standard classes */
0, /* (PyNumberMethods *) tp_as_number */
0, /* (PySequenceMethods *) tp_as_sequence */
0, /* (PyMappingMethods *) tp_as_mapping */
/* More standard operations (here for binary compatibility) */
0, /* (hashfunc) tp_hash */
0, /* (ternaryfunc) tp_call */
0, /* (reprfunc) tp_str */
0, /* (getattrofunc) tp_getattro */
0, /* (setattrofunc) tp_setattro */
/* Functions to access object as input/output buffer */
0, /* (PyBufferProcs *) tp_as_buffer */
/* Flags to define presence of optional/expanded features */
#if PY_VERSION_HEX < 0x02020000
Py_TPFLAGS_DEFAULT, /* (long) tp_flags */
#else
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE,
#endif
_mysql_ResultObject__doc__, /* (char *) tp_doc Documentation string */
#if PY_VERSION_HEX >= 0x02000000
/* Assigned meaning in release 2.0 */
#if PY_VERSION_HEX >= 0x02020000
/* call function for all accessible objects */
(traverseproc) _mysql_ResultObject_traverse, /* tp_traverse */
/* delete references to contained objects */
(inquiry) _mysql_ResultObject_clear, /* tp_clear */
#else
/* not supporting pre-2.2 GC */
0,
0,
#endif
#if PY_VERSION_HEX >= 0x02010000
/* Assigned meaning in release 2.1 */
/* rich comparisons */
0, /* (richcmpfunc) tp_richcompare */
/* weak reference enabler */
0, /* (long) tp_weaklistoffset */
#if PY_VERSION_HEX >= 0x02020000
/* Added in release 2.2 */
/* Iterators */
0, /* (getiterfunc) tp_iter */
0, /* (iternextfunc) tp_iternext */
/* Attribute descriptor and subclassing stuff */
(struct PyMethodDef *) _mysql_ResultObject_methods, /* tp_methods */
(MyMemberlist(*)) _mysql_ResultObject_memberlist, /*tp_members */
0, /* (struct getsetlist *) tp_getset; */
0, /* (struct _typeobject *) tp_base; */
0, /* (PyObject *) tp_dict */
0, /* (descrgetfunc) tp_descr_get */
0, /* (descrsetfunc) tp_descr_set */
0, /* (long) tp_dictoffset */
(initproc)_mysql_ResultObject_Initialize, /* tp_init */
NULL, /* tp_alloc */
NULL, /* tp_new */
NULL, /* tp_free Low-level free-memory routine */
0, /* (PyObject *) tp_bases */
0, /* (PyObject *) tp_mro method resolution order */
0, /* (PyObject *) tp_defined */
#endif /* python 2.2 */
#endif /* python 2.1 */
#endif /* python 2.0 */
};
static PyMethodDef
_mysql_methods[] = {
{
"connect",
(PyCFunction)_mysql_connect,
METH_VARARGS | METH_KEYWORDS,
_mysql_connect__doc__
},
{
"debug",
(PyCFunction)_mysql_debug,
METH_VARARGS,
_mysql_debug__doc__
},
{
"escape",
(PyCFunction)_mysql_escape,
METH_VARARGS,
_mysql_escape__doc__
},
{
"escape_sequence",
(PyCFunction)_mysql_escape_sequence,
METH_VARARGS,
_mysql_escape_sequence__doc__
},
{
"escape_dict",
(PyCFunction)_mysql_escape_dict,
METH_VARARGS,
_mysql_escape_dict__doc__
},
{
"escape_string",
(PyCFunction)_mysql_escape_string,
METH_VARARGS,
_mysql_escape_string__doc__
},
{
"string_literal",
(PyCFunction)_mysql_string_literal,
METH_VARARGS,
_mysql_string_literal__doc__
},
{
"get_client_info",
(PyCFunction)_mysql_get_client_info,
METH_VARARGS,
_mysql_get_client_info__doc__
},
#if MYSQL_VERSION_ID >= 32314
{
"thread_safe",
(PyCFunction)_mysql_thread_safe,
METH_VARARGS,
_mysql_thread_safe__doc__
},
#endif
{
"server_init",
(PyCFunction)_mysql_server_init,
METH_VARARGS | METH_KEYWORDS,
_mysql_server_init__doc__
},
{
"server_end",
(PyCFunction)_mysql_server_end,
METH_VARARGS,
_mysql_server_end__doc__
},
{NULL, NULL} /* sentinel */
};
static PyObject *
_mysql_NewException(
PyObject *dict,
PyObject *edict,
char *name)
{
PyObject *e;
if (!(e = PyDict_GetItemString(edict, name)))
return NULL;
if (PyDict_SetItemString(dict, name, e)) return NULL;
#ifdef PYPY_VERSION
Py_INCREF(e);
#endif
return e;
}
#define QUOTE(X) _QUOTE(X)
#define _QUOTE(X) #X
static char _mysql___doc__[] =
"an adaptation of the MySQL C API (mostly)\n\
\n\
You probably are better off using MySQLdb instead of using this\n\
module directly.\n\
\n\
In general, renaming goes from mysql_* to _mysql.*. _mysql.connect()\n\
returns a connection object (MYSQL). Functions which expect MYSQL * as\n\
an argument are now methods of the connection object. A number of things\n\
return result objects (MYSQL_RES). Functions which expect MYSQL_RES * as\n\
an argument are now methods of the result object. Deprecated functions\n\
(as of 3.23) are NOT implemented.\n\
";
#ifdef IS_PY3K
static struct PyModuleDef _mysqlmodule = {
PyModuleDef_HEAD_INIT,
"_mysql", /* name of module */
_mysql___doc__, /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module,
or -1 if the module keeps state in global variables. */
_mysql_methods
};
PyMODINIT_FUNC
PyInit__mysql(void)
#else
DL_EXPORT(void)
init_mysql(void)
#endif
{
PyObject *dict, *module, *emod, *edict;
#ifdef IS_PY3K
module = PyModule_Create(&_mysqlmodule);
if (!module) return module; /* this really should never happen */
#else
module = Py_InitModule4("_mysql", _mysql_methods, _mysql___doc__,
(PyObject *)NULL, PYTHON_API_VERSION);
if (!module) return; /* this really should never happen */
#endif
#ifdef IS_PY3K
Py_TYPE(&_mysql_ConnectionObject_Type) = &PyType_Type;
Py_TYPE(&_mysql_ResultObject_Type) = &PyType_Type;
#else
_mysql_ConnectionObject_Type.ob_type = &PyType_Type;
_mysql_ResultObject_Type.ob_type = &PyType_Type;
#endif
#if PY_VERSION_HEX >= 0x02020000
_mysql_ConnectionObject_Type.tp_alloc = PyType_GenericAlloc;
_mysql_ConnectionObject_Type.tp_new = PyType_GenericNew;
#ifndef IS_PY3K
_mysql_ConnectionObject_Type.tp_free = _PyObject_GC_Del;
#endif
_mysql_ResultObject_Type.tp_alloc = PyType_GenericAlloc;
_mysql_ResultObject_Type.tp_new = PyType_GenericNew;
#ifndef IS_PY3K
_mysql_ResultObject_Type.tp_free = _PyObject_GC_Del;
#endif
#endif
if (!(dict = PyModule_GetDict(module))) goto error;
if (PyDict_SetItemString(dict, "version_info",
PyRun_String(QUOTE(version_info), Py_eval_input,
dict, dict)))
goto error;
if (PyDict_SetItemString(dict, "__version__",
#ifdef IS_PY3K
PyUnicode_FromString(QUOTE(__version__))))
#else
PyString_FromString(QUOTE(__version__))))
#endif
goto error;
if (PyDict_SetItemString(dict, "connection",
(PyObject *)&_mysql_ConnectionObject_Type))
goto error;
Py_INCREF(&_mysql_ConnectionObject_Type);
if (PyDict_SetItemString(dict, "result",
(PyObject *)&_mysql_ResultObject_Type))
goto error;
Py_INCREF(&_mysql_ResultObject_Type);
if (!(emod = PyImport_ImportModule("_mysql_exceptions"))) {
PyErr_Print();
goto error;
}
if (!(edict = PyModule_GetDict(emod))) goto error;
if (!(_mysql_MySQLError =
_mysql_NewException(dict, edict, "MySQLError")))
goto error;
if (!(_mysql_Warning =
_mysql_NewException(dict, edict, "Warning")))
goto error;
if (!(_mysql_Error =
_mysql_NewException(dict, edict, "Error")))
goto error;
if (!(_mysql_InterfaceError =
_mysql_NewException(dict, edict, "InterfaceError")))
goto error;
if (!(_mysql_DatabaseError =
_mysql_NewException(dict, edict, "DatabaseError")))
goto error;
if (!(_mysql_DataError =
_mysql_NewException(dict, edict, "DataError")))
goto error;
if (!(_mysql_OperationalError =
_mysql_NewException(dict, edict, "OperationalError")))
goto error;
if (!(_mysql_IntegrityError =
_mysql_NewException(dict, edict, "IntegrityError")))
goto error;
if (!(_mysql_InternalError =
_mysql_NewException(dict, edict, "InternalError")))
goto error;
if (!(_mysql_ProgrammingError =
_mysql_NewException(dict, edict, "ProgrammingError")))
goto error;
if (!(_mysql_NotSupportedError =
_mysql_NewException(dict, edict, "NotSupportedError")))
goto error;
Py_DECREF(emod);
#ifdef IS_PY3K
if (!(_mysql_NULL = PyUnicode_FromString("NULL")))
goto error;
#else
if (!(_mysql_NULL = PyString_FromString("NULL")))
goto error;
#endif
if (PyDict_SetItemString(dict, "NULL", _mysql_NULL)) goto error;
error:
if (PyErr_Occurred()) {
PyErr_SetString(PyExc_ImportError,
"_mysql: init failed");
module = NULL;
}
#ifdef IS_PY3K
return module;
#endif
}
================================================
FILE: _mysql_exceptions.py
================================================
"""_mysql_exceptions: Exception classes for _mysql and MySQLdb.
These classes are dictated by the DB API v2.0:
http://www.python.org/topics/database/DatabaseAPI-2.0.html
"""
try:
from exceptions import Exception, StandardError, Warning
except ImportError:
# Python 3
StandardError = Exception
class MySQLError(StandardError):
"""Exception related to operation with MySQL."""
class Warning(Warning, MySQLError):
"""Exception raised for important warnings like data truncations
while inserting, etc."""
class Error(MySQLError):
"""Exception that is the base class of all other error exceptions
(not Warning)."""
class InterfaceError(Error):
"""Exception raised for errors that are related to the database
interface rather than the database itself."""
class DatabaseError(Error):
"""Exception raised for errors that are related to the
database."""
class DataError(DatabaseError):
"""Exception raised for errors that are due to problems with the
processed data like division by zero, numeric value out of range,
etc."""
class OperationalError(DatabaseError):
"""Exception raised for errors that are related to the database's
operation and not necessarily under the control of the programmer,
e.g. an unexpected disconnect occurs, the data source name is not
found, a transaction could not be processed, a memory allocation
error occurred during processing, etc."""
class IntegrityError(DatabaseError):
"""Exception raised when the relational integrity of the database
is affected, e.g. a foreign key check fails, duplicate key,
etc."""
class InternalError(DatabaseError):
"""Exception raised when the database encounters an internal
error, e.g. the cursor is not valid anymore, the transaction is
out of sync, etc."""
class ProgrammingError(DatabaseError):
"""Exception raised for programming errors, e.g. table not found
or already exists, syntax error in the SQL statement, wrong number
of parameters specified, etc."""
class NotSupportedError(DatabaseError):
"""Exception raised in case a method or database API was used
which is not supported by the database, e.g. requesting a
.rollback() on a connection that does not support transaction or
has transactions turned off."""
================================================
FILE: doc/FAQ.rst
================================================
====================================
MySQLdb Frequently Asked Questions
====================================
.. contents::
..
Build Errors
------------
ld: fatal: library -lmysqlclient_r: not found
mysqlclient_r is the thread-safe library. It's not available on
all platforms, or all installations, apparently. You'll need to
reconfigure site.cfg (in MySQLdb-1.2.1 and newer) to have
threadsafe = False.
mysql.h: No such file or directory
This almost always mean you don't have development packages
installed. On some systems, C headers for various things (like MySQL)
are distributed as a seperate package. You'll need to figure out
what that is and install it, but often the name ends with -devel.
Another possibility: Some older versions of mysql_config behave oddly
and may throw quotes around some of the path names, which confused
MySQLdb-1.2.0. 1.2.1 works around these problems. If you see things
like -I'/usr/local/include/mysql' in your compile command, that's
probably the issue, but it shouldn't happen any more.
ImportError
-----------
ImportError: No module named _mysql
If you see this, it's likely you did some wrong when installing
MySQLdb; re-read (or read) README. _mysql is the low-level C module
that interfaces with the MySQL client library.
Various versions of MySQLdb in the past have had build issues on
"weird" platforms; "weird" in this case means "not Linux", though
generally there aren't problems on Unix/POSIX platforms, including
BSDs and Mac OS X. Windows has been more problematic, in part because
there is no `mysql_config` available in the Windows installation of
MySQL. 1.2.1 solves most, if not all, of these problems, but you will
still have to edit a configuration file so that the setup knows where
to find MySQL and what libraries to include.
ImportError: libmysqlclient_r.so.14: cannot open shared object file: No such file or directory
The number after .so may vary, but this means you have a version of
MySQLdb compiled against one version of MySQL, and are now trying to
run it against a different version. The shared library version tends
to change between major releases.
Solution: Rebuilt MySQLdb, or get the matching version of MySQL.
Another thing that can cause this: The MySQL libraries may not be on
your system path.
Solutions:
* set the LD_LIBRARY_PATH environment variable so that it includes
the path to the MySQL libraries.
* set static=True in site.cfg for static linking
* reconfigure your system so that the MySQL libraries are on the
default loader path. In Linux, you edit /etc/ld.so.conf and run
ldconfig. For Solaris, see `Linker and Libraries Guide
<http://docs.sun.com/app/docs/doc/817-3677/6mj8mbtbe?a=view>`_.
ImportError: ld.so.1: python: fatal: libmtmalloc.so.1: DF_1_NOOPEN tagged object may not be dlopen()'ed
This is a weird one from Solaris. What does it mean? I have no idea.
However, things like this can happen if there is some sort of a compiler
or environment mismatch between Python and MySQL. For example, on some
commercial systems, you might have some code compiled with their own
compiler, and other things compiled with GCC. They don't always mesh
together. One way to encounter this is by getting binary packages from
different vendors.
Solution: Rebuild Python or MySQL (or maybe both) from source.
ImportError: dlopen(./_mysql.so, 2): Symbol not found: _sprintf$LDBLStub
Referenced from: ./_mysql.so
Expected in: dynamic lookup
This is one from Mac OS X. It seems to have been a compiler mismatch,
but this time between two different versions of GCC. It seems nearly
every major release of GCC changes the ABI in some why, so linking
code compiled with GCC-3.3 and GCC-4.0, for example, can be
problematic.
My data disappeared! (or won't go away!)
----------------------------------------
Starting with 1.2.0, MySQLdb disables autocommit by default, as
required by the DB-API standard (`PEP-249`_). If you are using InnoDB
tables or some other type of transactional table type, you'll need
to do connection.commit() before closing the connection, or else
none of your changes will be written to the database.
Conversely, you can also use connection.rollback() to throw away
any changes you've made since the last commit.
Important note: Some SQL statements -- specifically DDL statements
like CREATE TABLE -- are non-transactional, so they can't be
rolled back, and they cause pending transactions to commit.
Other Errors
------------
OperationalError: (1251, 'Client does not support authentication protocol requested by server; consider upgrading MySQL client')
This means your server and client libraries are not the same version.
More specifically, it probably means you have a 4.1 or newer server
and 4.0 or older client. You can either upgrade the client side, or
try some of the workarounds in `Password Hashing as of MySQL 4.1
<http://dev.mysql.com/doc/refman/5.0/en/password-hashing.html>`_.
Other Resources
---------------
* Help forum. Please search before posting.
* `Google <http://www.google.com/>`_
* READ README!
* Read the User's Guide
* Read `PEP-249`_
.. _`PEP-249`: http://www.python.org/peps/pep-0249.html
================================================
FILE: doc/Makefile
================================================
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
-rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/MySQLdb.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/MySQLdb.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/MySQLdb"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/MySQLdb"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
================================================
FILE: doc/MySQLdb.constants.rst
================================================
constants Package
=================
:mod:`constants` Package
------------------------
.. automodule:: MySQLdb.constants
:members:
:undoc-members:
:show-inheritance:
:mod:`CLIENT` Module
--------------------
.. automodule:: MySQLdb.constants.CLIENT
:members:
:undoc-members:
:show-inheritance:
:mod:`CR` Module
----------------
.. automodule:: MySQLdb.constants.CR
:members:
:undoc-members:
:show-inheritance:
:mod:`ER` Module
----------------
.. automodule:: MySQLdb.constants.ER
:members:
:undoc-members:
:show-inheritance:
:mod:`FIELD_TYPE` Module
------------------------
.. automodule:: MySQLdb.constants.FIELD_TYPE
:members:
:undoc-members:
:show-inheritance:
:mod:`FLAG` Module
------------------
.. automodule:: MySQLdb.constants.FLAG
:members:
:undoc-members:
:show-inheritance:
:mod:`REFRESH` Module
---------------------
.. automodule:: MySQLdb.constants.REFRESH
:members:
:undoc-members:
:show-inheritance:
================================================
FILE: doc/MySQLdb.rst
================================================
MySQLdb Package
===============
:mod:`MySQLdb` Package
----------------------
.. automodule:: MySQLdb.__init__
:members:
:undoc-members:
:show-inheritance:
:mod:`connections` Module
-------------------------
.. automodule:: MySQLdb.connections
:members: Connection
:undoc-members:
:show-inheritance:
:mod:`converters` Module
------------------------
.. automodule:: MySQLdb.converters
:members:
:undoc-members:
:show-inheritance:
:mod:`cursors` Module
---------------------
.. automodule:: MySQLdb.cursors
:members: Cursor
:undoc-members:
:show-inheritance:
:mod:`times` Module
-------------------
.. automodule:: MySQLdb.times
:members:
:undoc-members:
:show-inheritance:
Subpackages
-----------
.. toctree::
MySQLdb.constants
================================================
FILE: doc/_mysql.rst
================================================
_mysql Module
=============
.. automodule:: _mysql
:members:
:undoc-members:
:show-inheritance:
================================================
FILE: doc/_mysql_exceptions.rst
================================================
_mysql_exceptions Module
========================
.. automodule:: _mysql_exceptions
:members:
:undoc-members:
:show-inheritance:
================================================
FILE: doc/conf.py
================================================
# -*- coding: utf-8 -*-
#
# MySQLdb documentation build configuration file, created by
# sphinx-quickstart on Sun Oct 07 19:36:17 2012.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.autodoc']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'MySQLdb'
copyright = u'2012, Andy Dustman'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1.2'
# The full version, including alpha/beta/rc tags.
release = '1.2.4b4'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# -- Options for HTML output ---------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'MySQLdbdoc'
# -- Options for LaTeX output --------------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'MySQLdb.tex', u'MySQLdb Documentation',
u'Andy Dustman', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output --------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'mysqldb', u'MySQLdb Documentation',
[u'Andy Dustman'], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output ------------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'MySQLdb', u'MySQLdb Documentation',
u'Andy Dustman', 'MySQLdb', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
================================================
FILE: doc/index.rst
================================================
.. MySQLdb documentation master file, created by
sphinx-quickstart on Sun Oct 07 19:36:17 2012.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to MySQLdb's documentation!
===================================
Contents:
.. toctree::
:maxdepth: 3
user_guide
MySQLdb
FAQ
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
================================================
FILE: doc/make.bat
================================================
@ECHO OFF
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set BUILDDIR=_build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
set I18NSPHINXOPTS=%SPHINXOPTS% .
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. singlehtml to make a single large HTML file
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. devhelp to make HTML files and a Devhelp project
echo. epub to make an epub
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. text to make text files
echo. man to make manual pages
echo. texinfo to make Texinfo files
echo. gettext to make PO message catalogs
echo. changes to make an overview over all changed/added/deprecated items
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
del /q /s %BUILDDIR%\*
goto end
)
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
goto end
)
if "%1" == "singlehtml" (
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\MySQLdb.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\MySQLdb.ghc
goto end
)
if "%1" == "devhelp" (
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished.
goto end
)
if "%1" == "epub" (
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
if errorlevel 1 exit /b 1
echo.
echo.Build finished.
gitextract_hp90r54w/ ├── .gitignore ├── .travis.yml ├── GPL-2.0 ├── HISTORY ├── INSTALL ├── MANIFEST.in ├── MySQLdb/ │ ├── __init__.py │ ├── connections.py │ ├── constants/ │ │ ├── CLIENT.py │ │ ├── CR.py │ │ ├── ER.py │ │ ├── FIELD_TYPE.py │ │ ├── FLAG.py │ │ ├── REFRESH.py │ │ └── __init__.py │ ├── converters.py │ ├── cursors.py │ ├── release.py │ └── times.py ├── README.md ├── _mysql.c ├── _mysql_exceptions.py ├── doc/ │ ├── FAQ.rst │ ├── Makefile │ ├── MySQLdb.constants.rst │ ├── MySQLdb.rst │ ├── _mysql.rst │ ├── _mysql_exceptions.rst │ ├── conf.py │ ├── index.rst │ ├── make.bat │ ├── modules.rst │ └── user_guide.rst ├── metadata.cfg ├── pymemcompat.h ├── setup.cfg ├── setup.py ├── setup_common.py ├── setup_posix.py ├── setup_windows.py ├── site.cfg ├── tests/ │ ├── capabilities.py │ ├── configdb.py │ ├── dbapi20.py │ ├── default.cnf │ ├── test_MySQLdb_capabilities.py │ ├── test_MySQLdb_dbapi20.py │ ├── test_MySQLdb_nonstandard.py │ └── travis.cnf └── tox.ini
SYMBOL INDEX (289 symbols across 16 files)
FILE: MySQLdb/__init__.py
class DBAPISet (line 39) | class DBAPISet(frozenset):
method __eq__ (line 44) | def __eq__(self, other):
function test_DBAPISet_set_equality (line 63) | def test_DBAPISet_set_equality():
function test_DBAPISet_set_inequality (line 66) | def test_DBAPISet_set_inequality():
function test_DBAPISet_set_equality_membership (line 69) | def test_DBAPISet_set_equality_membership():
function test_DBAPISet_set_inequality_membership (line 72) | def test_DBAPISet_set_inequality_membership():
function Binary (line 75) | def Binary(x):
function Connect (line 78) | def Connect(*args, **kwargs):
FILE: MySQLdb/connections.py
function defaulterrorhandler (line 17) | def defaulterrorhandler(connection, cursor, errorclass, errorvalue):
function numeric_part (line 40) | def numeric_part(s):
class Connection (line 56) | class Connection(_mysql.connection):
method __init__ (line 62) | def __init__(self, *args, **kwargs):
method autocommit (line 240) | def autocommit(self, on):
method cursor (line 245) | def cursor(self, cursorclass=None):
method __enter__ (line 256) | def __enter__(self):
method __exit__ (line 261) | def __exit__(self, exc, value, tb):
method literal (line 267) | def literal(self, o):
method begin (line 280) | def begin(self):
method warning_count (line 291) | def warning_count(self):
method set_character_set (line 301) | def set_character_set(self, charset):
method set_sql_mode (line 321) | def set_sql_mode(self, sql_mode):
method show_warnings (line 329) | def show_warnings(self):
FILE: MySQLdb/converters.py
function Bool2Str (line 61) | def Bool2Str(s, d): return str(int(s))
function Str2Set (line 63) | def Str2Set(s):
function Set2Str (line 66) | def Set2Str(s, d):
function Thing2Str (line 69) | def Thing2Str(s, d):
function Unicode2Str (line 73) | def Unicode2Str(s, d):
function Float2Str (line 81) | def Float2Str(o, d):
function None2NULL (line 84) | def None2NULL(o, d):
function Thing2Literal (line 88) | def Thing2Literal(o, d):
function Instance2Str (line 98) | def Instance2Str(o, d):
function char_array (line 126) | def char_array(s):
function array2Str (line 129) | def array2Str(o, d):
function quote_tuple (line 132) | def quote_tuple(t, d):
FILE: MySQLdb/cursors.py
class BaseCursor (line 50) | class BaseCursor(object):
method __init__ (line 75) | def __init__(self, connection):
method __del__ (line 92) | def __del__(self):
method close (line 97) | def close(self):
method _check_executed (line 103) | def _check_executed(self):
method _warning_check (line 107) | def _warning_check(self):
method nextset (line 122) | def nextset(self):
method _post_get_result (line 140) | def _post_get_result(self): pass
method _do_get_result (line 142) | def _do_get_result(self):
method setinputsizes (line 153) | def setinputsizes(self, *args):
method setoutputsizes (line 156) | def setoutputsizes(self, *args):
method _get_db (line 159) | def _get_db(self):
method execute (line 164) | def execute(self, query, args=None):
method executemany (line 210) | def executemany(self, query, args):
method callproc (line 266) | def callproc(self, procname, args=()):
method _do_query (line 315) | def _do_query(self, q):
method _query (line 322) | def _query(self, q): return self._do_query(q)
method _fetch_row (line 324) | def _fetch_row(self, size=1):
method __iter__ (line 329) | def __iter__(self):
class CursorStoreResultMixIn (line 344) | class CursorStoreResultMixIn(object):
method _get_result (line 351) | def _get_result(self): return self._get_db().store_result()
method _query (line 353) | def _query(self, q):
method _post_get_result (line 358) | def _post_get_result(self):
method fetchone (line 362) | def fetchone(self):
method fetchmany (line 371) | def fetchmany(self, size=None):
method fetchall (line 380) | def fetchall(self):
method scroll (line 390) | def scroll(self, value, mode='relative'):
method __iter__ (line 409) | def __iter__(self):
class CursorUseResultMixIn (line 415) | class CursorUseResultMixIn(object):
method _get_result (line 425) | def _get_result(self): return self._get_db().use_result()
method fetchone (line 427) | def fetchone(self):
method fetchmany (line 437) | def fetchmany(self, size=None):
method fetchall (line 447) | def fetchall(self):
method __iter__ (line 455) | def __iter__(self):
method next (line 458) | def next(self):
class CursorTupleRowsMixIn (line 465) | class CursorTupleRowsMixIn(object):
class CursorDictRowsMixIn (line 473) | class CursorDictRowsMixIn(object):
method fetchoneDict (line 480) | def fetchoneDict(self):
method fetchmanyDict (line 488) | def fetchmanyDict(self, size=None):
method fetchallDict (line 496) | def fetchallDict(self):
class CursorOldDictRowsMixIn (line 505) | class CursorOldDictRowsMixIn(CursorDictRowsMixIn):
class Cursor (line 514) | class Cursor(CursorStoreResultMixIn, CursorTupleRowsMixIn,
class DictCursor (line 521) | class DictCursor(CursorStoreResultMixIn, CursorDictRowsMixIn,
class SSCursor (line 528) | class SSCursor(CursorUseResultMixIn, CursorTupleRowsMixIn,
class SSDictCursor (line 535) | class SSDictCursor(CursorUseResultMixIn, CursorDictRowsMixIn,
FILE: MySQLdb/times.py
function DateFromTicks (line 20) | def DateFromTicks(ticks):
function TimeFromTicks (line 24) | def TimeFromTicks(ticks):
function TimestampFromTicks (line 28) | def TimestampFromTicks(ticks):
function format_TIMEDELTA (line 34) | def format_TIMEDELTA(v):
function format_TIMESTAMP (line 40) | def format_TIMESTAMP(d):
function DateTime_or_None (line 44) | def DateTime_or_None(s):
function TimeDelta_or_None (line 65) | def TimeDelta_or_None(s):
function Time_or_None (line 84) | def Time_or_None(s):
function Date_or_None (line 98) | def Date_or_None(s):
function DateTime2literal (line 106) | def DateTime2literal(d, c):
function DateTimeDelta2literal (line 110) | def DateTimeDelta2literal(d, c):
function mysql_timestamp_converter (line 114) | def mysql_timestamp_converter(s):
FILE: _mysql.c
type Py_ssize_t (line 69) | typedef int Py_ssize_t;
type _mysql_ConnectionObject (line 86) | typedef struct {
type _mysql_ResultObject (line 99) | typedef struct {
function PyObject (line 127) | PyObject *
function PyObject (line 261) | static PyObject *_mysql_server_init(
function PyObject (line 361) | static PyObject *_mysql_server_end(
function PyObject (line 379) | static PyObject *_mysql_thread_safe(
function _mysql_ResultObject_Initialize (line 399) | static int
function _mysql_ResultObject_traverse (line 520) | static int _mysql_ResultObject_traverse(
function _mysql_ResultObject_clear (line 535) | static int _mysql_ResultObject_clear(
function _mysql_ConnectionObject_Initialize (line 545) | static int
function PyObject (line 760) | static PyObject *
function _mysql_ConnectionObject_traverse (line 778) | static int _mysql_ConnectionObject_traverse(
function _mysql_ConnectionObject_clear (line 789) | static int _mysql_ConnectionObject_clear(
function PyObject (line 800) | static PyObject *
function PyObject (line 828) | static PyObject *
function PyObject (line 844) | static PyObject *
function Py_END_ALLOW_THREADS (line 898) | Py_END_ALLOW_THREADS
function Py_END_ALLOW_THREADS (line 956) | Py_END_ALLOW_THREADS
function Py_END_ALLOW_THREADS (line 1011) | Py_END_ALLOW_THREADS
function PyObject (line 1047) | static PyObject *
function PyObject (line 1064) | static PyObject *
function PyObject (line 1080) | static PyObject *
function PyObject (line 1102) | static PyObject *
function PyObject (line 1149) | static PyObject *
function PyObject (line 1194) | static PyObject *
function PyObject (line 1230) | static PyObject *
function PyObject (line 1260) | static PyObject *
function PyObject (line 1294) | static PyObject *
function PyObject (line 1326) | static PyObject *
function PyObject (line 1362) | static PyObject *
function PyObject (line 1386) | static PyObject *
function PyObject (line 1416) | static PyObject *
function PyObject (line 1441) | static PyObject *
function PyObject (line 1480) | static PyObject *
type PyObject (line 1519) | typedef PyObject *_PYFUNC(_mysql_ResultObject *, MYSQL_ROW);
function _mysql__fetch_row (line 1521) | int
function PyObject (line 1567) | static PyObject *
function Py_END_ALLOW_THREADS (line 1662) | Py_END_ALLOW_THREADS
function PyObject (line 1700) | static PyObject *
function PyObject (line 1740) | static PyObject *
function PyObject (line 1782) | static PyObject *
function PyObject (line 1801) | static PyObject *
function PyObject (line 1820) | static PyObject *
function PyObject (line 1835) | static PyObject *
function PyObject (line 1855) | static PyObject *
function PyObject (line 1894) | static PyObject *
function Py_END_ALLOW_THREADS (line 1923) | Py_END_ALLOW_THREADS
function PyObject (line 1952) | static PyObject *
function PyObject (line 1968) | static PyObject *
function Py_END_ALLOW_THREADS (line 2086) | Py_END_ALLOW_THREADS
function PyObject (line 2125) | static PyObject *
function PyObject (line 2166) | static PyObject *
function PyObject (line 2186) | static PyObject *
function _mysql_ConnectionObject_dealloc (line 2216) | static void
function PyObject (line 2230) | static PyObject *
function PyObject (line 2251) | static PyObject *
function PyObject (line 2266) | static PyObject *
function PyObject (line 2288) | static PyObject *
function _mysql_ResultObject_dealloc (line 2305) | static void
function PyObject (line 2315) | static PyObject *
function PyObject (line 2652) | static PyObject *
function PyObject (line 2682) | static PyObject *
function _mysql_ConnectionObject_setattr (line 2710) | static int
function _mysql_ResultObject_setattr (line 2735) | static int
type PyMethodDef (line 2828) | struct PyMethodDef
type PyMethodDef (line 2917) | struct PyMethodDef
function PyObject (line 3010) | static PyObject *
type PyModuleDef (line 3045) | struct PyModuleDef
function PyMODINIT_FUNC (line 3054) | PyMODINIT_FUNC
FILE: _mysql_exceptions.py
class MySQLError (line 15) | class MySQLError(StandardError):
class Warning (line 20) | class Warning(Warning, MySQLError):
class Error (line 25) | class Error(MySQLError):
class InterfaceError (line 31) | class InterfaceError(Error):
class DatabaseError (line 37) | class DatabaseError(Error):
class DataError (line 43) | class DataError(DatabaseError):
class OperationalError (line 50) | class OperationalError(DatabaseError):
class IntegrityError (line 59) | class IntegrityError(DatabaseError):
class InternalError (line 66) | class InternalError(DatabaseError):
class ProgrammingError (line 73) | class ProgrammingError(DatabaseError):
class NotSupportedError (line 80) | class NotSupportedError(DatabaseError):
FILE: setup_common.py
function get_metadata_and_options (line 8) | def get_metadata_and_options():
function enabled (line 20) | def enabled(options, option):
function create_release_file (line 30) | def create_release_file(metadata):
FILE: setup_posix.py
function dequote (line 7) | def dequote(s):
function compiler_flag (line 12) | def compiler_flag(f):
function mysql_config (line 15) | def mysql_config(what):
function get_config (line 29) | def get_config():
FILE: setup_windows.py
function get_config (line 3) | def get_config():
FILE: tests/capabilities.py
class DatabaseTest (line 14) | class DatabaseTest(unittest.TestCase):
method setUp (line 23) | def setUp(self):
method tearDown (line 35) | def tearDown(self):
method table_exists (line 46) | def table_exists(self, name):
method quote_identifier (line 54) | def quote_identifier(self, ident):
method new_table_name (line 57) | def new_table_name(self):
method create_table (line 65) | def create_table(self, columndefs):
method check_data_integrity (line 81) | def check_data_integrity(self, columndefs, generator):
method test_transactions (line 103) | def test_transactions(self):
method test_truncation (line 136) | def test_truncation(self):
method test_CHAR (line 180) | def test_CHAR(self):
method test_INT (line 188) | def test_INT(self):
method test_DECIMAL (line 196) | def test_DECIMAL(self):
method test_DATE (line 205) | def test_DATE(self):
method test_TIME (line 213) | def test_TIME(self):
method test_DATETIME (line 221) | def test_DATETIME(self):
method test_TIMESTAMP (line 229) | def test_TIMESTAMP(self):
method test_fractional_TIMESTAMP (line 237) | def test_fractional_TIMESTAMP(self):
method test_LONG (line 245) | def test_LONG(self):
method test_TEXT (line 255) | def test_TEXT(self):
method test_LONG_BYTE (line 262) | def test_LONG_BYTE(self):
method test_BLOB (line 272) | def test_BLOB(self):
FILE: tests/configdb.py
function connection_kwargs (line 13) | def connection_kwargs(kwargs):
function connection_factory (line 18) | def connection_factory(**kwargs):
FILE: tests/dbapi20.py
class DatabaseAPI20Test (line 67) | class DatabaseAPI20Test(unittest.TestCase):
method executeDDL1 (line 105) | def executeDDL1(self,cursor):
method executeDDL2 (line 108) | def executeDDL2(self,cursor):
method setUp (line 111) | def setUp(self):
method tearDown (line 117) | def tearDown(self):
method _connect (line 136) | def _connect(self):
method test_connect (line 144) | def test_connect(self):
method test_apilevel (line 148) | def test_apilevel(self):
method test_threadsafety (line 157) | def test_threadsafety(self):
method test_paramstyle (line 166) | def test_paramstyle(self):
method test_Exceptions (line 177) | def test_Exceptions(self):
method test_ExceptionsAsConnectionAttributes (line 204) | def test_ExceptionsAsConnectionAttributes(self):
method test_commit (line 224) | def test_commit(self):
method test_rollback (line 232) | def test_rollback(self):
method test_cursor (line 242) | def test_cursor(self):
method test_cursor_isolation (line 249) | def test_cursor_isolation(self):
method test_description (line 268) | def test_description(self):
method test_rowcount (line 301) | def test_rowcount(self):
method test_callproc (line 331) | def test_callproc(self):
method test_close (line 350) | def test_close(self):
method test_execute (line 368) | def test_execute(self):
method _paraminsert (line 376) | def _paraminsert(self,cur):
method test_executemany (line 426) | def test_executemany(self):
method test_fetchone (line 478) | def test_fetchone(self):
method _populate (line 530) | def _populate(self):
method test_fetchmany (line 540) | def test_fetchmany(self):
method test_fetchall (line 622) | def test_fetchall(self):
method test_mixedfetch (line 671) | def test_mixedfetch(self):
method help_nextset_setUp (line 704) | def help_nextset_setUp(self,cur):
method help_nextset_tearDown (line 719) | def help_nextset_tearDown(self,cur):
method test_nextset (line 724) | def test_nextset(self):
method test_nextset (line 753) | def test_nextset(self):
method test_arraysize (line 756) | def test_arraysize(self):
method test_setinputsizes (line 767) | def test_setinputsizes(self):
method test_setoutputsize_basic (line 776) | def test_setoutputsize_basic(self):
method test_setoutputsize (line 787) | def test_setoutputsize(self):
method test_None (line 791) | def test_None(self):
method test_Date (line 805) | def test_Date(self):
method test_Time (line 811) | def test_Time(self):
method test_Timestamp (line 817) | def test_Timestamp(self):
method test_Binary (line 825) | def test_Binary(self):
method test_STRING (line 829) | def test_STRING(self):
method test_BINARY (line 834) | def test_BINARY(self):
method test_NUMBER (line 839) | def test_NUMBER(self):
method test_DATETIME (line 844) | def test_DATETIME(self):
method test_ROWID (line 849) | def test_ROWID(self):
FILE: tests/test_MySQLdb_capabilities.py
class test_MySQLdb (line 9) | class test_MySQLdb(capabilities.DatabaseTest):
method quote_identifier (line 17) | def quote_identifier(self, ident):
method test_TIME (line 20) | def test_TIME(self):
method test_TINYINT (line 28) | def test_TINYINT(self):
method test_stored_procedures (line 39) | def test_stored_procedures(self):
method test_small_CHAR (line 64) | def test_small_CHAR(self):
method test_bug_2671682 (line 75) | def test_bug_2671682(self):
method test_bug_3514287 (line 82) | def test_bug_3514287(self):
method test_ping (line 93) | def test_ping(self):
FILE: tests/test_MySQLdb_dbapi20.py
class test_MySQLdb (line 9) | class test_MySQLdb(dbapi20.DatabaseAPI20Test):
method test_setoutputsize (line 14) | def test_setoutputsize(self): pass
method test_setoutputsize_basic (line 15) | def test_setoutputsize_basic(self): pass
method test_nextset (line 16) | def test_nextset(self): pass
method test_fetchall (line 23) | def test_fetchall(self):
method test_fetchone (line 72) | def test_fetchone(self):
method test_rowcount (line 116) | def test_rowcount(self):
method test_callproc (line 145) | def test_callproc(self):
method help_nextset_setUp (line 148) | def help_nextset_setUp(self,cur):
method help_nextset_tearDown (line 162) | def help_nextset_tearDown(self,cur):
method test_nextset (line 166) | def test_nextset(self):
FILE: tests/test_MySQLdb_nonstandard.py
class TestDBAPISet (line 10) | class TestDBAPISet(unittest.TestCase):
method test_set_equality (line 11) | def test_set_equality(self):
method test_set_inequality (line 14) | def test_set_inequality(self):
method test_set_equality_membership (line 17) | def test_set_equality_membership(self):
method test_set_inequality_membership (line 20) | def test_set_inequality_membership(self):
class CoreModule (line 24) | class CoreModule(unittest.TestCase):
method test_NULL (line 27) | def test_NULL(self):
method test_version (line 31) | def test_version(self):
method test_client_info (line 38) | def test_client_info(self):
method test_thread_safe (line 41) | def test_thread_safe(self):
class CoreAPI (line 45) | class CoreAPI(unittest.TestCase):
method setUp (line 48) | def setUp(self):
method tearDown (line 51) | def tearDown(self):
method test_thread_id (line 54) | def test_thread_id(self):
method test_affected_rows (line 62) | def test_affected_rows(self):
method test_charset_name (line 72) | def test_charset_name(self):
method test_host_info (line 76) | def test_host_info(self):
method test_proto_info (line 80) | def test_proto_info(self):
method test_server_info (line 84) | def test_server_info(self):
Condensed preview — 50 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (314K chars).
[
{
"path": ".gitignore",
"chars": 75,
"preview": "*.pyc\n*.pyo\n*.o\n*.so\n*.pyd\n*.gz\n*.zip\n*.egg\n*.egg-info/\n.tox/\nbuild/\ndist/\n"
},
{
"path": ".travis.yml",
"chars": 191,
"preview": "language: python\npython:\n - \"2.6\"\n - \"2.7\"\n - \"pypy\"\ninstall: python setup.py install\nbefore_script: mysql -e 'create da"
},
{
"path": "GPL-2.0",
"chars": 18092,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Fr"
},
{
"path": "HISTORY",
"chars": 5686,
"preview": "=====================\r\n What's new in 1.2.4\r\n=====================\r\n\r\nfinal\r\n=====\r\n\r\nNo changes.\r\n\r\n\r\nrc 1\r\n====\r\n\r\nFix"
},
{
"path": "INSTALL",
"chars": 6636,
"preview": "====================\nMySQLdb Installation\n====================\n\n.. contents::\n..\n\nPrerequisites\n-------------\n\n+ Python "
},
{
"path": "MANIFEST.in",
"chars": 309,
"preview": "recursive-include doc *.rst\r\nrecursive-include tests *.py\r\ninclude doc/conf.py\r\ninclude MANIFEST.in\r\ninclude HISTORY\r\nin"
},
{
"path": "MySQLdb/__init__.py",
"chars": 3131,
"preview": "\"\"\"MySQLdb - A DB API v2.0 compatible interface to MySQL.\n\nThis package is a wrapper around _mysql, which mostly impleme"
},
{
"path": "MySQLdb/connections.py",
"chars": 11426,
"preview": "\"\"\"\n\nThis module implements connections for MySQLdb. Presently there is\nonly one class: Connection. Others are unlikely."
},
{
"path": "MySQLdb/constants/CLIENT.py",
"chars": 667,
"preview": "\"\"\"MySQL CLIENT constants\n\nThese constants are used when creating the connection. Use bitwise-OR\n(|) to combine options "
},
{
"path": "MySQLdb/constants/CR.py",
"chars": 674,
"preview": "\"\"\"MySQL Connection Errors\n\nNearly all of these raise OperationalError. COMMANDS_OUT_OF_SYNC\nraises ProgrammingError.\n\n\""
},
{
"path": "MySQLdb/constants/ER.py",
"chars": 12028,
"preview": "\"\"\"MySQL ER Constants\n\nThese constants are error codes for the bulk of the error conditions\nthat may occur.\n\n\"\"\"\n\nHASHCH"
},
{
"path": "MySQLdb/constants/FIELD_TYPE.py",
"chars": 485,
"preview": "\"\"\"MySQL FIELD_TYPE Constants\n\nThese constants represent the various column (field) types that are\nsupported by MySQL.\n\n"
},
{
"path": "MySQLdb/constants/FLAG.py",
"chars": 363,
"preview": "\"\"\"MySQL FLAG Constants\n\nThese flags are used along with the FIELD_TYPE to indicate various\nproperties of columns in a r"
},
{
"path": "MySQLdb/constants/REFRESH.py",
"chars": 252,
"preview": "\"\"\"MySQL REFRESH Constants\n\nThese constants seem to mostly deal with things internal to the\nMySQL server. Forget you saw"
},
{
"path": "MySQLdb/constants/__init__.py",
"chars": 62,
"preview": "__all__ = ['CR', 'FIELD_TYPE','CLIENT','REFRESH','ER','FLAG']\n"
},
{
"path": "MySQLdb/converters.py",
"chars": 5123,
"preview": "\"\"\"MySQLdb type conversion module\n\nThis module handles all the type conversions for MySQL. If the default\ntype conversio"
},
{
"path": "MySQLdb/cursors.py",
"chars": 17735,
"preview": "\"\"\"MySQLdb Cursors\n\nThis module implements Cursors of various types for MySQLdb. By\ndefault, MySQLdb uses the Cursor cla"
},
{
"path": "MySQLdb/release.py",
"chars": 110,
"preview": "\r\n__author__ = \"Andy Dustman <farcepest@gmail.com>\"\r\nversion_info = (1,2,4,'final',1)\r\n__version__ = \"1.2.4\"\r\n"
},
{
"path": "MySQLdb/times.py",
"chars": 3362,
"preview": "\"\"\"times module\n\nThis module provides some Date and Time classes for dealing with MySQL data.\n\nUse Python datetime modul"
},
{
"path": "README.md",
"chars": 1266,
"preview": "MySQLdb1\r\n========\r\n\r\nThis is the legacy (1.x) version of MySQLdb. While it is still being\r\nmaintained, there will not b"
},
{
"path": "_mysql.c",
"chars": 81541,
"preview": "/*\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public Lic"
},
{
"path": "_mysql_exceptions.py",
"chars": 2352,
"preview": "\"\"\"_mysql_exceptions: Exception classes for _mysql and MySQLdb.\n\nThese classes are dictated by the DB API v2.0:\n\n htt"
},
{
"path": "doc/FAQ.rst",
"chars": 5198,
"preview": "====================================\n MySQLdb Frequently Asked Questions\n====================================\n\n.. conten"
},
{
"path": "doc/Makefile",
"chars": 5568,
"preview": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS =\nSPHINXBUILD "
},
{
"path": "doc/MySQLdb.constants.rst",
"chars": 1076,
"preview": "constants Package\r\n=================\r\n\r\n:mod:`constants` Package\r\n------------------------\r\n\r\n.. automodule:: MySQLdb.co"
},
{
"path": "doc/MySQLdb.rst",
"chars": 856,
"preview": "MySQLdb Package\r\n===============\r\n\r\n:mod:`MySQLdb` Package\r\n----------------------\r\n\r\n.. automodule:: MySQLdb.__init__\r\n"
},
{
"path": "doc/_mysql.rst",
"chars": 108,
"preview": "_mysql Module\n=============\n\n.. automodule:: _mysql\n :members:\n :undoc-members:\n :show-inheritance:"
},
{
"path": "doc/_mysql_exceptions.rst",
"chars": 149,
"preview": "_mysql_exceptions Module\r\n========================\r\n\r\n.. automodule:: _mysql_exceptions\r\n :members:\r\n :undoc-membe"
},
{
"path": "doc/conf.py",
"chars": 7746,
"preview": "# -*- coding: utf-8 -*-\n#\n# MySQLdb documentation build configuration file, created by\n# sphinx-quickstart on Sun Oct 07"
},
{
"path": "doc/index.rst",
"chars": 461,
"preview": ".. MySQLdb documentation master file, created by\n sphinx-quickstart on Sun Oct 07 19:36:17 2012.\n You can adapt this"
},
{
"path": "doc/make.bat",
"chars": 5098,
"preview": "@ECHO OFF\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\nset BUI"
},
{
"path": "doc/modules.rst",
"chars": 65,
"preview": "MySQLdb\r\n=======\r\n\r\n.. toctree::\r\n :maxdepth: 4\r\n\r\n MySQLdb\r\n"
},
{
"path": "doc/user_guide.rst",
"chars": 28837,
"preview": "====================\nMySQLdb User's Guide\n====================\n\n.. contents::\n..\n\nIntroduction\n------------\n\nMySQLdb is "
},
{
"path": "metadata.cfg",
"chars": 1981,
"preview": "[metadata]\nversion: 1.2.4\nversion_info: (1,2,4,'final',1)\ndescription: Python interface to MySQL\nlong_description: \n "
},
{
"path": "pymemcompat.h",
"chars": 3203,
"preview": "\n/* The idea of this file is that you bundle it with your extension,\n #include it, program to Python 2.3's memory API "
},
{
"path": "setup.cfg",
"chars": 533,
"preview": "[test]\ntest_suite = nose.collector\n\n[build_ext]\n## Only uncomment/set these if the default configuration doesn't work\n##"
},
{
"path": "setup.py",
"chars": 588,
"preview": "#!/usr/bin/env python\n\nimport os\nimport sys\n\nimport distutils.errors\nimport setuptools\n\nif not hasattr(sys, \"hexversion\""
},
{
"path": "setup_common.py",
"chars": 1088,
"preview": "try:\n # Python 2.x\n from ConfigParser import SafeConfigParser\nexcept ImportError:\n # Python 3.x\n from config"
},
{
"path": "setup_posix.py",
"chars": 3289,
"preview": "import os, sys\nfrom ConfigParser import SafeConfigParser\n\n# This dequote() business is required for some older versions\n"
},
{
"path": "setup_windows.py",
"chars": 1334,
"preview": "import os, sys\n\ndef get_config():\n from setup_common import get_metadata_and_options, enabled, create_release_file\n\n "
},
{
"path": "site.cfg",
"chars": 665,
"preview": "[options]\n# embedded: link against the embedded server library\n# threadsafe: use the threadsafe client\n# static: link ag"
},
{
"path": "tests/capabilities.py",
"chars": 9932,
"preview": "#!/usr/bin/env python -O\r\n\"\"\" Script to test database capabilities and the DB-API interface\r\n for functionality and m"
},
{
"path": "tests/configdb.py",
"chars": 581,
"preview": "\"\"\"Configure database connection for tests.\"\"\"\n\nfrom os import environ, path\n\ntests_path = path.dirname(__file__)\nconf_f"
},
{
"path": "tests/dbapi20.py",
"chars": 31434,
"preview": "#!/usr/bin/env python\n''' Python DB API 2.0 driver compliance unit test suite. \n \n This software is Public Domain "
},
{
"path": "tests/default.cnf",
"chars": 278,
"preview": "# To create your own custom version of this file, read\n# http://dev.mysql.com/doc/refman/5.1/en/option-files.html\n# and "
},
{
"path": "tests/test_MySQLdb_capabilities.py",
"chars": 3072,
"preview": "#!/usr/bin/env python\r\nimport capabilities\r\nimport unittest\r\nimport MySQLdb\r\nimport warnings\r\n\r\nwarnings.filterwarnings("
},
{
"path": "tests/test_MySQLdb_dbapi20.py",
"chars": 7818,
"preview": "#!/usr/bin/env python\r\nimport dbapi20\r\nimport unittest\r\nimport MySQLdb\r\nfrom configdb import connection_kwargs\r\nimport w"
},
{
"path": "tests/test_MySQLdb_nonstandard.py",
"chars": 2737,
"preview": "import unittest\n\nimport _mysql\nimport MySQLdb\nfrom MySQLdb.constants import FIELD_TYPE\nfrom configdb import connection_f"
},
{
"path": "tests/travis.cnf",
"chars": 289,
"preview": "# To create your own custom version of this file, read\n# http://dev.mysql.com/doc/refman/5.1/en/option-files.html\n# and "
},
{
"path": "tox.ini",
"chars": 153,
"preview": "[tox]\nenvlist = py25, py26, py27, py33\n\n[testenv]\nsetenv =\n TESTDB=travis.cnf\ncommands =\n nosetests {posargs:-w te"
}
]
About this extraction
This page contains the full source code of the farcepest/MySQLdb1 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 50 files (288.8 KB), approximately 75.7k tokens, and a symbol index with 289 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.