Skip to content
This repository has been archived by the owner on Feb 22, 2020. It is now read-only.

Fix spurious 'Socket receive buffer full' errors #61

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
/build
*.pyc
umysql.egg-info
umysql.so
/.project
/.pydevproject
8 changes: 5 additions & 3 deletions README
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
:: WARNING ::
This driver is no longer supported or recommended. See https://github.com/zodb/relstorage/issues/264

:: Description ::
A fast MySQL driver written in pure C/C++ for Python.
A fast MySQL driver written in pure C/C++ for Python.
Compatible with gevent through monkey patching

:: Requirements ::
Requires Python (http://www.python.org)
Requires Python (http://www.python.org)

:: Installation ::
python setup.py build install

13 changes: 7 additions & 6 deletions lib/Connection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define snprintf _snprintf
#endif

//#define PRINTMARK() fprintf(stderr, "%08x:%s:%s MARK(%d)\n", GetTickCount(), __FILE__, __FUNCTION__, __LINE__)
#define PRINTMARK()
//#define PRINTMARK() fprintf(stderr, "%08x:%s:%s MARK(%d)\n", GetTickCount(), __FILE__, __FUNCTION__, __LINE__)
#define PRINTMARK()

Connection::Connection (UMConnectionCAPI *_capi)
Connection::Connection (UMConnectionCAPI *_capi)
: m_reader(MYSQL_RX_BUFFER_SIZE)
, m_writer(MYSQL_TX_BUFFER_SIZE)
{
Expand Down Expand Up @@ -127,15 +127,16 @@ void Connection::scramble(const char *_scramble1, const char *_scramble2, UINT8

for (int index = 0; index < 20; index ++)
{
_outToken[index] = final_hash[index] ^ stage1_hash[index];
_outToken[index] = final_hash[index] ^ stage1_hash[index];
}
}


bool Connection::readSocket()
{
m_reader.defrag();
size_t bytesToRecv = m_reader.getEndPtr() - m_reader.getWritePtr();
assert (bytesToRecv <= m_reader.getEndPtr() - m_reader.getWritePtr());
assert (bytesToRecv <= m_reader.getEndPtr() - m_reader.getWritePtr());

if (bytesToRecv == 0)
{
Expand Down Expand Up @@ -207,7 +208,7 @@ bool Connection::close(void)
m_writer.finalize(0);

if (!sendPacket())
{
{
m_capi.clearException();
}
}
Expand Down
25 changes: 19 additions & 6 deletions lib/PacketReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,22 @@ void PacketReader::skip()
}
}

void PacketReader::defrag(void)
{
if (m_writeCursor == m_buffEnd && m_readCursor > m_buffStart) {
assert (m_packetEnd == NULL);
size_t bytesToCopy = m_writeCursor - m_readCursor;
//fprintf(stderr, "%s: Transferring %zu bytes to beginning\n", __FUNCTION__, bytesToCopy);
memmove(m_buffStart, m_readCursor, bytesToCopy);
assert (*m_buffStart == *m_readCursor);
assert (m_buffStart[1] == m_readCursor[1]);
m_readCursor = m_buffStart;
m_writeCursor = m_buffStart + bytesToCopy;
memset(m_writeCursor + 1, 0, m_buffEnd - m_writeCursor - 1);
}

}

void PacketReader::push(size_t _cbData)
{
//fprintf (stderr, "%s: Pushing %u bytes\n", __FUNCTION__, _cbData);
Expand Down Expand Up @@ -249,20 +265,20 @@ UINT8 *PacketReader::readLengthCodedBinary(size_t *_outLen)
case 252:
m_readCursor ++;
*_outLen = (size_t) *((UINT16 *) m_readCursor);
m_readCursor += 2;
m_readCursor += 2;
break;

case 253:
m_readCursor ++;
*_outLen = (size_t) *((UINT32 *) m_readCursor);
*_outLen &= 0xffffff;
m_readCursor += 3;
m_readCursor += 3;
break;

case 254:
m_readCursor ++;
*_outLen = (size_t) *((UINT64 *) m_readCursor);
m_readCursor += 8;
m_readCursor += 8;
break;
}

Expand Down Expand Up @@ -326,6 +342,3 @@ UINT64 PacketReader::readLengthCodedInteger()

return ret;
}



3 changes: 2 additions & 1 deletion lib/PacketReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ class PacketReader
PacketReader (size_t cbSize);
~PacketReader (void);
void skip();
void defrag();
void push(size_t _cbData);
char *getWritePtr();
char *getStartPtr();
Expand All @@ -95,4 +96,4 @@ class PacketReader
UINT8 *readLengthCodedBinary(size_t *_outLen);
};

#endif
#endif
11 changes: 8 additions & 3 deletions python/umysql.c
Original file line number Diff line number Diff line change
Expand Up @@ -769,11 +769,12 @@ PyObject *Connection_isConnected(Connection *self, PyObject *args)
Py_RETURN_FALSE;
}

