Hey,

if anyone has access to a Birdstep server (velocis) can you QA this? I'm
waiting on seeing if the Birdstep company will send me a copy of their
product - however it's just name changes..

James

-----Original Message-----
From: James Cox [mailto:[EMAIL PROTECTED]]
Sent: Monday, March 04, 2002 9:11 AM
To: [EMAIL PROTECTED]
Subject: [PHP-CVS] cvs: php4 /ext/odbc birdstep.c config.m4
php_birstep.h php_odbc.c php_odbc.h php_velocis.h setup.stub velocis.c
/main build-defs.h.in


imajes          Mon Mar  4 04:10:33 2002 EDT

  Added files:
    /php4/ext/odbc      birdstep.c php_birstep.h

  Removed files:
    /php4/ext/odbc      php_velocis.h velocis.c

  Modified files:
    /php4/ext/odbc      config.m4 php_odbc.c php_odbc.h setup.stub
    /php4/main  build-defs.h.in
  Log:
  Changing the Velocis extension to now be called Birdstep, due to a
product/company change.
  added aliases for Velocis to the birdstep functions.
  # testing is both advised and encouraged!
  @ The Velocis extension is no




Index: php4/ext/odbc/config.m4
diff -u php4/ext/odbc/config.m4:1.48 php4/ext/odbc/config.m4:1.49
--- php4/ext/odbc/config.m4:1.48        Wed Feb  6 14:10:35 2002
+++ php4/ext/odbc/config.m4     Mon Mar  4 04:10:31 2002
@@ -1,5 +1,5 @@
 dnl
-dnl $Id: config.m4,v 1.48 2002/02/06 19:10:35 derick Exp $
+dnl $Id: config.m4,v 1.49 2002/03/04 09:10:31 imajes Exp $
 dnl
 
 dnl
@@ -290,26 +290,26 @@
 fi
 
 if test -z "$ODBC_TYPE"; then
-AC_MSG_CHECKING(for Velocis support)
-AC_ARG_WITH(velocis,
-[  --with-velocis[=DIR]    Include Velocis support.  DIR is the Velocis base
-                          install directory, defaults to /usr/local/velocis.],
+AC_MSG_CHECKING(for Birdstep support)
+AC_ARG_WITH(birdstep,
+[  --with-birdstep[=DIR]    Include Birdstep support.  DIR is the Birdstep base
+                          install directory, defaults to /usr/local/birdstep.],
 [
   PHP_WITH_SHARED
 
   if test "$withval" != "no"; then
     if test "$withval" = "yes"; then
-        ODBC_INCDIR=/usr/local/velocis/include
-        ODBC_LIBDIR=/usr/local/velocis/lib
+        ODBC_INCDIR=/usr/local/birdstep/include
+        ODBC_LIBDIR=/usr/local/birdstep/lib
     else
         ODBC_INCDIR=$withval/include
         ODBC_LIBDIR=$withval/lib
     fi
     ODBC_INCLUDE=-I$ODBC_INCDIR
-    ODBC_TYPE=velocis
+    ODBC_TYPE=birdstep
     ODBC_LFLAGS=-L$ODBC_LIBDIR
     ODBC_LIBS="-lCadm -lCdict -lCenc -lCrdm -lCrpc -lCrdbc -lCrm -lCuapi -lutil"
-    AC_DEFINE(HAVE_VELOCIS,1,[ ])
+    AC_DEFINE(HAVE_BIRDSTEP,1,[ ])
 
     AC_MSG_RESULT(yes)
   else
Index: php4/ext/odbc/php_odbc.c
diff -u php4/ext/odbc/php_odbc.c:1.118 php4/ext/odbc/php_odbc.c:1.119
--- php4/ext/odbc/php_odbc.c:1.118      Thu Feb 28 03:26:29 2002
+++ php4/ext/odbc/php_odbc.c    Mon Mar  4 04:10:31 2002
@@ -15,12 +15,12 @@
    | Authors: Stig Sæther Bakken <[EMAIL PROTECTED]>                            |
    |          Andreas Karajannis <[EMAIL PROTECTED]>              |
    |          Frank M. Kromann <[EMAIL PROTECTED]> Support for DB/2 CLI |
-   |          Kevin N. Shallow <[EMAIL PROTECTED]> Velocis Support |
+   |          Kevin N. Shallow <[EMAIL PROTECTED]> Birdstep Support |
    |          Daniel R. Kalowsky <[EMAIL PROTECTED]>                       |
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_odbc.c,v 1.118 2002/02/28 08:26:29 sebastian Exp $ */
+/* $Id: php_odbc.c,v 1.119 2002/03/04 09:10:31 imajes Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -113,14 +113,14 @@
        PHP_FE(odbc_columns, NULL)
        PHP_FE(odbc_gettypeinfo, NULL)
        PHP_FE(odbc_primarykeys, NULL)
-#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) 
&&!defined(HAVE_SOLID_35) && !defined(HAVE_VELOCIS)    /* not supported now */
+#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) 
+&&!defined(HAVE_SOLID_35) && !defined(HAVE_BIRDSTEP)    /* not supported now */
        PHP_FE(odbc_columnprivileges, NULL)
        PHP_FE(odbc_tableprivileges, NULL)
 #endif
 #if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35) /* not 
supported */
        PHP_FE(odbc_foreignkeys, NULL)
        PHP_FE(odbc_procedures, NULL)
-#if !defined(HAVE_VELOCIS)
+#if !defined(HAVE_BIRDSTEP)
        PHP_FE(odbc_procedurecolumns, NULL)
 #endif
 #endif
@@ -2800,7 +2800,7 @@
 }
 /* }}} */
 
-#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && 
!defined(HAVE_SOLID_35) && !defined(HAVE_VELOCIS)
+#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && 
+!defined(HAVE_SOLID_35) && !defined(HAVE_BIRDSTEP)
 /* {{{ proto int odbc_columnprivileges(int connection_id, string catalog, string 
schema, string table, string column)
    Returns a result identifier that can be used to fetch a list of columns and 
associated privileges for the specified table */
 PHP_FUNCTION(odbc_columnprivileges)
@@ -3127,7 +3127,7 @@
 }
 /* }}} */
 
-#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35) && 
!defined(HAVE_VELOCIS)
+#if !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && !defined(HAVE_SOLID_35) && 
+!defined(HAVE_BIRDSTEP)
 /* {{{ proto int odbc_procedurecolumns(int connection_id [, string qualifier, string 
owner, string proc, string column])
    Returns a result identifier containing the list of input and output parameters, as 
well as the columns that make up the result set for the specified procedures */
 PHP_FUNCTION(odbc_procedurecolumns)
@@ -3464,7 +3464,7 @@
 }
 /* }}} */
 
