Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:7441 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 3527 invoked by uid 1010); 31 Jan 2004 21:27:23 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 3482 invoked from network); 31 Jan 2004 21:27:21 -0000 Received: from unknown (HELO mail.zend.com) (192.117.235.230) by pb1.pair.com with SMTP; 31 Jan 2004 21:27:21 -0000 Received: (qmail 2991 invoked from network); 31 Jan 2004 21:27:18 -0000 Received: from localhost (HELO ido-comp2.zend.com) (127.0.0.1) by localhost with SMTP; 31 Jan 2004 21:27:18 -0000 Message-ID: <5.1.0.14.2.20040131232658.04f02ed8@127.0.0.1> X-Sender: andi@127.0.0.1 X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sat, 31 Jan 2004 23:27:27 +0200 To: Ard Biesheuvel ,internals@lists.php.net In-Reply-To: <20040131011938.49239.qmail@pb1.pair.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; format=flowed Subject: Re: [PHP-DEV] backup/restore functions for interbase From: andi@zend.com (Andi Gutmans) References: <20040131011938.49239.qmail@pb1.pair.com> I don't mind having this in the tree. It doesn't affect anything of significance (i.e. the core extensions). Andi At 02:19 AM 1/31/2004 +0100, Ard Biesheuvel wrote: >Guys, > >Any chance this will make it into RC1 ?? > >-- >Ard > > > >Index: interbase.c >=================================================================== >RCS file: /repository/php-src/ext/interbase/interbase.c,v >retrieving revision 1.194 >diff -u -r1.194 interbase.c >--- interbase.c 21 Jan 2004 10:22:04 -0000 1.194 >+++ interbase.c 31 Jan 2004 01:13:17 -0000 >@@ -153,6 +153,10 @@ > PHP_FE(ibase_wait_event, NULL) > PHP_FE(ibase_set_event_handler, NULL) > PHP_FE(ibase_free_event_handler, NULL) >+ PHP_FE(ibase_servmgr_connect, NULL) >+ PHP_FE(ibase_servmgr_disconnect, NULL) >+ PHP_FE(ibase_backup, NULL) >+ PHP_FE(ibase_restore, NULL) > {NULL, NULL, NULL} > }; > >@@ -181,7 +185,7 @@ > #endif > > /* True globals, no need for thread safety */ >-static int le_blob, le_link, le_plink, le_result, le_query, le_trans, >le_event; >+static int le_blob, le_link, le_plink, le_result, le_query, le_trans, >le_event, le_servmgr; > > ZEND_DECLARE_MODULE_GLOBALS(ibase) > >@@ -612,6 +616,28 @@ > } > /* }}} */ > >+/* {{{ _php_ibase_free_servmgr() */ >+static void _php_ibase_free_servmgr(zend_rsrc_list_entry *rsrc TSRMLS_DC) >+{ >+ ibase_servmgr *sv = (ibase_servmgr *) rsrc->ptr; >+ >+ IBDEBUG("Cleaning up service manager resource"); >+ >+ if (isc_service_detach(IB_STATUS, &sv->handle)) { >+ _php_ibase_error(TSRMLS_C); >+ } >+ >+ if (sv->hostname) { >+ efree(sv->hostname); >+ } >+ if (sv->username) { >+ efree(sv->username); >+ } >+ >+ efree(sv); >+} >+/* }}} */ >+ > /* {{{ startup, shutdown and info functions */ > PHP_INI_BEGIN() > STD_PHP_INI_BOOLEAN("ibase.allow_persistent", "1", > PHP_INI_SYSTEM, OnUpdateLong, allow_persistent, zend_ibase_globals, > ibase_globals) >@@ -646,6 +672,7 @@ > le_plink = > zend_register_list_destructors_ex(php_ibase_commit_link_rsrc, > _php_ibase_close_plink, "interbase link persistent", module_number); > le_trans = > zend_register_list_destructors_ex(_php_ibase_free_trans, NULL, "interbase > transaction", module_number); > le_event = > zend_register_list_destructors_ex(_php_ibase_free_event, NULL, "interbase > event", module_number); >+ le_servmgr = >zend_register_list_destructors_ex(_php_ibase_free_servmgr, NULL, >"interbase service manager handle", module_number); > > REGISTER_LONG_CONSTANT("IBASE_DEFAULT", PHP_IBASE_DEFAULT, > CONST_PERSISTENT); > REGISTER_LONG_CONSTANT("IBASE_TEXT", PHP_IBASE_FETCH_BLOBS, > CONST_PERSISTENT); /* deprecated, for BC only */ >@@ -786,7 +813,7 @@ > /* }}} */ > > /* {{{ _php_ibase_attach_db() */ >-static int _php_ibase_attach_db(char *server, char *uname, char *passwd, >char *charset, int buffers, char *role, isc_db_handle *db TSRMLS_DC) >+int _php_ibase_attach_db(char *server, char *uname, char *passwd, char >*charset, int buffers, char *role, isc_db_handle *db TSRMLS_DC) > { > char dpb_buffer[256], *dpb, *p; > int dpb_length, len; >@@ -4530,6 +4557,126 @@ > > /* }}} */ > >+/* {{{ proto resource ibase_servmgr_connect(string host, string >dba_username, string dba_password) */ >+PHP_FUNCTION(ibase_servmgr_connect) >+{ >+ long hlen, ulen, plen, spb_len; >+ ibase_servmgr *result, svm = { NULL, NULL, NULL }; >+ char buf[128], *password; >+ >+ RESET_ERRMSG; >+ >+ if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, >"sss", >+ &svm.hostname, &hlen, &svm.username, &ulen, >&password, &plen)) { >+ >+ RETURN_FALSE; >+ } >+ >+ /* construct the spb, hack the service name into it as well */ >+ spb_len = snprintf(buf, sizeof(buf), "%c%c%c%c%s%c%c%s" >"%s:service_mgr", >+ isc_spb_version, isc_spb_current_version, >isc_spb_user_name, (char)ulen, >+ svm.username, isc_spb_password, (char)plen, password, >svm.hostname); >+ >+ assert(sizeof(buf) > spb_len && spb_len != -1); >+ >+ /* attach to the service manager */ >+ if (isc_service_attach(IB_STATUS, 0, &buf[spb_len-hlen-12], /* >points to %s:service_mgr part */ >+ &svm.handle, (unsigned short)spb_len, buf)) { >+ _php_ibase_error(TSRMLS_C); >+ RETURN_FALSE; >+ } >+ >+ result = (ibase_servmgr*)emalloc(sizeof(ibase_servmgr)); >+ result->handle = svm.handle; >+ result->hostname = estrdup(svm.hostname); >+ result->username = estrdup(svm.username); >+ >+ ZEND_REGISTER_RESOURCE(return_value, result, le_servmgr); >+ zend_list_addref(Z_LVAL_P(return_value)); >+} >+/* }}} */ >+ >+/* {{{ proto bool ibase_servmgr_disconnect(resource service_handle) */ >+PHP_FUNCTION(ibase_servmgr_disconnect) >+{ >+ zval *res; >+ >+ RESET_ERRMSG; >+ >+ if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, >"r", &res)) { >+ RETURN_FALSE; >+ } >+ >+ zend_list_delete(Z_LVAL_P(res)); >+ >+ RETURN_TRUE; >+} >+/* }}} */ >+ >+/* {{{ */ >+static void _php_ibase_backup_restore(INTERNAL_FUNCTION_PARAMETERS, char >operation) >+{ >+ /** >+ * It appears that the service API is a little bit confused about >which flag >+ * to use for the source and destination in the case of a restore >operation. >+ * When passing the backup file as isc_spb_dbname and the >destination db as >+ * bpk_file, things work well. >+ */ >+ zval *res; >+ char *db, *bk, buf[200]; >+ long dblen, bklen, spb_len, opts = 0; >+ zend_bool replace = 0; >+ ibase_servmgr *svm; >+ >+ RESET_ERRMSG; >+ >+ if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, >operation == isc_action_svc_backup ? "rss" : "rss|b", >+ &res, &db, &dblen, &bk, &bklen, &replace)) { >+ RETURN_FALSE; >+ } >+ >+ ZEND_FETCH_RESOURCE(svm, ibase_servmgr *, &res, -1, "Interbase >service manager handle", le_servmgr); >+ >+ switch (operation) { >+ default: >+ break; >+ case isc_action_svc_restore: >+ opts |= replace ? isc_spb_res_replace : >isc_spb_res_create; >+ } >+ >+ /* fill the param buffer */ >+ spb_len = snprintf(buf, sizeof(buf), "%c%c%c%c%s%c%c%c%s%c%c%c%c%c", >+ operation, isc_spb_dbname, (char)dblen, (char)(dblen >> >8), db, >+ isc_spb_bkp_file, (char)bklen, (char)(bklen >> 8), bk, >isc_spb_options, >+ (char)opts,(char)(opts >> 8), (char)(opts >> 16), >(char)(opts >> 24)); >+ >+ assert(sizeof(buf) > spb_len && spb_len != -1); >+ >+ /* now start the backup/restore job */ >+ if (isc_service_start(IB_STATUS, &svm->handle, NULL, (unsigned >short)spb_len, buf)) { >+ _php_ibase_error(TSRMLS_C); >+ RETURN_FALSE; >+ } >+ >+ RETURN_TRUE; >+} >+/* }}} */ >+ >+/* {{{ proto bool ibase_backup(resource service_handle, string source_db, >string dest_file) >+ Initiates a backup task in the service manager and returns immediately */ >+PHP_FUNCTION(ibase_backup) >+{ >+ _php_ibase_backup_restore(INTERNAL_FUNCTION_PARAM_PASSTHRU, >isc_action_svc_backup); >+} >+ >+/* {{{ proto bool ibase_restore(resource service_handle, string >source_file, string dest_db [, bool replace]) >+ Initiates a restore task in the service manager and returns immediately */ >+PHP_FUNCTION(ibase_restore) >+{ >+ _php_ibase_backup_restore(INTERNAL_FUNCTION_PARAM_PASSTHRU, >isc_action_svc_restore); >+} >+/* }}} */ >+ > #endif /* HAVE_IBASE */ > > /* >Index: php_interbase.h >=================================================================== >RCS file: /repository/php-src/ext/interbase/php_interbase.h,v >retrieving revision 1.64 >diff -u -r1.64 php_interbase.h >--- php_interbase.h 8 Jan 2004 17:32:17 -0000 1.64 >+++ php_interbase.h 31 Jan 2004 01:13:17 -0000 >@@ -88,6 +88,11 @@ > PHP_FUNCTION(ibase_set_event_handler); > PHP_FUNCTION(ibase_free_event_handler); > >+PHP_FUNCTION(ibase_servmgr_connect); >+PHP_FUNCTION(ibase_servmgr_disconnect); >+PHP_FUNCTION(ibase_backup); >+PHP_FUNCTION(ibase_restore); >+ > #define IBASE_MSGSIZE 256 > #define MAX_ERRMSG (IBASE_MSGSIZE*2) > >@@ -175,6 +180,12 @@ > void **thread_ctx; > } ibase_event; > >+typedef struct { >+ isc_svc_handle handle; >+ char *hostname; >+ char *username; >+} ibase_servmgr; >+ > enum php_interbase_option { > PHP_IBASE_DEFAULT = 0, > /* fetch flags */ > >-- >PHP Internals - PHP Runtime Development Mailing List >To unsubscribe, visit: http://www.php.net/unsub.php