if (attr == PDO_ATTR_AUTOCOMMIT) {
zend_throw_exception_ex(php_pdo_get_exception(), PDO_ERR_NONE TSRMLS_CC, "The auto-commit mode cannot be changed for this driver");
} else if (!dbh->methods->set_attribute) {
+ /* XXX: do something better here */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "This driver doesn't support setting attributes");
+ } else {
+ PDO_HANDLE_DBH_ERR();
}
RETURN_FALSE;
}
/* }}} */
+/* {{{ proto mixed PDO::getAttribute(long attribute)
+ Get an attribute */
static PHP_METHOD(PDO, getAttribute)
{
pdo_dbh_t *dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
case -1:
PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
- break;
case 0:
+ /* XXX: should do something better here */
php_error_docref(NULL TSRMLS_CC, E_WARNING, "This driver doesn't support fetching %ld attribute", attr);
break;
default:
return;
- break;
}
}
/* }}} */
}
/* }}} */
+/* {{{ proto bool PDOStatement::setAttribute(long attribute, mixed value)
+ Set an attribute */
+static PHP_METHOD(PDOStatement, setAttribute)
+{
+ pdo_stmt_t *stmt = (pdo_stmt_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ long attr;
+ zval *value = NULL;
+
+ if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz!", &attr, &value)) {
+ RETURN_FALSE;
+ }
+
+ if (!stmt->methods->set_attribute) {
+ goto fail;
+ }
+
+ PDO_STMT_CLEAR_ERR();
+ if (stmt->methods->set_attribute(stmt, attr, value TSRMLS_CC)) {
+ RETURN_TRUE;
+ }
+
+fail:
+ if (!stmt->methods->set_attribute) {
+ /* XXX: do something better here */
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "This driver doesn't support setting attributes");
+ } else {
+ PDO_HANDLE_STMT_ERR();
+ }
+ RETURN_FALSE;
+}
+/* }}} */
+/* {{{ proto mixed PDOStatement::getAttribute(long attribute)
+ Get an attribute */
+static PHP_METHOD(PDOStatement, getAttribute)
+{
+ pdo_stmt_t *stmt = (pdo_stmt_t*)zend_object_store_get_object(getThis() TSRMLS_CC);
+ long attr;
+
+ if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &attr)) {
+ RETURN_FALSE;
+ }
+
+ if (!stmt->methods->get_attribute) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "This driver doesn't support fetching attributes");
+ RETURN_FALSE;
+ }
+
+ PDO_STMT_CLEAR_ERR();
+ switch (stmt->methods->get_attribute(stmt, attr, return_value TSRMLS_CC)) {
+ case -1:
+ PDO_HANDLE_STMT_ERR();
+ RETURN_FALSE;
+
+ case 0:
+ /* XXX: should do something better here */
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "This driver doesn't support fetching %ld attribute", attr);
+ break;
+
+ default:
+ return;
+ }
+}
+/* }}} */
function_entry pdo_dbstmt_functions[] = {
PHP_ME(PDOStatement, execute, NULL, ZEND_ACC_PUBLIC)
PHP_ME(PDOStatement, fetchAll, NULL, ZEND_ACC_PUBLIC)
PHP_ME(PDOStatement, errorCode, NULL, ZEND_ACC_PUBLIC)
PHP_ME(PDOStatement, errorInfo, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(PDOStatement, setAttribute, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(PDOStatement, getAttribute, NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
typedef int (*pdo_stmt_param_hook_func)(pdo_stmt_t *stmt, struct pdo_bound_param_data *param, enum pdo_param_event event_type TSRMLS_DC);
+/* setting of attributes */
+typedef int (*pdo_stmt_set_attr_func)(pdo_stmt_t *stmt, long attr, zval *val TSRMLS_DC);
+
+/* fetching of attributes */
+typedef int (*pdo_stmt_get_attr_func)(pdo_stmt_t *stmt, long attr, zval *val TSRMLS_DC);
+
+
struct pdo_stmt_methods {
pdo_stmt_dtor_func dtor;
pdo_stmt_execute_func executer;
pdo_stmt_describe_col_func describer;
pdo_stmt_get_col_data_func get_col;
pdo_stmt_param_hook_func param_hook;
+ pdo_stmt_set_attr_func set_attribute;
+ pdo_stmt_get_attr_func get_attribute;
};
/* }}} */