-#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && 
!defined(HAVE_SOLID_35) && !defined(HAVE_VELOCIS)
+#if !defined(HAVE_DBMAKER) && !defined(HAVE_SOLID) && !defined(HAVE_SOLID_30) && 
+!defined(HAVE_SOLID_35) && !defined(HAVE_BIRDSTEP)
 /* {{{ proto int odbc_tableprivileges(int connection_id, string qualifier, string 
owner, string name)
    Returns a result identifier containing a list of tables and the privileges 
associated with each table */
 PHP_FUNCTION(odbc_tableprivileges)
Index: php4/ext/odbc/php_odbc.h
diff -u php4/ext/odbc/php_odbc.h:1.44 php4/ext/odbc/php_odbc.h:1.45
--- php4/ext/odbc/php_odbc.h:1.44       Thu Feb 28 03:26:30 2002
+++ php4/ext/odbc/php_odbc.h    Mon Mar  4 04:10:31 2002
@@ -14,11 +14,11 @@
    +----------------------------------------------------------------------+
    | Authors: Stig Sæther Bakken <[EMAIL PROTECTED]>                            |
    |          Andreas Karajannis <[EMAIL PROTECTED]>              |
-   |           Kevin N. Shallow <[EMAIL PROTECTED]> Velocis Support |
+   |           Kevin N. Shallow <[EMAIL PROTECTED]> Birdstep Support |
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_odbc.h,v 1.44 2002/02/28 08:26:30 sebastian Exp $ */
+/* $Id: php_odbc.h,v 1.45 2002/03/04 09:10:31 imajes Exp $ */
 
 #ifndef PHP_ODBC_H
 #define PHP_ODBC_H
@@ -139,12 +139,12 @@
 #define SQLSMALLINT SWORD
 #define SQLUSMALLINT UWORD
 
-#elif defined(HAVE_VELOCIS) /* Raima Velocis */
+#elif defined(HAVE_BIRDSTEP) /* Raima Birdstep */
 
