]> granicus.if.org Git - php/commitdiff
Expose TDS version as \PDO::DBLIB_ATTR_TDS_VERSION attribute on \PDO instance
authorfandrieu <fandrieu@gmail.com>
Fri, 10 Nov 2017 19:20:42 +0000 (14:20 -0500)
committerAdam Baratz <adambaratz@php.net>
Fri, 10 Nov 2017 19:21:07 +0000 (14:21 -0500)
NEWS
ext/pdo_dblib/dblib_driver.c
ext/pdo_dblib/pdo_dblib.c
ext/pdo_dblib/php_pdo_dblib_int.h
ext/pdo_dblib/tests/dbtds.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 909033fa6a586cd8765b6262ebd6dd2f03fd7fb6..9567993c76c48e94197087aacf77dec55c40ae1e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -82,6 +82,8 @@ PHP                                                                        NEWS
   . Implemented request #69592 (allow 0-column rowsets to be skipped
     automatically). (fandrieu)
   . Fixed bug #74243 (allow locales.conf to drive datetime format). (fandrieu)
+  . Expose TDS version as \PDO::DBLIB_ATTR_TDS_VERSION attribute on \PDO
+    instance. (fandrieu)
 
 - PDO_OCI:
   . Fixed bug #74631 (PDO_PCO with PHP-FPM: OCI environment initialized
index f66e83734ceddbb9bae60d4b5ffe8951779dd782..502238219f0d644409ff930ccc3c7ff9ddb2937f 100644 (file)
@@ -298,6 +298,73 @@ static int dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
        }
 }
 
+static void dblib_get_tds_version(zval *return_value, int tds)
+{
+       switch (tds) {
+               case DBTDS_2_0:
+                       ZVAL_STRING(return_value, "2.0");
+                       break;
+
+               case DBTDS_3_4:
+                       ZVAL_STRING(return_value, "3.4");
+                       break;
+
+               case DBTDS_4_0:
+                       ZVAL_STRING(return_value, "4.0");
+                       break;
+
+               case DBTDS_4_2:
+                       ZVAL_STRING(return_value, "4.2");
+                       break;
+
+               case DBTDS_4_6:
+                       ZVAL_STRING(return_value, "4.6");
+                       break;
+
+               case DBTDS_4_9_5:
+                       ZVAL_STRING(return_value, "4.9.5");
+                       break;
+
+               case DBTDS_5_0:
+                       ZVAL_STRING(return_value, "5.0");
+                       break;
+
+#ifdef DBTDS_7_0
+               case DBTDS_7_0:
+                       ZVAL_STRING(return_value, "7.0");
+                       break;
+#endif
+
+#ifdef DBTDS_7_1
+               case DBTDS_7_1:
+                       ZVAL_STRING(return_value, "7.1");
+                       break;
+#endif
+
+#ifdef DBTDS_7_2
+               case DBTDS_7_2:
+                       ZVAL_STRING(return_value, "7.2");
+                       break;
+#endif
+
+#ifdef DBTDS_7_3
+               case DBTDS_7_3:
+                       ZVAL_STRING(return_value, "7.3");
+                       break;
+#endif
+
+#ifdef DBTDS_7_4
+               case DBTDS_7_4:
+                       ZVAL_STRING(return_value, "7.4");
+                       break;
+#endif
+
+               default:
+                       ZVAL_FALSE(return_value);
+                       break;
+       }
+}
+
 static int dblib_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_value)
 {
        pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
@@ -320,6 +387,10 @@ static int dblib_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_valu
                        ZVAL_STRING(return_value, dbversion());
                        break;
 
+               case PDO_DBLIB_ATTR_TDS_VERSION:
+                       dblib_get_tds_version(return_value, dbtds(H->link));
+                       break;
+
                case PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS:
                        ZVAL_BOOL(return_value, H->skip_empty_rowsets);
                        break;
index 98e21c9d86cea8eb5dd1dbdf97934f531a00e28c..223d7bc18d5bf8d0bf9ceef8019a8c9f6989ad04 100644 (file)
@@ -195,6 +195,7 @@ PHP_MINIT_FUNCTION(pdo_dblib)
        REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_QUERY_TIMEOUT", (long) PDO_DBLIB_ATTR_QUERY_TIMEOUT);
        REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER", (long) PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER);
        REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_VERSION", (long) PDO_DBLIB_ATTR_VERSION);
+       REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_TDS_VERSION", (long) PDO_DBLIB_ATTR_TDS_VERSION);
        REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_SKIP_EMPTY_ROWSETS", (long) PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS);
        REGISTER_PDO_CLASS_CONST_LONG("DBLIB_ATTR_DATETIME_CONVERT", (long) PDO_DBLIB_ATTR_DATETIME_CONVERT);
 
index b3bd04714fc9c730467bed79d56502984cc596b6..d1be37ee79b928d7b222613bc48223ed1b3c3ac4 100644 (file)
@@ -157,6 +157,7 @@ enum {
        PDO_DBLIB_ATTR_QUERY_TIMEOUT,
        PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER,
        PDO_DBLIB_ATTR_VERSION,
+       PDO_DBLIB_ATTR_TDS_VERSION,
        PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS,
        PDO_DBLIB_ATTR_DATETIME_CONVERT,
 };
diff --git a/ext/pdo_dblib/tests/dbtds.phpt b/ext/pdo_dblib/tests/dbtds.phpt
new file mode 100644 (file)
index 0000000..1f3f35f
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+PDO_DBLIB: \PDO::DBLIB_ATTR_TDS_VERSION exposes a string or false
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo_dblib')) die('skip not loaded');
+require __DIR__ . '/config.inc';
+?>
+--FILE--
+<?php
+require __DIR__ . '/config.inc';
+
+$version = $db->getAttribute(PDO::DBLIB_ATTR_TDS_VERSION);
+var_dump((is_string($version) && strlen($version)) || $version === false);
+
+?>
+--EXPECT--
+bool(true)