diff options
author | Davey Shafik <me@daveyshafik.com> | 2015-12-06 01:48:36 -0500 |
---|---|---|
committer | Davey Shafik <me@daveyshafik.com> | 2015-12-06 01:48:36 -0500 |
commit | 6bc0d8bc20223cf97887cd132de743b956265fd6 (patch) | |
tree | 667d6ac62b92b9743890ae0939b54cad295d321c /lib | |
parent | 3dd7cb7d90ba101098d15f3af50ab0db21178d10 (diff) | |
download | php7-mysql-shim-6bc0d8bc20223cf97887cd132de743b956265fd6.zip php7-mysql-shim-6bc0d8bc20223cf97887cd132de743b956265fd6.tar.gz php7-mysql-shim-6bc0d8bc20223cf97887cd132de743b956265fd6.tar.bz2 |
Upto 20% functions/59% lines coverage, more issues revealed
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mysql.php | 319 |
1 files changed, 278 insertions, 41 deletions
diff --git a/lib/mysql.php b/lib/mysql.php index e7a2a57..e1a8013 100644 --- a/lib/mysql.php +++ b/lib/mysql.php @@ -46,9 +46,12 @@ namespace { $flags ); + // @codeCoverageIgnoreStart + // PHPUnit turns the warning from mysqli_real_connect into an exception, so this never runs if ($conn === false) { return false; } + // @codeCoverageIgnoreEnd $conn->hash = $hash; \Dshafik\MySQL::$connections[$hash] = ['refcount' => 1, 'conn' => $conn]; @@ -56,7 +59,10 @@ namespace { return $conn; } catch (\Throwable $e) { trigger_error($e->getMessage(), E_USER_WARNING); + // @codeCoverageIgnoreStart + // PHPUnit turns the warning into an exception, so this never runs return false; + // @codeCoverageIgnoreEnd } } @@ -76,7 +82,10 @@ namespace { $link = \Dshafik\MySQL::getConnection($link, __FUNCTION__); if ($link === null) { + // @codeCoverageIgnoreStart + // PHPUnit Warning -> Exception return false; + // @codeCoverageIgnoreEnd } if (isset(\Dshafik\MySQL::$connections[$link->hash])) { @@ -123,8 +132,10 @@ namespace { function mysql_db_query($databaseName, $query, \mysqli $link = null) { - mysql_select_db($databaseName, $link); - return mysql_query($query, $link); + if (mysql_select_db($databaseName, $link)) { + return mysql_query($query, $link); + } + return false; } function mysql_list_dbs(\mysqli $link = null) @@ -132,20 +143,25 @@ namespace { return mysql_query("SHOW DATABASES", $link); } - function mysql_list_tables(\mysqli $link = null) + function mysql_list_tables($databaseName, \mysqli $link = null) { - return mysql_query("SHOW TABLES", \Dshafik\MySQL::getConnection($link)); + $link = \Dshafik\MySQL::getConnection($link); + return mysql_query("SHOW TABLES FROM " . mysql_real_escape_string($databaseName, $link), $link); } function mysql_list_fields($databaseName, $tableName, \mysqli $link = null) { $link = \Dshafik\MySQL::getConnection($link); - return mysql_query( - "SHOW COLUMNS FROM " . + $result = mysql_query( + "SHOW FULL COLUMNS FROM " . mysqli_real_escape_string($link, $databaseName) . "." . mysqli_real_escape_string($link, $tableName), $link ); + if ($result instanceof \mysqli_result) { + $result->table = $tableName; + } + return $result; } function mysql_list_processes(\mysqli $link = null) @@ -199,28 +215,44 @@ namespace { return $rows; } - function mysql_num_fields(\mysqli_result $result) + function mysql_num_fields($result) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_num_fields($result); } - function mysql_fetch_row(\mysqli_result $result) /* : array|null */ + function mysql_fetch_row($result) /* : array|null */ { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_fetch_row($result); } - function mysql_fetch_array(\mysqli_result $result) /* : array|null */ + function mysql_fetch_array($result) /* : array|null */ { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_fetch_array($result); } - function mysql_fetch_assoc(\mysqli_result $result) /* : array|null */ + function mysql_fetch_assoc($result) /* : array|null */ { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_fetch_assoc($result); } - function mysql_fetch_object(\mysqli_result $result, $class = null, array $params = []) /* : object|null */ + function mysql_fetch_object($result, $class = null, array $params = []) /* : object|null */ { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } + if ($class == null) { return mysqli_fetch_object($result); } @@ -228,53 +260,83 @@ namespace { return mysqli_fetch_object($result, $class, $params); } - function mysql_data_seek(\mysqli_result $result, $offset) + function mysql_data_seek($result, $offset) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_data_seek($result, $offset); } - function mysql_fetch_lengths(\mysqli_result $result) /* : array|*/ + function mysql_fetch_lengths($result) /* : array|*/ { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_fetch_lengths($result); } - function mysql_fetch_field(\mysqli_result $result) /* : object|*/ + function mysql_fetch_field($result) /* : object|*/ { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_fetch_field($result); } - function mysql_field_seek(\mysqli_result $result, $field) + function mysql_field_seek($result, $field) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_field_seek($result, $field); } - function mysql_free_result(\mysqli_result $result) + function mysql_free_result($result) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_free_result($result); } - function mysql_field_name(\mysqli_result $result, $field) + function mysql_field_name($result, $field) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return \Dshafik\MySQL::mysql_field_info($result, $field, 'name'); } - function mysql_field_table(\mysqli_result $result, $field) + function mysql_field_table($result, $field) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return \Dshafik\MySQL::mysql_field_info($result, $field, 'table'); } - function mysql_field_len(\mysql_result $result, $field) + function mysql_field_len($result, $field) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return \Dshafik\MySQL::mysql_field_info($result, $field, 'length'); } - function mysql_field_type(\mysql_result $result, $field) + function mysql_field_type($result, $field) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return \Dshafik\MySQL::mysql_field_info($result, $field, 'type'); } - function mysql_field_flags(\mysql_result $result, $field) + function mysql_field_flags($result, $field) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return \Dshafik\MySQL::mysql_field_info($result, $field, 'flags'); } @@ -338,59 +400,80 @@ namespace { return mysqli_set_charset(\Dshafik\MySQL::getConnection($link), $charset); } - function mysql_db_name(\mysqli_result $result) + function mysql_db_name($result) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_fetch_row($result)['Database']; } - function mysql_table_name(\mysqli_result $result) + function mysql_table_name($result) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysqli_fetch_row($result)['Table']; } /* Aliases */ - function mysql_fieldname(\mysqli_result $result) + function mysql_fieldname($result) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysql_field_name($result); } - function mysql_fieldtable(\mysqli_result $result) + function mysql_fieldtable($result) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysql_field_table($result); } - function mysql_fieldlen(\mysqli_result $result) + function mysql_fieldlen($result) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysql_field_len($result); } - function mysql_fieldtype(\mysqli_result $result) + function mysql_fieldtype($result) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysql_field_type($result); } - function mysql_fieldflags(\mysqli_result $result) + function mysql_fieldflags($result) { + if (\Dshafik\MySQL::checkValidResult($result, __FUNCTION__)) { + return false; + } return mysql_field_flags($result); } - function mysql_selectdb($databaseName, \mysql $link = null) + function mysql_selectdb($databaseName, \mysqli $link = null) { return mysql_select_db($databaseName, $link); } - function mysql_freeresult(\mysqli_result $result) + function mysql_freeresult($result) { return mysql_free_result($result); } - function mysql_numfields(\mysqli_result $result) + function mysql_numfields($result) { return mysql_num_fields($result); } - function mysql_numrows(\mysqli_result $result) + function mysql_numrows($result) { return mysql_num_rows($result); } @@ -410,12 +493,12 @@ namespace { return mysql_list_fields(... $args); } - function mysql_dbname(\mysqli_result $result) + function mysql_dbname($result) { return mysql_db_name($result); } - function mysql_tablename(\mysqli_result $result) + function mysql_tablename($result) { return mysql_table_name($result); } @@ -439,6 +522,7 @@ namespace Dshafik { $err = $func . "(): no MySQL-Link resource supplied"; } trigger_error($err, E_USER_WARNING); + return false; } return static::$last_connection; @@ -446,23 +530,176 @@ namespace Dshafik { static public function mysql_field_info(\mysqli_result $result, $field, $what) { - $field = mysqli_fetch_field_direct($result, $field); - if ($field === false) { + if (!\mysqli_data_seek($result, $field)) { trigger_error( - E_WARNING, sprintf( - "Field %d is invalid for MySQL result index %s", + "mysql_field_name(): Field %d is invalid for MySQL result index %s", $field, spl_object_hash($result) - ) + ), + E_USER_WARNING ); + // @codeCoverageIgnoreStart + // PHPUnit turns the warning into an exception, so this never runs + return false; + // @codeCoverageIgnoreEnd } - if (isset($field->{$what})) { - return $field->{$what}; + $field = \mysql_fetch_assoc($result); + + switch ($what) { + case "name": + return $field['Field']; + case "table": + return $result->table; + case "length": + case "type": + $matches = []; + preg_match("/(?<type>[a-z]+)(?:\((?<length>.+)\))?/", $field['Type'], $matches); + if (!isset($matches[$what])) { + $matches[$what] = null; + } + if ($what == 'length') { + return static::getFieldLength($matches[$what], $field['Type']); + } + return static::getFieldType($matches[$what]); + case "flags": + $flags = []; + if ($field['Null'] == "NO") { + $flags[] = "not_null"; + } + + if ($field['Key'] == 'PRI') { + $flags[] = "primary_key"; + } + + if (strpos($field['Extra'], "auto_increment") !== false) { + $flags[] = "auto_increment"; + } + + if ($field['Key'] == 'UNI') { + $flags[] = "unique_key"; + } + + if ($field['Key'] == 'MUL') { + $flags[] = "multiple_key"; + } + + $type = strtolower($field['Type']); + if (in_array(substr($type, -4), ["text", "blob"])) { + $flags[] = "blob"; + } + + if (substr($type, 0, 4) == "enum") { + $flags[] = "enum"; + } + + if (substr($type, 0, 3) == "set") { + $flags[] = "set"; + } + + return implode(" ", $flags); } return false; } + + static function checkValidResult($result, $function) + { + if (!($result instanceof \mysqli_result)) { + trigger_error( + $function . "() expects parameter 1 to be resource, " . gettype($result) . " given", + E_USER_WARNING + ); + return false; + } + } + + protected static function getFieldLength($what, $type) + { + if (is_numeric($what)) { + return (int) $what; + } + + switch ($type) { + case "text": + case "blob": + return 65535; + case "longtext": + case "longblob": + return 4294967295; + case "tinytext": + case "tinyblob": + return 255; + case "mediumtext": + case "mediumblob": + return 16777215; + } + + if (strtolower(substr($type, 0, 3)) == "set") { + return (int)strlen($what) + - 2 // Remove open and closing quotes + - substr_count($what, "'") // Remove quotes + + substr_count($what, "'''") // Re-add escaped quotes + + ( + substr_count( + str_replace("'''", "'", $what), // Remove escaped quotes + "'" + ) + / 2 // We have two quotes per value + ) + - 1; // But we have one less comma than values + } + + if (strtolower(substr($type, 0, 4) == "enum")) { + $values = str_getcsv($what, ",", "'", "'"); + return (int) max(array_map('strlen', $values)); + } + } + + protected static function getFieldType($what) + { + switch (strtolower($what)) { + case "char": + case "varchar": + case "binary": + case "varbinary": + case "enum": + case "set": + return "string"; + case "text": + case "tinytext": + case "mediumtext": + case "longtext": + case "blob": + case "tinyblob": + case "mediumblob": + case "longblob": + return "blob"; + case "integer": + case "bit": + case "int": + case "smallint": + case "tinyint": + case "mediumint": + case "bigint": + return "int"; + case "decimal": + case "numeric": + case "float": + case "double": + return "real"; + case "date": + case "time": + case "timestamp": + case "year": + case "datetime": + case "null": + case "geometry": + return $what; + default: + return "unknown"; + } + } } } |