-#define ODBC_TYPE "Velocis"
+#define ODBC_TYPE "Birdstep"
 #define UNIX
 /*
- * Extended Fetch in the Velocis ODBC API is incapable of returning long varchar 
(memo) fields.
+ * Extended Fetch in the Birdstep ODBC API is incapable of returning long varchar 
+(memo) fields.
  * So the following line has been commented-out to accomadate. - KNS
  *
  * #define HAVE_SQL_EXTENDED_FETCH 1
Index: php4/ext/odbc/setup.stub
diff -u php4/ext/odbc/setup.stub:1.6 php4/ext/odbc/setup.stub:1.7
--- php4/ext/odbc/setup.stub:1.6        Wed May  9 11:35:31 2001
+++ php4/ext/odbc/setup.stub    Mon Mar  4 04:10:32 2002
@@ -1,4 +1,4 @@
-# $Id: setup.stub,v 1.6 2001/05/09 15:35:31 zhang Exp $ -*- sh -*-
+# $Id: setup.stub,v 1.7 2002/03/04 09:10:32 imajes Exp $ -*- sh -*-
 
 # Solid
 define_option with-solid 'Solid support?' yesnodir \
@@ -89,7 +89,7 @@
     More info about Adabas D can be found at http://www.adabas.com/.;'
 fi
 
-# Velocis
+# Birdstep
 if test "$option_value_with_solid" = "no" -a \
         "$option_value_with_empress" = "no" -a \
         "$option_value_with_iodbc" = "no" -a \
@@ -97,10 +97,10 @@
         "$option_value_with_esoob" = "no" -a \
         "$option_value_with_openlink" = "no" -a \
         "$option_value_with_adabas" = "no"; then
-define_option with-velocis 'Velocis support?' yesnodir \
-    'no /usr/local/velocis Velocis install' \
-'     Whether to build PHP with Velocis support.\n
-     More information about Velocis can be found at http://www.raima.com/.;'
+define_option with-birdstep 'Birdstep support?' yesnodir \
+    'no /usr/local/birdstep Birdstep install' \
+'     Whether to build PHP with Birdstep support.\n
+     More information about Birdstep can be found at http://www.birdstep.com/.;'
 fi
 
 # DBMaker
@@ -111,7 +111,7 @@
         "$option_value_with_esoob" = "no" -a \
         "$option_value_with_openlink" = "no" -a \
         "$option_value_with_adabas" = "no" -a \
-        "$option_value_with_velocis" = "no"; then
+        "$option_value_with_birdstep" = "no"; then
 define_option with-dbmaker 'DBMaker support?' yesnodir \
     'no /home/dbmaker DBMaker install' \
 '    Whether to build PHP with DBMaker support. \n
@@ -126,7 +126,7 @@
         "$option_value_with_esoob" = "no" -a \
         "$option_value_with_openlink" = "no" -a \
         "$option_value_with_adabas" = "no" -a \
-        "$option_value_with_velocis" = "no" -a \
+        "$option_value_with_birdstep" = "no" -a \
         "$option_value_with_dbmaker" = "no"; then
 define_option with-sapdb 'SAP DB support?' yesnodir \
     'no /usr/local SAP DB install' \
@@ -142,7 +142,7 @@
         "$option_value_with_esoob" = "no" -a \
         "$option_value_with_openlink" = "no" -a \
         "$option_value_with_adabas" = "no" -a \
-        "$option_value_with_velocis" = "no" -a \
+        "$option_value_with_birdstep" = "no" -a \
         "$option_value_with_dbmaker" = "no" -a \
         "$option_value_with_sapdb" = "no"; then
 define_option with-custom-odbc 'custom ODBC support?' yesnodir \
Index: php4/main/build-defs.h.in
diff -u php4/main/build-defs.h.in:1.8 php4/main/build-defs.h.in:1.9
--- php4/main/build-defs.h.in:1.8       Thu Feb 28 03:27:03 2002
+++ php4/main/build-defs.h.in   Mon Mar  4 04:10:32 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: build-defs.h.in,v 1.8 2002/02/28 08:27:03 sebastian Exp $ */
+/* $Id: build-defs.h.in,v 1.9 2002/03/04 09:10:32 imajes Exp $ */
 
 #define CONFIGURE_COMMAND "@CONFIGURE_COMMAND@"
 #define PHP_ADA_INCLUDE                ""
@@ -75,8 +75,8 @@
 #define PHP_LDAP_LFLAGS                ""
 #define PHP_LDAP_INCLUDE       ""
 #define PHP_LDAP_LIBS          ""
-#define PHP_VELOCIS_INCLUDE     ""
-#define PHP_VELOCIS_LIBS        ""
+#define PHP_BIRDSTEP_INCLUDE     ""
+#define PHP_BIRDSTEP_LIBS        ""
 #define PEAR_INSTALLDIR         "@EXPANDED_PEAR_INSTALLDIR@"
 #define PHP_INCLUDE_PATH       "@INCLUDE_PATH@"
 #define PHP_EXTENSION_DIR       "@EXPANDED_EXTENSION_DIR@"

Index: php4/ext/odbc/birdstep.c
+++ php4/ext/odbc/birdstep.c
/*
   +----------------------------------------------------------------------+
   | PHP Version 4                                                        |
   +----------------------------------------------------------------------+
   | Copyright (c) 1997-2002 The PHP Group                                |
   +----------------------------------------------------------------------+
   | This source file is subject to version 2.02 of the PHP license,      |
   | that is bundled with this package in the file LICENSE, and is        |
   | available at through the world-wide-web at                           |
   | http://www.php.net/license/2_02.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          |
   | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
   | Authors: Nikolay P. Romanyuk <[EMAIL PROTECTED]>                         |
   +----------------------------------------------------------------------+
 */

/* $Id: birdstep.c,v 1.1 2002/03/04 09:10:31 imajes Exp $ */

