From fa6fa1b8d115a315de74f8c1294d31354d3da92d Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Fri, 29 Nov 2013 16:59:00 +0900 Subject: [PATCH 1/3] Trying remove weakref in MySQLResult --- pymysql/connections.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pymysql/connections.py b/pymysql/connections.py index b8aaa53..0a54682 100644 --- a/pymysql/connections.py +++ b/pymysql/connections.py @@ -1033,8 +1033,7 @@ class Connection(object): class MySQLResult(object): def __init__(self, connection): - from weakref import proxy - self.connection = proxy(connection) + self.connection = connection self.affected_rows = None self.insert_id = None self.server_status = None @@ -1121,6 +1120,7 @@ class MySQLResult(object): packet = self.connection._read_packet() if self._check_packet_is_eof(packet): self.unbuffered_active = False + self.connection = None # release reference to kill cyclic reference. def _read_rowdata_packet(self): """Read a rowdata packet for each data row in the result set.""" @@ -1128,6 +1128,7 @@ class MySQLResult(object): while True: packet = self.connection._read_packet() if self._check_packet_is_eof(packet): + self.connection = None # release reference to kill cyclic reference. break rows.append(self._read_row_from_packet(packet)) From 497bd0b2de6d2778e9b4f4d0a561065cdc11e939 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Sun, 8 Dec 2013 22:29:12 +0900 Subject: [PATCH 2/3] Close connection when unbuffered result ends. --- pymysql/connections.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pymysql/connections.py b/pymysql/connections.py index 0a54682..d5e7b50 100644 --- a/pymysql/connections.py +++ b/pymysql/connections.py @@ -845,6 +845,7 @@ class Connection(object): result.init_unbuffered_query() except: result.unbuffered_active = False + result.connection = None raise else: result = MySQLResult(self) @@ -1065,6 +1066,7 @@ class MySQLResult(object): if first_packet.is_ok_packet(): self._read_ok_packet(first_packet) self.unbuffered_active = False + self.connection = None else: self.field_count = first_packet.read_length_encoded_integer() self._get_descriptions() @@ -1104,6 +1106,7 @@ class MySQLResult(object): packet = self.connection._read_packet() if self._check_packet_is_eof(packet): self.unbuffered_active = False + self.connection = None self.rows = None return From b8f32470651dc2dcfc0e0be3ecd7c803911ff973 Mon Sep 17 00:00:00 2001 From: INADA Naoki Date: Sun, 8 Dec 2013 22:36:10 +0900 Subject: [PATCH 3/3] Remove reference to connection soon when using buffered mode. --- pymysql/connections.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/pymysql/connections.py b/pymysql/connections.py index d5e7b50..f7be54c 100644 --- a/pymysql/connections.py +++ b/pymysql/connections.py @@ -1051,13 +1051,16 @@ class MySQLResult(object): self._finish_unbuffered_query() def read(self): - first_packet = self.connection._read_packet() + try: + first_packet = self.connection._read_packet() - # TODO: use classes for different packet types? - if first_packet.is_ok_packet(): - self._read_ok_packet(first_packet) - else: - self._read_result_packet(first_packet) + # TODO: use classes for different packet types? + if first_packet.is_ok_packet(): + self._read_ok_packet(first_packet) + else: + self._read_result_packet(first_packet) + finally: + self.connection = False def init_unbuffered_query(self): self.unbuffered_active = True