88from .constants import BINLOG
99from .column import Column
1010
11+
1112class RowsEvent (BinLogEvent ):
1213 def __init__ (self , from_packet , event_size , table_map , ctl_connection ):
1314 super (RowsEvent , self ).__init__ (from_packet , event_size , table_map , ctl_connection )
@@ -19,8 +20,8 @@ def __init__(self, from_packet, event_size, table_map, ctl_connection):
1920
2021 #Event V2
2122 if self .event_type == BINLOG .WRITE_ROWS_EVENT or \
22- self .event_type == BINLOG .DELETE_ROWS_EVENT or \
23- self .event_type == BINLOG .UPDATE_ROWS_EVENT :
23+ self .event_type == BINLOG .DELETE_ROWS_EVENT or \
24+ self .event_type == BINLOG .UPDATE_ROWS_EVENT :
2425 self .extra_data_length = struct .unpack ('<H' , self .packet .read (2 ))[0 ]
2526 self .extra_data = self .packet .read (self .extra_data_length / 8 )
2627
@@ -54,6 +55,9 @@ def _read_column_data(self, null_bitmap):
5455 values [name ] = struct .unpack ("<B" , self .packet .read (1 ))[0 ]
5556 else :
5657 values [name ] = struct .unpack ("<b" , self .packet .read (1 ))[0 ]
58+
59+ if column .type_is_bool :
60+ values [name ] = bool (values [name ])
5761 elif column .type == FIELD_TYPE .SHORT :
5862 if unsigned :
5963 values [name ] = struct .unpack ("<H" , self .packet .read (2 ))[0 ]
@@ -94,10 +98,11 @@ def _read_column_data(self, null_bitmap):
9498 # For new date format: http://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html
9599 elif column .type == FIELD_TYPE .DATETIME2 :
96100 values [name ] = self .__read_datetime2 (column )
97- elif column .type == FIELD_TYPE .TIME2 :
101+ elif column .type == FIELD_TYPE .TIME2 :
98102 values [name ] = self .__read_time2 (column )
99103 elif column .type == FIELD_TYPE .TIMESTAMP2 :
100- values [name ] = self .__add_fsp_to_time (datetime .datetime .fromtimestamp (self .packet .read_int_be_by_size (4 )), column )
104+ values [name ] = self .__add_fsp_to_time (
105+ datetime .datetime .fromtimestamp (self .packet .read_int_be_by_size (4 )), column )
101106 elif column .type == FIELD_TYPE .LONGLONG :
102107 if unsigned :
103108 values [name ] = self .packet .read_uint64 ()
@@ -110,7 +115,7 @@ def _read_column_data(self, null_bitmap):
110115 elif column .type == FIELD_TYPE .SET :
111116 #We read set columns as a bitmap telling us which options are enabled
112117 bit_mask = self .packet .read_uint_by_size (column .size )
113- values [name ] = {val for idx ,val in enumerate (column .set_values ) if bit_mask & 2 ** idx } or None
118+ values [name ] = {val for idx , val in enumerate (column .set_values ) if bit_mask & 2 ** idx } or None
114119
115120 elif column .type == FIELD_TYPE .BIT :
116121 values [name ] = self .__read_bit (column )
@@ -134,9 +139,9 @@ def __add_fsp_to_time(self, time, column):
134139 if read > 0 :
135140 microsecond = self .packet .read_int_be_by_size (read )
136141 if column .fsp % 2 :
137- time = time .replace (microsecond = int (microsecond / 10 ))
142+ time = time .replace (microsecond = int (microsecond / 10 ))
138143 else :
139- time = time .replace (microsecond = microsecond )
144+ time = time .replace (microsecond = microsecond )
140145 return time
141146
142147 def __read_string (self , size , column ):
@@ -171,9 +176,9 @@ def __read_bit(self, column):
171176 def __read_time (self ):
172177 time = self .packet .read_uint24 ()
173178 date = datetime .time (
174- hour = int (time / 10000 ),
175- minute = int ((time % 10000 ) / 100 ),
176- second = int (time % 100 ))
179+ hour = int (time / 10000 ),
180+ minute = int ((time % 10000 ) / 100 ),
181+ second = int (time % 100 ))
177182 return date
178183
179184 def __read_time2 (self , column ):
@@ -187,9 +192,9 @@ def __read_time2(self, column):
18719224 bits = 3 bytes'''
188193 data = self .packet .read_int_be_by_size (3 )
189194 t = datetime .time (
190- hour = self .__read_binary_slice (data , 2 , 10 , 24 ),
191- minute = self .__read_binary_slice (data , 12 , 6 , 24 ),
192- second = self .__read_binary_slice (data , 18 , 6 , 24 ))
195+ hour = self .__read_binary_slice (data , 2 , 10 , 24 ),
196+ minute = self .__read_binary_slice (data , 12 , 6 , 24 ),
197+ second = self .__read_binary_slice (data , 18 , 6 , 24 ))
193198 return self .__add_fsp_to_time (t , column )
194199
195200 def __read_date (self ):
@@ -198,9 +203,9 @@ def __read_date(self):
198203 return None
199204
200205 date = datetime .date (
201- year = (time & ((1 << 15 ) - 1 ) << 9 ) >> 9 ,
202- month = (time & ((1 << 4 ) - 1 ) << 5 ) >> 5 ,
203- day = (time & ((1 << 5 ) - 1 ))
206+ year = (time & ((1 << 15 ) - 1 ) << 9 ) >> 9 ,
207+ month = (time & ((1 << 4 ) - 1 ) << 5 ) >> 5 ,
208+ day = (time & ((1 << 5 ) - 1 ))
204209 )
205210 return date
206211
@@ -219,12 +224,12 @@ def __read_datetime(self):
219224 return None
220225
221226 date = datetime .datetime (
222- year = year ,
223- month = month ,
224- day = day ,
225- hour = int (time / 10000 ),
226- minute = int ((time % 10000 ) / 100 ),
227- second = int (time % 100 ))
227+ year = year ,
228+ month = month ,
229+ day = day ,
230+ hour = int (time / 10000 ),
231+ minute = int ((time % 10000 ) / 100 ),
232+ second = int (time % 100 ))
228233 return date
229234
230235 def __read_datetime2 (self , column ):
@@ -241,12 +246,12 @@ def __read_datetime2(self, column):
241246 year_month = self .__read_binary_slice (data , 1 , 17 , 40 )
242247 try :
243248 t = datetime .datetime (
244- year = int (year_month / 13 ),
245- month = year_month % 13 ,
246- day = self .__read_binary_slice (data , 18 , 5 , 40 ),
247- hour = self .__read_binary_slice (data , 23 , 5 , 40 ),
248- minute = self .__read_binary_slice (data , 28 , 6 , 40 ),
249- second = self .__read_binary_slice (data , 34 , 6 , 40 ))
249+ year = int (year_month / 13 ),
250+ month = year_month % 13 ,
251+ day = self .__read_binary_slice (data , 18 , 5 , 40 ),
252+ hour = self .__read_binary_slice (data , 23 , 5 , 40 ),
253+ minute = self .__read_binary_slice (data , 28 , 6 , 40 ),
254+ second = self .__read_binary_slice (data , 34 , 6 , 40 ))
250255 except ValueError :
251256 return None
252257 return self .__add_fsp_to_time (t , column )
@@ -278,7 +283,6 @@ def __read_new_decimal(self, column):
278283 res = "-"
279284 self .packet .unread (struct .pack ('<B' , value ^ 0x80 ))
280285
281-
282286 size = compressed_bytes [comp_integral ]
283287 if size > 0 :
284288 value = self .packet .read_int_be_by_size (size ) ^ mask
@@ -316,7 +320,7 @@ def __read_binary_slice(self, binary, start, size, data_length):
316320 def _dump (self ):
317321 super (RowsEvent , self )._dump ()
318322 print ("Table: %s.%s" % (self .schema , self .table ))
319- print ("Affected columns: %d" % ( self .number_of_columns ) )
323+ print ("Affected columns: %d" % self .number_of_columns )
320324 print ("Changed rows: %d" % (len (self .rows )))
321325
322326 def _fetch_rows (self ):
@@ -332,7 +336,8 @@ def __getattr__(self, name):
332336
333337
334338class DeleteRowsEvent (RowsEvent ):
335- '''This evenement is trigger when a row in database is removed'''
339+ """This event is trigger when a row in the database is removed"""
340+
336341 def __init__ (self , from_packet , event_size , table_map , ctl_connection ):
337342 super (DeleteRowsEvent , self ).__init__ (from_packet , event_size , table_map , ctl_connection )
338343 self .columns_present_bitmap = self .packet .read ((self .number_of_columns + 7 ) / 8 )
@@ -354,7 +359,8 @@ def _dump(self):
354359
355360
356361class WriteRowsEvent (RowsEvent ):
357- '''This evenement is trigger when a row in database is added'''
362+ """This event is triggered when a row in database is added"""
363+
358364 def __init__ (self , from_packet , event_size , table_map , ctl_connection ):
359365 super (WriteRowsEvent , self ).__init__ (from_packet , event_size , table_map , ctl_connection )
360366 self .columns_present_bitmap = self .packet .read ((self .number_of_columns + 7 ) / 8 )
@@ -376,9 +382,10 @@ def _dump(self):
376382
377383
378384class UpdateRowsEvent (RowsEvent ):
379- '''This evenement is trigger when a row in database change'''
385+ """This event is triggered when a row in the database is changed"""
386+
380387 def __init__ (self , from_packet , event_size , table_map , ctl_connection ):
381- super (UpdateRowsEvent ,self ).__init__ (from_packet , event_size , table_map , ctl_connection )
388+ super (UpdateRowsEvent , self ).__init__ (from_packet , event_size , table_map , ctl_connection )
382389 #Body
383390 self .columns_present_bitmap = self .packet .read ((self .number_of_columns + 7 ) / 8 )
384391 self .columns_present_bitmap2 = self .packet .read ((self .number_of_columns + 7 ) / 8 )
@@ -395,7 +402,7 @@ def _fetch_one_row(self):
395402
396403 def _dump (self ):
397404 super (UpdateRowsEvent , self )._dump ()
398- print ("Affected columns: %d" % ( self .number_of_columns ) )
405+ print ("Affected columns: %d" % self .number_of_columns )
399406 print ("Values:" )
400407 for row in self .rows :
401408 print ("--" )
@@ -407,19 +414,19 @@ class TableMapEvent(BinLogEvent):
407414 '''This evenement describe the structure of a table.
408415 It's send before a change append on a table.
409416 A end user of the lib should have no usage of this'''
417+
410418 def __init__ (self , from_packet , event_size , table_map , ctl_connection ):
411419 super (TableMapEvent , self ).__init__ (from_packet , event_size , table_map , ctl_connection )
412420
413421 # Post-Header
414422 self .table_id = self ._read_table_id ()
415423 self .flags = struct .unpack ('<H' , self .packet .read (2 ))[0 ]
416424
417-
418425 # Payload
419- self .schema_length = byte2int (self .packet .read (1 ))
426+ self .schema_length = byte2int (self .packet .read (1 ))
420427 self .schema = self .packet .read (self .schema_length ).decode ()
421428 self .packet .advance (1 )
422- self .table_length = byte2int (self .packet .read (1 ))
429+ self .table_length = byte2int (self .packet .read (1 ))
423430 self .table = self .packet .read (self .table_length ).decode ()
424431 self .packet .advance (1 )
425432 self .column_count = self .packet .read_length_coded_binary ()
@@ -429,7 +436,7 @@ def __init__(self, from_packet, event_size, table_map, ctl_connection):
429436 if self .table_id in table_map :
430437 self .column_schemas = table_map [self .table_id ].column_schemas
431438 else :
432- self .column_schemas = self .__get_table_informations (self .schema , self .table )
439+ self .column_schemas = self .__get_table_information (self .schema , self .table )
433440
434441 #Read columns meta data
435442 column_types = list (self .packet .read (self .column_count ))
@@ -444,7 +451,7 @@ def __init__(self, from_packet, event_size, table_map, ctl_connection):
444451 # TODO: get this informations instead of trashing data
445452 # n NULL-bitmask, length: (column-length * 8) / 7
446453
447- def __get_table_informations (self , schema , table ):
454+ def __get_table_information (self , schema , table ):
448455 cur = self ._ctl_connection .cursor ()
449456 cur .execute ("""SELECT * FROM columns WHERE table_schema = %s AND table_name = %s""" , (schema , table ))
450457 return cur .fetchall ()
0 commit comments