/*
 * TODO:
 * birdstep_fetch_into(),
 * Check all on real life apps.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"

#if WIN32
# include "config.w32.h"
# include "win95nt.h"
# ifdef PHP_EXPORTS
#  define PHPAPI __declspec(dllexport) 
# else
#  define PHPAPI __declspec(dllimport) 
# endif
#else
# include "php_config.h"
# define PHPAPI
# define THREAD_LS
#endif

#ifdef HAVE_BIRDSTEP
#include "php_birdstep.h"
#include "ext/standard/info.h"

function_entry birdstep_functions[] = {
        PHP_FE(birdstep_connect,                                                       
         NULL)
        PHP_FE(birdstep_close,                                                         
 NULL)
        PHP_FE(birdstep_exec,                                                          
 NULL)
        PHP_FE(birdstep_fetch,                                                         
 NULL)
        PHP_FE(birdstep_result,                                                        
 NULL)
        PHP_FE(birdstep_freeresult,                                                    
 NULL)
        PHP_FE(birdstep_autocommit,                                                    
 NULL)
        PHP_FE(birdstep_off_autocommit,                                         NULL)
        PHP_FE(birdstep_commit,                                                        
 NULL)
        PHP_FE(birdstep_rollback,                                                      
 NULL)
        PHP_FE(birdstep_fieldnum,                                                      
 NULL)
        PHP_FE(birdstep_fieldname,                                                     
 NULL)
        PHP_FALIAS(velocis_connect,      birdstep_connect,      NULL)
        PHP_FALIAS(velocis_close,       birdstep_close, NULL)
        PHP_FALIAS(velocis_exec,        birdstep_exec,  NULL)
        PHP_FALIAS(velocis_fetch,       birdstep_fetch, NULL)
        PHP_FALIAS(velocis_result,      birdstep_result,        NULL)
        PHP_FALIAS(velocis_freeresult,  birdstep_freeresult,    NULL)
        PHP_FALIAS(velocis_autocommit,  birdstep_autocommit,    NULL)
        PHP_FALIAS(velocis_off_autocommit,      birdstep_off_autocommit,        NULL)
        PHP_FALIAS(velocis_commit,      birdstep_commit,        NULL)
        PHP_FALIAS(velocis_rollback,    birdstep_rollback,      NULL)
        PHP_FALIAS(velocis_fieldnum,    birdstep_fieldnum,      NULL)
        PHP_FALIAS(velocis_fieldname,   birdstep_fieldname,     NULL)
        {NULL, NULL, NULL}
};

zend_module_entry birdstep_module_entry = {
        STANDARD_MODULE_HEADER,
        "birdstep", birdstep_functions, PHP_MINIT(birdstep), PHP_MSHUTDOWN(birdstep),
                PHP_RINIT(birdstep), NULL, PHP_MINFO(birdstep), NO_VERSION_YET,
        STANDARD_MODULE_PROPERTIES
};


#ifdef COMPILE_DL_ODBC
ZEND_GET_MODULE(birdstep)
#endif

THREAD_LS birdstep_module php_birdstep_module;
THREAD_LS static HENV henv;

static void _close_birdstep_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
        VConn *conn = (VConn *)rsrc->ptr;

        if ( conn ) {
                efree(conn);
        }
}

static void _free_birdstep_result(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
        Vresult *res = (Vresult *)rsrc->ptr;

        if ( res && res->values ) {
                register int i;
                for ( i=0; i < res->numcols; i++ ) {
                        if ( res->values[i].value )
                               efree(res->values[i].value);
                }
                efree(res->values);
        }
        if ( res ) {
                efree(res);
        }
}

PHP_MINIT_FUNCTION(birdstep)
{
        SQLAllocEnv(&henv);

        if ( cfg_get_long("birdstep.max_links",&php_birdstep_module.max_links) == 
FAILURE ) {
                php_birdstep_module.max_links = -1;
        }
        php_birdstep_module.num_links = 0;
        php_birdstep_module.le_link   = 
zend_register_list_destructors_ex(_close_birdstep_link, NULL, "birdstep link", 
module_number);
        php_birdstep_module.le_result = 
zend_register_list_destructors_ex(_free_birdstep_result, NULL, "birdstep result", 
module_number);

        return SUCCESS;
}

PHP_RINIT_FUNCTION(birdstep)
{
        return SUCCESS;
}


PHP_MINFO_FUNCTION(birdstep)
{
        php_info_print_table_start();
        php_info_print_table_row(2, "RAIMA Birdstep Support", "enabled" );
        php_info_print_table_end();
}

PHP_MSHUTDOWN_FUNCTION(birdstep)
{
        SQLFreeEnv(henv);
        return SUCCESS;
}

/* Some internal functions. Connections and result manupulate */

static int
birdstep_add_conn(HashTable *list,VConn *conn,HDBC hdbc)
{
        int ind;

        ind = zend_list_insert(conn,php_birdstep_module.le_link);
        conn->hdbc = hdbc;
        conn->index = ind;

        return(ind);
}

static VConn *
birdstep_find_conn(HashTable *list,int ind)
{
        VConn *conn;
        int type;

        conn = zend_list_find(ind,&type);
        if ( !conn || type != php_birdstep_module.le_link ) {
                return(NULL);
        }
        return(conn);
}

static void
birdstep_del_conn(HashTable *list,int ind)
{
        zend_list_delete(ind);
}

static int
birdstep_add_result(HashTable *list,Vresult *res,VConn *conn)
{
        int ind;

        ind = zend_list_insert(res,php_birdstep_module.le_result);
        res->conn = conn;
        res->index = ind;

        return(ind);
}

static Vresult *
birdstep_find_result(HashTable *list,int ind)
{
        Vresult *res;
        int type;

        res = zend_list_find(ind,&type);
        if ( !res || type != php_birdstep_module.le_result ) {
                return(NULL);
        }
        return(res);
}

