summaryrefslogtreecommitdiffstats
path: root/lib/mysql.php
diff options
context:
space:
mode:
authorDavey Shafik <me@daveyshafik.com>2015-12-06 01:48:36 -0500
committerDavey Shafik <me@daveyshafik.com>2015-12-06 01:48:36 -0500
commit6bc0d8bc20223cf97887cd132de743b956265fd6 (patch)
tree667d6ac62b92b9743890ae0939b54cad295d321c /lib/mysql.php
parent3dd7cb7d90ba101098d15f3af50ab0db21178d10 (diff)
downloadphp7-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/mysql.php')
-rw-r--r--lib/mysql.php319
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";
+ }
+ }
}
}