mirror of
https://github.com/python/cpython
synced 2024-09-05 08:17:45 +00:00
Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r61981 | amaury.forgeotdarc | 2008-03-28 01:21:34 +0100 (Fri, 28 Mar 2008) | 2 lines test_future3.py is a regular test file, and should be part of the test suite ........ r61984 | jeffrey.yasskin | 2008-03-28 05:11:18 +0100 (Fri, 28 Mar 2008) | 6 lines Kill a race in test_threading in which the exception info in a thread finishing up after it was joined had a traceback pointing to that thread's (deleted) target attribute, while the test was trying to check that the target was destroyed. Big thanks to Antoine Pitrou for diagnosing the race and pointing out sys.exc_clear() to kill the exception early. This fixes issue 2496. ........ r61985 | neal.norwitz | 2008-03-28 05:41:34 +0100 (Fri, 28 Mar 2008) | 1 line Allow use of other ports so the test can pass if 9091 is in use ........ r61986 | jeffrey.yasskin | 2008-03-28 05:53:10 +0100 (Fri, 28 Mar 2008) | 2 lines Print more information the next time test_socket throws the wrong exception. ........ r61987 | neal.norwitz | 2008-03-28 05:58:51 +0100 (Fri, 28 Mar 2008) | 5 lines Revert r61969 which added casts to Py_CHARMASK to avoid compiler warnings. Rather than sprinkle casts throughout the code, change Py_CHARMASK to always cast it's result to an unsigned char. This should ensure we do the right thing when accessing an array with the result. ........ r61992 | neal.norwitz | 2008-03-28 06:34:59 +0100 (Fri, 28 Mar 2008) | 2 lines Fix compiler warning about finite() missing on Solaris. ........ r61993 | neal.norwitz | 2008-03-28 07:34:03 +0100 (Fri, 28 Mar 2008) | 11 lines Bug 1503: Get the test to pass on OSX. This should make the test more reliable, but I'm not convinced it is the right solution. We need to determine if this causes the test to hang on any platforms or do other bad things. Even if it gets the test to pass reliably, it might be that we want to fix this in socket. The socket returned from accept() is different on different platforms (inheriting attributes or not) and we might want to ensure that the attributes (at least blocking) is the same across all platforms. ........ r61997 | neal.norwitz | 2008-03-28 08:36:31 +0100 (Fri, 28 Mar 2008) | 1 line Name the main method correctly so the test is run ........ r61998 | gregory.p.smith | 2008-03-28 09:00:44 +0100 (Fri, 28 Mar 2008) | 7 lines This patch moves some tests from test_urllib2_net to test_urllib2_localnet. The moved tests use a local server rather than going out to external servers. Accepts patch from issue2429. Contributed by Jerry Seutter & Michael Foord (fuzzyman) at PyCon 2008. ........ r61999 | georg.brandl | 2008-03-28 09:06:56 +0100 (Fri, 28 Mar 2008) | 2 lines #2406: add examples to gzip docs. ........ r62000 | gregory.p.smith | 2008-03-28 09:32:09 +0100 (Fri, 28 Mar 2008) | 4 lines Accept patch issue2426 by Paul Kippes (kippesp). Adds sqlite3.Connection.iterdump to allow dumping of databases. ........
This commit is contained in:
parent
75d43c839e
commit
bbe741dd1b
|
@ -1,19 +1,22 @@
|
||||||
|
|
||||||
:mod:`gzip` --- Support for :program:`gzip` files
|
:mod:`gzip` --- Support for :program:`gzip` files
|
||||||
=================================================
|
=================================================
|
||||||
|
|
||||||
.. module:: gzip
|
.. module:: gzip
|
||||||
:synopsis: Interfaces for gzip compression and decompression using file objects.
|
:synopsis: Interfaces for gzip compression and decompression using file objects.
|
||||||
|
|
||||||
|
This module provides a simple interface to compress and decompress files just
|
||||||
|
like the GNU programs :program:`gzip` and :program:`gunzip` would.
|
||||||
|
|
||||||
The data compression provided by the ``zlib`` module is compatible with that
|
The data compression is provided by the :mod:``zlib`` module.
|
||||||
used by the GNU compression program :program:`gzip`. Accordingly, the
|
|
||||||
:mod:`gzip` module provides the :class:`GzipFile` class to read and write
|
The :mod:`gzip` module provides the :class:`GzipFile` class which is modeled
|
||||||
|
after Python's File Object. The :class:`GzipFile` class reads and writes
|
||||||
:program:`gzip`\ -format files, automatically compressing or decompressing the
|
:program:`gzip`\ -format files, automatically compressing or decompressing the
|
||||||
data so it looks like an ordinary file object. Note that additional file
|
data so that it looks like an ordinary file object.
|
||||||
formats which can be decompressed by the :program:`gzip` and :program:`gunzip`
|
|
||||||
programs, such as those produced by :program:`compress` and :program:`pack`,
|
Note that additional file formats which can be decompressed by the
|
||||||
are not supported by this module.
|
:program:`gzip` and :program:`gunzip` programs, such as those produced by
|
||||||
|
:program:`compress` and :program:`pack`, are not supported by this module.
|
||||||
|
|
||||||
For other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and
|
For other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and
|
||||||
:mod:`tarfile` modules.
|
:mod:`tarfile` modules.
|
||||||
|
@ -63,6 +66,36 @@ The module defines the following items:
|
||||||
*compresslevel* defaults to ``9``.
|
*compresslevel* defaults to ``9``.
|
||||||
|
|
||||||
|
|
||||||
|
.. _gzip-usage-examples:
|
||||||
|
|
||||||
|
Examples of usage
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Example of how to read a compressed file::
|
||||||
|
|
||||||
|
import gzip
|
||||||
|
f = gzip.open('/home/joe/file.txt.gz', 'rb')
|
||||||
|
file_content = f.read()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
Example of how to create a compressed GZIP file::
|
||||||
|
|
||||||
|
import gzip
|
||||||
|
content = "Lots of content here"
|
||||||
|
f = gzip.open('/home/joe/file.txt.gz', 'wb')
|
||||||
|
f.write(content)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
Example of how to GZIP compress an existing file::
|
||||||
|
|
||||||
|
import gzip
|
||||||
|
f_in = open('/home/joe/file.txt', 'rb')
|
||||||
|
f_out = gzip.open('/home/joe/file.txt.gz', 'wb')
|
||||||
|
f_out.writelines(f_in)
|
||||||
|
f_out.close()
|
||||||
|
f_in.close()
|
||||||
|
|
||||||
|
|
||||||
.. seealso::
|
.. seealso::
|
||||||
|
|
||||||
Module :mod:`zlib`
|
Module :mod:`zlib`
|
||||||
|
|
|
@ -376,6 +376,27 @@ A :class:`Connection` instance has the following attributes and methods:
|
||||||
deleted since the database connection was opened.
|
deleted since the database connection was opened.
|
||||||
|
|
||||||
|
|
||||||
|
.. attribute:: Connection.iterdump
|
||||||
|
|
||||||
|
Returns an iterator to dump the database in an SQL text format. Useful when
|
||||||
|
saving an in-memory database for later restoration. This function provides
|
||||||
|
the same capabilities as the :kbd:`.dump` command in the :program:`sqlite3`
|
||||||
|
shell.
|
||||||
|
|
||||||
|
.. versionadded:: 2.6
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
# Convert file existing_db.db to SQL dump file dump.sql
|
||||||
|
import sqlite3, os
|
||||||
|
|
||||||
|
con = sqlite3.connect('existing_db.db')
|
||||||
|
full_dump = os.linesep.join([line for line in con.iterdump()])
|
||||||
|
f = open('dump.sql', 'w')
|
||||||
|
f.writelines(full_dump)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
|
||||||
.. _sqlite3-cursor-objects:
|
.. _sqlite3-cursor-objects:
|
||||||
|
|
||||||
Cursor Objects
|
Cursor Objects
|
||||||
|
|
|
@ -124,7 +124,7 @@ PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);
|
||||||
#ifdef __CHAR_UNSIGNED__
|
#ifdef __CHAR_UNSIGNED__
|
||||||
#define Py_CHARMASK(c) (c)
|
#define Py_CHARMASK(c) (c)
|
||||||
#else
|
#else
|
||||||
#define Py_CHARMASK(c) ((c) & 0xff)
|
#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "pyfpe.h"
|
#include "pyfpe.h"
|
||||||
|
|
|
@ -44,13 +44,13 @@ extern const char _Py_swapcase__doc__[];
|
||||||
|
|
||||||
extern const unsigned int _Py_ctype_table[256];
|
extern const unsigned int _Py_ctype_table[256];
|
||||||
|
|
||||||
#define ISLOWER(c) (_Py_ctype_table[(unsigned)Py_CHARMASK(c)] & FLAG_LOWER)
|
#define ISLOWER(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_LOWER)
|
||||||
#define ISUPPER(c) (_Py_ctype_table[(unsigned)Py_CHARMASK(c)] & FLAG_UPPER)
|
#define ISUPPER(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_UPPER)
|
||||||
#define ISALPHA(c) (_Py_ctype_table[(unsigned)Py_CHARMASK(c)] & FLAG_ALPHA)
|
#define ISALPHA(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_ALPHA)
|
||||||
#define ISDIGIT(c) (_Py_ctype_table[(unsigned)Py_CHARMASK(c)] & FLAG_DIGIT)
|
#define ISDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_DIGIT)
|
||||||
#define ISXDIGIT(c) (_Py_ctype_table[(unsigned)Py_CHARMASK(c)] & FLAG_XDIGIT)
|
#define ISXDIGIT(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_XDIGIT)
|
||||||
#define ISALNUM(c) (_Py_ctype_table[(unsigned)Py_CHARMASK(c)] & FLAG_ALNUM)
|
#define ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_ALNUM)
|
||||||
#define ISSPACE(c) (_Py_ctype_table[(unsigned)Py_CHARMASK(c)] & FLAG_SPACE)
|
#define ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & FLAG_SPACE)
|
||||||
|
|
||||||
#undef islower
|
#undef islower
|
||||||
#define islower(c) undefined_islower(c)
|
#define islower(c) undefined_islower(c)
|
||||||
|
|
|
@ -529,7 +529,6 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False,
|
||||||
'test_support',
|
'test_support',
|
||||||
'test_future1',
|
'test_future1',
|
||||||
'test_future2',
|
'test_future2',
|
||||||
'test_future3',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
|
def findtests(testdir=None, stdtests=STDTESTS, nottests=NOTTESTS):
|
||||||
|
|
|
@ -446,7 +446,8 @@ def test_expat_nsattrs_wattr(self):
|
||||||
|
|
||||||
# ===== InputSource support
|
# ===== InputSource support
|
||||||
|
|
||||||
def test_expat_inpsource_filename(self):
|
def XXXtest_expat_inpsource_filename(self):
|
||||||
|
# FIXME: test blocks indefinitely
|
||||||
parser = create_parser()
|
parser = create_parser()
|
||||||
result = StringIO()
|
result = StringIO()
|
||||||
xmlgen = XMLGenerator(result)
|
xmlgen = XMLGenerator(result)
|
||||||
|
@ -456,7 +457,8 @@ def test_expat_inpsource_filename(self):
|
||||||
|
|
||||||
self.assertEquals(result.getvalue(), xml_test_out)
|
self.assertEquals(result.getvalue(), xml_test_out)
|
||||||
|
|
||||||
def test_expat_inpsource_sysid(self):
|
def XXXtest_expat_inpsource_sysid(self):
|
||||||
|
# FIXME: test blocks indefinitely
|
||||||
parser = create_parser()
|
parser = create_parser()
|
||||||
result = StringIO()
|
result = StringIO()
|
||||||
xmlgen = XMLGenerator(result)
|
xmlgen = XMLGenerator(result)
|
||||||
|
@ -529,7 +531,8 @@ def test_expat_locator_noinfo(self):
|
||||||
self.assertEquals(parser.getPublicId(), None)
|
self.assertEquals(parser.getPublicId(), None)
|
||||||
self.assertEquals(parser.getLineNumber(), 1)
|
self.assertEquals(parser.getLineNumber(), 1)
|
||||||
|
|
||||||
def test_expat_locator_withinfo(self):
|
def XXXtest_expat_locator_withinfo(self):
|
||||||
|
# FIXME: test blocks indefinitely
|
||||||
result = StringIO()
|
result = StringIO()
|
||||||
xmlgen = XMLGenerator(result)
|
xmlgen = XMLGenerator(result)
|
||||||
parser = create_parser()
|
parser = create_parser()
|
||||||
|
@ -684,7 +687,7 @@ def test_sf_1513611(self):
|
||||||
self.assertRaises(SAXParseException, parser.parse, sio)
|
self.assertRaises(SAXParseException, parser.parse, sio)
|
||||||
|
|
||||||
|
|
||||||
def unittest_main():
|
def test_main():
|
||||||
run_unittest(MakeParserTest,
|
run_unittest(MakeParserTest,
|
||||||
SaxutilsTest,
|
SaxutilsTest,
|
||||||
XmlgenTest,
|
XmlgenTest,
|
||||||
|
@ -693,4 +696,4 @@ def unittest_main():
|
||||||
XmlReaderTest)
|
XmlReaderTest)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest_main()
|
test_main()
|
||||||
|
|
|
@ -5,8 +5,9 @@
|
||||||
|
|
||||||
import socket
|
import socket
|
||||||
import select
|
import select
|
||||||
import time
|
|
||||||
import thread, threading
|
import thread, threading
|
||||||
|
import time
|
||||||
|
import traceback
|
||||||
import Queue
|
import Queue
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
@ -1016,10 +1017,13 @@ def alarm_handler(signal, frame):
|
||||||
except Alarm:
|
except Alarm:
|
||||||
pass
|
pass
|
||||||
except:
|
except:
|
||||||
self.fail("caught other exception instead of Alarm")
|
self.fail("caught other exception instead of Alarm:"
|
||||||
|
" %s(%s):\n%s" %
|
||||||
|
(sys.exc_info()[:2] + (traceback.format_exc(),)))
|
||||||
else:
|
else:
|
||||||
self.fail("nothing caught")
|
self.fail("nothing caught")
|
||||||
signal.alarm(0) # shut off alarm
|
finally:
|
||||||
|
signal.alarm(0) # shut off alarm
|
||||||
except Alarm:
|
except Alarm:
|
||||||
self.fail("got Alarm in wrong place")
|
self.fail("got Alarm in wrong place")
|
||||||
finally:
|
finally:
|
||||||
|
|
|
@ -5,12 +5,13 @@
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise TestSkipped('no sqlite available')
|
raise TestSkipped('no sqlite available')
|
||||||
from sqlite3.test import (dbapi, types, userfunctions,
|
from sqlite3.test import (dbapi, types, userfunctions,
|
||||||
factory, transactions, hooks, regression)
|
factory, transactions, hooks, regression,
|
||||||
|
dump)
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
run_unittest(dbapi.suite(), types.suite(), userfunctions.suite(),
|
run_unittest(dbapi.suite(), types.suite(), userfunctions.suite(),
|
||||||
factory.suite(), transactions.suite(), hooks.suite(),
|
factory.suite(), transactions.suite(),
|
||||||
regression.suite())
|
hooks.suite(), regression.suite(), dump.suite())
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_main()
|
test_main()
|
||||||
|
|
|
@ -6,12 +6,14 @@
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from test import test_support
|
from test import test_support
|
||||||
|
|
||||||
|
PORT = 9091
|
||||||
|
|
||||||
def server(evt):
|
def server(evt):
|
||||||
serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
serv.settimeout(3)
|
serv.settimeout(3)
|
||||||
serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||||
serv.bind(("", 9091))
|
global PORT
|
||||||
|
PORT = test_support.bind_port(serv, "", PORT)
|
||||||
serv.listen(5)
|
serv.listen(5)
|
||||||
evt.set()
|
evt.set()
|
||||||
try:
|
try:
|
||||||
|
@ -36,24 +38,24 @@ def tearDown(self):
|
||||||
|
|
||||||
def testBasic(self):
|
def testBasic(self):
|
||||||
# connects
|
# connects
|
||||||
telnet = telnetlib.Telnet("localhost", 9091)
|
telnet = telnetlib.Telnet("localhost", PORT)
|
||||||
telnet.sock.close()
|
telnet.sock.close()
|
||||||
|
|
||||||
def testTimeoutDefault(self):
|
def testTimeoutDefault(self):
|
||||||
# default
|
# default
|
||||||
telnet = telnetlib.Telnet("localhost", 9091)
|
telnet = telnetlib.Telnet("localhost", PORT)
|
||||||
self.assertTrue(telnet.sock.gettimeout() is None)
|
self.assertTrue(telnet.sock.gettimeout() is None)
|
||||||
telnet.sock.close()
|
telnet.sock.close()
|
||||||
|
|
||||||
def testTimeoutValue(self):
|
def testTimeoutValue(self):
|
||||||
# a value
|
# a value
|
||||||
telnet = telnetlib.Telnet("localhost", 9091, timeout=30)
|
telnet = telnetlib.Telnet("localhost", PORT, timeout=30)
|
||||||
self.assertEqual(telnet.sock.gettimeout(), 30)
|
self.assertEqual(telnet.sock.gettimeout(), 30)
|
||||||
telnet.sock.close()
|
telnet.sock.close()
|
||||||
|
|
||||||
def testTimeoutDifferentOrder(self):
|
def testTimeoutDifferentOrder(self):
|
||||||
telnet = telnetlib.Telnet(timeout=30)
|
telnet = telnetlib.Telnet(timeout=30)
|
||||||
telnet.open("localhost", 9091)
|
telnet.open("localhost", PORT)
|
||||||
self.assertEqual(telnet.sock.gettimeout(), 30)
|
self.assertEqual(telnet.sock.gettimeout(), 30)
|
||||||
telnet.sock.close()
|
telnet.sock.close()
|
||||||
|
|
||||||
|
@ -62,7 +64,7 @@ def testTimeoutNone(self):
|
||||||
previous = socket.getdefaulttimeout()
|
previous = socket.getdefaulttimeout()
|
||||||
socket.setdefaulttimeout(30)
|
socket.setdefaulttimeout(30)
|
||||||
try:
|
try:
|
||||||
telnet = telnetlib.Telnet("localhost", 9091, timeout=None)
|
telnet = telnetlib.Telnet("localhost", PORT, timeout=None)
|
||||||
finally:
|
finally:
|
||||||
socket.setdefaulttimeout(previous)
|
socket.setdefaulttimeout(previous)
|
||||||
self.assertEqual(telnet.sock.gettimeout(), 30)
|
self.assertEqual(telnet.sock.gettimeout(), 30)
|
||||||
|
|
|
@ -271,13 +271,17 @@ def _run(self, other_ref, yet_another):
|
||||||
weak_cyclic_object = weakref.ref(cyclic_object)
|
weak_cyclic_object = weakref.ref(cyclic_object)
|
||||||
cyclic_object.thread.join()
|
cyclic_object.thread.join()
|
||||||
del cyclic_object
|
del cyclic_object
|
||||||
self.assertEquals(None, weak_cyclic_object())
|
self.assertEquals(None, weak_cyclic_object(),
|
||||||
|
msg=('%d references still around' %
|
||||||
|
sys.getrefcount(weak_cyclic_object())))
|
||||||
|
|
||||||
raising_cyclic_object = RunSelfFunction(should_raise=True)
|
raising_cyclic_object = RunSelfFunction(should_raise=True)
|
||||||
weak_raising_cyclic_object = weakref.ref(raising_cyclic_object)
|
weak_raising_cyclic_object = weakref.ref(raising_cyclic_object)
|
||||||
raising_cyclic_object.thread.join()
|
raising_cyclic_object.thread.join()
|
||||||
del raising_cyclic_object
|
del raising_cyclic_object
|
||||||
self.assertEquals(None, weak_raising_cyclic_object())
|
self.assertEquals(None, weak_raising_cyclic_object(),
|
||||||
|
msg=('%d references still around' %
|
||||||
|
sys.getrefcount(weak_raising_cyclic_object())))
|
||||||
|
|
||||||
|
|
||||||
class ThreadingExceptionTests(unittest.TestCase):
|
class ThreadingExceptionTests(unittest.TestCase):
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import mimetools
|
||||||
import threading
|
import threading
|
||||||
import urlparse
|
import urlparse
|
||||||
import urllib2
|
import urllib2
|
||||||
|
@ -217,7 +218,7 @@ def do_GET(self):
|
||||||
# Test cases
|
# Test cases
|
||||||
|
|
||||||
class ProxyAuthTests(unittest.TestCase):
|
class ProxyAuthTests(unittest.TestCase):
|
||||||
URL = "http://www.foo.com"
|
URL = "http://localhost"
|
||||||
|
|
||||||
USER = "tester"
|
USER = "tester"
|
||||||
PASSWD = "test123"
|
PASSWD = "test123"
|
||||||
|
@ -279,6 +280,202 @@ def test_proxy_qop_auth_int_works_or_throws_urlerror(self):
|
||||||
pass
|
pass
|
||||||
result.close()
|
result.close()
|
||||||
|
|
||||||
|
|
||||||
|
def GetRequestHandler(responses):
|
||||||
|
|
||||||
|
class FakeHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||||
|
|
||||||
|
server_version = "TestHTTP/"
|
||||||
|
requests = []
|
||||||
|
headers_received = []
|
||||||
|
port = 80
|
||||||
|
|
||||||
|
def do_GET(self):
|
||||||
|
body = self.send_head()
|
||||||
|
if body:
|
||||||
|
self.wfile.write(body)
|
||||||
|
|
||||||
|
def do_POST(self):
|
||||||
|
content_length = self.headers['Content-Length']
|
||||||
|
post_data = self.rfile.read(int(content_length))
|
||||||
|
self.do_GET()
|
||||||
|
self.requests.append(post_data)
|
||||||
|
|
||||||
|
def send_head(self):
|
||||||
|
FakeHTTPRequestHandler.headers_received = self.headers
|
||||||
|
self.requests.append(self.path)
|
||||||
|
response_code, headers, body = responses.pop(0)
|
||||||
|
|
||||||
|
self.send_response(response_code)
|
||||||
|
|
||||||
|
for (header, value) in headers:
|
||||||
|
self.send_header(header, value % self.port)
|
||||||
|
if body:
|
||||||
|
self.send_header('Content-type', 'text/plain')
|
||||||
|
self.end_headers()
|
||||||
|
return body
|
||||||
|
self.end_headers()
|
||||||
|
|
||||||
|
def log_message(self, *args):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
return FakeHTTPRequestHandler
|
||||||
|
|
||||||
|
|
||||||
|
class TestUrlopen(unittest.TestCase):
|
||||||
|
"""Tests urllib2.urlopen using the network.
|
||||||
|
|
||||||
|
These tests are not exhaustive. Assuming that testing using files does a
|
||||||
|
good job overall of some of the basic interface features. There are no
|
||||||
|
tests exercising the optional 'data' and 'proxies' arguments. No tests
|
||||||
|
for transparent redirection have been written.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def start_server(self, responses):
|
||||||
|
handler = GetRequestHandler(responses)
|
||||||
|
|
||||||
|
self.server = LoopbackHttpServerThread(handler)
|
||||||
|
self.server.start()
|
||||||
|
self.server.ready.wait()
|
||||||
|
port = self.server.port
|
||||||
|
handler.port = port
|
||||||
|
return handler
|
||||||
|
|
||||||
|
|
||||||
|
def test_redirection(self):
|
||||||
|
expected_response = b'We got here...'
|
||||||
|
responses = [
|
||||||
|
(302, [('Location', 'http://localhost:%s/somewhere_else')], ''),
|
||||||
|
(200, [], expected_response)
|
||||||
|
]
|
||||||
|
|
||||||
|
handler = self.start_server(responses)
|
||||||
|
|
||||||
|
try:
|
||||||
|
f = urllib2.urlopen('http://localhost:%s/' % handler.port)
|
||||||
|
data = f.read()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
self.assertEquals(data, expected_response)
|
||||||
|
self.assertEquals(handler.requests, ['/', '/somewhere_else'])
|
||||||
|
finally:
|
||||||
|
self.server.stop()
|
||||||
|
|
||||||
|
|
||||||
|
def test_404(self):
|
||||||
|
expected_response = b'Bad bad bad...'
|
||||||
|
handler = self.start_server([(404, [], expected_response)])
|
||||||
|
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
urllib2.urlopen('http://localhost:%s/weeble' % handler.port)
|
||||||
|
except urllib2.URLError as f:
|
||||||
|
data = f.read()
|
||||||
|
f.close()
|
||||||
|
else:
|
||||||
|
self.fail('404 should raise URLError')
|
||||||
|
|
||||||
|
self.assertEquals(data, expected_response)
|
||||||
|
self.assertEquals(handler.requests, ['/weeble'])
|
||||||
|
finally:
|
||||||
|
self.server.stop()
|
||||||
|
|
||||||
|
|
||||||
|
def test_200(self):
|
||||||
|
expected_response = b'pycon 2008...'
|
||||||
|
handler = self.start_server([(200, [], expected_response)])
|
||||||
|
|
||||||
|
try:
|
||||||
|
f = urllib2.urlopen('http://localhost:%s/bizarre' % handler.port)
|
||||||
|
data = f.read()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
self.assertEquals(data, expected_response)
|
||||||
|
self.assertEquals(handler.requests, ['/bizarre'])
|
||||||
|
finally:
|
||||||
|
self.server.stop()
|
||||||
|
|
||||||
|
def test_200_with_parameters(self):
|
||||||
|
expected_response = b'pycon 2008...'
|
||||||
|
handler = self.start_server([(200, [], expected_response)])
|
||||||
|
|
||||||
|
try:
|
||||||
|
f = urllib2.urlopen('http://localhost:%s/bizarre' % handler.port, b'get=with_feeling')
|
||||||
|
data = f.read()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
self.assertEquals(data, expected_response)
|
||||||
|
self.assertEquals(handler.requests, ['/bizarre', b'get=with_feeling'])
|
||||||
|
finally:
|
||||||
|
self.server.stop()
|
||||||
|
|
||||||
|
|
||||||
|
def test_sending_headers(self):
|
||||||
|
handler = self.start_server([(200, [], b"we don't care")])
|
||||||
|
|
||||||
|
try:
|
||||||
|
req = urllib2.Request("http://localhost:%s/" % handler.port,
|
||||||
|
headers={'Range': 'bytes=20-39'})
|
||||||
|
urllib2.urlopen(req)
|
||||||
|
self.assertEqual(handler.headers_received['Range'], 'bytes=20-39')
|
||||||
|
finally:
|
||||||
|
self.server.stop()
|
||||||
|
|
||||||
|
def test_basic(self):
|
||||||
|
handler = self.start_server([(200, [], b"we don't care")])
|
||||||
|
|
||||||
|
try:
|
||||||
|
open_url = urllib2.urlopen("http://localhost:%s" % handler.port)
|
||||||
|
for attr in ("read", "close", "info", "geturl"):
|
||||||
|
self.assert_(hasattr(open_url, attr), "object returned from "
|
||||||
|
"urlopen lacks the %s attribute" % attr)
|
||||||
|
try:
|
||||||
|
self.assert_(open_url.read(), "calling 'read' failed")
|
||||||
|
finally:
|
||||||
|
open_url.close()
|
||||||
|
finally:
|
||||||
|
self.server.stop()
|
||||||
|
|
||||||
|
def test_info(self):
|
||||||
|
handler = self.start_server([(200, [], b"we don't care")])
|
||||||
|
|
||||||
|
try:
|
||||||
|
open_url = urllib2.urlopen("http://localhost:%s" % handler.port)
|
||||||
|
info_obj = open_url.info()
|
||||||
|
self.assert_(isinstance(info_obj, mimetools.Message),
|
||||||
|
"object returned by 'info' is not an instance of "
|
||||||
|
"mimetools.Message")
|
||||||
|
self.assertEqual(info_obj.getsubtype(), "plain")
|
||||||
|
finally:
|
||||||
|
self.server.stop()
|
||||||
|
|
||||||
|
def test_geturl(self):
|
||||||
|
# Make sure same URL as opened is returned by geturl.
|
||||||
|
handler = self.start_server([(200, [], b"we don't care")])
|
||||||
|
|
||||||
|
try:
|
||||||
|
open_url = urllib2.urlopen("http://localhost:%s" % handler.port)
|
||||||
|
url = open_url.geturl()
|
||||||
|
self.assertEqual(url, "http://localhost:%s" % handler.port)
|
||||||
|
finally:
|
||||||
|
self.server.stop()
|
||||||
|
|
||||||
|
|
||||||
|
def test_bad_address(self):
|
||||||
|
# Make sure proper exception is raised when connecting to a bogus
|
||||||
|
# address.
|
||||||
|
self.assertRaises(IOError,
|
||||||
|
# SF patch 809915: In Sep 2003, VeriSign started
|
||||||
|
# highjacking invalid .com and .net addresses to
|
||||||
|
# boost traffic to their own site. This test
|
||||||
|
# started failing then. One hopes the .invalid
|
||||||
|
# domain will be spared to serve its defined
|
||||||
|
# purpose.
|
||||||
|
# urllib2.urlopen, "http://www.sadflkjsasadf.com/")
|
||||||
|
urllib2.urlopen, "http://www.python.invalid./")
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
# We will NOT depend on the network resource flag
|
# We will NOT depend on the network resource flag
|
||||||
# (Lib/test/regrtest.py -u network) since all tests here are only
|
# (Lib/test/regrtest.py -u network) since all tests here are only
|
||||||
|
@ -287,6 +484,7 @@ def test_main():
|
||||||
#test_support.requires("network")
|
#test_support.requires("network")
|
||||||
|
|
||||||
test_support.run_unittest(ProxyAuthTests)
|
test_support.run_unittest(ProxyAuthTests)
|
||||||
|
test_support.run_unittest(TestUrlopen)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
test_main()
|
test_main()
|
||||||
|
|
|
@ -25,20 +25,6 @@ def _urlopen_with_retry(host, *args, **kwargs):
|
||||||
raise last_exc
|
raise last_exc
|
||||||
|
|
||||||
|
|
||||||
class URLTimeoutTest(unittest.TestCase):
|
|
||||||
|
|
||||||
TIMEOUT = 10.0
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
socket.setdefaulttimeout(self.TIMEOUT)
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
socket.setdefaulttimeout(None)
|
|
||||||
|
|
||||||
def testURLread(self):
|
|
||||||
f = _urlopen_with_retry("http://www.python.org/")
|
|
||||||
x = f.read()
|
|
||||||
|
|
||||||
|
|
||||||
class AuthTests(unittest.TestCase):
|
class AuthTests(unittest.TestCase):
|
||||||
"""Tests urllib2 authentication features."""
|
"""Tests urllib2 authentication features."""
|
||||||
|
@ -98,68 +84,6 @@ def test_close(self):
|
||||||
response.close()
|
response.close()
|
||||||
self.assert_(fileobject.closed)
|
self.assert_(fileobject.closed)
|
||||||
|
|
||||||
class urlopenNetworkTests(unittest.TestCase):
|
|
||||||
"""Tests urllib2.urlopen using the network.
|
|
||||||
|
|
||||||
These tests are not exhaustive. Assuming that testing using files does a
|
|
||||||
good job overall of some of the basic interface features. There are no
|
|
||||||
tests exercising the optional 'data' and 'proxies' arguments. No tests
|
|
||||||
for transparent redirection have been written.
|
|
||||||
|
|
||||||
setUp is not used for always constructing a connection to
|
|
||||||
http://www.python.org/ since there a few tests that don't use that address
|
|
||||||
and making a connection is expensive enough to warrant minimizing unneeded
|
|
||||||
connections.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
def test_basic(self):
|
|
||||||
# Simple test expected to pass.
|
|
||||||
open_url = _urlopen_with_retry("http://www.python.org/")
|
|
||||||
for attr in ("read", "close", "info", "geturl"):
|
|
||||||
self.assert_(hasattr(open_url, attr), "object returned from "
|
|
||||||
"urlopen lacks the %s attribute" % attr)
|
|
||||||
try:
|
|
||||||
self.assert_(open_url.read(), "calling 'read' failed")
|
|
||||||
finally:
|
|
||||||
open_url.close()
|
|
||||||
|
|
||||||
def test_info(self):
|
|
||||||
# Test 'info'.
|
|
||||||
open_url = _urlopen_with_retry("http://www.python.org/")
|
|
||||||
try:
|
|
||||||
info_obj = open_url.info()
|
|
||||||
finally:
|
|
||||||
open_url.close()
|
|
||||||
self.assert_(isinstance(info_obj, mimetools.Message),
|
|
||||||
"object returned by 'info' is not an instance of "
|
|
||||||
"mimetools.Message")
|
|
||||||
self.assertEqual(info_obj.getsubtype(), "html")
|
|
||||||
|
|
||||||
def test_geturl(self):
|
|
||||||
# Make sure same URL as opened is returned by geturl.
|
|
||||||
URL = "http://www.python.org/"
|
|
||||||
open_url = _urlopen_with_retry(URL)
|
|
||||||
try:
|
|
||||||
gotten_url = open_url.geturl()
|
|
||||||
finally:
|
|
||||||
open_url.close()
|
|
||||||
self.assertEqual(gotten_url, URL)
|
|
||||||
|
|
||||||
def test_bad_address(self):
|
|
||||||
# Make sure proper exception is raised when connecting to a bogus
|
|
||||||
# address.
|
|
||||||
self.assertRaises(IOError,
|
|
||||||
# SF patch 809915: In Sep 2003, VeriSign started
|
|
||||||
# highjacking invalid .com and .net addresses to
|
|
||||||
# boost traffic to their own site. This test
|
|
||||||
# started failing then. One hopes the .invalid
|
|
||||||
# domain will be spared to serve its defined
|
|
||||||
# purpose.
|
|
||||||
# urllib2.urlopen, "http://www.sadflkjsasadf.com/")
|
|
||||||
urllib2.urlopen, "http://www.python.invalid./")
|
|
||||||
|
|
||||||
|
|
||||||
class OtherNetworkTests(unittest.TestCase):
|
class OtherNetworkTests(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
if 0: # for debugging
|
if 0: # for debugging
|
||||||
|
@ -167,13 +91,6 @@ def setUp(self):
|
||||||
logger = logging.getLogger("test_urllib2net")
|
logger = logging.getLogger("test_urllib2net")
|
||||||
logger.addHandler(logging.StreamHandler())
|
logger.addHandler(logging.StreamHandler())
|
||||||
|
|
||||||
def test_range (self):
|
|
||||||
req = urllib2.Request("http://www.python.org",
|
|
||||||
headers={'Range': 'bytes=20-39'})
|
|
||||||
result = _urlopen_with_retry(req)
|
|
||||||
data = result.read()
|
|
||||||
self.assertEqual(len(data), 20)
|
|
||||||
|
|
||||||
# XXX The rest of these tests aren't very good -- they don't check much.
|
# XXX The rest of these tests aren't very good -- they don't check much.
|
||||||
# They do sometimes catch some major disasters, though.
|
# They do sometimes catch some major disasters, though.
|
||||||
|
|
||||||
|
@ -201,16 +118,6 @@ def test_file(self):
|
||||||
finally:
|
finally:
|
||||||
os.remove(TESTFN)
|
os.remove(TESTFN)
|
||||||
|
|
||||||
def test_http(self):
|
|
||||||
urls = [
|
|
||||||
'http://www.espn.com/', # redirect
|
|
||||||
'http://www.python.org/Spanish/Inquistion/',
|
|
||||||
('http://www.python.org/cgi-bin/faqw.py',
|
|
||||||
'query=pythonistas&querytype=simple&casefold=yes&req=search', None),
|
|
||||||
'http://www.python.org/',
|
|
||||||
]
|
|
||||||
self._test_urls(urls, self._extra_handlers())
|
|
||||||
|
|
||||||
# XXX Following test depends on machine configurations that are internal
|
# XXX Following test depends on machine configurations that are internal
|
||||||
# to CNRI. Need to set up a public server with the right authentication
|
# to CNRI. Need to set up a public server with the right authentication
|
||||||
# configuration for test purposes.
|
# configuration for test purposes.
|
||||||
|
@ -278,6 +185,7 @@ def _extra_handlers(self):
|
||||||
|
|
||||||
return handlers
|
return handlers
|
||||||
|
|
||||||
|
|
||||||
class TimeoutTest(unittest.TestCase):
|
class TimeoutTest(unittest.TestCase):
|
||||||
def test_http_basic(self):
|
def test_http_basic(self):
|
||||||
u = _urlopen_with_retry("http://www.python.org")
|
u = _urlopen_with_retry("http://www.python.org")
|
||||||
|
@ -326,9 +234,7 @@ def test_ftp_Value(self):
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
test_support.requires("network")
|
test_support.requires("network")
|
||||||
test_support.run_unittest(URLTimeoutTest,
|
test_support.run_unittest(AuthTests,
|
||||||
urlopenNetworkTests,
|
|
||||||
AuthTests,
|
|
||||||
OtherNetworkTests,
|
OtherNetworkTests,
|
||||||
CloseSocketTest,
|
CloseSocketTest,
|
||||||
TimeoutTest,
|
TimeoutTest,
|
||||||
|
|
|
@ -238,9 +238,17 @@ def my_function():
|
||||||
'''This is my function'''
|
'''This is my function'''
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
class MyXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer):
|
||||||
|
def get_request(self):
|
||||||
|
# Ensure the socket is always non-blocking. On Linux, socket
|
||||||
|
# attributes are not inherited like they are on *BSD and Windows.
|
||||||
|
s, port = self.socket.accept()
|
||||||
|
s.setblocking(True)
|
||||||
|
return s, port
|
||||||
|
|
||||||
try:
|
try:
|
||||||
serv = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 0),
|
serv = MyXMLRPCServer(("localhost", 0),
|
||||||
logRequests=False, bind_and_activate=False)
|
logRequests=False, bind_and_activate=False)
|
||||||
serv.server_bind()
|
serv.server_bind()
|
||||||
global PORT
|
global PORT
|
||||||
PORT = serv.socket.getsockname()[1]
|
PORT = serv.socket.getsockname()[1]
|
||||||
|
|
|
@ -391,6 +391,9 @@ class Thread(_Verbose):
|
||||||
# shutdown and thus raises an exception about trying to perform some
|
# shutdown and thus raises an exception about trying to perform some
|
||||||
# operation on/with a NoneType
|
# operation on/with a NoneType
|
||||||
__exc_info = _sys.exc_info
|
__exc_info = _sys.exc_info
|
||||||
|
# Keep sys.exc_clear too to clear the exception just before
|
||||||
|
# allowing .join() to return.
|
||||||
|
#XXX __exc_clear = _sys.exc_clear
|
||||||
|
|
||||||
def __init__(self, group=None, target=None, name=None,
|
def __init__(self, group=None, target=None, name=None,
|
||||||
args=(), kwargs=None, verbose=None):
|
args=(), kwargs=None, verbose=None):
|
||||||
|
@ -527,6 +530,13 @@ def _bootstrap_inner(self):
|
||||||
else:
|
else:
|
||||||
if __debug__:
|
if __debug__:
|
||||||
self._note("%s._bootstrap(): normal return", self)
|
self._note("%s._bootstrap(): normal return", self)
|
||||||
|
finally:
|
||||||
|
# Prevent a race in
|
||||||
|
# test_threading.test_no_refcycle_through_target when
|
||||||
|
# the exception keeps the target alive past when we
|
||||||
|
# assert that it's dead.
|
||||||
|
#XXX self.__exc_clear()
|
||||||
|
pass
|
||||||
finally:
|
finally:
|
||||||
with _active_limbo_lock:
|
with _active_limbo_lock:
|
||||||
self._stop()
|
self._stop()
|
||||||
|
|
|
@ -361,6 +361,7 @@ Lawrence Kesteloot
|
||||||
Vivek Khera
|
Vivek Khera
|
||||||
Mads Kiilerich
|
Mads Kiilerich
|
||||||
Taek Joo Kim
|
Taek Joo Kim
|
||||||
|
Paul Kippes
|
||||||
Steve Kirsch
|
Steve Kirsch
|
||||||
Ron Klatchko
|
Ron Klatchko
|
||||||
Bastian Kleineidam
|
Bastian Kleineidam
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* connection.c - the connection type
|
/* connection.c - the connection type
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004-2006 Gerhard Häring <gh@ghaering.de>
|
* Copyright (C) 2004-2006 Gerhard H<EFBFBD>ring <gh@ghaering.de>
|
||||||
*
|
*
|
||||||
* This file is part of pysqlite.
|
* This file is part of pysqlite.
|
||||||
*
|
*
|
||||||
|
@ -1069,6 +1069,52 @@ pysqlite_connection_interrupt(pysqlite_Connection* self, PyObject* args)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Function author: Paul Kippes <kippesp@gmail.com>
|
||||||
|
* Class method of Connection to call the Python function _iterdump
|
||||||
|
* of the sqlite3 module.
|
||||||
|
*/
|
||||||
|
static PyObject *
|
||||||
|
pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args)
|
||||||
|
{
|
||||||
|
PyObject* retval = NULL;
|
||||||
|
PyObject* module = NULL;
|
||||||
|
PyObject* module_dict;
|
||||||
|
PyObject* pyfn_iterdump;
|
||||||
|
|
||||||
|
if (!pysqlite_check_connection(self)) {
|
||||||
|
goto finally;
|
||||||
|
}
|
||||||
|
|
||||||
|
module = PyImport_ImportModule(MODULE_NAME ".dump");
|
||||||
|
if (!module) {
|
||||||
|
goto finally;
|
||||||
|
}
|
||||||
|
|
||||||
|
module_dict = PyModule_GetDict(module);
|
||||||
|
if (!module_dict) {
|
||||||
|
goto finally;
|
||||||
|
}
|
||||||
|
|
||||||
|
pyfn_iterdump = PyDict_GetItemString(module_dict, "_iterdump");
|
||||||
|
if (!pyfn_iterdump) {
|
||||||
|
PyErr_SetString(pysqlite_OperationalError, "Failed to obtain _iterdump() reference");
|
||||||
|
goto finally;
|
||||||
|
}
|
||||||
|
|
||||||
|
args = PyTuple_New(1);
|
||||||
|
if (!args) {
|
||||||
|
goto finally;
|
||||||
|
}
|
||||||
|
Py_INCREF(self);
|
||||||
|
PyTuple_SetItem(args, 0, (PyObject*)self);
|
||||||
|
retval = PyObject_CallObject(pyfn_iterdump, args);
|
||||||
|
|
||||||
|
finally:
|
||||||
|
Py_XDECREF(args);
|
||||||
|
Py_XDECREF(module);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
|
pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
|
||||||
{
|
{
|
||||||
|
@ -1140,6 +1186,43 @@ pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Called when the connection is used as a context manager. Returns itself as a
|
||||||
|
* convenience to the caller. */
|
||||||
|
static PyObject *
|
||||||
|
pysqlite_connection_enter(pysqlite_Connection* self, PyObject* args)
|
||||||
|
{
|
||||||
|
Py_INCREF(self);
|
||||||
|
return (PyObject*)self;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Called when the connection is used as a context manager. If there was any
|
||||||
|
* exception, a rollback takes place; otherwise we commit. */
|
||||||
|
static PyObject *
|
||||||
|
pysqlite_connection_exit(pysqlite_Connection* self, PyObject* args)
|
||||||
|
{
|
||||||
|
PyObject* exc_type, *exc_value, *exc_tb;
|
||||||
|
char* method_name;
|
||||||
|
PyObject* result;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "OOO", &exc_type, &exc_value, &exc_tb)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exc_type == Py_None && exc_value == Py_None && exc_tb == Py_None) {
|
||||||
|
method_name = "commit";
|
||||||
|
} else {
|
||||||
|
method_name = "rollback";
|
||||||
|
}
|
||||||
|
|
||||||
|
result = PyObject_CallMethod((PyObject*)self, method_name, "");
|
||||||
|
if (!result) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
Py_DECREF(result);
|
||||||
|
|
||||||
|
Py_RETURN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static char connection_doc[] =
|
static char connection_doc[] =
|
||||||
PyDoc_STR("SQLite database connection object.");
|
PyDoc_STR("SQLite database connection object.");
|
||||||
|
|
||||||
|
@ -1174,6 +1257,13 @@ static PyMethodDef connection_methods[] = {
|
||||||
PyDoc_STR("Creates a collation function. Non-standard.")},
|
PyDoc_STR("Creates a collation function. Non-standard.")},
|
||||||
{"interrupt", (PyCFunction)pysqlite_connection_interrupt, METH_NOARGS,
|
{"interrupt", (PyCFunction)pysqlite_connection_interrupt, METH_NOARGS,
|
||||||
PyDoc_STR("Abort any pending database operation. Non-standard.")},
|
PyDoc_STR("Abort any pending database operation. Non-standard.")},
|
||||||
|
{"iterdump", (PyCFunction)pysqlite_connection_iterdump, METH_NOARGS,
|
||||||
|
PyDoc_STR("Returns iterator to the dump of the database in an SQL text"
|
||||||
|
"format.")},
|
||||||
|
{"__enter__", (PyCFunction)pysqlite_connection_enter, METH_NOARGS,
|
||||||
|
PyDoc_STR("For context manager. Non-standard.")},
|
||||||
|
{"__exit__", (PyCFunction)pysqlite_connection_exit, METH_VARARGS,
|
||||||
|
PyDoc_STR("For context manager. Non-standard.")},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,10 @@
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "structmember.h"
|
#include "structmember.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_IEEEFP_H
|
||||||
|
#include <ieeefp.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef WITHOUT_COMPLEX
|
#ifndef WITHOUT_COMPLEX
|
||||||
|
|
||||||
/* Precisions used by repr() and str(), respectively.
|
/* Precisions used by repr() and str(), respectively.
|
||||||
|
|
|
@ -12,6 +12,10 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_IEEEFP_H
|
||||||
|
#include <ieeefp.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(__STDC__)
|
#if !defined(__STDC__)
|
||||||
extern double fmod(double, double);
|
extern double fmod(double, double);
|
||||||
extern double pow(double, double);
|
extern double pow(double, double);
|
||||||
|
|
|
@ -1620,7 +1620,7 @@ long_from_binary_base(char **str, int base)
|
||||||
n >>= 1;
|
n >>= 1;
|
||||||
/* n <- total # of bits needed, while setting p to end-of-string */
|
/* n <- total # of bits needed, while setting p to end-of-string */
|
||||||
n = 0;
|
n = 0;
|
||||||
while (_PyLong_DigitValue[(unsigned)Py_CHARMASK(*p)] < base)
|
while (_PyLong_DigitValue[Py_CHARMASK(*p)] < base)
|
||||||
++p;
|
++p;
|
||||||
*str = p;
|
*str = p;
|
||||||
/* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
|
/* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
|
||||||
|
@ -1641,7 +1641,7 @@ long_from_binary_base(char **str, int base)
|
||||||
bits_in_accum = 0;
|
bits_in_accum = 0;
|
||||||
pdigit = z->ob_digit;
|
pdigit = z->ob_digit;
|
||||||
while (--p >= start) {
|
while (--p >= start) {
|
||||||
int k = _PyLong_DigitValue[(unsigned)Py_CHARMASK(*p)];
|
int k = _PyLong_DigitValue[Py_CHARMASK(*p)];
|
||||||
assert(k >= 0 && k < base);
|
assert(k >= 0 && k < base);
|
||||||
accum |= (twodigits)(k << bits_in_accum);
|
accum |= (twodigits)(k << bits_in_accum);
|
||||||
bits_in_accum += bits_per_char;
|
bits_in_accum += bits_per_char;
|
||||||
|
@ -1828,7 +1828,7 @@ digit beyond the first.
|
||||||
|
|
||||||
/* Find length of the string of numeric characters. */
|
/* Find length of the string of numeric characters. */
|
||||||
scan = str;
|
scan = str;
|
||||||
while (_PyLong_DigitValue[(unsigned)Py_CHARMASK(*scan)] < base)
|
while (_PyLong_DigitValue[Py_CHARMASK(*scan)] < base)
|
||||||
++scan;
|
++scan;
|
||||||
|
|
||||||
/* Create a long object that can contain the largest possible
|
/* Create a long object that can contain the largest possible
|
||||||
|
@ -1854,10 +1854,10 @@ digit beyond the first.
|
||||||
/* Work ;-) */
|
/* Work ;-) */
|
||||||
while (str < scan) {
|
while (str < scan) {
|
||||||
/* grab up to convwidth digits from the input string */
|
/* grab up to convwidth digits from the input string */
|
||||||
c = (digit)_PyLong_DigitValue[(unsigned)Py_CHARMASK(*str++)];
|
c = (digit)_PyLong_DigitValue[Py_CHARMASK(*str++)];
|
||||||
for (i = 1; i < convwidth && str != scan; ++i, ++str) {
|
for (i = 1; i < convwidth && str != scan; ++i, ++str) {
|
||||||
c = (twodigits)(c * base +
|
c = (twodigits)(c * base +
|
||||||
_PyLong_DigitValue[(unsigned)Py_CHARMASK(*str)]);
|
_PyLong_DigitValue[Py_CHARMASK(*str)]);
|
||||||
assert(c < PyLong_BASE);
|
assert(c < PyLong_BASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -512,13 +512,13 @@ PyObject *PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size)
|
||||||
/* Single characters are shared when using this constructor.
|
/* Single characters are shared when using this constructor.
|
||||||
Restrict to ASCII, since the input must be UTF-8. */
|
Restrict to ASCII, since the input must be UTF-8. */
|
||||||
if (size == 1 && Py_CHARMASK(*u) < 128) {
|
if (size == 1 && Py_CHARMASK(*u) < 128) {
|
||||||
unicode = unicode_latin1[(unsigned)Py_CHARMASK(*u)];
|
unicode = unicode_latin1[Py_CHARMASK(*u)];
|
||||||
if (!unicode) {
|
if (!unicode) {
|
||||||
unicode = _PyUnicode_New(1);
|
unicode = _PyUnicode_New(1);
|
||||||
if (!unicode)
|
if (!unicode)
|
||||||
return NULL;
|
return NULL;
|
||||||
unicode->str[0] = Py_CHARMASK(*u);
|
unicode->str[0] = Py_CHARMASK(*u);
|
||||||
unicode_latin1[(unsigned)Py_CHARMASK(*u)] = unicode;
|
unicode_latin1[Py_CHARMASK(*u)] = unicode;
|
||||||
}
|
}
|
||||||
Py_INCREF(unicode);
|
Py_INCREF(unicode);
|
||||||
return (PyObject *)unicode;
|
return (PyObject *)unicode;
|
||||||
|
|
|
@ -39,14 +39,6 @@ extern char *PyOS_Readline(FILE *, FILE *, char *);
|
||||||
/* Don't ever change this -- it would break the portability of Python code */
|
/* Don't ever change this -- it would break the portability of Python code */
|
||||||
#define TABSIZE 8
|
#define TABSIZE 8
|
||||||
|
|
||||||
/* Convert a possibly signed character to a nonnegative int */
|
|
||||||
/* XXX This assumes characters are 8 bits wide */
|
|
||||||
#ifdef __CHAR_UNSIGNED__
|
|
||||||
#define Py_CHARMASK(c) (c)
|
|
||||||
#else
|
|
||||||
#define Py_CHARMASK(c) ((c) & 0xff)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Forward */
|
/* Forward */
|
||||||
static struct tok_state *tok_new(void);
|
static struct tok_state *tok_new(void);
|
||||||
static int tok_nextc(struct tok_state *tok);
|
static int tok_nextc(struct tok_state *tok);
|
||||||
|
|
|
@ -109,7 +109,7 @@ PyOS_strtoul(register char *str, char **ptr, int base)
|
||||||
++str;
|
++str;
|
||||||
if (*str == 'x' || *str == 'X') {
|
if (*str == 'x' || *str == 'X') {
|
||||||
/* there must be at least one digit after 0x */
|
/* there must be at least one digit after 0x */
|
||||||
if (_PyLong_DigitValue[(unsigned)Py_CHARMASK(str[1])] >= 16) {
|
if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) {
|
||||||
if (ptr)
|
if (ptr)
|
||||||
*ptr = str;
|
*ptr = str;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -118,7 +118,7 @@ PyOS_strtoul(register char *str, char **ptr, int base)
|
||||||
base = 16;
|
base = 16;
|
||||||
} else if (*str == 'o' || *str == 'O') {
|
} else if (*str == 'o' || *str == 'O') {
|
||||||
/* there must be at least one digit after 0o */
|
/* there must be at least one digit after 0o */
|
||||||
if (_PyLong_DigitValue[(unsigned)Py_CHARMASK(str[1])] >= 8) {
|
if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 8) {
|
||||||
if (ptr)
|
if (ptr)
|
||||||
*ptr = str;
|
*ptr = str;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -127,7 +127,7 @@ PyOS_strtoul(register char *str, char **ptr, int base)
|
||||||
base = 8;
|
base = 8;
|
||||||
} else if (*str == 'b' || *str == 'B') {
|
} else if (*str == 'b' || *str == 'B') {
|
||||||
/* there must be at least one digit after 0b */
|
/* there must be at least one digit after 0b */
|
||||||
if (_PyLong_DigitValue[(unsigned)Py_CHARMASK(str[1])] >= 2) {
|
if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 2) {
|
||||||
if (ptr)
|
if (ptr)
|
||||||
*ptr = str;
|
*ptr = str;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -155,7 +155,7 @@ PyOS_strtoul(register char *str, char **ptr, int base)
|
||||||
++str;
|
++str;
|
||||||
if (*str == 'x' || *str == 'X') {
|
if (*str == 'x' || *str == 'X') {
|
||||||
/* there must be at least one digit after 0x */
|
/* there must be at least one digit after 0x */
|
||||||
if (_PyLong_DigitValue[(unsigned)Py_CHARMASK(str[1])] >= 16) {
|
if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 16) {
|
||||||
if (ptr)
|
if (ptr)
|
||||||
*ptr = str;
|
*ptr = str;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -169,7 +169,7 @@ PyOS_strtoul(register char *str, char **ptr, int base)
|
||||||
++str;
|
++str;
|
||||||
if (*str == 'o' || *str == 'O') {
|
if (*str == 'o' || *str == 'O') {
|
||||||
/* there must be at least one digit after 0o */
|
/* there must be at least one digit after 0o */
|
||||||
if (_PyLong_DigitValue[(unsigned)Py_CHARMASK(str[1])] >= 8) {
|
if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 8) {
|
||||||
if (ptr)
|
if (ptr)
|
||||||
*ptr = str;
|
*ptr = str;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -183,7 +183,7 @@ PyOS_strtoul(register char *str, char **ptr, int base)
|
||||||
++str;
|
++str;
|
||||||
if (*str == 'b' || *str == 'B') {
|
if (*str == 'b' || *str == 'B') {
|
||||||
/* there must be at least one digit after 0b */
|
/* there must be at least one digit after 0b */
|
||||||
if (_PyLong_DigitValue[(unsigned)Py_CHARMASK(str[1])] >= 2) {
|
if (_PyLong_DigitValue[Py_CHARMASK(str[1])] >= 2) {
|
||||||
if (ptr)
|
if (ptr)
|
||||||
*ptr = str;
|
*ptr = str;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -209,7 +209,7 @@ PyOS_strtoul(register char *str, char **ptr, int base)
|
||||||
ovlimit = digitlimit[base];
|
ovlimit = digitlimit[base];
|
||||||
|
|
||||||
/* do the conversion until non-digit character encountered */
|
/* do the conversion until non-digit character encountered */
|
||||||
while ((c = _PyLong_DigitValue[(unsigned)Py_CHARMASK(*str)]) < base) {
|
while ((c = _PyLong_DigitValue[Py_CHARMASK(*str)]) < base) {
|
||||||
if (ovlimit > 0) /* no overflow check required */
|
if (ovlimit > 0) /* no overflow check required */
|
||||||
result = result * base + c;
|
result = result * base + c;
|
||||||
else { /* requires overflow check */
|
else { /* requires overflow check */
|
||||||
|
@ -246,7 +246,7 @@ PyOS_strtoul(register char *str, char **ptr, int base)
|
||||||
overflowed:
|
overflowed:
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
/* spool through remaining digit characters */
|
/* spool through remaining digit characters */
|
||||||
while (_PyLong_DigitValue[(unsigned)Py_CHARMASK(*str)] < base)
|
while (_PyLong_DigitValue[Py_CHARMASK(*str)] < base)
|
||||||
++str;
|
++str;
|
||||||
*ptr = str;
|
*ptr = str;
|
||||||
}
|
}
|
||||||
|
|
5
configure
vendored
5
configure
vendored
|
@ -1,5 +1,5 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# From configure.in Revision: 61728 .
|
# From configure.in Revision: 61848 .
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.61 for python 3.0.
|
# Generated by GNU Autoconf 2.61 for python 3.0.
|
||||||
#
|
#
|
||||||
|
@ -5390,11 +5390,12 @@ done
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for ac_header in asm/types.h conio.h curses.h direct.h dlfcn.h errno.h \
|
for ac_header in asm/types.h conio.h curses.h direct.h dlfcn.h errno.h \
|
||||||
fcntl.h grp.h \
|
fcntl.h grp.h \
|
||||||
io.h langinfo.h libintl.h ncurses.h poll.h process.h pthread.h \
|
ieeefp.h io.h langinfo.h libintl.h ncurses.h poll.h process.h pthread.h \
|
||||||
shadow.h signal.h stdint.h stropts.h termios.h thread.h \
|
shadow.h signal.h stdint.h stropts.h termios.h thread.h \
|
||||||
unistd.h utime.h \
|
unistd.h utime.h \
|
||||||
sys/audioio.h sys/bsdtty.h sys/epoll.h sys/event.h sys/file.h sys/loadavg.h \
|
sys/audioio.h sys/bsdtty.h sys/epoll.h sys/event.h sys/file.h sys/loadavg.h \
|
||||||
|
|
|
@ -1074,7 +1074,7 @@ dnl AC_MSG_RESULT($cpp_type)
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS(asm/types.h conio.h curses.h direct.h dlfcn.h errno.h \
|
AC_CHECK_HEADERS(asm/types.h conio.h curses.h direct.h dlfcn.h errno.h \
|
||||||
fcntl.h grp.h \
|
fcntl.h grp.h \
|
||||||
io.h langinfo.h libintl.h ncurses.h poll.h process.h pthread.h \
|
ieeefp.h io.h langinfo.h libintl.h ncurses.h poll.h process.h pthread.h \
|
||||||
shadow.h signal.h stdint.h stropts.h termios.h thread.h \
|
shadow.h signal.h stdint.h stropts.h termios.h thread.h \
|
||||||
unistd.h utime.h \
|
unistd.h utime.h \
|
||||||
sys/audioio.h sys/bsdtty.h sys/epoll.h sys/event.h sys/file.h sys/loadavg.h \
|
sys/audioio.h sys/bsdtty.h sys/epoll.h sys/event.h sys/file.h sys/loadavg.h \
|
||||||
|
|
|
@ -297,6 +297,9 @@
|
||||||
/* Define to 1 if you have the `hypot' function. */
|
/* Define to 1 if you have the `hypot' function. */
|
||||||
#undef HAVE_HYPOT
|
#undef HAVE_HYPOT
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <ieeefp.h> header file. */
|
||||||
|
#undef HAVE_IEEEFP_H
|
||||||
|
|
||||||
/* Define if you have the 'inet_aton' function. */
|
/* Define if you have the 'inet_aton' function. */
|
||||||
#undef HAVE_INET_ATON
|
#undef HAVE_INET_ATON
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue