Skip to content

Commit

Permalink
Optimize column definition parsing by 25%
Browse files Browse the repository at this point in the history
  • Loading branch information
bwoebi committed Apr 21, 2016
1 parent 7363527 commit f248380
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 37 deletions.
52 changes: 15 additions & 37 deletions lib/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -661,8 +661,7 @@ private function parseOk($packet) {
}

if ($this->capabilities & self::CLIENT_SESSION_TRACK) {
$this->connInfo->statusInfo = DataTypes::decodeString(substr($packet, $off), $intlen, $strlen);
$off += $intlen + $strlen;
$this->connInfo->statusInfo = DataTypes::decodeStringOff($packet, $off);

if ($this->connInfo->statusFlags & StatusFlags::SERVER_SESSION_STATE_CHANGED) {
$sessionState = DataTypes::decodeString(substr($packet, $off), $intlen, $sessionStateLen);
Expand Down Expand Up @@ -870,26 +869,13 @@ private function parseColumnDefinition($packet) {
$column = [];

if ($this->capabilities & self::CLIENT_PROTOCOL_41) {
$column["catalog"] = DataTypes::decodeString(substr($packet, $off), $intlen, $len);
$off += $intlen + $len;

$column["schema"] = DataTypes::decodeString(substr($packet, $off), $intlen, $len);
$off += $intlen + $len;

$column["table"] = DataTypes::decodeString(substr($packet, $off), $intlen, $len);
$off += $intlen + $len;

$column["original_table"] = DataTypes::decodeString(substr($packet, $off), $intlen, $len);
$off += $intlen + $len;

$column["name"] = DataTypes::decodeString(substr($packet, $off), $intlen, $len);
$off += $intlen + $len;

$column["original_name"] = DataTypes::decodeString(substr($packet, $off), $intlen, $len);
$off += $intlen + $len;

$fixlen = DataTypes::decodeInt(substr($packet, $off), $len);
$off += $len;
$column["catalog"] = DataTypes::decodeStringOff($packet, $off);
$column["schema"] = DataTypes::decodeStringOff($packet, $off);
$column["table"] = DataTypes::decodeStringOff($packet, $off);
$column["original_table"] = DataTypes::decodeStringOff($packet, $off);
$column["name"] = DataTypes::decodeStringOff($packet, $off);
$column["original_name"] = DataTypes::decodeStringOff($packet, $off);
$fixlen = DataTypes::decodeIntOff($packet, $off);

$len = 0;
$column["charset"] = DataTypes::decode_int16(substr($packet, $off + $len));
Expand All @@ -905,31 +891,24 @@ private function parseColumnDefinition($packet) {

$off += $fixlen;
} else {
$column["table"] = DataTypes::decodeString(substr($packet, $off), $intlen, $len);
$off += $intlen + $len;

$column["name"] = DataTypes::decodeString(substr($packet, $off), $intlen, $len);
$off += $intlen + $len;

$collen = DataTypes::decodeInt(substr($packet, $off), $len);
$off += $len;
$column["table"] = DataTypes::decodeStringOff($packet, $off);
$column["name"] = DataTypes::decodeStringOff($packet, $off);

$collen = DataTypes::decodeIntOff($packet, $off);
$column["columnlen"] = DataTypes::decode_intByLen(substr($packet, $off), $collen);
$off += $collen;

$typelen = DataTypes::decodeInt(substr($packet, $off), $len);
$off += $len;

$typelen = DataTypes::decodeIntOff($packet, $off);
$column["type"] = DataTypes::decode_intByLen(substr($packet, $off), $typelen);
$off += $typelen;

$len = 1;
$flaglen = $this->capabilities & self::CLIENT_LONG_FLAG ? DataTypes::decodeInt(substr($packet, $off), $len) : ord($packet[$off]);
$flaglen = $this->capabilities & self::CLIENT_LONG_FLAG ? DataTypes::decodeInt(substr($packet, $off, 9), $len) : ord($packet[$off]);
$off += $len;

if ($flaglen > 2) {
$len = 2;
$column["flags"] = DataTypes::decode_int16(substr($packet, $off));
$column["flags"] = DataTypes::decode_int16(substr($packet, $off, 4));
} else {
$len = 1;
$column["flags"] = ord($packet[$off]);
Expand Down Expand Up @@ -984,8 +963,7 @@ private function handleTextResultsetRow($packet) {
$fields[] = null;
$off += 1;
} else {
$fields[] = DataTypes::decodeString(substr($packet, $off), $intlen, $len);
$off += $intlen + $len;
$fields[] = DataTypes::decodeStringOff($packet, $off);
}
}
$this->result->rowFetched($fields);
Expand Down
26 changes: 26 additions & 0 deletions lib/DataTypes.php
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,32 @@ public static function decodeNullString($str, &$len = 0) {
return substr($str, 0, $len = strpos($str, "\0"));
}

public static function decodeStringOff($str, &$off) {
$len = self::decodeIntOff($str, $off);
$off += $len;
return substr($str, $off - $len, $len);
}

public static function decodeIntOff($str, &$off) {
$int = ord($str[$off]);
if ($int < 0xfb) {
$off += 1;
return $int;
} elseif ($int == 0xfc) {
$off += 3;
return self::decode_int16(substr($str, $off - 2, 2));
} elseif ($int == 0xfd) {
$off += 4;
return self::decode_int24(substr($str, $off - 3, 3));
} elseif ($int == 0xfe) {
$off += 9;
return self::decode_int64(substr($str, $off - 8, 8));
} else {
// If that happens connection is borked...
throw new \RangeException("$int is not in ranges [0x00, 0xfa] or [0xfc, 0xfe]");
}
}

public static function decodeString($str, &$intlen = 0, &$len = 0) {
$len = self::decodeInt($str, $intlen);
return substr($str, $intlen, $len);
Expand Down

0 comments on commit f248380

Please sign in to comment.