static void
birdstep_del_result(HashTable *list,int ind)
{
        zend_list_delete(ind);
}

/* Users functions */

/* {{{ proto int birdstep_connect(string server, string user, sting pass)
 */
PHP_FUNCTION(birdstep_connect)
{
        pval *serv,*user,*pass;
        char *Serv = NULL;
        char *User = NULL;
        char *Pass = NULL;
        RETCODE stat;
        HDBC hdbc;
        VConn *new;
        long ind;

        if ( php_birdstep_module.max_links != -1 && php_birdstep_module.num_links == 
php_birdstep_module.max_links ) {
                php_error(E_WARNING,"Birdstep: Too many open connections 
(%d)",php_birdstep_module.num_links);
                RETURN_FALSE;
        }
        if ( ZEND_NUM_ARGS() != 3 ||
           getParameters(ht,3,&serv,&user,&pass) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_string(serv);
        convert_to_string(user);
        convert_to_string(pass);
        Serv = Z_STRVAL_P(serv);
        User = Z_STRVAL_P(user);
        Pass = Z_STRVAL_P(pass);
        stat = SQLAllocConnect(henv,&hdbc);
        if ( stat != SQL_SUCCESS ) {
                php_error(E_WARNING,"Birdstep: Could not allocate connection handle");
                RETURN_FALSE;
        }
        stat = SQLConnect(hdbc,Serv,SQL_NTS,User,SQL_NTS,Pass,SQL_NTS);
        if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
                php_error(E_WARNING,"Birdstep: Could not connect to server \"%s\" for 
%s",Serv,User);
                SQLFreeConnect(hdbc);
                RETURN_FALSE;
        }
        new = (VConn *)emalloc(sizeof(VConn));
        if ( new == NULL ) {
                php_error(E_WARNING,"Birdstep: Out of memory for store connection");
                SQLFreeConnect(hdbc);
                RETURN_FALSE;
        }
        ind = birdstep_add_conn(list,new,hdbc);
        php_birdstep_module.num_links++;
        RETURN_LONG(ind);
}
/* }}} */

/* {{{ proto bool birdstep_close(int id)
 */
PHP_FUNCTION(birdstep_close)
{
        pval *id;
        VConn *conn;

        if ( ZEND_NUM_ARGS() != 1 || getParameters(ht,1,&id) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(id);
        conn = birdstep_find_conn(list,Z_LVAL_P(id));
        if ( !conn ) {
                php_error(E_WARNING,"Birdstep: Not connection index 
(%d)",Z_LVAL_P(id));
                RETURN_FALSE;
        }
        SQLDisconnect(conn->hdbc);
        SQLFreeConnect(conn->hdbc);
        birdstep_del_conn(list,Z_LVAL_P(id));
        php_birdstep_module.num_links--;
        RETURN_TRUE;
}
/* }}} */

/* {{{ proto int birdstep_exec(int index, string exec_str)
 */
PHP_FUNCTION(birdstep_exec)
{
        pval *ind,*exec_str;
        char *query = NULL;
        int indx;
        VConn *conn;
        Vresult *res;
        RETCODE stat;
        SWORD cols,i,colnamelen;
        SDWORD rows,coldesc;

        if ( ZEND_NUM_ARGS() != 2 || getParameters(ht,2,&ind,&exec_str) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(ind);
        conn = birdstep_find_conn(list,Z_LVAL_P(ind));
        if ( !conn ) {
                php_error(E_WARNING,"Birdstep: Not connection index 
(%d)",Z_LVAL_P(ind));
                RETURN_FALSE;
        }
        convert_to_string(exec_str);
        query = Z_STRVAL_P(exec_str);

        res = (Vresult *)emalloc(sizeof(Vresult));
        if ( res == NULL ) {
                php_error(E_WARNING,"Birdstep: Out of memory for result");
                RETURN_FALSE;
        }
        stat = SQLAllocStmt(conn->hdbc,&res->hstmt);
        if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
                php_error(E_WARNING,"Birdstep: SQLAllocStmt return %d",stat);
                efree(res);
                RETURN_FALSE;
        }
        stat = SQLExecDirect(res->hstmt,query,SQL_NTS);
        if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
                php_error(E_WARNING,"Birdstep: Can not execute \"%s\" query",query);
                SQLFreeStmt(res->hstmt,SQL_DROP);
                efree(res);
                RETURN_FALSE;
        }
        /* Success query */
        stat = SQLNumResultCols(res->hstmt,&cols);
        if ( stat != SQL_SUCCESS ) {
                php_error(E_WARNING,"Birdstep: SQLNumResultCols return %d",stat);
                SQLFreeStmt(res->hstmt,SQL_DROP);
                efree(res);
                RETURN_FALSE;
        }
        if ( !cols ) { /* Was INSERT, UPDATE, DELETE, etc. query */
                stat = SQLRowCount(res->hstmt,&rows);
                if ( stat != SQL_SUCCESS ) {
                        php_error(E_WARNING,"Birdstep: SQLNumResultCols return 
%d",stat);
                        SQLFreeStmt(res->hstmt,SQL_DROP);
                        efree(res);
                        RETURN_FALSE;
                }
                SQLFreeStmt(res->hstmt,SQL_DROP);
                efree(res);
                RETURN_LONG(rows);
        } else {  /* Was SELECT query */
                res->values = (VResVal *)emalloc(sizeof(VResVal)*cols);
                if ( res->values == NULL ) {
                        php_error(E_WARNING,"Birdstep: Out of memory for result 
columns");
                        SQLFreeStmt(res->hstmt,SQL_DROP);
                        efree(res);
                        RETURN_FALSE;
                }
                res->numcols = cols;
                for ( i = 0; i < cols; i++ ) {
                        SQLColAttributes(res->hstmt,i+1,SQL_COLUMN_NAME,
                           res->values[i].name,sizeof(res->values[i].name),
                           &colnamelen,NULL);
                        SQLColAttributes(res->hstmt,i+1,SQL_COLUMN_TYPE,
                           NULL,0,NULL,&res->values[i].valtype);
                        switch ( res->values[i].valtype ) {
                                case SQL_LONGVARBINARY:
                                case SQL_LONGVARCHAR:
                                        res->values[i].value = NULL;
                                        continue;
                                default:
                                        break;
                        }
                        SQLColAttributes(res->hstmt,i+1,SQL_COLUMN_DISPLAY_SIZE,
                           NULL,0,NULL,&coldesc);
                        res->values[i].value = (char *)emalloc(coldesc+1);
                        if ( res->values[i].value != NULL ) {
                                SQLBindCol(res->hstmt,i+1,SQL_C_CHAR,
                                   res->values[i].value,coldesc+1,
                                   &res->values[i].vallen);
                        }
                }
        }
        res->fetched = 0;
        indx = birdstep_add_result(list,res,conn);
        RETURN_LONG(indx);
}
/* }}} */

/* {{{ proto bool birdstep_fetch(int index)
 */
PHP_FUNCTION(birdstep_fetch)
{
        pval *ind;
        Vresult *res;
        RETCODE stat;
        UDWORD  row;
        UWORD   RowStat[1];

        if ( ZEND_NUM_ARGS() != 1 || getParameters(ht,1,&ind) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(ind);
        res = birdstep_find_result(list,Z_LVAL_P(ind));
        if ( !res ) {
                php_error(E_WARNING,"Birdstep: Not result index (%d)",Z_LVAL_P(ind));
                RETURN_FALSE;
        }
        stat = SQLExtendedFetch(res->hstmt,SQL_FETCH_NEXT,1,&row,RowStat);
        if ( stat == SQL_NO_DATA_FOUND ) {
                SQLFreeStmt(res->hstmt,SQL_DROP);
                birdstep_del_result(list,Z_LVAL_P(ind));
                RETURN_FALSE;
        }
        if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
                php_error(E_WARNING,"Birdstep: SQLFetch return error");
                SQLFreeStmt(res->hstmt,SQL_DROP);
                birdstep_del_result(list,Z_LVAL_P(ind));
                RETURN_FALSE;
        }
        res->fetched = 1;
        RETURN_TRUE;
}
/* }}} */

/* {{{ proto mixed birdstep_result(int index, int col)
 */
PHP_FUNCTION(birdstep_result)
{
        pval *ind,*col;
        Vresult *res;
        RETCODE stat;
        int i,sql_c_type;
        UDWORD row;
        UWORD RowStat[1];
        SWORD indx = -1;
        char *field = NULL;

        if ( ZEND_NUM_ARGS() != 2 || getParameters(ht,2,&ind,&col) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(ind);
        res = birdstep_find_result(list,Z_LVAL_P(ind));
        if ( !res ) {
                php_error(E_WARNING,"Birdstep: Not result index (%d),Z_LVAL_P(ind)");
                RETURN_FALSE;
        }
        if ( Z_TYPE_P(col) == IS_STRING ) {
                field = Z_STRVAL_P(col);
        } else {
                convert_to_long(col);
                indx = Z_LVAL_P(col);
        }
        if ( field ) {
                for ( i = 0; i < res->numcols; i++ ) {
                        if ( !strcasecmp(res->values[i].name,field)) {
                                indx = i;
                                break;
                        }
                }
                if ( indx < 0 ) {
                        php_error(E_WARNING, "Field %s not found",field);
                        RETURN_FALSE;
                }
        } else {
                if ( indx < 0 || indx >= res->numcols ) {
                        php_error(E_WARNING,"Birdstep: Field index not in range");
                        RETURN_FALSE;
                }
        }
        if ( !res->fetched ) {
                stat = SQLExtendedFetch(res->hstmt,SQL_FETCH_NEXT,1,&row,RowStat);
                if ( stat == SQL_NO_DATA_FOUND ) {
                        SQLFreeStmt(res->hstmt,SQL_DROP);
                        birdstep_del_result(list,Z_LVAL_P(ind));
                        RETURN_FALSE;
                }
                if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
                        php_error(E_WARNING,"Birdstep: SQLFetch return error");
                        SQLFreeStmt(res->hstmt,SQL_DROP);
                        birdstep_del_result(list,Z_LVAL_P(ind));
                        RETURN_FALSE;
                }
                res->fetched = 1;
        }
        switch ( res->values[indx].valtype ) {
                case SQL_LONGVARBINARY:
                        sql_c_type = SQL_C_BINARY;
                        goto l1;
                case SQL_LONGVARCHAR:
                        sql_c_type = SQL_C_CHAR;
l1:
                        if ( !res->values[indx].value ) {
                                res->values[indx].value = emalloc(4096);
                                if ( !res->values[indx].value ) {
                                        php_error(E_WARNING,"Out of memory");
                                        RETURN_FALSE;
                                }
                        }
                        stat = SQLGetData(res->hstmt,indx+1,sql_c_type,
                                
res->values[indx].value,4095,&res->values[indx].vallen);
                        if ( stat == SQL_NO_DATA_FOUND ) {
                                SQLFreeStmt(res->hstmt,SQL_DROP);
                                birdstep_del_result(list,Z_LVAL_P(ind));
                                RETURN_FALSE;
                        }
                        if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
                                php_error(E_WARNING,"Birdstep: SQLGetData return 
error");
                                SQLFreeStmt(res->hstmt,SQL_DROP);
                                birdstep_del_result(list,Z_LVAL_P(ind));
                                RETURN_FALSE;
                        }
                        if ( res->values[indx].valtype == SQL_LONGVARCHAR ) {
                                RETURN_STRING(res->values[indx].value,TRUE);
                        } else {
                                RETURN_LONG((long)res->values[indx].value);
                        }
                default:
                        if ( res->values[indx].value != NULL ) {
                                RETURN_STRING(res->values[indx].value,TRUE);
                        }
        }
}
/* }}} */

/* {{{ proto bool birdstep_freeresult(int index)
 */
PHP_FUNCTION(birdstep_freeresult)
{
        pval *ind;
        Vresult *res;

        if ( ZEND_NUM_ARGS() != 1 || getParameters(ht,1,&ind) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(ind);
        res = birdstep_find_result(list,Z_LVAL_P(ind));
        if ( !res ) {
                php_error(E_WARNING,"Birdstep: Not result index (%d)",Z_LVAL_P(ind));
                RETURN_FALSE;
        }
        SQLFreeStmt(res->hstmt,SQL_DROP);
        birdstep_del_result(list,Z_LVAL_P(ind));
        RETURN_TRUE;
}
/* }}} */

/* {{{ proto bool birdstep_autocommit(int index)
 */
PHP_FUNCTION(birdstep_autocommit)
{
        pval *id;
        RETCODE stat;
        VConn *conn;

        if ( ZEND_NUM_ARGS() != 1 || getParameters(ht,1,&id) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(id);
        conn = birdstep_find_conn(list,Z_LVAL_P(id));
        if ( !conn ) {
                php_error(E_WARNING,"Birdstep: Not connection index 
(%d)",Z_LVAL_P(id));
                RETURN_FALSE;
        }
        stat = SQLSetConnectOption(conn->hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_ON);
        if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
                php_error(E_WARNING,"Birdstep: Set autocommit_on option failure");
                RETURN_FALSE;
        }
        RETURN_TRUE;
}
/* }}} */

/* {{{ proto bool birdstep_off_autocommit(int index)
 */
PHP_FUNCTION(birdstep_off_autocommit)
{
        pval *id;
        RETCODE stat;
        VConn *conn;

        if ( ZEND_NUM_ARGS() != 1 || getParameters(ht,1,&id) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(id);
        conn = birdstep_find_conn(list,Z_LVAL_P(id));
        if ( !conn ) {
                php_error(E_WARNING,"Birdstep: Not connection index 
(%d)",Z_LVAL_P(id));
                RETURN_FALSE;
        }
        stat = SQLSetConnectOption(conn->hdbc,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF);
        if ( stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO ) {
                php_error(E_WARNING,"Birdstep: Set autocommit_off option failure");
                RETURN_FALSE;
        }
        RETURN_TRUE;
}
/* }}} */

/* {{{ proto bool birdstep_commit(int index)
 */
PHP_FUNCTION(birdstep_commit)
{
        pval *id;
        RETCODE stat;
        VConn *conn;

        if ( ZEND_NUM_ARGS() != 1 || getParameters(ht,1,&id) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(id);
        conn = birdstep_find_conn(list,Z_LVAL_P(id));
        if ( !conn ) {
                php_error(E_WARNING,"Birdstep: Not connection index 
(%d)",Z_LVAL_P(id));
                RETURN_FALSE;
        }
        stat = SQLTransact(NULL,conn->hdbc,SQL_COMMIT);
        if ( stat != SQL_SUCCESS ) {
                php_error(E_WARNING,"Birdstep: Commit failure");
                RETURN_FALSE;
        }
        RETURN_TRUE;
}
/* }}} */

/* {{{ proto bool birdstep_rollback(int index)
 */
PHP_FUNCTION(birdstep_rollback)
{
        pval *id;
        RETCODE stat;
        VConn *conn;

        if ( ZEND_NUM_ARGS() != 1 || getParameters(ht,1,&id) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(id);
        conn = birdstep_find_conn(list,Z_LVAL_P(id));
        if ( !conn ) {
                php_error(E_WARNING,"Birdstep: Not connection index 
(%d)",Z_LVAL_P(id));
                RETURN_FALSE;
        }
        stat = SQLTransact(NULL,conn->hdbc,SQL_ROLLBACK);
        if ( stat != SQL_SUCCESS ) {
                php_error(E_WARNING,"Birdstep: Rollback failure");
                RETURN_FALSE;
        }
        RETURN_TRUE;
}
/* }}} */

/* {{{ proto string birdstep_fieldname(int index, int col)
 */
PHP_FUNCTION(birdstep_fieldname)
{
        pval *ind,*col;
        Vresult *res;
        SWORD indx;

        if ( ZEND_NUM_ARGS() != 2 || getParameters(ht,2,&ind,&col) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(ind);
        res = birdstep_find_result(list,Z_LVAL_P(ind));
        if ( !res ) {
                php_error(E_WARNING,"Birdstep: Not result index (%d),Z_LVAL_P(ind)");
                RETURN_FALSE;
        }
        convert_to_long(col);
        indx = Z_LVAL_P(col);
        if ( indx < 0 || indx >= res->numcols ) {
                php_error(E_WARNING,"Birdstep: Field index not in range");
                RETURN_FALSE;
        }
        RETURN_STRING(res->values[indx].name,TRUE);
}
/* }}} */

/* {{{ proto int birdstep_fieldnum(int index)
 */
PHP_FUNCTION(birdstep_fieldnum)
{
        pval *ind;
        Vresult *res;

        if ( ZEND_NUM_ARGS() != 1 || getParameters(ht,1,&ind) == FAILURE ) {
                WRONG_PARAM_COUNT;
        }
        convert_to_long(ind);
        res = birdstep_find_result(list,Z_LVAL_P(ind));
        if ( !res ) {
                php_error(E_WARNING,"Birdstep: Not result index (%d),Z_LVAL_P(ind)");
                RETURN_FALSE;
        }
        RETURN_LONG(res->numcols);
}
/* }}} */

#endif /* HAVE_BIRDSTEP */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 */

Index: php4/ext/odbc/php_birstep.h
+++ php4/ext/odbc/php_birstep.h
/*
   +----------------------------------------------------------------------+
   | PHP Version 4                                                        |
   +----------------------------------------------------------------------+
   | Copyright (c) 1997-2002 The PHP Group                                |
   +----------------------------------------------------------------------+
   | This source file is subject to version 2.02 of the PHP license,      |
   | that is bundled with this package in the file LICENSE, and is        |
   | available at through the world-wide-web at                           |
   | http://www.php.net/license/2_02.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          |
   | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
   +----------------------------------------------------------------------+
   | Authors: Nikolay P. Romanyuk <[EMAIL PROTECTED]>                         |
   +----------------------------------------------------------------------+
*/

/* $Id: php_birstep.h,v 1.1 2002/03/04 09:10:31 imajes Exp $ */

#ifndef PHP_BIRDSTEP_H
#define PHP_BIRDSTEP_H

#if defined(HAVE_BIRDSTEP) && !HAVE_UODBC
#define UNIX
#include <sql.h>
#include <sqlext.h>

typedef struct VConn {
        HDBC    hdbc;
        long    index;
} VConn;

typedef struct {
        char name[32];
        char *value;
        long vallen;
        SDWORD valtype;
} VResVal;

typedef struct Vresult {
        HSTMT   hstmt;
        VConn   *conn; 
        long    index;
        VResVal *values;
        long    numcols;
        int     fetched;
} Vresult;

typedef struct {
        long num_links;
        long max_links;
        int le_link,le_result;
} birdstep_module;

extern zend_module_entry birdstep_module_entry;
#define birdstep_module_ptr &birdstep_module_entry

/* birdstep.c functions */
PHP_MINIT_FUNCTION(birdstep);
PHP_RINIT_FUNCTION(birdstep);
PHP_MINFO_FUNCTION(birdstep);
PHP_MSHUTDOWN_FUNCTION(birdstep);

PHP_FUNCTION(birdstep_connect);
PHP_FUNCTION(birdstep_close);
PHP_FUNCTION(birdstep_exec);
PHP_FUNCTION(birdstep_fetch);
PHP_FUNCTION(birdstep_result);
PHP_FUNCTION(birdstep_freeresult);
PHP_FUNCTION(birdstep_autocommit);
PHP_FUNCTION(birdstep_off_autocommit);
PHP_FUNCTION(birdstep_commit);
PHP_FUNCTION(birdstep_rollback);
PHP_FUNCTION(birdstep_fieldnum);
PHP_FUNCTION(birdstep_fieldname);

extern birdstep_module php_birdstep_module;

#else

#define birdstep_module_ptr NULL

#endif /* HAVE_BIRDSTEP */
#endif /* PHP_BIRDSTEP_H */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 */


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to