diff --git a/product/ZMySQLDDA/CHANGES.txt b/product/ZMySQLDDA/CHANGES.txt new file mode 100755 index 0000000000000000000000000000000000000000..3f4b2d46e352578e05fd2b2ab0c447a116795367 --- /dev/null +++ b/product/ZMySQLDDA/CHANGES.txt @@ -0,0 +1,5 @@ +Z MySQL DDA Releases + + 2.0.9 + + Initial Release diff --git a/product/ZMySQLDDA/DA.py b/product/ZMySQLDDA/DA.py new file mode 100755 index 0000000000000000000000000000000000000000..a52c1d2a8453e45a4ff5d0d618ad3157bfc7286f --- /dev/null +++ b/product/ZMySQLDDA/DA.py @@ -0,0 +1,145 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# Copyright (c) Nexedi SARL 2004. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## + +from Products.ZMySQLDA.DA import * +from db import DeferredDB + +manage_addZMySQLDeferredConnectionForm=HTMLFile('deferredConnectionAdd',globals()) + +def manage_addZMySQLDeferredConnection(self, id, title, + connection_string, + check=None, REQUEST=None): + """Add a DB connection to a folder""" + self._setObject(id, DeferredConnection(id, title, connection_string, check)) + if REQUEST is not None: return self.manage_main(self,REQUEST) + +class DeferredConnection(Connection): + """ + Experimental MySQL DA which implements + deferred SQL code execution to reduce locking issues + """ + meta_type=title='Z %s Database Deferred Connection' % database_type + + def factory(self): return DeferredDB + + def connect(self,s): + try: self._v_database_connection.close() + except: pass + self._v_connected='' + DB=self.factory() + ## No try. DO. + self._v_database_connection=DeferredDB(s) + self._v_connected=DateTime() + return self + +classes=('DA.DeferredConnection') + +meta_types=( + {'name':'Z %s Database Deferred Connection' % database_type, + 'action':'manage_addZ%sDeferredConnectionForm' % database_type, + }, + ) + +folder_methods={ + 'manage_addZMySQLDeferredConnection': + manage_addZMySQLDeferredConnection, + 'manage_addZMySQLDeferredConnectionForm': + manage_addZMySQLDeferredConnectionForm, + } + +__ac_permissions__=( + ('Add Z MySQL Database Connections', + ('manage_addZMySQLConnectionForm', + 'manage_addZMySQLConnection')), + ) + +misc_={'conn': ImageFile( + os.path.join('Shared','DC','ZRDB','www','DBAdapterFolder_icon.gif'))} + +for icon in ('table', 'view', 'stable', 'what', + 'field', 'text','bin','int','float', + 'date','time','datetime'): + misc_[icon]=ImageFile(os.path.join('icons','%s.gif') % icon, globals()) diff --git a/product/ZMySQLDDA/DEPENDENCIES.txt b/product/ZMySQLDDA/DEPENDENCIES.txt new file mode 100755 index 0000000000000000000000000000000000000000..151d8af655fd877e6cd88e8a96fa78cca514c1d0 --- /dev/null +++ b/product/ZMySQLDDA/DEPENDENCIES.txt @@ -0,0 +1,6 @@ +* MySQL-python-0.9.2 or newer + +* Zope-2.3.0 or newer + +* ZMySQLDA 2.0.9 or newer + diff --git a/product/ZMySQLDDA/README.txt b/product/ZMySQLDDA/README.txt new file mode 100755 index 0000000000000000000000000000000000000000..6695265cb8885090946beebcbd9d5bb385f39d7d --- /dev/null +++ b/product/ZMySQLDDA/README.txt @@ -0,0 +1,18 @@ +Z MySQL Deferred DA + + This is the Z MySQL database deferred adapter product for the + Z Object Publishing Environment. It is based on + ZMySQLDA and follows the same API and installation + procedure. + + The main difference with ZMySQLDA is that the execution + of SQL expressions is deferred and executed during the Zope + commit time rather than immediately. This allows for example + to group INSERT and DELETE statements in a very short amount of + time, which reduces risks of lock. It also allows to use + MyISAM tables without raising useless exception messages related + to the non transactional nature of MyISAM. + + ** IMPORTANT ** + + SELECT expressions will not work in deferred mode \ No newline at end of file diff --git a/product/ZMySQLDDA/VERSION.txt b/product/ZMySQLDDA/VERSION.txt new file mode 100755 index 0000000000000000000000000000000000000000..197875ed4d0e5c2dfc964a1578fbfafa13927aa8 --- /dev/null +++ b/product/ZMySQLDDA/VERSION.txt @@ -0,0 +1 @@ +ZMySQLDA 2.0.9 diff --git a/product/ZMySQLDDA/__init__.py b/product/ZMySQLDDA/__init__.py new file mode 100755 index 0000000000000000000000000000000000000000..91beec23a5d4d837f7e64866dd7b86c7fe537b64 --- /dev/null +++ b/product/ZMySQLDDA/__init__.py @@ -0,0 +1,107 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## +__doc__='''Generic Deferred Database Adapter Package Registration + +$Id$''' +__version__='$Revision$'[11:-2] + +import sys, string +import DA + +methods=DA.folder_methods +misc_=DA.misc_ + +def initialize(context): + + context.registerClass( + DA.DeferredConnection, + permission='Add Z MySQL Database Deferred Connections', + constructors=(DA.manage_addZMySQLDeferredConnectionForm, + DA.manage_addZMySQLDeferredConnection,) + ) + + context.registerHelp() + context.registerHelpTitle('ZMySQLDDA') + diff --git a/product/ZMySQLDDA/browse.dtml b/product/ZMySQLDDA/browse.dtml new file mode 100755 index 0000000000000000000000000000000000000000..4e600bc10752ea86449eba20efe67aa1273e08c9 --- /dev/null +++ b/product/ZMySQLDDA/browse.dtml @@ -0,0 +1,12 @@ +<html> + <head><title><!--#var title_or_id--> tables</title></head> + <body bgcolor="#FFFFFF" link="#000099" vlink="#555555" alink="#77003B"> + <!--#var manage_tabs--> + <!--#tree header=info--> + <IMG SRC="<!--#var SCRIPT_NAME-->/misc_/ZMySQLDA/<!--#var icon-->" + ALT="<!--#var Type-->" BORDER="0"> + <!--#var Name--><!--#var Description--> + <!--#/tree--> + + </body> +</html> diff --git a/product/ZMySQLDDA/connectionAdd.dtml b/product/ZMySQLDDA/connectionAdd.dtml new file mode 100755 index 0000000000000000000000000000000000000000..cd7b5c1fb290926b9b49e66c666b269ae74e14e7 --- /dev/null +++ b/product/ZMySQLDDA/connectionAdd.dtml @@ -0,0 +1,92 @@ +<html> + <head><title>Add Z MySQL Database Connection</title></head> + <body bgcolor="#FFFFFF" link="#000099" vlink="#555555" alink="#77003B"> + + <h2>Add Z MySQL Database Deferred Connection</h2> + + <form action="manage_addZMySQLConnection" method="POST"> + <table cellspacing="2"> + <tr> + <th align="LEFT" valign="TOP">Id</th> + <td align="LEFT" valign="TOP"> + <input type="TEXT" name="id" size="40" + value="MySQL_database_connection"> + </td> + </tr> + <tr> + <th align="LEFT" valign="TOP"><em>Title</em></th> + <td align="LEFT" valign="TOP"> + <input type="TEXT" name="title" size="40" + value="Z MySQL Database Connection"> + </td> + </tr> + <tr> + <th align="LEFT" valign="TOP"> + Enter a Database Connection String + <a href="#1"><sup>1</sup></a></th> + <td align="LEFT" valign="TOP"> + <input type="TEXT" name="connection_string" size="40"> + </td> + </tr> + <tr> + <th align="LEFT" valign="TOP">Connect immediately</th> + <td align="LEFT" valign="TOP"> + <input name="check" type="CHECKBOX" value="YES" CHECKED> + </td> + </tr> + <tr> + <td></td> + <td><br><input type="SUBMIT" value="Add"></td> + </tr> + </table> + </form> + + + +<dt><a hname="1"><sup>1</sup></a> Connection Strings</dt> +<dd> +<p> + The connection string used for Z MySQL Database Connection + is of the form: +<pre> + [*lock] [+/-][database][@host[:port]] [user [password [unix_socket]]] +</pre> + or typically: +<pre> + database user password +</pre> + to use a MySQL server on localhost via the standard UNIX socket. + Only specify host if the server is on a remote system. You can + use a non-standard port, if necessary. Hint: To use a non-standard + port on the local system, use 127.0.0.1 for the host instead of + localhost. +<p> + Either a database or a host or both must be specified. +<p> + If the UNIX socket is in a non-standard location, you can specify + the full path to it after the password. +<p> + A '-' in front of the database tells ZMySQLDA to not use Zope's + Transaction Manager, even if the server supports transactions. A + '+' in front of the database tells ZMySQLDA that it must use + transactions; an exception will be raised if they are not + supported by the server. If neither '-' or '+' are present, then + transactions will be enabled if the server supports them. If you + are using non-transaction safe tables (TSTs) on a server that + supports TSTs, use '-'. If you require transactions, use '+'. If + you aren't sure, don't use either. +<p> + *<em>lock</em> at the begining of the connection string means to + psuedo-transactional. When the transaction begins, it will acquire + a lock on the server named <em>lock</em> (i.e. MYLOCK). When the + transaction commits, the lock will be released. If the transaction + is aborted and restarted, which can happen due to a ConflictError, + you'll get an error in the logs, and inconsistent data. In this + respect, it's equivalent to transactions turned off. +<p> + Transactions are highly recommended. Using a named lock in + conjunctions with transactions is probably pointless. +</dd></dl> + + </body> +</html> diff --git a/product/ZMySQLDDA/connectionEdit.dtml b/product/ZMySQLDDA/connectionEdit.dtml new file mode 100755 index 0000000000000000000000000000000000000000..b2379944ccdbb4388935a89167f71fc26111a9b7 --- /dev/null +++ b/product/ZMySQLDDA/connectionEdit.dtml @@ -0,0 +1,48 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> +<html lang="en"> + <head><title>Edit <dtml-var title_or_id></title></head> + <body bgcolor="#FFFFFF" link="#000099" vlink="#555555" alink="#77003B"> + <dtml-var manage_tabs> + + <h2>Edit <dtml-var title_or_id></h2> + + <form action="manage_edit" method="POST"> + <table cellspacing="2"> + + <tr> + <th align="LEFT" valign="TOP">Id</th> + <td align="LEFT" valign="TOP"><dtml-var id></td> + </tr> + + <tr> + <th align="LEFT" valign="TOP"><em>Title</em></th> + <td align="LEFT" valign="TOP"> + <input type="TEXT" name="title" size="40" + value="<dtml-var title html_quote>"> + </td> + </tr> + + <tr> + <th align="LEFT" valign="TOP">Database Connection String</th> + <td align="LEFT" valign="TOP"> + <input type="TEXT" name="connection_string" size="40" + value="<dtml-var connection_string html_quote>"> + </td> + </tr> + <tr> + <th align="LEFT" valign="TOP">Connect immediately</th> + <td align="LEFT" valign="TOP"> + <input name="check" type="CHECKBOX" value="YES" CHECKED> + </td> + </tr> + + <tr> + <td></td> + <td><br><input type="SUBMIT" value="Change"></td> + </tr> + + </table> + </form> + + </body> +</html> diff --git a/product/ZMySQLDDA/db.py b/product/ZMySQLDDA/db.py new file mode 100755 index 0000000000000000000000000000000000000000..7ef477efe58bc8b2fada4a21933fbc73046bff16 --- /dev/null +++ b/product/ZMySQLDDA/db.py @@ -0,0 +1,180 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# Copyright (c) Nexedi SARL 2004. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## + +from Products.ZMySQLDA.db import * + +class DeferredDB(DB): + """ + An experimental MySQL DA which implements deferred execution + of SQL code in order to reduce locks and provide better behaviour + with MyISAM non transactional tables + """ + + def __init__(self,connection): + DB.__init__(self, connection) + self.sql_string_list = [] + + def query(self,query_string, max_rows=1000): + self._use_TM and self._register() + desc=None + result=() + db=self.db + try: + self._lock.acquire() + for qs in filter(None, map(strip,split(query_string, '\0'))): + qtype = upper(split(qs, None, 1)[0]) + if qtype == "SELECT": + raise NotSupportedError, "can not SELECT in deferred connections" + #LOG('ZMySQLDDA', 0, "insert string %s" % qs ) + self.sql_string_list.append(qs) + finally: + self._lock.release() + + return (),() + + def _begin(self, *ignored): + from thread import get_ident + self._tlock.acquire() + self._tthread = get_ident() + + def _finish(self, *ignored): + from thread import get_ident + if not self._tlock.locked() or self._tthread != get_ident(): + LOG('ZMySQLDA', INFO, "ignoring _finish") + return + # BEGIN commit + LOG('ZMySQLDDA', INFO, "BEGIN commit") + try: + if self._transactions: + self.db.query("BEGIN") + self.db.store_result() + if self._mysql_lock: + self.db.query("SELECT GET_LOCK('%s',0)" % self._mysql_lock) + self.db.store_result() + except: + LOG('ZMySQLDDA', ERROR, "exception during _begin", + error=sys.exc_info()) + self._tlock.release() + raise + # Execute SQL + db = self.db + for qs in self.sql_string_list: + try: + db.query(qs) + c=db.store_result() + except OperationalError, m: + if m[0] not in hosed_connection: raise + # Hm. maybe the db is hosed. Let's restart it. + db=self.db=apply(self.Database_Connection, (), self.kwargs) + try: + db.query(qs) + c=db.store_result() + except OperationalError, m: + raise + LOG('ZMySQLDDA', INFO, "Execute %s" % qs) + # Finish commit + LOG('ZMySQLDDA', INFO, "FINISH commit") + try: + try: + if self._mysql_lock: + self.db.query("SELECT RELEASE_LOCK('%s')" % self._mysql_lock) + self.db.store_result() + if self._transactions: + self.db.query("COMMIT") + self.db.store_result() + except: + LOG('ZMySQLDDA', ERROR, "exception during _finish", + error=sys.exc_info()) + raise + finally: + self._tlock.release() + + def _abort(self, *ignored): + from thread import get_ident + if not self._tlock.locked() or self._tthread != get_ident(): + LOG('ZMySQLDDA', INFO, "ignoring _abort") + return + self._tlock.release() \ No newline at end of file diff --git a/product/ZMySQLDDA/deferredConnectionAdd.dtml b/product/ZMySQLDDA/deferredConnectionAdd.dtml new file mode 100755 index 0000000000000000000000000000000000000000..73581b10f9eadfdcc5c24393c3e88897fd54c71e --- /dev/null +++ b/product/ZMySQLDDA/deferredConnectionAdd.dtml @@ -0,0 +1,92 @@ +<html> + <head><title>Add Z MySQL Database Connection</title></head> + <body bgcolor="#FFFFFF" link="#000099" vlink="#555555" alink="#77003B"> + + <h2>Add Z MySQL Database Connection</h2> + + <form action="manage_addZMySQLDeferredConnection" method="POST"> + <table cellspacing="2"> + <tr> + <th align="LEFT" valign="TOP">Id</th> + <td align="LEFT" valign="TOP"> + <input type="TEXT" name="id" size="40" + value="MySQL_database_connection"> + </td> + </tr> + <tr> + <th align="LEFT" valign="TOP"><em>Title</em></th> + <td align="LEFT" valign="TOP"> + <input type="TEXT" name="title" size="40" + value="Z MySQL Database Connection"> + </td> + </tr> + <tr> + <th align="LEFT" valign="TOP"> + Enter a Database Connection String + <a href="#1"><sup>1</sup></a></th> + <td align="LEFT" valign="TOP"> + <input type="TEXT" name="connection_string" size="40"> + </td> + </tr> + <tr> + <th align="LEFT" valign="TOP">Connect immediately</th> + <td align="LEFT" valign="TOP"> + <input name="check" type="CHECKBOX" value="YES" CHECKED> + </td> + </tr> + <tr> + <td></td> + <td><br><input type="SUBMIT" value="Add"></td> + </tr> + </table> + </form> + + + +<dt><a hname="1"><sup>1</sup></a> Connection Strings</dt> +<dd> +<p> + The connection string used for Z MySQL Database Connection + is of the form: +<pre> + [*lock] [+/-][database][@host[:port]] [user [password [unix_socket]]] +</pre> + or typically: +<pre> + database user password +</pre> + to use a MySQL server on localhost via the standard UNIX socket. + Only specify host if the server is on a remote system. You can + use a non-standard port, if necessary. Hint: To use a non-standard + port on the local system, use 127.0.0.1 for the host instead of + localhost. +<p> + Either a database or a host or both must be specified. +<p> + If the UNIX socket is in a non-standard location, you can specify + the full path to it after the password. +<p> + A '-' in front of the database tells ZMySQLDA to not use Zope's + Transaction Manager, even if the server supports transactions. A + '+' in front of the database tells ZMySQLDA that it must use + transactions; an exception will be raised if they are not + supported by the server. If neither '-' or '+' are present, then + transactions will be enabled if the server supports them. If you + are using non-transaction safe tables (TSTs) on a server that + supports TSTs, use '-'. If you require transactions, use '+'. If + you aren't sure, don't use either. +<p> + *<em>lock</em> at the begining of the connection string means to + psuedo-transactional. When the transaction begins, it will acquire + a lock on the server named <em>lock</em> (i.e. MYLOCK). When the + transaction commits, the lock will be released. If the transaction + is aborted and restarted, which can happen due to a ConflictError, + you'll get an error in the logs, and inconsistent data. In this + respect, it's equivalent to transactions turned off. +<p> + Transactions are highly recommended. Using a named lock in + conjunctions with transactions is probably pointless. +</dd></dl> + + </body> +</html> diff --git a/product/ZMySQLDDA/help/DA.py b/product/ZMySQLDDA/help/DA.py new file mode 100755 index 0000000000000000000000000000000000000000..86051d8ee460a88ff34a821df3774159d38a87d1 --- /dev/null +++ b/product/ZMySQLDDA/help/DA.py @@ -0,0 +1,61 @@ +def manage_addZMySQLDeferredConnection(self, id, title, + connection_string, + check=None, REQUEST=None): + """Add a MySQL deferred connection to a folder. + + Arguments: + + REQUEST -- The current request + + title -- The title of the ZMySQLDA Connection (string) + + id -- The id of the ZMySQLDA Connection (string) + + connection_string -- The connection string is of the form: + + '[*lock] [+/-][database][@host[:port]] [user [password [unix_socket]]]' + + or typically: + + 'database user password' + + to use a MySQL server on localhost via the standard UNIX + socket. Only specify host if the server is on a remote + system. You can use a non-standard port, if necessary. If the + UNIX socket is in a non-standard location, you can specify the + full path to it after the password. Hint: To use a + non-standard port on the local system, use 127.0.0.1 for the + host instead of localhost. + + Either a database or a host or both must be specified. + + A '-' in front of the database tells ZMySQLDA to not use + Zope's Transaction Manager, even if the server supports + transactions. A '+' in front of the database tells ZMySQLDA + that it must use transactions; an exception will be raised if + they are not supported by the server. If neither '-' or '+' + are present, then transactions will be enabled if the server + supports them. If you are using non-transaction safe tables + (TSTs) on a server that supports TSTs, use '-'. If you require + transactions, use '+'. If you aren't sure, don't use either. + + *lock at the begining of the connection string means to + psuedo-transactional. When the transaction begins, it will + acquire a lock on the server named lock (i.e. MYLOCK). When + the transaction commits, the lock will be released. If the + transaction is aborted and restarted, which can happen due to + a ConflictError, you'll get an error in the logs, and + inconsistent data. In this respect, it's equivalent to + transactions turned off. + + Transactions are highly recommended. Using a named lock in + conjunctions with transactions is probably pointless. + + """ + +class DeferredConnection: + """MySQL Deferred Connection Object""" + + __constructor__ = manage_addZMySQLConnection + + diff --git a/product/ZMySQLDDA/help/DABase.py b/product/ZMySQLDDA/help/DABase.py new file mode 100755 index 0000000000000000000000000000000000000000..d6fbff1464c62b27d268e3d8cbcb625aa207643c --- /dev/null +++ b/product/ZMySQLDDA/help/DABase.py @@ -0,0 +1,35 @@ +def manage_addZMySQLDeferredConnection(self, id, title, + connection_string, + check=None, REQUEST=None): + """Add a MySQL deferred connection to a folder. + + Arguments: + + REQUEST -- The current request + + title -- The title of the ZMySQLDA Connection (string) + + id -- The id of the ZMySQLDA Connection (string) + + connection_string -- The connection string is of the form: + + 'database[@host[:port]] [user [password [unix_socket]]]' + + or typically: + + 'database user password' + + to use a MySQL server on localhost via the standard UNIX socket. + Only specify host if the server is on a remote system. You can + use a non-standard port, if necessary. If the UNIX socket is in + a non-standard location, you can specify the full path to it + after the password. + + """ + +class DeferredConnection: + """MySQL Deferred Connection Object""" + + __constructor__ = manage_addZMySQLConnection + + diff --git a/product/ZMySQLDDA/help/db.py b/product/ZMySQLDDA/help/db.py new file mode 100755 index 0000000000000000000000000000000000000000..78f7c9d74bc3164a51b1ea8a045ca082357f2fed --- /dev/null +++ b/product/ZMySQLDDA/help/db.py @@ -0,0 +1,28 @@ +class DB: + + """This is the ZMySQLDDA Database Deferred Connection Object.""" + + def __init__(self,connection): + """ + connection + blah blah + """ + + def tables(self, rdb=0, + _care=('TABLE', 'VIEW')): + """Returns a list of tables in the current database.""" + + def columns(self, table_name): + """Returns a list of column descriptions for 'table_name'.""" + + def query(self,query_string, max_rows=1000): + """Execute 'query_string' and return at most 'max_rows'.""" + + def _begin(self, *ignored): + """Begin a transaction (when TM is enabled).""" + + def _finish(self, *ignored): + """Commit a transaction (when TM is enabled).""" + + def _abort(self, *ignored): + """Rollback a transaction (when TM is enabled).""" diff --git a/product/ZMySQLDDA/icons/bin.gif b/product/ZMySQLDDA/icons/bin.gif new file mode 100755 index 0000000000000000000000000000000000000000..e4691265687b23c83b3032da963526c0b3a8e526 Binary files /dev/null and b/product/ZMySQLDDA/icons/bin.gif differ diff --git a/product/ZMySQLDDA/icons/date.gif b/product/ZMySQLDDA/icons/date.gif new file mode 100755 index 0000000000000000000000000000000000000000..0d88a57343f8a727924fd2fc1bad32c4ecb5b24d Binary files /dev/null and b/product/ZMySQLDDA/icons/date.gif differ diff --git a/product/ZMySQLDDA/icons/datetime.gif b/product/ZMySQLDDA/icons/datetime.gif new file mode 100755 index 0000000000000000000000000000000000000000..faa540b11f97cfba8c689dcbf1162de4c51c4a63 Binary files /dev/null and b/product/ZMySQLDDA/icons/datetime.gif differ diff --git a/product/ZMySQLDDA/icons/field.gif b/product/ZMySQLDDA/icons/field.gif new file mode 100755 index 0000000000000000000000000000000000000000..9bf8692be6c734783164f7c8df4a99c7696c6635 Binary files /dev/null and b/product/ZMySQLDDA/icons/field.gif differ diff --git a/product/ZMySQLDDA/icons/float.gif b/product/ZMySQLDDA/icons/float.gif new file mode 100755 index 0000000000000000000000000000000000000000..dd427299369f706417724103e20b3b5c89480ffd Binary files /dev/null and b/product/ZMySQLDDA/icons/float.gif differ diff --git a/product/ZMySQLDDA/icons/int.gif b/product/ZMySQLDDA/icons/int.gif new file mode 100755 index 0000000000000000000000000000000000000000..ef2c5e3690d5b55e816b388c1112b58c9f55aee2 Binary files /dev/null and b/product/ZMySQLDDA/icons/int.gif differ diff --git a/product/ZMySQLDDA/icons/stable.gif b/product/ZMySQLDDA/icons/stable.gif new file mode 100755 index 0000000000000000000000000000000000000000..acdd37df61c44de3b08fa95c8302e6702a423da5 Binary files /dev/null and b/product/ZMySQLDDA/icons/stable.gif differ diff --git a/product/ZMySQLDDA/icons/table.gif b/product/ZMySQLDDA/icons/table.gif new file mode 100755 index 0000000000000000000000000000000000000000..cce83beaf96b7d4e6147e7c6a18c975c541df349 Binary files /dev/null and b/product/ZMySQLDDA/icons/table.gif differ diff --git a/product/ZMySQLDDA/icons/text.gif b/product/ZMySQLDDA/icons/text.gif new file mode 100755 index 0000000000000000000000000000000000000000..a2e5aab6f29769c52dff27f822fc9da76f0be924 Binary files /dev/null and b/product/ZMySQLDDA/icons/text.gif differ diff --git a/product/ZMySQLDDA/icons/time.gif b/product/ZMySQLDDA/icons/time.gif new file mode 100755 index 0000000000000000000000000000000000000000..6d089150008c5f5e5d35771e238266d2e0f37cc5 Binary files /dev/null and b/product/ZMySQLDDA/icons/time.gif differ diff --git a/product/ZMySQLDDA/icons/view.gif b/product/ZMySQLDDA/icons/view.gif new file mode 100755 index 0000000000000000000000000000000000000000..71b30de161aa4c99d3f09e19aa7fcf9a7d1e1757 Binary files /dev/null and b/product/ZMySQLDDA/icons/view.gif differ diff --git a/product/ZMySQLDDA/icons/what.gif b/product/ZMySQLDDA/icons/what.gif new file mode 100755 index 0000000000000000000000000000000000000000..8b5516e397d2684c0ee4628ddd2730964e07bee0 Binary files /dev/null and b/product/ZMySQLDDA/icons/what.gif differ diff --git a/product/ZMySQLDDA/table_info.dtml b/product/ZMySQLDDA/table_info.dtml new file mode 100755 index 0000000000000000000000000000000000000000..639c23fd14c5fcc2bea839bc5db3458cf90e2dcf --- /dev/null +++ b/product/ZMySQLDDA/table_info.dtml @@ -0,0 +1,7 @@ +<dtml-var standard_html_header> + +<dtml-var TABLE_TYPE><dtml-if TABLE_OWNER> + owned by <dtml-var TABLE_OWNER></dtml-if> +<dtml-if REMARKS><br><dtml-var REMARKS></dtml-if> + +<dtml-var standard_html_footer>