#ifndef PYPY_VERSION
PyObject *PyUnicode_EncodeCP1250Helper(const Py_UNICODE *data, Py_ssize_t length, const char *errors)
{
return PyUnicode_Encode (data, length, "cp1250", errors);
}

#endif

PyObject *HandleError(Connection *self, const char *funcName)
{
Expand Down Expand Up @@ -878,8 +879,12 @@ PyObject *Connection_connect(Connection *self, PyObject *args)
else
if (strcmp (pstrCharset, "cp1250") == 0)
{
#ifndef PYPY_VERSION
self->charset = MCS_cp1250_general_ci;
self->PFN_PyUnicode_Encode = PyUnicode_EncodeCP1250Helper;
#else
return PyErr_Format (PyExc_ValueError, "Unsupported character set '%s' specified", pstrCharset);
#endif
}
else
if (strcmp (pstrCharset, "utf8mb4") == 0)
Expand Down Expand Up @@ -1093,7 +1098,7 @@ PyObject *EscapeQueryArguments(Connection *self, PyObject *inQuery, PyObject *it
{
/*
FIXME: Allocate a PyString and resize it just like the Python code does it */
obuffer = (char *) PyObject_Malloc(cbOutQuery);
obuffer = (char *) PyMem_Malloc(cbOutQuery);
heap = 1;
}
else
Expand Down Expand Up @@ -1124,7 +1129,7 @@ PyObject *EscapeQueryArguments(Connection *self, PyObject *inQuery, PyObject *it
if (*iptr != 's' && *iptr != '%')
{
Py_DECREF(iterator);
if (heap) PyObject_Free(obuffer);
if (heap) PyMem_Free(obuffer);
return PyErr_Format (PyExc_ValueError, "Found character %c expected %%", *iptr);
}

Expand Down
16 changes: 9 additions & 7 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,20 +68,22 @@
Programming Language :: Python
Topic :: Database
Topic :: Software Development :: Libraries :: Python Modules
Programming Language :: Python :: Implementation :: CPython
Programming Language :: Python :: Implementation :: PyPy
""".splitlines()))

"""
try:
shutil.rmtree("./build")
except(OSError):
pass
"""
"""

libs = []

if sys.platform != "win32":
libs.append("stdc++")

if sys.platform == "win32":
libs.append("ws2_32")

Expand All @@ -92,16 +94,16 @@
library_dirs = [],
libraries=libs,
define_macros=[('WIN32_LEAN_AND_MEAN', None)])

setup (name = 'umysql',
version = "2.61",
version = "2.62.dev0",
description = "Ultra fast MySQL driver for Python",
ext_modules = [module1],
author="Jonas Tarnstrom",
author_email="[email protected]",
download_url="http://github.com/esnme/ultramysql",
license="BSD License",
platforms=['any'],
platforms=['any'],
url="http://www.esn.me",
classifiers=CLASSIFIERS,
)
)