最近在开发自己的SofeeFramework的时候,需要直接从数据库取出为XML格式,以便用SimpleXML来处理,由于到目前为止PDO还未加入该格式,索性就自己为PDO打了个补丁。该补丁是在PDO-1.0RC1基础上制作的。
例子:
=======================================================
<?php
$x = new PDO("sqlite::memory:");
$x->query("create table test(name string, value string)");
$stmt = $x->prepare("INSERT INTO test (NAME, VALUE) VALUES (:name, :value)");
$stmt->bindParam(":name", $the_name, PDO_PARAM_STR, 32);
$stmt->bindParam(":value", $the_value, PDO_PARAM_STR, 32);
for ($i = 0; $i < 4; $i++) {
$the_name = "foo" . rand();
$the_value = "bar" . rand();
if (!$stmt->execute()) {
break;
}
}
$stmt = $x->query("SELECT * FROM test");
header("Content-type: text/xml;");
echo $stmt->fetchAll(PDO_FETCH_XML);
?>
输出为:
===============================================================
- <resultset queryString="SELECT * FROM test">
- <row>
<name>foo30156</name>
<value>bar21</value>
</row>
- <row>
<name>foo7978</name>
<value>bar16667</value>
</row>
- <row>
<name>foo8888</name>
<value>bar2193</value>
</row>
- <row>
<name>foo1014</name>
<value>bar21495</value>
</row>
</resultset>
下面为补丁文件内容:
===============================================================================
diff -Nur PDO-1.0RC1/pdo.c pdo/pdo.c
--- PDO-1.0RC1/pdo.c Sun Sep 11 13:27:30 2005
+++ pdo/pdo.c Mon Oct 24 19:18:38 2005
@@ -320,6 +320,7 @@
REGISTER_LONG_CONSTANT("PDO_FETCH_SERIALIZE",(long)PDO_FETCH_SERIALIZE, CONST_CS|CONST_PERSISTENT);
#endif
REGISTER_LONG_CONSTANT("PDO_FETCH_NAMED",(long)PDO_FETCH_NAMED, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("PDO_FETCH_XML", (long)PDO_FETCH_XML, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PDO_ATTR_AUTOCOMMIT", (long)PDO_ATTR_AUTOCOMMIT, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PDO_ATTR_PREFETCH", (long)PDO_ATTR_PREFETCH, CONST_CS|CONST_PERSISTENT);
diff -Nur PDO-1.0RC1/pdo_stmt.c pdo/pdo_stmt.c
--- PDO-1.0RC1/pdo_stmt.c Sun Sep 11 03:32:16 2005
+++ pdo/pdo_stmt.c Tue Oct 25 11:13:49 2005
@@ -36,6 +36,7 @@
#include "zend_exceptions.h"
#include "zend_interfaces.h"
#include "php_memory_streams.h"
+#include "ext/standard/php_smart_str.h"
#if COMPILE_DL_PDO
/* {{{ content from zend_arg_defs.c:
@@ -743,6 +744,7 @@
int flags = how & PDO_FETCH_FLAGS, idx, old_arg_count;
zend_class_entry * ce, * old_ce;
zval grp_val, *grp, **pgrp, *retval, *old_ctor_args;
+ smart_str xmlstr = {0};
how = how & ~PDO_FETCH_FLAGS;
if (how == PDO_FETCH_USE_DEFAULT) {
@@ -846,6 +848,11 @@
}
}
break;
+
+ case PDO_FETCH_XML:
+ convert_to_string(return_value);
+ smart_str_appends(&xmlstr, "<row>");
+ break;
default:
@@ -969,6 +976,16 @@
stmt->fetch.func.values[idx] = val;
stmt->fetch.cls.fci.params[idx] = &stmt->fetch.func.values[idx];
break;
+
+ case PDO_FETCH_XML:
+ smart_str_appends(&xmlstr, "<");
+ smart_str_appendl(&xmlstr, stmt->columns[i].name, stmt->columns[i].namelen);
+ smart_str_appends(&xmlstr, ">");
+ smart_str_appendl(&xmlstr, Z_STRVAL_P(val), Z_STRLEN_P(val));
+ smart_str_appends(&xmlstr, "</");
+ smart_str_appendl(&xmlstr, stmt->columns[i].name, stmt->columns[i].namelen);
+ smart_str_appends(&xmlstr, ">");
+ break;
default:
zval_ptr_dtor(&val);
@@ -1020,6 +1037,13 @@
zval_ptr_dtor(&stmt->fetch.func.values[idx]);
}
break;
+
+ case PDO_FETCH_XML:
+ smart_str_appends(&xmlstr, "</row>");
+ smart_str_0(&xmlstr);
+ ZVAL_STRINGL(return_value, xmlstr.c, xmlstr.len, 1);
+ smart_str_free(&xmlstr);
+ break;
default:
break;
@@ -1231,6 +1255,7 @@
zend_class_entry *old_ce;
zval *old_ctor_args, *ctor_args = NULL;
int error = 0, old_arg_count;
+ smart_str xmlstr = {0};
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lzz", &how, &arg2, &ctor_args)) {
RETURN_FALSE;
@@ -1318,7 +1343,6 @@
error = 1;
}
}
-
if (!error) {
PDO_STMT_CLEAR_ERR();
MAKE_STD_ZVAL(data);
@@ -1339,11 +1363,29 @@
MAKE_STD_ZVAL(data);
} while (do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
} else {
- array_init(return_value);
+ if (how == PDO_FETCH_XML) {
+ convert_to_string(return_value);
+ smart_str_appends(&xmlstr, "<resultset queryString=\"");
+ smart_str_appendl(&xmlstr, stmt->query_string, stmt->query_stringlen);
+ smart_str_appends(&xmlstr, "\">");
+ } else {
+ array_init(return_value);
+ }
do {
- add_next_index_zval(return_value, data);
+ if (how == PDO_FETCH_XML) {
+ smart_str_appends(&xmlstr, Z_STRVAL_P(data));
+ } else {
+ add_next_index_zval(return_value, data);
+ }
MAKE_STD_ZVAL(data);
} while (do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, 0 TSRMLS_CC));
+
+ if (how == PDO_FETCH_XML) {
+ smart_str_appends(&xmlstr, "</resultset>");
+ smart_str_0(&xmlstr);
+ ZVAL_STRINGL(return_value, xmlstr.c, xmlstr.len, 1);
+ smart_str_free(&xmlstr);
+ }
}
FREE_ZVAL(data);
}
diff -Nur PDO-1.0RC1/php_pdo_driver.h pdo/php_pdo_driver.h
--- PDO-1.0RC1/php_pdo_driver.h Wed Jul 20 11:38:34 2005
+++ pdo/php_pdo_driver.h Mon Oct 24 19:18:29 2005
@@ -90,6 +90,7 @@
PDO_FETCH_INTO, /* fetch row into an existing object */
PDO_FETCH_FUNC, /* fetch into function and return its result */
PDO_FETCH_NAMED, /* like PDO_FETCH_ASSOC, but can handle duplicate names */
+ PDO_FETCH_XML, /* fetch row into xml format */
PDO_FETCH__MAX /* must be last */
};
发表于 @ 2005年10月24日 20:09:00 | 评论( loading... ) | 举报| 收藏