summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/mysql.php319
-rw-r--r--tests/MySqlShimTest.php237
2 files changed, 470 insertions, 86 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";
+ }
+ }
}
}
diff --git a/tests/MySqlShimTest.php b/tests/MySqlShimTest.php
index 35523cf..928edb4 100644
--- a/tests/MySqlShimTest.php
+++ b/tests/MySqlShimTest.php
@@ -96,6 +96,21 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
id int AUTO_INCREMENT,
one varchar(255),
two varchar(255),
+ three varchar(255),
+ four varchar(255),
+ five varchar(255),
+ six varchar(255),
+ seven varchar(255),
+ eight varchar(255),
+ nine ENUM('one', 'two', '\'three'),
+ ten SET('one', 'two', '\'three'),
+ eleven MEDIUMTEXT,
+ INDEX one_idx (one),
+ UNIQUE INDEX two_unq (two),
+ INDEX three_four_idx (three, four),
+ UNIQUE INDEX four_five_unq (four, five),
+ INDEX seven_eight_idx (seven, eight),
+ UNIQUE INDEX seven_eight_unq (seven, eight),
PRIMARY KEY (id)
);"
);
@@ -104,15 +119,23 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
public function test_mysql_query_insert()
{
- $this->getConnection("mysql_shim");
- $result = \mysql_query("INSERT INTO testing (one, two) VALUES ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4')");
+ $this->getConnection("shim_test");
+ $result = \mysql_query(
+ "INSERT INTO
+ testing (one, two, three, four, five, six, seven, eight)
+ VALUES
+ ('1', '1', '1', '1', '1', '1', '1', '1'),
+ ('2', '2', '2', '2', '2', '2', '2', '2'),
+ ('3', '3', '3', '3', '3', '3', '3', '3'),
+ ('4', '4', '4', '4', '4', '4', '4', '4')"
+ );
$this->assertTrue($result, \mysql_error());
}
public function test_mysql_query()
{
- $this->getConnection("mysql_shim");
+ $this->getConnection("shim_test");
$result = \mysql_query("SELECT VERSION()");
$this->assertResult($result);
@@ -120,7 +143,7 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
public function test_mysql_query_nodata()
{
- $this->getConnection("mysql_shim");
+ $this->getConnection("shim_test");
$result = \mysql_query("SET @test = 'foo'");
$this->assertTrue($result);
@@ -128,7 +151,7 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
public function test_mysql_query_fail()
{
- $this->getConnection("mysql_shim");
+ $this->getConnection("shim_test");
$result = \mysql_query("SELECT VERSION(");
$this->assertFalse($result);
@@ -136,7 +159,7 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
public function test_mysql_unbuffered_query()
{
- $this->getConnection("mysql_shim");
+ $this->getConnection("shim_test");
$result = \mysql_unbuffered_query("SELECT one, two FROM testing LIMIT 4");
$this->assertResult($result);
@@ -160,16 +183,7 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
public function test_mysql_unbuffered_query_num_rows()
{
- $this->getConnection("mysql_shim");
-
- \mysql_query(
- "CREATE TABLE largetest (
- id int AUTO_INCREMENT,
- one varchar(255),
- two varchar(255),
- PRIMARY KEY (id)
- );"
- );
+ $this->getConnection("shim_test");
$result = \mysql_unbuffered_query("SELECT one, two FROM testing");
$this->assertResult($result);
@@ -183,16 +197,7 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped("PHP < 7.0.0 is required");
}
- $conn = $this->getConnection("mysql_shim");
-
- \mysql_query(
- "CREATE TABLE largetest (
- id int AUTO_INCREMENT,
- one varchar(255),
- two varchar(255),
- PRIMARY KEY (id)
- );"
- );
+ $conn = $this->getConnection("shim_test");
$result = \mysql_unbuffered_query("SELECT one, two FROM testing");
$this->assertResult($result);
@@ -211,28 +216,170 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
*/
public function test_mysql_unbuffered_query_close()
{
- $conn = $this->getConnection("mysql_shim");
-
- \mysql_query(
- "CREATE TABLE largetest (
- id int AUTO_INCREMENT,
- one varchar(255),
- two varchar(255),
- PRIMARY KEY (id)
- );"
- );
-
+ $conn = $this->getConnection("shim_test");
$result = \mysql_unbuffered_query("SELECT one, two FROM testing");
$this->assertResult($result);
\mysql_close($conn);
}
+ public function test_mysql_db_query()
+ {
+ $this->getConnection();
+ $result = \mysql_db_query("shim_test", "SELECT DATABASE()");
+ $this->assertResult($result);
+ $this->assertEquals("shim_test", \mysql_fetch_row($result)[0]);
+ $result = \mysql_db_query("mysql", "SELECT DATABASE()");
+ $this->assertResult($result);
+ $this->assertEquals("mysql", \mysql_fetch_row($result)[0]);
+ }
+
+ public function test_mysql_db_query_fail()
+ {
+ $this->getConnection();
+ $result = \mysql_db_query("nonexistent", "SELECT DATABASE()");
+ $this->assertFalse($result);
+ }
+
+ public function test_mysql_list_dbs()
+ {
+ $this->getConnection();
+ $result = \mysql_list_dbs();
+ $this->assertResult($result);
+ while ($row = mysql_fetch_assoc($result)) {
+ $this->assertArrayHasKey("Database", $row);
+ }
+ }
+
+ public function test_mysql_list_tables()
+ {
+ $this->getConnection();
+ $result = \mysql_list_tables("mysql");
+ $this->assertResult($result);
+ while ($row = mysql_fetch_assoc($result)) {
+ $this->assertArrayHasKey("Tables_in_mysql", $row);
+ }
+ }
+
+ public function test_mysql_list_tables_fail()
+ {
+ $this->getConnection();
+ $result = \mysql_list_tables("nonexistent");
+ $this->assertFalse($result);
+ }
+
+ public function test_mysql_list_fields()
+ {
+ $this->getConnection();
+ $result = \mysql_list_fields("shim_test", "testing");
+ $this->assertResult($result);
+
+ $this->assertEquals("testing", \mysql_field_table($result, 0));
+ $this->assertEquals("id", \mysql_field_name($result, 0));
+ $this->assertEquals("int", \mysql_field_type($result, 0));
+ $this->assertEquals(11, \mysql_field_len($result, 0));
+ $this->assertEquals("not_null primary_key auto_increment", \mysql_field_flags($result, 0));
+
+ $this->assertEquals("testing", \mysql_field_table($result, 1));
+ $this->assertEquals("one", \mysql_field_name($result, 1));
+ $this->assertEquals("string", \mysql_field_type($result, 1));
+ $this->assertEquals(255, \mysql_field_len($result, 1));
+ $this->assertEquals("multiple_key", \mysql_field_flags($result, 1));
+
+ $this->assertEquals("testing", \mysql_field_table($result, 2));
+ $this->assertEquals("two", \mysql_field_name($result, 2));
+ $this->assertEquals("string", \mysql_field_type($result, 2));
+ $this->assertEquals(255, \mysql_field_len($result, 2));
+ $this->assertEquals("unique_key", \mysql_field_flags($result, 2));
+
+ $this->assertEquals("testing", \mysql_field_table($result, 3));
+ $this->assertEquals("three", \mysql_field_name($result, 3));
+ $this->assertEquals("string", \mysql_field_type($result, 3));
+ $this->assertEquals(255, \mysql_field_len($result, 3));
+ $this->assertEquals("multiple_key", \mysql_field_flags($result, 3));
+
+ $this->assertEquals("testing", \mysql_field_table($result, 4));
+ $this->assertEquals("four", \mysql_field_name($result, 4));
+ $this->assertEquals("string", \mysql_field_type($result, 4));
+ $this->assertEquals(255, \mysql_field_len($result, 4));
+ $this->assertEquals("multiple_key", \mysql_field_flags($result, 4));
+
+ $this->assertEquals("testing", \mysql_field_table($result, 5));
+ $this->assertEquals("five", \mysql_field_name($result, 5));
+ $this->assertEquals("string", \mysql_field_type($result, 5));
+ $this->assertEquals(255, \mysql_field_len($result, 5));
+ $this->assertEmpty(\mysql_field_flags($result, 5));
+
+ $this->assertEquals("testing", \mysql_field_table($result, 6));
+ $this->assertEquals("six", \mysql_field_name($result, 6));
+ $this->assertEquals("string", \mysql_field_type($result, 6));
+ $this->assertEquals(255, \mysql_field_len($result, 6));
+ $this->assertEmpty(\mysql_field_flags($result, 6));
+
+ $this->assertEquals("testing", \mysql_field_table($result, 7));
+ $this->assertEquals("seven", \mysql_field_name($result, 7));
+ $this->assertEquals("string", \mysql_field_type($result, 7));
+ $this->assertEquals(255, \mysql_field_len($result, 7));
+ $this->assertEquals("multiple_key", \mysql_field_flags($result, 7));
+
+ $this->assertEquals("testing", \mysql_field_table($result, 8));
+ $this->assertEquals("eight", \mysql_field_name($result, 8));
+ $this->assertEquals("string", \mysql_field_type($result, 8));
+ $this->assertEquals(255, \mysql_field_len($result, 8));
+ $this->assertEmpty(\mysql_field_flags($result, 8));
+
+ $this->assertEquals("testing", \mysql_field_table($result, 9));
+ $this->assertEquals("nine", \mysql_field_name($result, 9));
+ $this->assertEquals("string", \mysql_field_type($result, 9));
+ $this->assertEquals(6, \mysql_field_len($result, 9));
+ $this->assertEquals("enum", \mysql_field_flags($result, 9));
+
+ $this->assertEquals("testing", \mysql_field_table($result, 11));
+ $this->assertEquals("eleven", \mysql_field_name($result, 11));
+ $this->assertEquals("blob", \mysql_field_type($result, 11));
+ $this->assertEquals(16777215, \mysql_field_len($result, 11));
+ $this->assertEquals("blob", \mysql_field_flags($result, 11));
+ }
+
+ /**
+ * @expectedException \PHPUnit_Framework_Error_Warning
+ * @expectedExceptionMessageRegExp /^mysql_field_name\(\): Field 999 is invalid for MySQL result index .*$/
+ */
+ public function test_mysql_list_fields_fail()
+ {
+ $this->getConnection();
+ $result = \mysql_list_fields("shim_test", "testing");
+ $this->assertResult($result);
+
+ \mysql_field_name($result, 999);
+ }
+
+ public function test_mysql_num_fields()
+ {
+ $this->getConnection('shim_test');
+ $result = \mysql_query("SELECT one, two FROM testing LIMIT 1");
+ $this->assertResult($result);
+
+ $this->assertEquals(2, \mysql_num_fields($result));
+ }
+
+ /**
+ * @expectedException \PHPUnit_Framework_Error_Warning
+ * @expectedExceptionMessageRegExp /^mysql_num_fields\(\) expects parameter 1 to be resource, boolean given$/
+ */
+ public function test_mysql_num_fields_fail()
+ {
+ $this->getConnection('shim_test');
+ $result = \mysql_query("SELECT one, two FROM nonexistent");
+
+ \mysql_num_fields($result);
+ }
+
/**
* @dataProvider mysql_fetch_DataProvider
*/
public function test_mysql_fetch($function, $results)
{
- $this->getConnection("mysql_shim");
+ $this->getConnection("shim_test");
$result = \mysql_query("SELECT one, two FROM testing");
$this->assertResult($result);
@@ -250,7 +397,7 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
public function test_mysql_num_rows()
{
- $this->getConnection("mysql_shim");
+ $this->getConnection("shim_test");
$result = \mysql_query("SELECT * FROM testing");
$this->assertResult($result);
@@ -259,13 +406,13 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
public function test_mysql_affected_rows()
{
- $this->getConnection("mysql_shim");
+ $this->getConnection("shim_test");
- $result = \mysql_query("UPDATE testing SET one = one + 1, two = two + 1 ORDER BY one DESC LIMIT 4");
+ $result = \mysql_query("UPDATE testing SET one = one + 1000, two = two + 1000 ORDER BY one DESC LIMIT 4");
$this->assertTrue($result);
$this->assertEquals(4, \mysql_affected_rows());
- $result = \mysql_query("UPDATE testing SET one = one - 1, two = two - 1 ORDER BY one DESC LIMIT 4");
- $this->assertTrue($result);
+ $result = \mysql_query("UPDATE testing SET one = one - 1000, two = two - 1000 ORDER BY one DESC LIMIT 4");
+ $this->assertTrue($result, \mysql_error());
$this->assertEquals(4, \mysql_affected_rows());
}
@@ -313,7 +460,7 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
}
fwrite(STDERR, "=> Running Docker Container: ");
- static::$container = exec($docker . ' run -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -P -d mysql/mysql-server');
+ static::$container = exec($docker . ' run -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -P -d mysql/mysql-server:5.7');
if (empty(static::$container)) {
static::markTestSkipped("Unable to start docker container");
@@ -432,7 +579,7 @@ class MySqlShimTest extends \PHPUnit_Framework_TestCase
$this->assertConnection($mysql);
if ($db !== null) {
- $this->assertTrue(\mysql_select_db('shim_test'));
+ $this->assertTrue(\mysql_select_db($db));
}
return $mysql;