Skip to content

Commit c42a3b6

Browse files
author
zhao.zhiqiang
committed
add time type parse
1 parent 62a7bad commit c42a3b6

File tree

1 file changed

+64
-42
lines changed

1 file changed

+64
-42
lines changed

pack/RowEvent.php

Lines changed: 64 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -218,85 +218,70 @@ private static function _read_column_data($cols_bitmap, $len)
218218
if (self::_is_null($null_bitmap, $nullBitmapIndex)) {
219219
$values[$name] = null;
220220
} elseif ($column['type'] == ConstFieldType::TINY) {
221-
if ($unsigned)
221+
if ($unsigned) {
222222
$values[$name] = unpack("C", self::$PACK->read(1))[1];
223-
else
223+
} else {
224224
$values[$name] = unpack("c", self::$PACK->read(1))[1];
225+
}
225226
} elseif ($column['type'] == ConstFieldType::SHORT) {
226-
if ($unsigned)
227+
if ($unsigned) {
227228
$values[$name] = unpack("S", self::$PACK->read(2))[1];
228-
else
229+
} else {
229230
$values[$name] = unpack("s", self::$PACK->read(2))[1];
231+
}
230232
} elseif ($column['type'] == ConstFieldType::LONG) {
231-
232233
if ($unsigned) {
233234
$values[$name] = unpack("I", self::$PACK->read(4))[1];
234235
} else {
235236
$values[$name] = unpack("i", self::$PACK->read(4))[1];
236-
237237
}
238238
} elseif ($column['type'] == ConstFieldType::INT24) {
239-
if ($unsigned)
239+
if ($unsigned) {
240240
$values[$name] = self::$PACK->read_uint24();
241-
else
241+
} else {
242242
$values[$name] = self::$PACK->read_int24();
243-
} elseif ($column['type'] == ConstFieldType::FLOAT)
243+
}
244+
} elseif ($column['type'] == ConstFieldType::FLOAT) {
244245
$values[$name] = unpack("f", self::$PACK->read(4))[1];
245-
elseif ($column['type'] == ConstFieldType::DOUBLE)
246+
}
247+
elseif ($column['type'] == ConstFieldType::DOUBLE) {
246248
$values[$name] = unpack("d", self::$PACK->read(8))[1];
247-
elseif ($column['type'] == ConstFieldType::VARCHAR ||
249+
} elseif ($column['type'] == ConstFieldType::VARCHAR ||
248250
$column['type'] == ConstFieldType::STRING
249251
) {
250-
if ($column['max_length'] > 255)
252+
if ($column['max_length'] > 255) {
251253
$values[$name] = self::_read_string(2, $column);
252-
else
254+
} else {
253255
$values[$name] = self::_read_string(1, $column);
256+
}
254257
} elseif ($column['type'] == ConstFieldType::NEWDECIMAL) {
255258
$values[$name] = self::_read_new_decimal($column);
256259
} elseif ($column['type'] == ConstFieldType::BLOB) {
257260
//ok
258261
$values[$name] = self::_read_string($column['length_size'], $column);
259-
260-
}
261-
elseif ($column['type'] == ConstFieldType::DATETIME) {
262-
262+
} elseif ($column['type'] == ConstFieldType::DATETIME) {
263263
$values[$name] = self::_read_datetime();
264264
} elseif ($column['type'] == ConstFieldType::DATETIME2) {
265265
//ok
266266
$values[$name] = self::_read_datetime2($column);
267267
}elseif ($column['type'] == ConstFieldType::TIME2) {
268-
269268
$values[$name] = self::_read_time2($column);
270-
}
271-
elseif ($column['type'] == ConstFieldType::TIMESTAMP2){
269+
} elseif ($column['type'] == ConstFieldType::TIMESTAMP2){
272270
//ok
273271
$time = date('Y-m-d H:i:m',self::$PACK->read_int_be_by_size(4));
274272
// 微妙
275-
$time .= '.' . self::_add_fsp_to_time($column);
273+
$micro = self::_add_fsp_to_time($column);
274+
if($micro) {
275+
$time .= '.' . self::_add_fsp_to_time($column);
276+
}
276277
$values[$name] = $time;
277278
}
278-
elseif ($column['type'] == ConstFieldType::DATE)
279+
elseif ($column['type'] == ConstFieldType::DATE) {
279280
$values[$name] = self::_read_date();
280-
/*
281-
elseif ($column['type'] == ConstFieldType::TIME:
282-
$values[$name] = self.__read_time()
283-
elseif ($column['type'] == ConstFieldType::DATE:
284-
$values[$name] = self.__read_date()
285-
*/
281+
}
286282
elseif ($column['type'] == ConstFieldType::TIMESTAMP) {
287283
$values[$name] = date('Y-m-d H:i:s', self::$PACK->readUint32());
288-
}
289-
290-
# For new date format:
291-
/*
292-
elseif ($column['type'] == ConstFieldType::TIME2:
293-
$values[$name] = self.__read_time2(column)
294-
elseif ($column['type'] == ConstFieldType::TIMESTAMP2:
295-
$values[$name] = self.__add_fsp_to_time(
296-
datetime.datetime.fromtimestamp(
297-
self::$PACK->read_int_be_by_size(4)), column)
298-
*/
299-
elseif ($column['type'] == ConstFieldType::LONGLONG) {
284+
} elseif ($column['type'] == ConstFieldType::LONGLONG) {
300285
if ($unsigned) {
301286
$values[$name] = self::$PACK->readUint64();
302287
} else {
@@ -309,6 +294,8 @@ private static function _read_column_data($cols_bitmap, $len)
309294
echo $column['type'] . " type(ConstFieldType.php) have not been support ,if need feedback";exit;
310295
}
311296
/*
297+
elseif ($column['type'] == ConstFieldType::TIME:
298+
$values[$name] = self.__read_time()
312299
elseif ($column['type'] == ConstFieldType::YEAR:
313300
$values[$name] = self::$PACK->read_uint8() + 1900
314301
elseif ($column['type'] == ConstFieldType::SET:
@@ -370,6 +357,43 @@ private static function _read_date() {
370357
return $year.'-'.$month.'-'.$day;
371358
}
372359

360+
private static function _read_time2($column) {
361+
/*
362+
https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html
363+
TIME encoding for nonfractional part:
364+
365+
1 bit sign (1= non-negative, 0= negative)
366+
1 bit unused (reserved for future extensions)
367+
10 bits hour (0-838)
368+
6 bits minute (0-59)
369+
6 bits second (0-59)
370+
---------------------
371+
24 bits = 3 bytes
372+
*/
373+
$data = self::$PACK->read_int_be_by_size(3);
374+
375+
$sign = 1;
376+
if (self::_read_binary_slice($data, 0, 1, 24) ) {
377+
} else {
378+
$sign = -1;
379+
}
380+
if ($sign == -1) {
381+
# negative integers are stored as 2's compliment
382+
# hence take 2's compliment again to get the right value.
383+
$data = ~$data + 1;
384+
}
385+
386+
$hours=$sign*self::_read_binary_slice($data, 2, 10, 24);
387+
$minutes=self::_read_binary_slice($data, 12, 6, 24);
388+
$seconds=self::_read_binary_slice($data, 18, 6, 24);
389+
$microseconds=self::_add_fsp_to_time($column);
390+
$t = $hours.':'.$minutes.':'.$seconds;
391+
if($microseconds) {
392+
$t .= '.'.$microseconds;
393+
}
394+
return $t;
395+
}
396+
373397
private static function _read_datetime2($column) {
374398
/*DATETIME
375399
@@ -429,8 +453,6 @@ private static function _add_fsp_to_time($column)
429453
For more details about new date format:
430454
http://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html
431455
*/
432-
433-
434456
$read = 0;
435457
$time = '';
436458
if( $column['fsp'] == 1 or $column['fsp'] == 2)

0 commit comments

Comments
 (0)