summaryrefslogtreecommitdiff
path: root/ext/pdo_firebird
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pdo_firebird')
-rw-r--r--ext/pdo_firebird/CREDITS2
-rw-r--r--ext/pdo_firebird/EXPERIMENTAL0
-rw-r--r--ext/pdo_firebird/config.m439
-rw-r--r--ext/pdo_firebird/config.w3215
-rw-r--r--ext/pdo_firebird/firebird_driver.c309
-rw-r--r--ext/pdo_firebird/firebird_statement.c48
-rw-r--r--ext/pdo_firebird/package.xml48
-rw-r--r--ext/pdo_firebird/pdo_firebird.c95
-rw-r--r--ext/pdo_firebird/php_pdo_firebird.h52
-rw-r--r--ext/pdo_firebird/php_pdo_firebird_int.h83
-rw-r--r--ext/pdo_firebird/tests/connect.phpt16
-rw-r--r--ext/pdo_firebird/tests/skipif.inc5
-rw-r--r--ext/pdo_firebird/tests/testdb.inc34
13 files changed, 746 insertions, 0 deletions
diff --git a/ext/pdo_firebird/CREDITS b/ext/pdo_firebird/CREDITS
new file mode 100644
index 0000000000..7757c96ee0
--- /dev/null
+++ b/ext/pdo_firebird/CREDITS
@@ -0,0 +1,2 @@
+Firebird/InterBase PDO module
+Ard Biesheuvel
diff --git a/ext/pdo_firebird/EXPERIMENTAL b/ext/pdo_firebird/EXPERIMENTAL
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/ext/pdo_firebird/EXPERIMENTAL
diff --git a/ext/pdo_firebird/config.m4 b/ext/pdo_firebird/config.m4
new file mode 100644
index 0000000000..1baee70ac6
--- /dev/null
+++ b/ext/pdo_firebird/config.m4
@@ -0,0 +1,39 @@
+dnl
+dnl $Id$
+dnl
+
+PHP_ARG_WITH(pdo-firebird,for Firebird support for PDO,
+[ --with-pdo-firebird[=DIR] Include Firebird support for PDO. DIR is the Firebird base
+ install directory, defaults to /opt/firebird])
+
+if test "$PHP_PDO_FIREBIRD" != "no"; then
+ if test "$PHP_PDO_FIREBIRD" = "yes"; then
+ FIREBIRD_INCDIR=/opt/firebird/include
+ FIREBIRD_LIBDIR=/opt/firebird/lib
+ else
+ FIREBIRD_INCDIR=$PHP_PDO_FIREBIRD/include
+ FIREBIRD_LIBDIR=$PHP_PDO_FIREBIRD/lib
+ fi
+
+ PHP_CHECK_LIBRARY(gds, isc_detach_database,
+ [
+ FIREBIRD_LIBNAME=gds
+ ], [
+ PHP_CHECK_LIBRARY(fbclient, isc_detach_database,
+ [
+ FIREBIRD_LIBNAME=fbclient
+ ], [
+ AC_MSG_ERROR([libgds or libfbclient not found! Check config.log for more information.])
+ ], [
+ -L$FIREBIRD_LIBDIR
+ ])
+ ], [
+ -L$FIREBIRD_LIBDIR
+ ])
+
+ PHP_ADD_LIBRARY_WITH_PATH($FIREBIRD_LIBNAME, $FIREBIRD_LIBDIR, PDO_FIREBIRD_SHARED_LIBADD)
+ PHP_ADD_INCLUDE($FIREBIRD_INCDIR)
+ AC_DEFINE(HAVE_PDO_FIREBIRD,1,[ ])
+ PHP_NEW_EXTENSION(pdo_firebird, pdo_firebird.c firebird_driver.c firebird_statement.c, $ext_shared)
+ PHP_SUBST(PDO_FIREBIRD_SHARED_LIBADD)
+fi
diff --git a/ext/pdo_firebird/config.w32 b/ext/pdo_firebird/config.w32
new file mode 100644
index 0000000000..160689d2df
--- /dev/null
+++ b/ext/pdo_firebird/config.w32
@@ -0,0 +1,15 @@
+// $Id$
+// vim:ft=javascript
+
+ARG_WITH("pdo-firebird", "Firebird support for PDO", "no");
+
+if (PHP_PDO_FIREBIRD != "no") {
+ if (CHECK_LIB("fbclient_ms.lib", "pdo_firebird", PHP_PDO_FIREBIRD) &&
+ CHECK_HEADER_ADD_INCLUDE("ibase.h", "CFLAGS_PDO_FIREBIRD", PHP_PHP_BUILD + "\\include\\firebird;" + PHP_PDO_FIREBIRD)) {
+ EXTENSION("pdo_firebird", "pdo_firebird.c firebird_driver.c firebird_statement.c");
+ ADD_FLAG('CFLAGS_PDO_FIREBIRD', "/I ..\\pecl");
+ } else {
+ WARNING("pdo_firebird not enabled; libraries and headers not found");
+ }
+ ADD_EXTENSION_DEP('pdo_firebird', 'pdo');
+}
diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c
new file mode 100644
index 0000000000..4215b34a4c
--- /dev/null
+++ b/ext/pdo_firebird/firebird_driver.c
@@ -0,0 +1,309 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2004 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Ard Biesheuvel <abies@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "pdo/php_pdo.h"
+#include "pdo/php_pdo_driver.h"
+#include "php_pdo_firebird.h"
+#include "php_pdo_firebird_int.h"
+
+static int pdo_firebird_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info TSRMLS_DC)
+{
+ pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
+ ISC_STATUS *s = H->isc_status;
+ char buf[128];
+
+ add_next_index_long(info, isc_sqlcode(s));
+
+ while (isc_interprete(buf,&s)) {
+ add_next_index_string(info, buf, 1);
+ }
+
+ return 1;
+}
+
+static int firebird_handle_closer(pdo_dbh_t *dbh TSRMLS_DC) /* {{{ */
+{
+ pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
+
+ if (dbh->in_txn) {
+ if (dbh->auto_commit) {
+ if (isc_commit_transaction(H->isc_status, &H->tr)) {
+ /* error */
+ }
+ } else {
+ if (isc_rollback_transaction(H->isc_status, &H->tr)) {
+ /* error */
+ }
+ }
+ }
+
+ if (isc_detach_database(H->isc_status, &H->db)) {
+ /* error */
+ }
+
+ pefree(H, dbh->is_persistent);
+
+ return 0;
+}
+/* }}} */
+
+static int firebird_handle_preparer(pdo_dbh_t *dbh, const char *sql, long sql_len, pdo_stmt_t *stmt,
+ long options, zval *driver_options TSRMLS_DC)
+{
+ pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
+ pdo_firebird_stmt *S = NULL;
+
+ do {
+ isc_stmt_handle s = NULL;
+ XSQLDA num_sqlda;
+
+ num_sqlda.version = PDO_FB_SQLDA_VERSION;
+ num_sqlda.sqln = 1;
+
+ /* prepare the statement */
+ if (isc_dsql_prepare(H->isc_status, &H->tr, &s, (short)sql_len, /* sigh */ (char*) sql,
+ PDO_FB_DIALECT, &num_sqlda)) {
+ /* error */
+ break;
+ }
+
+ /* allocate a statement handle of the right size */
+ S = ecalloc(1, sizeof(*S)-sizeof(XSQLDA) + XSQLDA_LENGTH(num_sqlda.sqld));
+ S->H = H;
+ S->stmt = s;
+
+ if (isc_dsql_describe(H->isc_status, &s, PDO_FB_SQLDA_VERSION, S->out_sqlda)) {
+ /* error */
+ break;
+ }
+
+ /* TODO what about input params */
+
+ stmt->driver_data = S;
+ stmt->methods = &firebird_stmt_methods;
+
+ return 1;
+
+ } while (0);
+
+ if (S) {
+ efree(S);
+ }
+
+ return 0;
+}
+
+static long firebird_handle_doer(pdo_dbh_t *dbh, const char *sql, long sql_len TSRMLS_DC)
+{
+ pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
+ isc_stmt_handle stmt = NULL;
+ static char info_count[] = { isc_info_sql_records };
+ char result[64];
+ int ret = 0;
+
+ if (dbh->auto_commit && !dbh->in_txn) {
+ if (isc_start_transaction(H->isc_status, &H->tr, 1, &H->db, 0, NULL)) {
+ /* error */
+ return -1;
+ }
+ dbh->in_txn = 1;
+ }
+
+ /* prepare */
+ if (isc_dsql_prepare(H->isc_status, &H->tr, &stmt, 0, (char*) sql, PDO_FB_DIALECT, NULL)) {
+ /* error */
+ return -1;
+ }
+
+ /* execute */
+ if (isc_dsql_execute2(H->isc_status, &H->tr, &stmt, PDO_FB_SQLDA_VERSION, NULL, NULL)) {
+ /* error */
+ return -1;
+ }
+
+ /* return the number of affected rows */
+ if (isc_dsql_sql_info(H->isc_status, &stmt, sizeof(info_count), info_count, sizeof(result),
+ result)) {
+ /* error */
+ return -1;
+ }
+
+ if (result[0] == isc_info_sql_records) {
+ unsigned i = 3, result_size = isc_vax_integer(&result[1],2);
+
+ while (result[i] != isc_info_end && i < result_size) {
+ short len = (short)isc_vax_integer(&result[i+1],2);
+ if (result[i] != isc_info_req_select_count) {
+ ret += isc_vax_integer(&result[i+3],len);
+ }
+ i += len+3;
+ }
+ }
+
+ /* commit? */
+ if (dbh->auto_commit && isc_commit_retaining(H->isc_status, &H->tr)) {
+ /* error */
+ }
+
+ return ret;
+}
+
+static int firebird_handle_commit(pdo_dbh_t *dbh TSRMLS_DC)
+{
+ pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
+
+ if (isc_commit_transaction(H->isc_status, &H->tr)) {
+ /* error */
+ return 0;
+ }
+ return 1;
+}
+
+static int firebird_handle_rollback(pdo_dbh_t *dbh TSRMLS_DC)
+{
+ pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
+
+ if (isc_rollback_transaction(H->isc_status, &H->tr)) {
+ /* error */
+ return 0;
+ }
+ return 1;
+}
+
+static int firebird_handle_set_attribute(pdo_dbh_t *dbh, long attr, zval *val TSRMLS_DC)
+{
+ pdo_firebird_db_handle *H = (pdo_firebird_db_handle *)dbh->driver_data;
+
+ switch (attr) {
+
+ case PDO_ATTR_AUTOCOMMIT:
+
+ if (dbh->in_txn) {
+ /* Assume they want to commit whatever is outstanding */
+ if (isc_commit_retaining(H->isc_status, &H->tr)) {
+ /* error */
+ return 0;
+ }
+ dbh->in_txn = 0;
+ }
+
+ convert_to_long(val);
+
+ dbh->auto_commit = Z_LVAL_P(val);
+
+ return 1;
+
+ default:
+
+ return 0;
+ }
+}
+
+static struct pdo_dbh_methods firebird_methods = {
+ firebird_handle_closer,
+ firebird_handle_preparer,
+ firebird_handle_doer,
+ NULL,
+ NULL,
+ firebird_handle_commit,
+ firebird_handle_rollback,
+ firebird_handle_set_attribute,
+ NULL,
+ pdo_firebird_fetch_error_func,
+};
+
+static int pdo_firebird_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_DC) /* {{{ */
+{
+ struct pdo_data_src_parser vars[] = {
+ { "dbname", NULL, 0 },
+ { "charset", NULL, 0 },
+ { "role", NULL, 0 }
+ };
+ int i, ret = 0;
+ pdo_firebird_db_handle *H = dbh->driver_data = pecalloc(1,sizeof(*H),dbh->is_persistent);
+
+ php_pdo_parse_data_source(dbh->data_source, dbh->data_source_len, vars, 2);
+
+ do {
+ static char const dpb_flags[] = {
+ isc_dpb_user_name, isc_dpb_password, isc_dpb_lc_ctype, isc_dpb_sql_role_name };
+ char const *dpb_values[] = { dbh->username, dbh->password, vars[1].optval, vars[2].optval };
+ char dpb_buffer[256] = { isc_dpb_version1 }, *dpb;
+ short len;
+
+ dpb = dpb_buffer + 1;
+
+ /* loop through all the provided arguments and set dpb fields accordingly */
+ for (i = 0; i < sizeof(dpb_flags); ++i) {
+ if (dpb_values[i]) {
+ dpb += sprintf(dpb, "%c%c%s", dpb_flags[i], (unsigned char)strlen(dpb_values[i]),
+ dpb_values[i]);
+ }
+ }
+
+ /* fire it up baby! */
+ if (isc_attach_database(H->isc_status, 0, vars[0].optval, &H->db,(short)(dpb-dpb_buffer),
+ dpb_buffer)) {
+ break;
+ }
+
+ dbh->methods = &firebird_methods;
+ dbh->alloc_own_columns = 0;
+ dbh->supports_placeholders = PDO_PLACEHOLDER_POSITIONAL;
+ dbh->native_case = PDO_CASE_UPPER;
+
+ ret = 1;
+
+ } while (0);
+
+ for (i = 0; i < sizeof(vars)/sizeof(vars[0]); ++i) {
+ if (vars[i].freeme) {
+ efree(vars[i].optval);
+ }
+ }
+
+ if (!ret) {
+ firebird_handle_closer(dbh TSRMLS_CC);
+ }
+
+ return ret;
+}
+/* }}} */
+
+pdo_driver_t pdo_firebird_driver = {
+ PDO_DRIVER_HEADER(firebird),
+ pdo_firebird_handle_factory
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/pdo_firebird/firebird_statement.c b/ext/pdo_firebird/firebird_statement.c
new file mode 100644
index 0000000000..dc1f648799
--- /dev/null
+++ b/ext/pdo_firebird/firebird_statement.c
@@ -0,0 +1,48 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2004 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Ard Biesheuvel <abies@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "pdo/php_pdo.h"
+#include "pdo/php_pdo_driver.h"
+
+struct pdo_stmt_methods firebird_stmt_methods = {0,0,0,0,0,0};
+/*
+ firebird_stmt_dtor,
+ firebird_stmt_execute,
+ firebird_stmt_fetch,
+ firebird_stmt_describe,
+ firebird_stmt_get_col,
+ firebird_stmt_param_hook
+};
+*/
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/pdo_firebird/package.xml b/ext/pdo_firebird/package.xml
new file mode 100644
index 0000000000..99b689db24
--- /dev/null
+++ b/ext/pdo_firebird/package.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE package SYSTEM "../pear/package.dtd">
+<package version="1.0">
+ <name>PDO_Firebird</name>
+ <summary>Firebird/InterBase support for PDO</summary>
+ <maintainers>
+ <maintainer>
+ <user>abies</user>
+ <name>Ard Biesheuvel</name>
+ <email>abies@php.net</email>
+ <role>lead</role>
+ </maintainer>
+ </maintainers>
+ <configureoptions>
+ <configureoption name="with-pdo-firebird" prompt="dir"/>
+</configureoptions>
+ <description>
+ This extension provides a Firebird/InterBase driver for PDO. It supports
+ InterBase versions 6.x/7.x and Firebird 1.x.
+ </description>
+ <license>PHP</license>
+ <release>
+ <state>pre-alpha</state>
+ <version>0.1</version>
+ <date>2004-06-11</date>
+
+ <notes>
+ To compile and run this module, you will need to have the main PDO module and Firebird's
+ client library installed on your system.
+ </notes>
+
+ <filelist>
+ <file role="src" name="config.m4"/>
+ <file role="src" name="config.w32"/>
+ <file role="src" name="firebird_driver.c"/>
+ <file role="src" name="firebird_statement.c"/>
+ <file role="src" name="pdo_firebird.c"/>
+ <file role="src" name="php_pdo_firebird.h"/>
+ <file role="src" name="php_pdo_firebird_int.h"/>
+
+ <file role="doc" name="CREDITS"/>
+ </filelist>
+ <deps>
+ <dep type="php" rel="ge" version="5.0.0RC3"/>
+ <dep type="ext" rel="ge" name="pdo" version="0.1"/>
+ </deps>
+ </release>
+</package>
diff --git a/ext/pdo_firebird/pdo_firebird.c b/ext/pdo_firebird/pdo_firebird.c
new file mode 100644
index 0000000000..bdb946f108
--- /dev/null
+++ b/ext/pdo_firebird/pdo_firebird.c
@@ -0,0 +1,95 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2004 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Ard Biesheuvel <abies@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "pdo/php_pdo.h"
+#include "pdo/php_pdo_driver.h"
+#include "php_pdo_firebird.h"
+#include "php_pdo_firebird_int.h"
+
+/* {{{ pdo_firebird_functions[] */
+function_entry pdo_firebird_functions[] = {
+ {NULL, NULL, NULL}
+};
+/* }}} */
+
+/* {{{ pdo_firebird_module_entry */
+zend_module_entry pdo_firebird_module_entry = {
+ STANDARD_MODULE_HEADER,
+ "PDO_Firebird",
+ pdo_firebird_functions,
+ PHP_MINIT(pdo_firebird),
+ PHP_MSHUTDOWN(pdo_firebird),
+ NULL,
+ NULL,
+ PHP_MINFO(pdo_firebird),
+ "0.1",
+ STANDARD_MODULE_PROPERTIES
+};
+/* }}} */
+
+#ifdef COMPILE_DL_PDO_FIREBIRD
+ZEND_GET_MODULE(pdo_firebird)
+#endif
+
+/* {{{ PHP_MINIT_FUNCTION
+ */
+PHP_MINIT_FUNCTION(pdo_firebird)
+{
+ php_pdo_register_driver(&pdo_firebird_driver);
+
+ return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MSHUTDOWN_FUNCTION
+ */
+PHP_MSHUTDOWN_FUNCTION(pdo_firebird)
+{
+ php_pdo_unregister_driver(&pdo_firebird_driver);
+
+ return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MINFO_FUNCTION
+ */
+PHP_MINFO_FUNCTION(pdo_firebird)
+{
+ php_info_print_table_start();
+ php_info_print_table_header(2, "PDO Driver for Firebird/InterBase", "enabled");
+ php_info_print_table_end();
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/pdo_firebird/php_pdo_firebird.h b/ext/pdo_firebird/php_pdo_firebird.h
new file mode 100644
index 0000000000..9eb913dd59
--- /dev/null
+++ b/ext/pdo_firebird/php_pdo_firebird.h
@@ -0,0 +1,52 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2004 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Ard Biesheuvel <abies@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_PDO_FIREBIRD_H
+#define PHP_PDO_FIREBIRD_H
+
+extern zend_module_entry pdo_firebird_module_entry;
+#define phpext_pdo_firebird_ptr &pdo_firebird_module_entry
+
+#ifdef PHP_WIN32
+#define PHP_PDO_FB_API __declspec(dllexport)
+#else
+#define PHP_PDO_FB_API
+#endif
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
+PHP_MINIT_FUNCTION(pdo_firebird);
+PHP_MSHUTDOWN_FUNCTION(pdo_firebird);
+PHP_RINIT_FUNCTION(pdo_firebird);
+PHP_RSHUTDOWN_FUNCTION(pdo_firebird);
+PHP_MINFO_FUNCTION(pdo_firebird);
+
+#endif /* PHP_PDO_FIREBIRD_H */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/pdo_firebird/php_pdo_firebird_int.h b/ext/pdo_firebird/php_pdo_firebird_int.h
new file mode 100644
index 0000000000..da602e49f1
--- /dev/null
+++ b/ext/pdo_firebird/php_pdo_firebird_int.h
@@ -0,0 +1,83 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2004 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Ard Biesheuvel <abies@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_PDO_FIREBIRD_INT_H
+#define PHP_PDO_FIREBIRD_INT_H
+
+#include <ibase.h>
+
+#ifdef SQLDA_VERSION
+#define PDO_FB_SQLDA_VERSION SQLDA_VERSION
+#else
+#define PDO_FB_SQLDA_VERSION 1
+#endif
+
+#define PDO_FB_DIALECT 3
+
+
+typedef struct {
+ const char *file;
+ int line;
+ long errcode;
+ char *errmsg;
+} pdo_firebird_error_info;
+
+
+typedef struct {
+
+ /* the result of the last API call */
+ ISC_STATUS isc_status[20];
+
+ /* the connection handle */
+ isc_db_handle db;
+
+ /* the transaction handle */
+ isc_tr_handle tr;
+
+} pdo_firebird_db_handle;
+
+
+typedef struct {
+
+ /* the link that owns this statement */
+ pdo_firebird_db_handle *H;
+
+ /* the statement handle */
+ isc_stmt_handle stmt;
+
+ /* the output SQLDA */
+ XSQLDA out_sqlda[1]; /* last member */
+
+} pdo_firebird_stmt;
+
+extern pdo_driver_t pdo_firebird_driver;
+
+extern struct pdo_stmt_methods firebird_stmt_methods;
+
+#endif /* PHP_PDO_FIREBIRD_INT_H */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/pdo_firebird/tests/connect.phpt b/ext/pdo_firebird/tests/connect.phpt
new file mode 100644
index 0000000000..e4bb8ef54e
--- /dev/null
+++ b/ext/pdo_firebird/tests/connect.phpt
@@ -0,0 +1,16 @@
+--TEST--
+PDO_Firebird: connect/disconnect
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php /* $Id$ */
+
+ require("testdb.inc");
+
+ $db = new PDO("firebird:dbname=$test_base",$user,$password) or die;
+ unset($db);
+ echo "done\n";
+
+?>
+--EXPECT--
+done
diff --git a/ext/pdo_firebird/tests/skipif.inc b/ext/pdo_firebird/tests/skipif.inc
new file mode 100644
index 0000000000..5a6cd372d1
--- /dev/null
+++ b/ext/pdo_firebird/tests/skipif.inc
@@ -0,0 +1,5 @@
+<?php /* $Id$ */
+
+if (!extension_loaded("interbase") || !extension_loaded("pdo_firebird")) print "skip";
+
+?>
diff --git a/ext/pdo_firebird/tests/testdb.inc b/ext/pdo_firebird/tests/testdb.inc
new file mode 100644
index 0000000000..f6951a7b13
--- /dev/null
+++ b/ext/pdo_firebird/tests/testdb.inc
@@ -0,0 +1,34 @@
+<?php /* $Id$ */
+
+$user = 'SYSDBA';
+$password = 'masterkey';
+ini_set('ibase.default_user',$user);
+ini_set('ibase.default_password',$password);
+
+/* we need just the generated name, not the file itself */
+unlink($test_base = tempnam('/tmp',"php_ibase_test"));
+
+function init_db()
+{
+ global $test_base, $user, $password;
+
+ $test_db = ibase_query(IBASE_CREATE,sprintf("CREATE DATABASE '%s' USER '%s' PASSWORD '%s'",
+ $test_base, $user, $password));
+ $tr = ibase_trans($test_db);
+ ibase_query($tr,"create table test1 (i integer, c varchar(100))");
+ ibase_commit_ret($tr);
+ ibase_query($tr,"insert into test1(i, c) values(1, 'test table not created with isql')");
+ ibase_commit($tr);
+ ibase_close($test_db);
+}
+
+function cleanup_db()
+{
+ global $test_base;
+
+ $r = ibase_connect($test_base);
+ ibase_drop_db($r);
+}
+
+register_shutdown_function('cleanup_db');
+init_db();