@@ -218,85 +218,70 @@ private static function _read_column_data($cols_bitmap, $len)
218
218
if (self ::_is_null ($ null_bitmap , $ nullBitmapIndex )) {
219
219
$ values [$ name ] = null ;
220
220
} elseif ($ column ['type ' ] == ConstFieldType::TINY ) {
221
- if ($ unsigned )
221
+ if ($ unsigned ) {
222
222
$ values [$ name ] = unpack ("C " , self ::$ PACK ->read (1 ))[1 ];
223
- else
223
+ } else {
224
224
$ values [$ name ] = unpack ("c " , self ::$ PACK ->read (1 ))[1 ];
225
+ }
225
226
} elseif ($ column ['type ' ] == ConstFieldType::SHORT ) {
226
- if ($ unsigned )
227
+ if ($ unsigned ) {
227
228
$ values [$ name ] = unpack ("S " , self ::$ PACK ->read (2 ))[1 ];
228
- else
229
+ } else {
229
230
$ values [$ name ] = unpack ("s " , self ::$ PACK ->read (2 ))[1 ];
231
+ }
230
232
} elseif ($ column ['type ' ] == ConstFieldType::LONG ) {
231
-
232
233
if ($ unsigned ) {
233
234
$ values [$ name ] = unpack ("I " , self ::$ PACK ->read (4 ))[1 ];
234
235
} else {
235
236
$ values [$ name ] = unpack ("i " , self ::$ PACK ->read (4 ))[1 ];
236
-
237
237
}
238
238
} elseif ($ column ['type ' ] == ConstFieldType::INT24 ) {
239
- if ($ unsigned )
239
+ if ($ unsigned ) {
240
240
$ values [$ name ] = self ::$ PACK ->read_uint24 ();
241
- else
241
+ } else {
242
242
$ values [$ name ] = self ::$ PACK ->read_int24 ();
243
- } elseif ($ column ['type ' ] == ConstFieldType::FLOAT )
243
+ }
244
+ } elseif ($ column ['type ' ] == ConstFieldType::FLOAT ) {
244
245
$ values [$ name ] = unpack ("f " , self ::$ PACK ->read (4 ))[1 ];
245
- elseif ($ column ['type ' ] == ConstFieldType::DOUBLE )
246
+ }
247
+ elseif ($ column ['type ' ] == ConstFieldType::DOUBLE ) {
246
248
$ values [$ name ] = unpack ("d " , self ::$ PACK ->read (8 ))[1 ];
247
- elseif ($ column ['type ' ] == ConstFieldType::VARCHAR ||
249
+ } elseif ($ column ['type ' ] == ConstFieldType::VARCHAR ||
248
250
$ column ['type ' ] == ConstFieldType::STRING
249
251
) {
250
- if ($ column ['max_length ' ] > 255 )
252
+ if ($ column ['max_length ' ] > 255 ) {
251
253
$ values [$ name ] = self ::_read_string (2 , $ column );
252
- else
254
+ } else {
253
255
$ values [$ name ] = self ::_read_string (1 , $ column );
256
+ }
254
257
} elseif ($ column ['type ' ] == ConstFieldType::NEWDECIMAL ) {
255
258
$ values [$ name ] = self ::_read_new_decimal ($ column );
256
259
} elseif ($ column ['type ' ] == ConstFieldType::BLOB ) {
257
260
//ok
258
261
$ values [$ name ] = self ::_read_string ($ column ['length_size ' ], $ column );
259
-
260
- }
261
- elseif ($ column ['type ' ] == ConstFieldType::DATETIME ) {
262
-
262
+ } elseif ($ column ['type ' ] == ConstFieldType::DATETIME ) {
263
263
$ values [$ name ] = self ::_read_datetime ();
264
264
} elseif ($ column ['type ' ] == ConstFieldType::DATETIME2 ) {
265
265
//ok
266
266
$ values [$ name ] = self ::_read_datetime2 ($ column );
267
267
}elseif ($ column ['type ' ] == ConstFieldType::TIME2 ) {
268
-
269
268
$ values [$ name ] = self ::_read_time2 ($ column );
270
- }
271
- elseif ($ column ['type ' ] == ConstFieldType::TIMESTAMP2 ){
269
+ } elseif ($ column ['type ' ] == ConstFieldType::TIMESTAMP2 ){
272
270
//ok
273
271
$ time = date ('Y-m-d H:i:m ' ,self ::$ PACK ->read_int_be_by_size (4 ));
274
272
// 微妙
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
+ }
276
277
$ values [$ name ] = $ time ;
277
278
}
278
- elseif ($ column ['type ' ] == ConstFieldType::DATE )
279
+ elseif ($ column ['type ' ] == ConstFieldType::DATE ) {
279
280
$ 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
+ }
286
282
elseif ($ column ['type ' ] == ConstFieldType::TIMESTAMP ) {
287
283
$ 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 ) {
300
285
if ($ unsigned ) {
301
286
$ values [$ name ] = self ::$ PACK ->readUint64 ();
302
287
} else {
@@ -309,6 +294,8 @@ private static function _read_column_data($cols_bitmap, $len)
309
294
echo $ column ['type ' ] . " type(ConstFieldType.php) have not been support ,if need feedback " ;exit ;
310
295
}
311
296
/*
297
+ elseif ($column['type'] == ConstFieldType::TIME:
298
+ $values[$name] = self.__read_time()
312
299
elseif ($column['type'] == ConstFieldType::YEAR:
313
300
$values[$name] = self::$PACK->read_uint8() + 1900
314
301
elseif ($column['type'] == ConstFieldType::SET:
@@ -370,6 +357,43 @@ private static function _read_date() {
370
357
return $ year .'- ' .$ month .'- ' .$ day ;
371
358
}
372
359
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
+
373
397
private static function _read_datetime2 ($ column ) {
374
398
/*DATETIME
375
399
@@ -429,8 +453,6 @@ private static function _add_fsp_to_time($column)
429
453
For more details about new date format:
430
454
http://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html
431
455
*/
432
-
433
-
434
456
$ read = 0 ;
435
457
$ time = '' ;
436
458
if ( $ column ['fsp ' ] == 1 or $ column ['fsp ' ] == 2 )
0 commit comments