removed tine20/Zend and using patched composer zend package instead
authorPaul Mehrer <p.mehrer@metaways.de>
Thu, 17 Mar 2016 10:13:57 +0000 (11:13 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Mon, 11 Jul 2016 12:27:43 +0000 (14:27 +0200)
Change-Id: I28a763861ec760316e1ae4f1d03cc43abf1eaa14
Reviewed-on: https://gerrit.tine20.org/tine20/3354
Tested-by: jenkins user
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
51 files changed:
tine20/Zend/Auth/Adapter/Http/Abstract.php [deleted file]
tine20/Zend/Auth/Adapter/Http/Ntlm.php [deleted file]
tine20/Zend/Auth/Adapter/Http/Ntlm/Identity.php [deleted file]
tine20/Zend/Auth/Adapter/Http/Ntlm/Resolver/Interface.php [deleted file]
tine20/Zend/Auth/Adapter/Http/Ntlm/Resolver/Mock.php [deleted file]
tine20/Zend/Auth/Adapter/Http/NtlmTests.php [deleted file]
tine20/Zend/Auth/Adapter/Imap.php [deleted file]
tine20/Zend/Auth/Adapter/ModSsl.php [deleted file]
tine20/Zend/Cache/Backend/Memcached.php [deleted file]
tine20/Zend/Cache/Backend/Redis.php [deleted file]
tine20/Zend/Db/Adapter/Oracle.php [deleted file]
tine20/Zend/Db/Adapter/Pdo/Pgsql.php [deleted file]
tine20/Zend/Db/Select.php [deleted file]
tine20/Zend/Db/Table/Abstract.php [deleted file]
tine20/Zend/Filter/Empty.php [deleted file]
tine20/Zend/Http/Cookie.php [deleted file]
tine20/Zend/Json/Client.php [deleted file]
tine20/Zend/Json/Client/Exception.php [deleted file]
tine20/Zend/Json/Client/FaultException.php [deleted file]
tine20/Zend/Json/Client/HttpException.php [deleted file]
tine20/Zend/Json/Client/IntrospectException.php [deleted file]
tine20/Zend/Json/Client/Response.php [deleted file]
tine20/Zend/Json/Client/SMD.php [deleted file]
tine20/Zend/Json/Client/ServerIntrospection.php [deleted file]
tine20/Zend/Json/Client/ServerProxy.php [deleted file]
tine20/Zend/Json/Server.php [deleted file]
tine20/Zend/Log.php [deleted file]
tine20/Zend/Mail/Protocol/Abstract.php [deleted file]
tine20/Zend/Mail/Protocol/Imap.php [deleted file]
tine20/Zend/Mail/Protocol/Sieve.php [deleted file]
tine20/Zend/Mail/Storage.php [deleted file]
tine20/Zend/Mail/Transport/Array.php [deleted file]
tine20/Zend/Mime/Part.php [deleted file]
tine20/Zend/OpenId/Provider.php [deleted file]
tine20/Zend/Scheduler.php [deleted file]
tine20/Zend/Scheduler/Backend/Abstract.php [deleted file]
tine20/Zend/Scheduler/Backend/Db.php [deleted file]
tine20/Zend/Scheduler/Backend/File.php [deleted file]
tine20/Zend/Scheduler/Exception.php [deleted file]
tine20/Zend/Scheduler/Task.php [deleted file]
tine20/Zend/Scheduler/Task/Interface.php [deleted file]
tine20/Zend/Scheduler/Task/Rule.php [deleted file]
tine20/Zend/Service/Nominatim.php [deleted file]
tine20/Zend/Service/Nominatim/Result.php [deleted file]
tine20/Zend/Service/Nominatim/ResultSet.php [deleted file]
tine20/Zend/Service/Tine20.php [deleted file]
tine20/Zend/Session/Validator/IpAddress.php [deleted file]
tine20/Zend/Translate/Adapter.php [deleted file]
tine20/Zend/Translate/Adapter/GettextPo.php [deleted file]
tine20/composer.json
tine20/composer.lock

diff --git a/tine20/Zend/Auth/Adapter/Http/Abstract.php b/tine20/Zend/Auth/Adapter/Http/Abstract.php
deleted file mode 100644 (file)
index 4d73ca8..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter_Http
- * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/**
- * Abstract HTTP Authentication Adapter
- *
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter_Http
- * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Auth_Adapter_Http_Abstract
-{
-    /**
-     * Reference to the HTTP Request object
-     *
-     * @var Zend_Controller_Request_Http
-     */
-    protected $_request;
-
-    /**
-     * Reference to the HTTP Response object
-     *
-     * @var Zend_Controller_Response_Http
-     */
-    protected $_response;
-    
-    /**
-     * Reference to the session namespace
-     * 
-     * @var Zend_Session_Namespace
-     */
-    protected $_session;
-    
-    /**
-     * Whether or not to do Proxy Authentication instead of origin server
-     * authentication (send 407's instead of 401's). Off by default.
-     *
-     * @var boolean
-     */
-    protected $_imaProxy;
-    
-    /**
-     * Setter for the Request object
-     *
-     * @param  Zend_Controller_Request_Http $request
-     * @return Zend_Auth_Adapter_Http_Abstract Provides a fluent interface
-     */
-    public function setRequest(Zend_Controller_Request_Http $request)
-    {
-        $this->_request = $request;
-
-        return $this;
-    }
-
-    /**
-     * Getter for the Request object
-     *
-     * @return Zend_Controller_Request_Http
-     */
-    public function getRequest()
-    {
-        return $this->_request;
-    }
-
-    /**
-     * Setter for the Response object
-     *
-     * @param  Zend_Controller_Response_Http $response
-     * @return Zend_Auth_Adapter_Http_Abstract Provides a fluent interface
-     */
-    public function setResponse(Zend_Controller_Response_Http $response)
-    {
-        $this->_response = $response;
-
-        return $this;
-    }
-
-    /**
-     * Getter for the Response object
-     *
-     * @return Zend_Controller_Response_Http
-     */
-    public function getResponse()
-    {
-        return $this->_response;
-    }
-    
-    /**
-     * Setter for the _resolver property
-     *
-     * @param  Zend_Auth_Adapter_Http_Resolver_Interface $resolver
-     * @return Zend_Auth_Adapter_Http_Abstract Provides a fluent interface
-     */
-    public function setResolver($resolver)
-    {
-        $this->_resolver = $resolver;
-
-        return $this;
-    }
-
-    /**
-     * Getter for the _resolver property
-     *
-     * @return Zend_Auth_Adapter_Http_Resolver_Interface
-     */
-    public function getResolver()
-    {
-        return $this->_resolver;
-    }
-    
-    /**
-     * Setter for the _session property
-     *
-     * @param  Zend_Session_Namespace $session
-     * @return Zend_Auth_Adapter_Http_Abstract Provides a fluent interface
-     */
-    public function setSession($session)
-    {
-        $this->_session = $session;
-
-        return $this;
-    }
-
-    /**
-     * Getter for the _session property
-     *
-     * @return Zend_Session_Namespace
-     */
-    public function getSession()
-    {
-        return $this->_session;
-    }
-    
-    /**
-     * Challenge Client
-     *
-     * Sets a 401 or 407 Unauthorized response code, and creates the
-     * appropriate Authenticate header(s) to prompt for credentials.
-     *
-     * @return Zend_Auth_Result Always returns a non-identity Auth result
-     */
-    protected function _challengeClient()
-    {
-        if ($this->_imaProxy) {
-            $statusCode = 407;
-            $headerName = 'Proxy-Authenticate';
-        } else {
-            $statusCode = 401;
-            $headerName = 'WWW-Authenticate';
-        }
-
-        $this->_response->setHttpResponseCode($statusCode);
-
-        $this->_response->setHeader($headerName, $this->_getAuthHeader());
-        return new Zend_Auth_Result(
-            Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID,
-            array(),
-            array('Invalid or absent credentials; challenging client')
-        );
-    }
-}
\ No newline at end of file
diff --git a/tine20/Zend/Auth/Adapter/Http/Ntlm.php b/tine20/Zend/Auth/Adapter/Http/Ntlm.php
deleted file mode 100644 (file)
index 0edbb1e..0000000
+++ /dev/null
@@ -1,675 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter_Http
- * @version    $Id$
- */
-
-
-/**
- * @see Zend_Auth_Adapter_Http_Abstract
- */
-require_once 'Zend/Auth/Adapter/Http/Abstract.php';
-
-
-/**
- * NTLM Authentication Protocol and Security Support Provider
- * 
- * @see http://davenport.sourceforge.net/ntlm.html
- * @see http://ubiqx.org/cifs/SMB.html
- * @see http://technet.microsoft.com/de-de/magazine/2006.08.securitywatch(en-us).aspx
- * 
- * @todo add NTLMv1 support, as we can't prohibit sending v1 blobs anyway
- * 
- * IMPORTANT NOTE: quoting section 2.8.5.7 from  
- *  http://ubiqx.org/cifs/SMB.html: "The use of NTLMv2 is
- *  not negotiated between the client and server. There is 
- *  nothing in the protocol to determine which challenge/response 
- *  algorithms should be used."
- */
-class Zend_Auth_Adapter_Http_Ntlm extends Zend_Auth_Adapter_Http_Abstract
-{
-    /**
-     * Indicates that Unicode strings are supported for use in security buffer data.
-     */
-    const FLAG_NEGOTIATE_UNICODE = 0x00000001;
-    /**
-     * Indicates that OEM strings are supported for use in security buffer data.
-     */
-    const FLAG_NEGOTIATE_OEM = 0x00000002;
-    /**
-     * Requests that the server's authentication realm be included in the Type 2 message.
-     */
-    const FLAG_REQUEST_TARGET = 0x00000004;
-    /**
-     * Specifies that authenticated communication between the client and server should 
-     * carry a digital signature (message integrity).
-     */
-    const FLAG_NEGOTIATE_SIGN = 0x00000010;
-    /**
-     * Specifies that authenticated communication between the client and server should 
-     * be encrypted (message confidentiality).
-     */
-    const FLAG_NEGOTIATE_SEAL = 0x00000020;
-    /**
-     * Indicates that datagram authentication is being used.
-     */
-    const FLAG_NEGOTIATE_DATAGRAM_STYLE = 0x00000040;
-    /**
-     * Indicates that the Lan Manager Session Key should be used for signing and sealing 
-     * authenticated communications.
-     */
-    const FLAG_NEGOTIATE_LAN_MANAGER_KEY = 0x00000080;
-    /**
-     * Indicates that NTLM authentication is being used.
-     */
-    const FLAG_NEGOTIATE_NTLM = 0x00000200;
-    /**
-     * Sent by the client in the Type 3 message to indicate that an anonymous context has 
-     * been established. This also affects the response fields
-     */
-    const FLAG_NEGOTIATE_ANONYMOUS = 0x00000800;
-    /**
-     * Sent by the client in the Type 1 message to indicate that the name of the domain in 
-     * which the client workstation has membership is included in the message. This is used 
-     * by the server to determine whether the client is eligible for local authentication.
-     */
-    const FLAG_NEGOTIATE_DOMAIN_SUPPLIED = 0x00001000;
-    /**
-     * Sent by the client in the Type 1 message to indicate that the client workstation's 
-     * name is included in the message. This is used by the server to determine whether the 
-     * client is eligible for local authentication.
-     */
-    const FLAG_NEGOTIATE_WORKSTATION_SUPPLIED = 0x00002000;
-    /**
-     * Sent by the server to indicate that the server and client are on the same machine. 
-     * Implies that the client may use the established local credentials for authentication 
-     * instead of calculating a response to the challenge.
-     */
-    const FLAG_NEGOTIATE_LOCAL_CALL = 0x00004000;
-    /**
-     * Indicates that authenticated communication between the client and server should be 
-     * signed with a "dummy" signature.
-     */
-    const FLAG_NEGOTIATE_ALWAYS_SIGN = 0x00008000;
-    /**
-     * Sent by the server in the Type 2 message to indicate that the target authentication 
-     * realm is a domain.
-     */
-    const FLAG_TARGET_TYPE_DOMAIN = 0x00010000;
-    /**
-     * Sent by the server in the Type 2 message to indicate that the target authentication 
-     * realm is a server.
-     */
-    const FLAG_TARGET_TYPE_SERVER = 0x00020000;
-    /**
-     * Sent by the server in the Type 2 message to indicate that the target authentication 
-     * realm is a share. Presumably, this is for share-level authentication. Usage is unclear.
-     */
-    const FLAG_TARGET_TYPE_SHARE = 0x00040000;
-    /**
-     * Indicates that the NTLM2 signing and sealing scheme should be used for protecting 
-     * authenticated communications. Note that this refers to a particular session security 
-     * scheme, and is not related to the use of NTLMv2 authentication. This flag can,however, 
-     * have an effect on the response calculations
-     */
-    const FLAG_NEGOTIATE_NTLM2_KEY = 0x00080000;
-    /**
-     * Sent by the server in the Type 2 message to indicate that it is including a Target 
-     * Information block in the message. The Target Information block is used in the 
-     * calculation of the NTLMv2 response.
-     */
-    const FLAG_NEGOTIATE_TARGET_INFO = 0x00800000;
-    /**
-     * Indicates that 128-bit encryption is supported.
-     */
-    const FLAG_NEGOTIATE_128 = 0x20000000;
-    /**
-     * Indicates that the client will provide an encrypted master key in the "Session Key" 
-     * field of the Type 3 message.
-     */
-    const FLAG_NEGOTIATE_KEY_EXCHANGE = 0x40000000;
-    /**
-     * Indicates that 56-bit encryption is supported.
-     */
-    const FLAG_NEGOTIATE_56 = 0x80000000;
-    
-    /**
-     * names for buffers
-     */
-    const BUFFER_DOMAIN         = 'domain';
-    const BUFFER_WORKSTATION    = 'workstation';
-    const BUFFER_TARGETNAME     = 'targetname';
-    const BUFFER_TARGETINFO     = 'targetinfo';
-    const BUFFER_LMRESPONSE     = 'lmresponse';
-    const BUFFER_NTLMRESPONSE   = 'ntlmresponse';
-    const BUFFER_USERNAME       = 'username';
-    const BUFFER_SESSIONKEY     = 'sessionkey';
-    
-    /**
-     * auth targets server name
-     */
-    const TARGETINFO_SERVER = 'servername';
-    /**
-     * auth targets domain name
-     */
-    const TARGETINFO_DOMAIN = 'domain';
-    /**
-     * auth targets fully-qualified DNS host name (i.e., server.domain.com)
-     */
-    const TARGETINFO_FQSERVER = 'fqserver';
-    /**
-     * auth DNS domain name (i.e., domain.com)
-     */
-    const TARGETINFO_DNSDOMAIN = 'dnsdomain';
-    
-    /**
-     * map where to find start of security buffers
-     * 
-     * @var array $messageNumber => array $buffer => location in hex string
-     */
-    protected $_securityBufferMap = array(
-        1 => array(
-            self::BUFFER_DOMAIN       => 32,
-            self::BUFFER_WORKSTATION  => 48
-        ),
-        2 => array(
-            self::BUFFER_TARGETNAME   => 24,
-            self::BUFFER_TARGETINFO   => 80
-        ),
-        3 => array(
-            self::BUFFER_LMRESPONSE   =>  24,
-            self::BUFFER_NTLMRESPONSE =>  40,
-            self::BUFFER_TARGETNAME   =>  56,
-            self::BUFFER_USERNAME     =>  72,
-            self::BUFFER_WORKSTATION  =>  88,
-            self::BUFFER_SESSIONKEY   => 104,
-        )
-    );
-    
-    /**
-     * indicators in targetdata
-     *  
-     * @var array
-     */
-    protected $_targetInfoBufferTypMap = array(
-        self::TARGETINFO_DOMAIN     => 2,
-        self::TARGETINFO_SERVER     => 1,
-        self::TARGETINFO_DNSDOMAIN  => 4,
-        self::TARGETINFO_FQSERVER   => 3,
-    );
-    
-    /**
-     * @var Zend_Log
-     */
-    protected $_log;
-    
-    /**
-     * @var Zend_Auth_Adapter_Http_Ntlm_Resolver_Interface
-     */
-    protected $_resolver;
-    
-    /**
-     * @var string current client message
-     */
-    protected $_ntlmMessage;
-    
-    /**
-     * @var int server flags
-     */
-    protected $_serverFlags;
-    
-    /**
-     * @var array infos about the client
-     */
-    protected $_clientInfo;
-    
-    /**
-     * @var array auth target info
-     */
-    protected $_targetInfo = array();
-    
-    /**
-     * the constructor
-     * 
-     * @param  array $config
-     * @return void
-     */
-    public function __construct(array $config = array())
-    {
-        if ((isset($config['log']) || array_key_exists('log', $config)) && $config['log'] instanceof Zend_Log) {
-            $this->_log = $config['log'];
-        } else {
-            $this->_log = new Zend_Log(new Zend_Log_Writer_Null());
-        }
-        
-        if ((isset($config['resolver']) || array_key_exists('resolver', $config)) /*&& $config['resolver'] instanceof Zend_Auth_Adapter_Http_Resolver_Interface*/) {
-            $this->setResolver($config['resolver']);
-        }
-        
-        if ((isset($config['session']) || array_key_exists('session', $config)) && $config['session'] instanceof Zend_Session_Namespace) {
-            $this->setSession($config['session']);
-        }
-        
-        if ((isset($config['challenge']) || array_key_exists('challenge', $config))) {
-            $this->_challenge = $config['challenge'];
-        }
-        
-        if ((isset($config['targetInfo']) || array_key_exists('targetInfo', $config))) {
-            $this->_targetInfo = $config['targetInfo'];
-        }
-        
-        if (! (isset($config['serverFlags']) || array_key_exists('serverFlags', $config))) {
-            $config['serverFlags'] = dechex(
-                (0x00000000 | self::FLAG_NEGOTIATE_UNICODE | self::FLAG_NEGOTIATE_NTLM)
-            );
-        }
-        
-        $this->setServerFlags($config['serverFlags']);
-        
-        
-        // to be removed
-        $this->_request = new Zend_Controller_Request_Http();
-        $this->_response = new Zend_Controller_Response_Http();
-    }
-    
-    /**
-     * Authenticate
-     *
-     * @throws Zend_Auth_Adapter_Exception
-     * @return Zend_Auth_Result
-     */
-    public function authenticate()
-    {
-        $authHeader = $this->getRequest()->getHeader('Authorization');
-        
-        if (! $authHeader) {
-            return $this->_challengeClient();
-        }
-        
-        if (substr($authHeader, 0, 5) !== 'NTLM ') {
-            /**
-             * @see Zend_Auth_Adapter_Exception
-             */
-            require_once 'Zend/Auth/Adapter/Exception.php';
-            throw new Zend_Auth_Adapter_Exception('Unexpected authentication scheme');
-        }
-        
-        $authMessage = base64_decode(substr($authHeader, 5));
-        if (substr($authMessage, 0, 7) != "NTLMSSP") {
-            /**
-             * @see Zend_Auth_Adapter_Exception
-             */
-            require_once 'Zend/Auth/Adapter/Exception.php';
-            throw new Zend_Auth_Adapter_Exception('Unexpected client response');
-        }
-        
-        $this->_ntlmMessage = bin2hex($authMessage);
-        $this->_log->INFO("client send ntlm message #{$this->_getMessageNumber()}");
-        $this->_log->DEBUG("ntlmMessage #{$this->_getMessageNumber()}: {$this->_ntlmMessage}");
-        
-        if ($this->_getMessageNumber() === 3) {
-            return $this->_authenticateClient();
-        }
-        
-        return $this->_challengeClient();
-    }
-    
-    /**
-     * return message flags
-     * 
-     * @return int
-     */
-    public function getClientFlags()
-    {
-        $offset = $this->_getMessageNumber() == 1 ? 24 : 120;
-        $leFlags = substr($this->_ntlmMessage, $offset, 8);
-        
-        $flags = $this->leHex2hex($leFlags);
-        
-        return hexdec($flags);
-    }
-    
-    /**
-     * returns client info
-     * @return array
-     */
-    public function getClientInfo()
-    {
-        if (! empty($this->_clientInfo)) {
-            return $this->_clientInfo;
-        } else {
-            $clientFlags = $this->getClientFlags();
-            $this->_clientInfo = array();
-        }
-        
-        
-        // message 1 info
-        if ($this->_getMessageNumber() == 1) {
-            if ($clientFlags & self::FLAG_NEGOTIATE_DOMAIN_SUPPLIED) {
-                $this->_clientInfo[self::BUFFER_DOMAIN] = $this->_getBufferData(self::BUFFER_DOMAIN, FALSE);
-            }
-            
-            if ($clientFlags & self::FLAG_NEGOTIATE_WORKSTATION_SUPPLIED) {
-                $this->_clientInfo[self::BUFFER_WORKSTATION] = $this->_getBufferData(self::BUFFER_WORKSTATION, FALSE);
-            }
-        }
-        
-        // message 3 info
-        if ($this->_getMessageNumber() == 3) {
-            $this->_clientInfo = array(
-                self::BUFFER_USERNAME => $this->_getBufferData(self::BUFFER_USERNAME),
-                self::BUFFER_WORKSTATION => $this->_getBufferData(self::BUFFER_WORKSTATION),
-                self::BUFFER_TARGETNAME => $this->_getBufferData(self::BUFFER_TARGETNAME),
-            );
-        }
-        
-        
-        return $this->_clientInfo;
-    }
-    
-    /**
-     * returns server flags (hex representation)
-     * 
-     * $param  $asLittleEndian
-     * @return string 
-     */
-    public function getServerFlags($asLittleEndian = TRUE)
-    {
-        return $asLittleEndian ? 
-            bin2hex(pack('V', $this->_serverFlags)) :
-            dechex($this->_serverFlags);
-    }
-    
-    /**
-     * sets server falgs from hex representation
-     * 
-     * @param string $flags in hex representation
-     * @return int
-     */
-    public function setServerFlags($flags)
-    {
-        $this->_serverFlags = hexdec($flags);
-        
-        $this->_serverFlags |= self::FLAG_NEGOTIATE_TARGET_INFO;
-        
-        if (! ($this->_serverFlags & (self::FLAG_TARGET_TYPE_SERVER | self::FLAG_TARGET_TYPE_SHARE))) {
-            $this->_serverFlags |= self::FLAG_TARGET_TYPE_DOMAIN;
-        }
-        
-        return $this->_serverFlags;
-    }
-    
-    public function setTargetInfo($target)
-    {
-        $this->_targetInfo = $target;
-    }
-    
-    /**
-     * authenticates ntlm client (response to message 3)
-     * 
-     * @return Zend_Auth_Result
-     */
-    protected function _authenticateClient()
-    {
-        $resolver = $this->getResolver();
-        if (! $resolver) {
-            /**
-             * @see Zend_Auth_Adapter_Exception
-             */
-            require_once 'Zend/Auth/Adapter/Exception.php';
-            throw new Zend_Auth_Adapter_Exception('A resolver object must be set before doing NTLM authentication');
-        }
-        
-        $ntlmResponse = $this->_getBufferData(self::BUFFER_NTLMRESPONSE, FALSE);
-        
-        $clientBlob     = substr($ntlmResponse, 16);
-        $clientBlobHash = substr($ntlmResponse, 0, 16);
-        
-        $userName = $this->_getBufferData(self::BUFFER_USERNAME);
-        $authTarget = $this->_getBufferData(self::BUFFER_TARGETNAME);
-        
-        $md4hash = $resolver->resolve($userName);
-        if (!$md4hash) {
-            /**
-             * @see Zend_Auth_Adapter_Exception
-             */
-            require_once 'Zend/Auth/Adapter/Exception.php';
-            throw new Zend_Auth_Adapter_Exception('Could not resolve shared secret');
-        }
-        
-        $NTLMv2hash = hash_hmac('md5', $this->toUTF16LE(strtoupper($userName) . $authTarget), $md4hash, TRUE);
-        $blobHash = hash_hmac('md5', pack('H*', $this->_getChallenge()) . $clientBlob, $NTLMv2hash, TRUE);
-        
-        // destroy challenge
-        if ($this->getSession() instanceof Zend_Session_Namespace) {
-            unset($this->getSession()->ntlmchallenge);
-        }
-        
-        $identity = new Zend_Auth_Adapter_Http_Ntlm_Identity(array(
-            'ntlmData' => $this->_clientInfo
-        ));
-        
-        if ($clientBlobHash == $blobHash) {
-            return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $identity);
-        } else {
-            return $this->_challengeClient();
-        }
-    }
-        
-    /**
-     * (non-PHPdoc)
-     * @see tine20/Zend/Auth/Http/Zend_Auth_Adapter_Http_Abstract#_challengeClient()
-     */
-    protected function _challengeClient()
-    {
-        $result = parent::_challengeClient();
-        
-        // include identity from message 1
-        return new Zend_Auth_Result(
-            $result->getCode(),
-            new Zend_Auth_Adapter_Http_Ntlm_Identity(array(
-                'flags' => $this->getClientFlags(),
-                'ntlmData' => $this->getClientInfo()
-            )),
-            $result->getMessages()
-        );
-    }
-    
-    protected function _getAuthHeader()
-    {
-        $header = 'NTLM';
-        
-        if ($this->_getMessageNumber() === 1) {
-            $message2 = $this->_getChallengeMessage();
-            $header .= ' ' . trim(base64_encode(pack('H*', $message2)));
-        }
-        
-        return $header;
-    }
-    
-    /**
-     * generates challenge (message 2)
-     * 
-     * @return string hex
-     */
-    protected function _getChallengeMessage()
-    {
-        $clientFlags = $this->getClientFlags();
-        
-        $useNTLM2SessionSecurity = $clientFlags & self::FLAG_NEGOTIATE_NTLM2_KEY;
-        $this->_log->INFO("client " . ($useNTLM2SessionSecurity ? 'supports' : " dosn't") . ' NTLM2 Session Security');
-        
-        // force NTLM2 as this implies NTLMv2 or NTLM2 session response
-        //$this->_serverFlags |= self::FLAG_NEGOTIATE_NTLM2_KEY;
-        
-        // todo: decide by serverFlags
-        $targetInfoBuffer = $this->_getTargetInfoBuffer($this->_targetInfo);
-        
-        // todo: decide by serverFlags
-        $targetNameBuffer = bin2hex($this->toUTF16LE($this->_targetInfo[self::TARGETINFO_DOMAIN]));
-        
-        // base offset to first buffer
-        $offset = 48;
-        
-        $message2 = 
-            '4e544c4d53535000'.                             // NTLMSSP Signature
-            '02000000'.                                     // Type 2 Indicator
-            bin2hex(pack('vvV',                             // Target Name Security Buffer
-                strlen($targetNameBuffer)/2,                //   - Length
-                strlen($targetNameBuffer)/2,                //   - Allocated Space
-                $offset                                     //   - Offset
-            )).
-            $this->getServerFlags().                        // Flags
-            $this->_getChallenge().                         // Challenge
-            '0000000000000000'.                             // Context
-            bin2hex(pack('vvV',                             // Target Information Security Buffer
-                strlen($targetInfoBuffer)/2,                //   - Length
-                strlen($targetInfoBuffer)/2,                //   - Allocated Space
-                $offset += strlen($targetNameBuffer)/2      //   - Offset
-            )).
-            $targetNameBuffer.
-            $targetInfoBuffer;
-            
-        $this->_log->INFO('server generated ntlm message #2');
-        $this->_log->DEBUG("ntlmMessage #2: $message2");
-        
-        return $message2;
-    }
-    
-    /**
-     * generates random challenge 
-     * 
-     * @return string
-     */
-    protected function _getChallenge()
-    {
-        if (! empty($this->_challenge)) {
-            return $this->_challenge;
-        }
-        
-        $session = $this->getSession();
-        if (! $session instanceof Zend_Session_Namespace) {
-            /**
-             * @see Zend_Auth_Adapter_Exception
-             */
-            require_once 'Zend/Auth/Adapter/Exception.php';
-            throw new Zend_Auth_Adapter_Exception('session is not set');
-        }
-        
-        if (empty($session->ntlmchallenge)) {
-            $session->ntlmchallenge = $this->generateChallenge();
-        }
-        
-        $this->_log->DEBUG("server challenge : {$session->ntlmchallenge}");
-        return $session->ntlmchallenge;
-    }
-    
-    /**
-     * returns decoded buffer data
-     * 
-     * @param  string $name
-     * @param  bool   $isUTF16LE
-     * @return string
-     */
-    protected function _getBufferData($name, $isUTF16LE = TRUE)
-    {
-        $sboffset = $this->_securityBufferMap[$this->_getMessageNumber()][$name];
-        
-        $sbhex = substr($this->_ntlmMessage, $sboffset, 16);
-        extract(unpack('vlength/vspace/Voffset', pack('H*', $sbhex)));
-        
-        $hexData = substr($this->_ntlmMessage, $offset*2, $length*2);
-        
-        $data = pack('H*', $hexData);
-        if ($isUTF16LE) {
-            $data = iconv('UTF-16LE', 'UTF-8', $data);
-        }
-        return $data;
-    }
-    
-    /**
-     * returns hex representation of given target info
-     * 
-     * @param  array $targetInfo
-     * @return string
-     */
-    protected function _getTargetInfoBuffer(array $targetInfo)
-    {
-        $buffer = '';
-        foreach ($this->_targetInfoBufferTypMap as $type => $typeIdentifier) {
-            $data = (isset($targetInfo[$type]) || array_key_exists($type, $targetInfo)) ? $targetInfo[$type] : '';
-            $buffer .= $this->_getTargetInfoSubBuffer($type, $data);
-        }
-        
-        // terminate string (hex)
-        $buffer .= '00000000';
-        
-        return $buffer;
-    }
-    
-    /**
-     * return hex representation of given target info subblock
-     * 
-     * @param  string   $type
-     * @param  string   $data       utf8 encoded data
-     * @return string
-     */
-    protected function _getTargetInfoSubBuffer($type, $data)
-    {
-        $utf16le = $this->toUTF16LE($data);
-        return bin2hex(pack('vv', $this->_targetInfoBufferTypMap[$type], strlen($utf16le)).$utf16le);
-    }
-    
-    /**
-     * gets number of current message
-     * 
-     * @return int 
-     */
-    protected function _getMessageNumber()
-    {
-        return (int) $this->_ntlmMessage[17];
-    }
-    
-    /**
-     * converts little-endian hex string to normal hex string
-     * 
-     * @param  string $leHex
-     * @return string
-     */
-    public static function leHex2hex($leHex)
-    {
-        $l = $leHex;
-        return $l[6].$l[7].$l[4].$l[5].$l[2].$l[3].$l[0].$l[1];
-    }
-    
-    /**
-     * converts utf8 string to utf16+little-endian
-     * 
-     * @param  string $utf8
-     * @return string
-     */
-    public static function toUTF16LE($utf8) {
-        return iconv('UTF-8', 'UTF-16LE', $utf8);
-    }
-    
-    /**
-     * returns random challenge in hex representation
-     * 
-     * @return string
-     */
-    public static function generateChallenge($length = 8)
-    {
-        $hexVals = '0123456789abcdef';
-        
-        $challenge = "";
-        for ($i = 0; $i < $length*2; $i++) {
-            $challenge .= $hexVals[rand(0, 15)];
-        }
-        
-        return $challenge;
-    }
-}
\ No newline at end of file
diff --git a/tine20/Zend/Auth/Adapter/Http/Ntlm/Identity.php b/tine20/Zend/Auth/Adapter/Http/Ntlm/Identity.php
deleted file mode 100644 (file)
index a11c3bb..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-class Zend_Auth_Adapter_Http_Ntlm_Identity
-{
-    /**
-     * @var int flags
-     */
-    protected $_flags = 0;
-    
-    protected $_domain = NULL;
-    protected $_workstation = NULL;
-    
-    public function __construct(array $idData = array())
-    {
-        if ((isset($idData['flags']) || array_key_exists('flags', $idData))) {
-            $this->_flags = $idData['flags'];
-        }
-        
-    if ((isset($idData['ntlmData']) || array_key_exists('ntlmData', $idData))) {
-        
-            $which = array('domain', 'workstation');
-            foreach( (array) $idData['ntlmData'] as $key => $value) {
-                if (in_array($key, $which)) {
-                    $var = '_' . $key;
-                    $this->$var = $value;
-                }
-            }
-        }
-    }
-    
-    /**
-     * get response flags
-     * 
-     * @return int
-     */
-    public function getFlags()
-    {
-        return $this->_flags;
-    }
-    
-    public function getDomain()
-    {
-        return $this->_domain;
-    }
-    
-    public function getWorkstation()
-    {
-        return $this->_workstation;
-    }
-    
-    /**
-     * checks if flag is set in response flags
-     * 
-     * @param  int $flag
-     * @return bool
-     */
-    public function hasFlag($flag)
-    {
-        return (bool) ($this->getFlags() & $flag);
-    }
-}
\ No newline at end of file
diff --git a/tine20/Zend/Auth/Adapter/Http/Ntlm/Resolver/Interface.php b/tine20/Zend/Auth/Adapter/Http/Ntlm/Resolver/Interface.php
deleted file mode 100644 (file)
index 6f89b77..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter_Http
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/**
- * Auth HTTP NTLM Resolver Interface
- *
- * Defines an interace to resolve a username into a shared
- * secret usable by HTTP NTLM Authentication.
- *
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter_Http
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-interface Zend_Auth_Adapter_Http_Ntlm_Resolver_Interface
-{
-    /**
-     * Resolve username to password/hash/etc.
-     *
-     * @param  string $username Username
-     * @return string|false User's shared secret, if the user is found in the
-     *         realm, false otherwise.
-     */
-    public function resolve($username);
-}
\ No newline at end of file
diff --git a/tine20/Zend/Auth/Adapter/Http/Ntlm/Resolver/Mock.php b/tine20/Zend/Auth/Adapter/Http/Ntlm/Resolver/Mock.php
deleted file mode 100644 (file)
index 089e7d0..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter_Http
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/**
- * Auth HTTP NTLM Resolver Mock
- *
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter_Http
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Auth_Adapter_Http_Ntlm_Resolver_Mock implements Zend_Auth_Adapter_Http_Ntlm_Resolver_Interface
-{
-    /**
-     * Resolve username to password/hash/etc.
-     *
-     * @param  string $username Username
-     * @return string|false User's shared secret, if the user is found in the
-     *         realm, false otherwise.
-     */
-    public function resolve($username)
-    {
-        switch ($username) {
-            case 'user':
-                $ntPassword = hash('md4', Zend_Auth_Adapter_Http_Ntlm::toUTF16LE('SecREt01'), TRUE);
-                break;
-            default:
-                $ntPassword = NULL;
-                break;
-        }
-        
-        return $ntPassword;
-    }
-}
\ No newline at end of file
diff --git a/tine20/Zend/Auth/Adapter/Http/NtlmTests.php b/tine20/Zend/Auth/Adapter/Http/NtlmTests.php
deleted file mode 100644 (file)
index a7c9de2..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-
-require_once 'PHPUnit/Framework.php';
-set_include_path('.' . PATH_SEPARATOR . '../../../../library' . PATH_SEPARATOR . '../../../..' . PATH_SEPARATOR . get_include_path());
-
-require_once 'Zend/Loader/Autoloader.php';
-$autoloader = Zend_Loader_Autoloader::getInstance();
-$autoloader->setFallbackAutoloader(true);
-
-class NtlmTests extends PHPUnit_Framework_TestCase
-{
-    
-    public function setUp()
-    {
-        $this->_auth = new Zend_Auth_Adapter_Http_Ntlm(array(
-            'challenge' => '0123456789abcdef',
-        ));
-        
-        // prepare response for testing (phpunit sets headers...)
-        $this->_auth->getResponse()->headersSentThrowsException = FALSE;
-        
-        $targetInfo = array(
-            'domain'        => 'DOMAIN',
-            'servername'    => 'SERVER',
-            'dnsdomain'     => 'domain.com',
-            'fqserver'      => 'server.domain.com',
-        );
-        
-        $this->_auth->setTargetInfo($targetInfo);
-        
-        $resolver = new Zend_Auth_Adapter_Http_Ntlm_Resolver_Mock();
-        $this->_auth->setResolver($resolver);
-        
-        $m1hex = '4e544c4d53535000010000000732000006000600330000000b000b0028000000050093080000000f574f524b53544154494f4e444f4d41494e';
-        $m1bin = pack('H*', $m1hex);
-        
-        $authHeader = 'NTLM '. base64_encode($m1bin);
-        $_SERVER['HTTP_AUTHORIZATION'] = $authHeader;
-        
-    }
-    
-    public function testMessage1Decode()
-    {
-        $authResult = $this->_auth->authenticate();
-        
-        $this->assertFalse($authResult->isValid(), 'Message 1 must not authenticate');
-        
-        $identity = $authResult->getIdentity();
-        
-        // assert flags
-        $this->assertTrue($identity->hasFlag(Zend_Auth_Adapter_Http_Ntlm::FLAG_NEGOTIATE_UNICODE));
-        $this->assertTrue($identity->hasFlag(Zend_Auth_Adapter_Http_Ntlm::FLAG_NEGOTIATE_OEM));
-        $this->assertTrue($identity->hasFlag(Zend_Auth_Adapter_Http_Ntlm::FLAG_REQUEST_TARGET));
-        $this->assertTrue($identity->hasFlag(Zend_Auth_Adapter_Http_Ntlm::FLAG_NEGOTIATE_NTLM));
-        $this->assertTrue($identity->hasFlag(Zend_Auth_Adapter_Http_Ntlm::FLAG_NEGOTIATE_DOMAIN_SUPPLIED));
-        $this->assertTrue($identity->hasFlag(Zend_Auth_Adapter_Http_Ntlm::FLAG_NEGOTIATE_WORKSTATION_SUPPLIED));
-        $this->assertFalse($identity->hasFlag(Zend_Auth_Adapter_Http_Ntlm::FLAG_NEGOTIATE_NTLM2_KEY));
-        
-        // assert domain / workstatsion
-        $this->assertEquals('DOMAIN', $identity->getDomain());
-        $this->assertEquals('WORKSTATION', $identity->getWorkstation());
-    }
-    
-    public function testMessage2Encode()
-    {
-        $authResult = $this->_auth->authenticate();
-        
-        $headers = $this->_auth->getResponse()->getHeaders();
-        $hexMessage2 = bin2hex(base64_decode(substr($headers[0]['value'], 5)));
-        
-        $m2hex =    "4e544c4d53535000020000000c000c003000000001028100".
-                    "0123456789abcdef0000000000000000620062003c000000".
-                    "44004f004d00410049004e0002000c0044004f004d004100".
-                    "49004e0001000c0053004500520056004500520004001400".
-                    "64006f006d00610069006e002e0063006f006d0003002200".
-                    "7300650072007600650072002e0064006f006d0061006900".
-                    "6e002e0063006f006d0000000000";
-        
-        $this->assertEquals($m2hex, $hexMessage2);
-        
-        /*
-        echo $m2hex . "\n";
-        echo bin2hex(base64_decode(substr($headers[0]['value'], 5))) . "\n";
-        */
-    }
-    
-    public function testMessage3Decode()
-    {
-        // from document LM / NTLM responses
-        $m3v1hex =  "4e544c4d5353500003000000180018006a00000018001800".
-                    "820000000c000c0040000000080008004c00000016001600".
-                    "54000000000000009a0000000102000044004f004d004100".
-                    "49004e00750073006500720057004f0052004b0053005400".
-                    "4100540049004f004e00c337cd5cbd44fc9782a667af6d42".
-                    "7c6de67c20c2d3e77c5625a98c1c31e81847466b29b2df46".
-                    "80f39958fb8c213a9cc6";
-        
-        // captured from IE8 user/SecREt01 
-        // with HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\LSA\LMCompatibility = 3
-        // so it should be LMv2 and NTLMv2!
-        $m3v2hex =  "4e544c4d5353500003000000180018007e0000008a008a00".
-                    "96000000100010004800000008000800580000001e001e00".
-                    "600000000000000020010000050280020501280a0000000f".
-                    "310030002e0030002e0032002e0032007500730065007200".
-                    "4d0045005400410057004100590053002d00300044003000".
-                    "3800340031003a7cbeb676aa589be625cbefe881247362b2".
-                    "43f24bebcdda433b26e048254c148108da2657b700400101".
-                    "0000000000006042ae554d92ca0162b243f24bebcdda0000".
-                    "00000200000001000c005300450052005600450052000400".
-                    "140064006f006d00610069006e002e0063006f006d000300".
-                    "22007300650072007600650072002e0064006f006d006100".
-                    "69006e002e0063006f006d00000000000000000000000000";
-        
-        
-        
-        $m3bin = pack('H*', $m3v2hex);
-        
-        $authHeader = 'NTLM '. base64_encode($m3bin);
-        $_SERVER['HTTP_AUTHORIZATION'] = $authHeader;
-        
-        $authResult = $this->_auth->authenticate();
-        
-        $this->assertTrue($authResult->isValid());
-        
-    }
-    
-}
\ No newline at end of file
diff --git a/tine20/Zend/Auth/Adapter/Imap.php b/tine20/Zend/Auth/Adapter/Imap.php
deleted file mode 100644 (file)
index 210be17..0000000
+++ /dev/null
@@ -1,253 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id: Ldap.php 10020 2009-08-18 14:34:09Z j.fischer@metaways.de $
- */
-
-/**
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Auth_Adapter_Imap implements Zend_Auth_Adapter_Interface
-{
-
-    /**
-     * The Zend_Mail_Protocol_Imap context.
-     *
-     * @var Zend_Mail_Protocol_Imap
-     */
-    protected $_imap = null;
-
-    /**
-     * The array of arrays of Zend_Ldap options passed to the constructor.
-     *
-     * @var array
-     */
-    protected $_options = null;
-
-    /**
-     * The username of the account being authenticated.
-     *
-     * @var string
-     */
-    protected $_username = null;
-
-    /**
-     * The password of the account being authenticated.
-     *
-     * @var string
-     */
-    protected $_password = null;
-
-    /**
-     * Constructor
-     *
-     * @param  array  $options  An array of arrays of Zend_Ldap options
-     * @param  string $username The username of the account being authenticated
-     * @param  string $password The password of the account being authenticated
-     * @return void
-     */
-    public function __construct(array $options = array(), $username = null, $password = null)
-    {
-        $this->setOptions($options);
-        if ($username !== null) {
-            $this->setUsername($username);
-        }
-        if ($password !== null) {
-            $this->setPassword($password);
-        }
-    }
-
-    /**
-     * Returns the array of arrays of Zend_Ldap options of this adapter.
-     *
-     * @return array|null
-     */
-    public function getOptions()
-    {
-        return $this->_options;
-    }
-
-    /**
-     * Sets the array of arrays of Zend_Ldap options to be used by
-     * this adapter.
-     *
-     * @param  array $options The array of arrays of Zend_Ldap options
-     * @return Zend_Auth_Adapter_Ldap Provides a fluent interface
-     */
-    public function setOptions($options)
-    {
-        $this->_options = is_array($options) ? $options : array();
-        return $this;
-    }
-
-    /**
-     * Returns the username of the account being authenticated, or
-     * NULL if none is set.
-     *
-     * @return string|null
-     */
-    public function getUsername()
-    {
-        return $this->_username;
-    }
-
-    /**
-     * Sets the username for binding
-     *
-     * @param  string $username The username for binding
-     * @return Zend_Auth_Adapter_Ldap Provides a fluent interface
-     */
-    public function setUsername($username)
-    {
-        $this->_username = (string) $username;
-        return $this;
-    }
-
-    /**
-     * Returns the password of the account being authenticated, or
-     * NULL if none is set.
-     *
-     * @return string|null
-     */
-    public function getPassword()
-    {
-        return $this->_password;
-    }
-
-    /**
-     * Sets the passwort for the account
-     *
-     * @param  string $password The password of the account being authenticated
-     * @return Zend_Auth_Adapter_Ldap Provides a fluent interface
-     */
-    public function setPassword($password)
-    {
-        $this->_password = (string) $password;
-        return $this;
-    }
-
-    /**
-     * Returns the IMAP Object
-     *
-     * @return Zend_Mail_Protocol_Imap The Zend_Mail_Protocol_Imap object used to authenticate the credentials
-     */
-    public function getImap()
-    {
-        if ($this->_imap === null) {
-            $this->_imap = new Zend_Mail_Protocol_Imap();
-        }
-
-        return $this->_imap;
-    }
-
-    /**
-     * Set an IMAP connection
-     *
-     * @param Zend_Mail_Protocol_Imap $imao An existing IMAP object
-     * @return Zend_Auth_Adapter_Imap Provides a fluent interface
-     */
-    public function setImap(Zend_Mail_Protocol_Imap $imap)
-    {
-        $this->_imap = $imap;
-//@todo check imap->getOptions()
-        $this->setOptions(array($imap->getOptions()));
-
-        return $this;
-    }
-
-    /**
-     * Authenticate the user
-     *
-     * @throws Zend_Auth_Adapter_Exception
-     * @return Zend_Auth_Result
-     */
-    public function authenticate()
-    {
-        $messages = array();
-        $messages[0] = ''; // reserved
-        $messages[1] = ''; // reserved
-
-        $username = $this->_username;
-        $password = $this->_password;
-
-        if (!$username) {
-            $code = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND;
-            $messages[0] = 'A username is required';
-            return new Zend_Auth_Result($code, '', $messages);
-        }
-        
-        if (isset($this->_options['domain']) && ! empty($this->_options['domain'])) {
-            $imapUsername = $username . '@' . $this->_options['domain'];
-        } else {
-            $imapUsername = $username;
-        }
-        
-        if (!$password) {
-            /* A password is required because some servers will
-             * treat an empty password as an anonymous bind.
-             */
-            $code = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID;
-            $messages[0] = 'A password is required';
-            return new Zend_Auth_Result($code, '', $messages);
-        }
-
-        $imap = $this->getImap();
-
-        $code = Zend_Auth_Result::FAILURE;
-        $messages[0] = "Authority not found: $username";
-
-        $host = isset($this->_options['host']) ? $this->_options['host'] : 'localhost';
-        $port = isset($this->_options['port']) ? $this->_options['port'] : null;
-        $ssl  = isset($this->_options['ssl'])  ? strtoupper($this->_options['ssl']) : false;
-
-        $imap->connect($host, $port, $ssl);
-        if (! $imap->login($imapUsername, $password)) {
-            $code = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID;
-            $messages[0] = 'Invalid credentials for user ' . $imapUsername;
-        } else {
-            $code = Zend_Auth_Result::SUCCESS;
-            $messages[0] = 'Authentication successful.';
-        }
-
-        return new Zend_Auth_Result($code, $username, $messages);
-    }
-
-    /**
-     * Converts options to string
-     *
-     * @param  array $options
-     * @return string
-     */
-    private function _optionsToString(array $options)
-    {
-        $str = '';
-        foreach ($options as $key => $val) {
-            if ($key === 'password')
-                $val = '*****';
-            if ($str)
-                $str .= ',';
-            $str .= $key . '=' . $val;
-        }
-        return $str;
-    }
-}
diff --git a/tine20/Zend/Auth/Adapter/ModSsl.php b/tine20/Zend/Auth/Adapter/ModSsl.php
deleted file mode 100644 (file)
index 21f94e0..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-/**
- * Tine 2.0
- *
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter
- * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
- * @copyright   Copyright (c) 2009-2013 Serpro (http://www.serpro.gov.br)
- * @copyright   Copyright (c) 2013 Metaways Infosystems GmbH (http://www.metaways.de)
- * @author      Mário César Kolling <mario.koling@serpro.gov.br>
- */
-
-/**
- * DigitalCertificate authentication backend adapter
- *
- * @category   Zend
- * @package    Zend_Auth
- * @subpackage Zend_Auth_Adapter
- * @todo       get object's config parameters in __construct()
- */
-class Zend_Auth_Adapter_ModSsl implements Zend_Auth_Adapter_Interface
-{
-
-    /**
-     * Verify if client was verified by apache mod_ssl
-     *
-     * @return boolean true if we have all needed mod_ssl server variables
-     */
-    static function hasModSsl(){
-
-        // Get modssl config session
-        $config = Tinebase_Config::getInstance()->get('modssl');
-        if ($config && (!empty($_SERVER['SSL_CLIENT_CERT']) || !empty($_SERVER['HTTP_SSL_CLIENT_CERT']))
-                &&  ((!empty($_SERVER['SSL_CLIENT_VERIFY']) && $_SERVER['SSL_CLIENT_VERIFY'] == 'SUCCESS')
-                || (!empty($_SERVER['HTTP_SSL_CLIENT_VERIFY']) && $_SERVER['HTTP_SSL_CLIENT_VERIFY'] == 'SUCCESS'))) {
-            if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
-                Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ModSsl detected');
-            }
-            return true;
-        }
-
-        return false;
-
-    }
-
-    public function authenticate()
-    {
-        if (self::hasModSsl()) {
-
-            // Fix to support reverseProxy without SSLProxyEngine
-            $clientCert = !empty($_SERVER['SSL_CLIENT_CERT']) ? $_SERVER['SSL_CLIENT_CERT'] : $_SERVER['HTTP_SSL_CLIENT_CERT'];
-
-            // get Identity
-            $certificate = Custom_Auth_ModSsl_Certificate_Factory::buildCertificate($clientCert);
-            $config = Tinebase_Config::getInstance()->get('modssl');
-
-            if (class_exists($config->username_callback)) {
-                $callback = new $config->username_callback($certificate);
-            } else { // fallback to default
-                $callback = new Custom_Auth_ModSsl_UsernameCallback_Standard($certificate);
-            }
-
-            $this->setIdentity(call_user_func(array($callback, 'getUsername')));
-            $this->setCredential(null);
-            
-            if ($certificate instanceof Custom_Auth_ModSsl_Certificate_X509) {
-                if(!$certificate->isValid()) {
-                   $lines = '';
-                   foreach($certificate->getStatusErrors() as $line) {
-                       $lines .= $line . '#';
-                   }
-
-                   if (Tinebase_Core::isLogLevel(Zend_Log::ERR)) {
-                       Tinebase_Core::getLogger()->err(__METHOD__ . '::' . __LINE__ . ' ModSsl authentication for '. $this->_identity . ' failed: ' . $lines);
-                   }
-
-                   return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, $this->_identity, $certificate->getStatusErrors());
-                }
-                $messages = array('Authentication Successfull');
-
-                // If certificate is valid store it in database
-                $controller = Addressbook_Controller_Certificate::getInstance();
-                try {
-                    $controller->create(new Addressbook_Model_Certificate($certificate));
-                } catch (Tinebase_Exception_Duplicate $e) {
-                    // Fail silently if certificate already exists
-                }
-                return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $this->_identity, $messages);
-            }
-        }
-
-        return new Zend_Auth_Result(Zend_Auth_Result::FAILURE, 'Unknown User', array('Unknown Authentication Error'));
-    }
-}
diff --git a/tine20/Zend/Cache/Backend/Memcached.php b/tine20/Zend/Cache/Backend/Memcached.php
deleted file mode 100644 (file)
index 03322b4..0000000
+++ /dev/null
@@ -1,512 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Cache
- * @subpackage Zend_Cache_Backend
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- *
- * NOTE: overwritten to always clear the cache even if a CLEANING_MODE_TAG_* mode is used (-> @see clean())
- * @todo check if still needed / clearing by tag should not be used any more
- */
-
-
-/**
- * @see Zend_Cache_Backend_Interface
- */
-require_once 'Zend/Cache/Backend/ExtendedInterface.php';
-
-/**
- * @see Zend_Cache_Backend
- */
-require_once 'Zend/Cache/Backend.php';
-
-
-/**
- * @package    Zend_Cache
- * @subpackage Zend_Cache_Backend
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Cache_Backend_Memcached extends Zend_Cache_Backend implements Zend_Cache_Backend_ExtendedInterface
-{
-    /**
-     * Default Values
-     */
-    const DEFAULT_HOST = '127.0.0.1';
-    const DEFAULT_PORT =  11211;
-    const DEFAULT_PERSISTENT = true;
-    const DEFAULT_WEIGHT  = 1;
-    const DEFAULT_TIMEOUT = 1;
-    const DEFAULT_RETRY_INTERVAL = 15;
-    const DEFAULT_STATUS = true;
-    const DEFAULT_FAILURE_CALLBACK = null;
-
-    /**
-     * Log message
-     */
-    const TAGS_UNSUPPORTED_BY_CLEAN_OF_MEMCACHED_BACKEND = 'Zend_Cache_Backend_Memcached::clean() : tags are unsupported by the Memcached backend';
-    const TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND =  'Zend_Cache_Backend_Memcached::save() : tags are unsupported by the Memcached backend';
-
-    /**
-     * Available options
-     *
-     * =====> (array) servers :
-     * an array of memcached server ; each memcached server is described by an associative array :
-     * 'host' => (string) : the name of the memcached server
-     * 'port' => (int) : the port of the memcached server
-     * 'persistent' => (bool) : use or not persistent connections to this memcached server
-     * 'weight' => (int) : number of buckets to create for this server which in turn control its
-     *                     probability of it being selected. The probability is relative to the total
-     *                     weight of all servers.
-     * 'timeout' => (int) : value in seconds which will be used for connecting to the daemon. Think twice
-     *                      before changing the default value of 1 second - you can lose all the
-     *                      advantages of caching if your connection is too slow.
-     * 'retry_interval' => (int) : controls how often a failed server will be retried, the default value
-     *                             is 15 seconds. Setting this parameter to -1 disables automatic retry.
-     * 'status' => (bool) : controls if the server should be flagged as online.
-     * 'failure_callback' => (callback) : Allows the user to specify a callback function to run upon
-     *                                    encountering an error. The callback is run before failover
-     *                                    is attempted. The function takes two parameters, the hostname
-     *                                    and port of the failed server.
-     *
-     * =====> (boolean) compression :
-     * true if you want to use on-the-fly compression
-     *
-     * =====> (boolean) compatibility :
-     * true if you use old memcache server or extension
-     *
-     * @var array available options
-     */
-    protected $_options = array(
-        'servers' => array(array(
-            'host' => self::DEFAULT_HOST,
-            'port' => self::DEFAULT_PORT,
-            'persistent' => self::DEFAULT_PERSISTENT,
-            'weight'  => self::DEFAULT_WEIGHT,
-            'timeout' => self::DEFAULT_TIMEOUT,
-            'retry_interval' => self::DEFAULT_RETRY_INTERVAL,
-            'status' => self::DEFAULT_STATUS,
-            'failure_callback' => self::DEFAULT_FAILURE_CALLBACK
-        )),
-        'compression' => false,
-        'compatibility' => false,
-    );
-
-    /**
-     * Memcache object
-     *
-     * @var mixed memcache object
-     */
-    protected $_memcache = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $options associative array of options
-     * @throws Zend_Cache_Exception
-     * @return void
-     */
-    public function __construct(array $options = array())
-    {
-        if (!extension_loaded('memcache')) {
-            Zend_Cache::throwException('The memcache extension must be loaded for using this backend !');
-        }
-        parent::__construct($options);
-        if (isset($this->_options['servers'])) {
-            $value= $this->_options['servers'];
-            if (isset($value['host'])) {
-                // in this case, $value seems to be a simple associative array (one server only)
-                $value = array(0 => $value); // let's transform it into a classical array of associative arrays
-            }
-            $this->setOption('servers', $value);
-        }
-        $this->_memcache = new Memcache;
-        foreach ($this->_options['servers'] as $server) {
-            if (!array_key_exists('port', $server)) {
-                $server['port'] = self::DEFAULT_PORT;
-            }
-            if (!array_key_exists('persistent', $server)) {
-                $server['persistent'] = self::DEFAULT_PERSISTENT;
-            }
-            if (!array_key_exists('weight', $server)) {
-                $server['weight'] = self::DEFAULT_WEIGHT;
-            }
-            if (!array_key_exists('timeout', $server)) {
-                $server['timeout'] = self::DEFAULT_TIMEOUT;
-            }
-            if (!array_key_exists('retry_interval', $server)) {
-                $server['retry_interval'] = self::DEFAULT_RETRY_INTERVAL;
-            }
-            if (!array_key_exists('status', $server)) {
-                $server['status'] = self::DEFAULT_STATUS;
-            }
-            if (!array_key_exists('failure_callback', $server)) {
-                $server['failure_callback'] = self::DEFAULT_FAILURE_CALLBACK;
-            }
-            if ($this->_options['compatibility']) {
-                // No status for compatibility mode (#ZF-5887)
-                $this->_memcache->addServer($server['host'], $server['port'], $server['persistent'],
-                                        $server['weight'], $server['timeout'],
-                                        $server['retry_interval']);
-            } else {
-                $this->_memcache->addServer($server['host'], $server['port'], $server['persistent'],
-                                        $server['weight'], $server['timeout'],
-                                        $server['retry_interval'],
-                                        $server['status'], $server['failure_callback']);
-            }
-        }
-    }
-
-    /**
-     * Test if a cache is available for the given id and (if yes) return it (false else)
-     *
-     * @param  string  $id                     Cache id
-     * @param  boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested
-     * @return string|false cached datas
-     */
-    public function load($id, $doNotTestCacheValidity = false)
-    {
-        $tmp = $this->_memcache->get($id);
-        if (is_array($tmp) && isset($tmp[0])) {
-            return $tmp[0];
-        }
-        return false;
-    }
-
-    /**
-     * Test if a cache is available or not (for the given id)
-     *
-     * @param  string $id Cache id
-     * @return mixed|false (a cache is not available) or "last modified" timestamp (int) of the available cache record
-     */
-    public function test($id)
-    {
-        $tmp = $this->_memcache->get($id);
-        if (is_array($tmp)) {
-            return $tmp[1];
-        }
-        return false;
-    }
-
-    /**
-     * Save some string datas into a cache record
-     *
-     * Note : $data is always "string" (serialization is done by the
-     * core not by the backend)
-     *
-     * @param  string $data             Datas to cache
-     * @param  string $id               Cache id
-     * @param  array  $tags             Array of strings, the cache record will be tagged by each string entry
-     * @param  int    $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime)
-     * @return boolean True if no problem
-     */
-    public function save($data, $id, $tags = array(), $specificLifetime = false)
-    {
-        $lifetime = $this->getLifetime($specificLifetime);
-        if ($this->_options['compression']) {
-            $flag = MEMCACHE_COMPRESSED;
-        } else {
-            $flag = 0;
-        }
-
-        // ZF-8856: using set because add needs a second request if item already exists
-        $result = @$this->_memcache->set($id, array($data, time(), $lifetime), $flag, $lifetime);
-
-        if (count($tags) > 0) {
-            $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND);
-        }
-
-        return $result;
-    }
-
-    /**
-     * Remove a cache record
-     *
-     * @param  string $id Cache id
-     * @return boolean True if no problem
-     */
-    public function remove($id)
-    {
-        return $this->_memcache->delete($id, 0);
-    }
-
-    /**
-     * Clean some cache records
-     *
-     * Available modes are :
-     * 'all' (default)  => remove all cache entries ($tags is not used)
-     * 'old'            => unsupported
-     * 'matchingTag'    => unsupported
-     * 'notMatchingTag' => unsupported
-     * 'matchingAnyTag' => unsupported
-     *
-     * @param  string $mode Clean mode
-     * @param  array  $tags Array of tags
-     * @throws Zend_Cache_Exception
-     * @return boolean True if no problem
-     */
-    public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
-    {
-        switch ($mode) {
-            case Zend_Cache::CLEANING_MODE_MATCHING_TAG:
-            case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG:
-            case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG:
-                $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_MEMCACHED_BACKEND);
-            // fall through / clear all entries
-            case Zend_Cache::CLEANING_MODE_ALL:
-                return $this->_memcache->flush();
-                break;
-            case Zend_Cache::CLEANING_MODE_OLD:
-                $this->_log("Zend_Cache_Backend_Memcached::clean() : CLEANING_MODE_OLD is unsupported by the Memcached backend");
-                break;
-               default:
-                Zend_Cache::throwException('Invalid mode for clean() method');
-                   break;
-        }
-    }
-
-    /**
-     * Return true if the automatic cleaning is available for the backend
-     *
-     * @return boolean
-     */
-    public function isAutomaticCleaningAvailable()
-    {
-        return false;
-    }
-
-    /**
-     * Set the frontend directives
-     *
-     * @param  array $directives Assoc of directives
-     * @throws Zend_Cache_Exception
-     * @return void
-     */
-    public function setDirectives($directives)
-    {
-        parent::setDirectives($directives);
-        $lifetime = $this->getLifetime(false);
-        if ($lifetime > 2592000) {
-            // #ZF-3490 : For the memcached backend, there is a lifetime limit of 30 days (2592000 seconds)
-            $this->_log('memcached backend has a limit of 30 days (2592000 seconds) for the lifetime');
-        }
-        if ($lifetime === null) {
-            // #ZF-4614 : we tranform null to zero to get the maximal lifetime
-            parent::setDirectives(array('lifetime' => 0));
-        }
-    }
-
-    /**
-     * Return an array of stored cache ids
-     *
-     * @return array array of stored cache ids (string)
-     */
-    public function getIds()
-    {
-        $this->_log("Zend_Cache_Backend_Memcached::save() : getting the list of cache ids is unsupported by the Memcache backend");
-        return array();
-    }
-
-    /**
-     * Return an array of stored tags
-     *
-     * @return array array of stored tags (string)
-     */
-    public function getTags()
-    {
-        $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND);
-        return array();
-    }
-
-    /**
-     * Return an array of stored cache ids which match given tags
-     *
-     * In case of multiple tags, a logical AND is made between tags
-     *
-     * @param array $tags array of tags
-     * @return array array of matching cache ids (string)
-     */
-    public function getIdsMatchingTags($tags = array())
-    {
-        $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND);
-        return array();
-    }
-
-    /**
-     * Return an array of stored cache ids which don't match given tags
-     *
-     * In case of multiple tags, a logical OR is made between tags
-     *
-     * @param array $tags array of tags
-     * @return array array of not matching cache ids (string)
-     */
-    public function getIdsNotMatchingTags($tags = array())
-    {
-        $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND);
-        return array();
-    }
-
-    /**
-     * Return an array of stored cache ids which match any given tags
-     *
-     * In case of multiple tags, a logical AND is made between tags
-     *
-     * @param array $tags array of tags
-     * @return array array of any matching cache ids (string)
-     */
-    public function getIdsMatchingAnyTags($tags = array())
-    {
-        $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_MEMCACHED_BACKEND);
-        return array();
-    }
-
-    /**
-     * Return the filling percentage of the backend storage
-     *
-     * @throws Zend_Cache_Exception
-     * @return int integer between 0 and 100
-     */
-    public function getFillingPercentage()
-    {
-        $mems = $this->_memcache->getExtendedStats();
-
-        $memSize = null;
-        $memUsed = null;
-        foreach ($mems as $key => $mem) {
-            if ($mem === false) {
-                $this->_log('can\'t get stat from ' . $key);
-                continue;
-            }
-
-            $eachSize = $mem['limit_maxbytes'];
-
-            /**
-             * Couchbase 1.x uses 'mem_used' instead of 'bytes'
-             * @see https://www.couchbase.com/issues/browse/MB-3466
-             */
-            $eachUsed = isset($mem['bytes']) ? $mem['bytes'] : $mem['mem_used'];
-            if ($eachUsed > $eachSize) {
-                $eachUsed = $eachSize;
-            }
-
-            $memSize += $eachSize;
-            $memUsed += $eachUsed;
-        }
-
-        if ($memSize === null || $memUsed === null) {
-            Zend_Cache::throwException('Can\'t get filling percentage');
-        }
-
-        return ((int) (100. * ($memUsed / $memSize)));
-    }
-
-    /**
-     * Return an array of metadatas for the given cache id
-     *
-     * The array must include these keys :
-     * - expire : the expire timestamp
-     * - tags : a string array of tags
-     * - mtime : timestamp of last modification time
-     *
-     * @param string $id cache id
-     * @return array array of metadatas (false if the cache id is not found)
-     */
-    public function getMetadatas($id)
-    {
-        $tmp = $this->_memcache->get($id);
-        if (is_array($tmp)) {
-            $data = $tmp[0];
-            $mtime = $tmp[1];
-            if (!isset($tmp[2])) {
-                // because this record is only with 1.7 release
-                // if old cache records are still there...
-                return false;
-            }
-            $lifetime = $tmp[2];
-            return array(
-                'expire' => $mtime + $lifetime,
-                'tags' => array(),
-                'mtime' => $mtime
-            );
-        }
-        return false;
-    }
-
-    /**
-     * Give (if possible) an extra lifetime to the given cache id
-     *
-     * @param string $id cache id
-     * @param int $extraLifetime
-     * @return boolean true if ok
-     */
-    public function touch($id, $extraLifetime)
-    {
-        if ($this->_options['compression']) {
-            $flag = MEMCACHE_COMPRESSED;
-        } else {
-            $flag = 0;
-        }
-        $tmp = $this->_memcache->get($id);
-        if (is_array($tmp)) {
-            $data = $tmp[0];
-            $mtime = $tmp[1];
-            if (!isset($tmp[2])) {
-                // because this record is only with 1.7 release
-                // if old cache records are still there...
-                return false;
-            }
-            $lifetime = $tmp[2];
-            $newLifetime = $lifetime - (time() - $mtime) + $extraLifetime;
-            if ($newLifetime <=0) {
-                return false;
-            }
-            // #ZF-5702 : we try replace() first becase set() seems to be slower
-            if (!($result = $this->_memcache->replace($id, array($data, time(), $newLifetime), $flag, $newLifetime))) {
-                $result = $this->_memcache->set($id, array($data, time(), $newLifetime), $flag, $newLifetime);
-            }
-            return $result;
-        }
-        return false;
-    }
-
-    /**
-     * Return an associative array of capabilities (booleans) of the backend
-     *
-     * The array must include these keys :
-     * - automatic_cleaning (is automating cleaning necessary)
-     * - tags (are tags supported)
-     * - expired_read (is it possible to read expired cache records
-     *                 (for doNotTestCacheValidity option for example))
-     * - priority does the backend deal with priority when saving
-     * - infinite_lifetime (is infinite lifetime can work with this backend)
-     * - get_list (is it possible to get the list of cache ids and the complete list of tags)
-     *
-     * @return array associative of with capabilities
-     */
-    public function getCapabilities()
-    {
-        return array(
-            'automatic_cleaning' => false,
-            'tags' => false,
-            'expired_read' => false,
-            'priority' => false,
-            'infinite_lifetime' => false,
-            'get_list' => false
-        );
-    }
-
-}
diff --git a/tine20/Zend/Cache/Backend/Redis.php b/tine20/Zend/Cache/Backend/Redis.php
deleted file mode 100644 (file)
index 339ded4..0000000
+++ /dev/null
@@ -1,553 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Cache
- * @subpackage Zend_Cache_Backend
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-
-
-/**
- * @package    Zend_Cache
- * @subpackage Zend_Cache_Backend
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Cache_Backend_Redis extends Zend_Cache_Backend implements Zend_Cache_Backend_ExtendedInterface
-{
-    /**
-     * Default Values
-     */
-    const DEFAULT_HOST    = '127.0.0.1';
-    const DEFAULT_PORT    =  6379;
-    const DEFAULT_PERSISTENT = false;
-    #const DEFAULT_WEIGHT  = 1;
-    const DEFAULT_TIMEOUT = 1;
-    const DEFAULT_PREFIX  = 'ZEND_CACHE_';
-    const DEFAULT_STATUS  = true;
-    const DEFAULT_FAILURE_CALLBACK = null;
-    const TAG_PREFIX      = 'TAGS_';
-
-    /**
-     * Log message
-     */
-    const TAGS_UNSUPPORTED_BY_CLEAN_OF_REDIS_BACKEND = 'Zend_Cache_Backend_Redis::clean() : tags are unsupported by the Redis backend';
-    const TAGS_UNSUPPORTED_BY_SAVE_OF_REDIS_BACKEND =  'Zend_Cache_Backend_Redis::save() : tags are unsupported by the Redis backend';
-
-    /**
-     * Available options
-     *
-     * =====> (array) servers :
-     * an array of memcached server ; each memcached server is described by an associative array :
-     * 'host' => (string) : the name of the memcached server
-     * 'port' => (int) : the port of the memcached server
-     * 'persistent' => (bool) : use or not persistent connections to this memcached server
-     * 'weight' => (int) : number of buckets to create for this server which in turn control its
-     *                     probability of it being selected. The probability is relative to the total
-     *                     weight of all servers.
-     * 'timeout' => (int) : value in seconds which will be used for connecting to the daemon. Think twice
-     *                      before changing the default value of 1 second - you can lose all the
-     *                      advantages of caching if your connection is too slow.
-     * 'retry_interval' => (int) : controls how often a failed server will be retried, the default value
-     *                             is 15 seconds. Setting this parameter to -1 disables automatic retry.
-     *
-     * @var array available options
-     */
-    protected $_options = array(
-        'servers' => array(array(
-            'host' => self::DEFAULT_HOST,
-            'port' => self::DEFAULT_PORT,
-            'persistent' => self::DEFAULT_PERSISTENT,
-            #'weight'  => self::DEFAULT_WEIGHT,
-            'timeout' => self::DEFAULT_TIMEOUT,
-            'prefix' => self::DEFAULT_PREFIX,
-        ))
-    );
-
-    /**
-     * Redis object
-     *
-     * @var Redis redis object
-     */
-    protected $_redis = null;
-
-    /**
-     * Constructor
-     *
-     * @param array $options associative array of options
-     * @throws Zend_Cache_Exception
-     * @return void
-     */
-    public function __construct(array $options = array())
-    {
-        if (!extension_loaded('redis')) {
-            Zend_Cache::throwException('The redis extension must be loaded for using this backend !');
-        }
-        
-        parent::__construct($options);
-        
-        if (isset($this->_options['servers'])) {
-            $value= $this->_options['servers'];
-            if (isset($value['host'])) {
-                // in this case, $value seems to be a simple associative array (one server only)
-                $value = array(0 => $value); // let's transform it into a classical array of associative arrays
-            }
-            $this->setOption('servers', $value);
-        }
-        
-        $this->_redis = new Redis;
-        
-        foreach ($this->_options['servers'] as $server) {
-            if (!(isset($server['port']) || array_key_exists('port', $server))) {
-                $server['port'] = self::DEFAULT_PORT;
-            }
-            if (!(isset($server['persistent']) || array_key_exists('persistent', $server))) {
-                $server['persistent'] = self::DEFAULT_PERSISTENT;
-            }
-            #if (!(isset($server['weight']) || array_key_exists('weight', $server))) {
-            #    $server['weight'] = self::DEFAULT_WEIGHT;
-            #}
-            if (!(isset($server['timeout']) || array_key_exists('timeout', $server))) {
-                $server['timeout'] = self::DEFAULT_TIMEOUT;
-            }
-            if (!(isset($server['prefix']) || array_key_exists('prefix', $server))) {
-                $server['prefix'] = self::DEFAULT_PREFIX;
-            }
-            
-            $this->_redis->connect($server['host'], $server['port'], $server['timeout']);
-        }
-        
-        $this->_redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
-        $this->_redis->setOption(Redis::OPT_PREFIX, $server['prefix']);
-    }
-
-    /**
-     * Test if a cache is available for the given id and (if yes) return it (false else)
-     *
-     * @param  string  $id                     Cache id
-     * @param  boolean $doNotTestCacheValidity If set to true, the cache validity won't be tested
-     * @return string|false cached datas
-     */
-    public function load($id, $doNotTestCacheValidity = false)
-    {
-        $tmp = $this->_redis->get($id);
-        if (is_array($tmp)) {
-            return $tmp[0];
-        }
-        return false;
-    }
-
-    /**
-     * Test if a cache is available or not (for the given id)
-     *
-     * @param  string $id Cache id
-     * @return mixed|false (a cache is not available) or "last modified" timestamp (int) of the available cache record
-     */
-    public function test($id)
-    {
-        try {
-            $tmp = $this->_redis->get($id);
-        } catch (Exception $e) {
-            $this->_log("Zend_Cache_Backend_Redis::test() : Got an exception trying to access redis cache: " . $e);
-            return false;
-        }
-        if (is_array($tmp)) {
-            return $tmp[1];
-        }
-        return false;
-    }
-
-    /**
-     * Save some string datas into a cache record
-     *
-     * Note : $data is always "string" (serialization is done by the
-     * core not by the backend)
-     *
-     * @param  string $data             Datas to cache
-     * @param  string $id               Cache id
-     * @param  array  $tags             Array of strings, the cache record will be tagged by each string entry
-     * @param  int    $specificLifetime If != false, set a specific lifetime for this cache record (null => infinite lifetime)
-     * @return boolean True if no problem
-     */
-    public function save($data, $id, $tags = array(), $specificLifetime = false)
-    {
-        $lifetime = $this->getLifetime($specificLifetime);
-        
-        $transaction = $this->_redis->multi();
-
-        if (! $transaction) {
-            $this->_log("Zend_Cache_Backend_Redis::save() : problem with Redis multi-transaction during save");
-            return false;
-        }
-        
-        if ($lifetime) {
-            $transaction->setex($id, $lifetime, array($data, time(), $lifetime, (array)$tags));
-        } else {
-            $transaction->set($id, array($data, time(), $lifetime, (array)$tags));
-        }
-
-        // add to tag sets
-        foreach ((array) $tags as $tag) {
-            $transaction->sAdd(self::TAG_PREFIX . $tag, $id);
-        }
-
-        $result = $transaction->exec();
-        
-        return $result;
-    }
-
-    /**
-     * Remove a cache record
-     *
-     * @param  string $id Cache id
-     * @return boolean True if no problem
-     */
-    public function remove($id)
-    {
-        $tmp = $this->_redis->get($id);
-        $tags = $tmp[3];
-        
-        $transaction = $this->_redis->multi();
-        
-        // remove from tag sets
-        foreach ((array) $tags as $tag) {
-            $transaction->sRem(self::TAG_PREFIX . $tag, $id);
-        }
-        $transaction->delete($id);
-        
-        return $transaction->exec();
-    }
-
-    /**
-     * Clean some cache records
-     *
-     * Available modes are :
-     * 'all' (default)  => remove all cache entries ($tags is not used)
-     * 'old'            => unsupported
-     * 'matchingTag'    => remove cache entries matching all given tags
-     *                     ($tags can be an array of strings or a single string)
-     * 'notMatchingTag' => unsupported
-     * 'matchingAnyTag' => remove cache entries matching any given tags
-     *                     ($tags can be an array of strings or a single string)
-     *
-     * @param  string $mode Clean mode
-     * @param  array  $tags Array of tags
-     * @throws Zend_Cache_Exception
-     * @return boolean True if no problem
-     */
-    public function clean($mode = Zend_Cache::CLEANING_MODE_ALL, $tags = array())
-    {
-        switch ($mode) {
-            case Zend_Cache::CLEANING_MODE_ALL:
-                return $this->_redis->flushDB();
-                break;
-                
-            case Zend_Cache::CLEANING_MODE_OLD:
-                $this->_log("Zend_Cache_Backend_Redis::clean() : CLEANING_MODE_OLD is not required for Redis backend");
-                break;
-                
-            case Zend_Cache::CLEANING_MODE_MATCHING_TAG:
-                $ids = $this->getIdsMatchingTags($tags);
-                
-                if (!empty($ids)) {
-                    $values = $this->_redis->getMultiple($ids);
-                    
-                    $transaction = $this->_redis->multi();
-                    
-                    $i = 0;
-                    foreach ($ids as $id) {
-                        $transaction->delete($id);
-                        
-                        // if the record also has some other tags attached, remove record from these tag lists too
-                        // $values[$i] can be null if id was not found by getMultiple
-                        if (is_array($values[$i]) && is_array($values[$i][3])) {
-                            $allTags = array_unique(array_merge((array) $tags, $values[$i][3]));
-                        // otherwise just remove from the tag lists provided
-                        } else {
-                            $allTags = (array) $tags;
-                        }
-                        
-                        foreach($allTags as $tag) {
-                            $transaction->sRem(self::TAG_PREFIX . $tag, $id);
-                        }
-                        
-                        $i++;
-                    }
-                    
-                    $transaction->exec();
-                }
-                
-                break;
-                
-            case Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG:
-                $ids = $this->getIdsMatchingAnyTags($tags);
-                
-                if (!empty($ids)) {
-                    $values = $this->_redis->getMultiple($ids);
-                    
-                    $transaction = $this->_redis->multi();
-                    
-                    $i = 0;
-                    foreach ($ids as $id) {
-                        $transaction->delete($id);
-
-                        $allTags = array_unique(array_merge($tags, $values[$i][3]));
-                        foreach($allTags as $tag) {
-                            $transaction->sRem(self::TAG_PREFIX . $tag, $id);
-                        }
-                        
-                        $i++;
-                    }
-                    
-                    $transaction->exec();
-                }
-                
-                break;
-            
-            case Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG:
-                $this->_log(self::TAGS_UNSUPPORTED_BY_CLEAN_OF_REDIS_BACKEND);
-                break;
-                
-            default:
-                Zend_Cache::throwException('Invalid mode for clean() method');
-                   break;
-        }
-    }
-
-    /**
-     * Return true if the automatic cleaning is available for the backend
-     *
-     * @return boolean
-     */
-    public function isAutomaticCleaningAvailable()
-    {
-        return false;
-    }
-
-    /**
-     * Set the frontend directives
-     *
-     * @param  array $directives Assoc of directives
-     * @throws Zend_Cache_Exception
-     * @return void
-     */
-    public function setDirectives($directives)
-    {
-        parent::setDirectives($directives);
-        
-        $lifetime = $this->getLifetime(false);
-        if ($lifetime === null) {
-            // #ZF-4614 : we tranform null to zero to get the maximal lifetime
-            parent::setDirectives(array('lifetime' => 0));
-        }
-    }
-
-    /**
-     * Return an array of stored cache ids
-     *
-     * @return array array of stored cache ids (string)
-     */
-    public function getIds()
-    {
-        $this->_log("Zend_Cache_Backend_Redis::getIds() : getting the list of cache ids is unsupported by Redis backend");
-        return array();
-    }
-
-    /**
-     * Return an array of stored tags
-     *
-     * @return array array of stored tags (string)
-     */
-    public function getTags()
-    {
-        $keysWithCachePrefix = $this->_redis->keys(self::TAG_PREFIX . '*');
-        
-        return $this->_removeTagPrefix($keysWithCachePrefix);
-    }
-
-    /**
-     * Return an array of stored cache ids which match given tags
-     *
-     * In case of multiple tags, a logical AND is made between tags
-     *
-     * @param array $tags array of tags
-     * @return array array of matching cache ids (string)
-     */
-    public function getIdsMatchingTags($tags = array())
-    {
-        $cacheTags = array();
-        
-        foreach ((array) $tags as $tag) {
-            $cacheTags[] = self::TAG_PREFIX . $tag;
-        }
-        $ids = $this->_redis->sInter($cacheTags);
-        
-        return $ids;
-    }
-
-    /**
-     * Return an array of stored cache ids which don't match given tags
-     *
-     * In case of multiple tags, a logical OR is made between tags
-     *
-     * @param array $tags array of tags
-     * @return array array of not matching cache ids (string)
-     */
-    public function getIdsNotMatchingTags($tags = array())
-    {
-        $this->_log(self::TAGS_UNSUPPORTED_BY_SAVE_OF_REDIS_BACKEND);
-        return array();
-    }
-
-    /**
-     * Return an array of stored cache ids which match any given tags
-     *
-     * In case of multiple tags, a logical AND is made between tags
-     *
-     * @param array $tags array of tags
-     * @return array array of any matching cache ids (string)
-     */
-    public function getIdsMatchingAnyTags($tags = array())
-    {
-        $cacheTags = array();
-        
-        foreach ((array) $tags as $tag) {
-            $cacheTags[] = self::TAG_PREFIX . $tag;
-        }
-        $ids = $this->_redis->sUnion($cacheTags);
-        
-        return $ids;
-    }
-
-    /**
-     * Return the filling percentage of the backend storage
-     *
-     * @throws Zend_Cache_Exception
-     * @return int integer between 0 and 100
-     */
-    public function getFillingPercentage()
-    {
-        $this->_log("Filling percentage not supported by the Redis backend");
-        
-        return 0;
-    }
-
-    /**
-     * Return an array of metadatas for the given cache id
-     *
-     * The array must include these keys :
-     * - expire : the expire timestamp
-     * - tags : a string array of tags
-     * - mtime : timestamp of last modification time
-     *
-     * @param string $id cache id
-     * @return array array of metadatas (false if the cache id is not found)
-     */
-    public function getMetadatas($id)
-    {
-        $tmp = $this->_redis->get($id);
-        
-        if (is_array($tmp)) {
-            $mtime = $tmp[1];
-            $lifetime = $tmp[2];
-            
-            return array(
-                'expire' => $mtime + $lifetime,
-                'tags'   => $tmp[3],
-                'mtime'  => $mtime
-            );
-        }
-        
-        return false;
-    }
-
-    /**
-     * Give (if possible) an extra lifetime to the given cache id
-     *
-     * @param string $id cache id
-     * @param int $extraLifetime
-     * @return boolean true if ok
-     */
-    public function touch($id, $extraLifetime)
-    {
-        $tmp = $this->_redis->get($id);
-        
-        if (is_array($tmp)) {
-            $data = $tmp[0];
-            $mtime = $tmp[1];
-            $lifetime = $tmp[2];
-            $tags = $tmp[3];
-            
-            $newLifetime = $lifetime - (time() - $mtime) + $extraLifetime;
-            if ($newLifetime <=0) {
-                return false;
-            }
-            
-            $result = $this->_redis->setex($id, $newLifetime, array($data, time(), $newLifetime, $tags));
-            
-            return $result;
-        }
-        
-        return false;
-    }
-
-    /**
-     * Return an associative array of capabilities (booleans) of the backend
-     *
-     * The array must include these keys :
-     * - automatic_cleaning (is automating cleaning necessary)
-     * - tags (are tags supported)
-     * - expired_read (is it possible to read expired cache records
-     *                 (for doNotTestCacheValidity option for example))
-     * - priority does the backend deal with priority when saving
-     * - infinite_lifetime (is infinite lifetime can work with this backend)
-     * - get_list (is it possible to get the list of cache ids and the complete list of tags)
-     *
-     * @return array associative of with capabilities
-     */
-    public function getCapabilities()
-    {
-        return array(
-            'automatic_cleaning' => false,
-            'tags'               => true,
-            'expired_read'       => false,
-            'priority'           => false,
-            'infinite_lifetime'  => true,
-            'get_list'           => false
-        );
-    }
-
-    /**
-     * strip key prefix and tag prefix from key name
-     * 
-     * @param array $keys
-     * @return array
-     */
-    protected function _removeTagPrefix(array $keys)
-    {
-        $keyPrefix = $this->_redis->getOption(Redis::OPT_PREFIX);
-        
-        $pos = strlen($keyPrefix) + strlen(self::TAG_PREFIX);
-        
-        $result = array();
-        
-        foreach ($keys as $key) {
-            $result[] = substr($key, $pos);
-        }
-        
-        return $result;
-    }    
-}
diff --git a/tine20/Zend/Db/Adapter/Oracle.php b/tine20/Zend/Db/Adapter/Oracle.php
deleted file mode 100644 (file)
index 1daada6..0000000
+++ /dev/null
@@ -1,1021 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * Copied from Zend Framework version 1.12.17
- * Enable positioned parameters in Oracle adapter
- *
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Db
- * @subpackage Adapter
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-/**
- * @see Zend_Db_Adapter_Abstract
- */
-require_once 'Zend/Db/Adapter/Abstract.php';
-
-/**
- * @see Zend_Db_Statement_Oracle
- */
-require_once 'Zend/Db/Statement/Oracle.php';
-
-/**
- * @category   Zend
- * @package    Zend_Db
- * @subpackage Adapter
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Db_Adapter_Oracle extends Zend_Db_Adapter_Abstract
-{
-    /**
-     * User-provided configuration.
-     *
-     * Basic keys are:
-     *
-     * username => (string) Connect to the database as this username.
-     * password => (string) Password associated with the username.
-     * dbname   => Either the name of the local Oracle instance, or the
-     *             name of the entry in tnsnames.ora to which you want to connect.
-     * persistent => (boolean) Set TRUE to use a persistent connection
-     * @var array
-     */
-    protected $_config = array(
-        'dbname'       => null,
-        'username'     => null,
-        'password'     => null,
-        'persistent'   => false
-    );
-
-    /**
-     * Keys are UPPERCASE SQL datatypes or the constants
-     * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE.
-     *
-     * Values are:
-     * 0 = 32-bit integer
-     * 1 = 64-bit integer
-     * 2 = float or decimal
-     *
-     * @var array Associative array of datatypes to values 0, 1, or 2.
-     */
-    protected $_numericDataTypes = array(
-        Zend_Db::INT_TYPE    => Zend_Db::INT_TYPE,
-        Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE,
-        Zend_Db::FLOAT_TYPE  => Zend_Db::FLOAT_TYPE,
-        'BINARY_DOUBLE'      => Zend_Db::FLOAT_TYPE,
-        'BINARY_FLOAT'       => Zend_Db::FLOAT_TYPE,
-        'NUMBER'             => Zend_Db::FLOAT_TYPE,
-    );
-
-    /**
-     * @var integer
-     */
-    protected $_execute_mode = null;
-
-    /**
-     * Default class name for a DB statement.
-     *
-     * @var string
-     */
-    protected $_defaultStmtClass = 'Zend_Db_Statement_Oracle';
-
-    /**
-     * Check if LOB field are returned as string
-     * instead of OCI-Lob object
-     *
-     * @var boolean
-     */
-    protected $_lobAsString = null;
-
-    /**
-     * @var boolean
-     */
-    protected $_transactionOpen = null;
-
-    /**
-     * Creates a connection resource.
-     *
-     * @return void
-     * @throws Zend_Db_Adapter_Oracle_Exception
-     */
-    protected function _connect()
-    {
-        if (is_resource($this->_connection)) {
-            // connection already exists
-            return;
-        }
-
-        if (!extension_loaded('oci8')) {
-            /**
-             * @see Zend_Db_Adapter_Oracle_Exception
-             */
-            require_once 'Zend/Db/Adapter/Oracle/Exception.php';
-            throw new Zend_Db_Adapter_Oracle_Exception('The OCI8 extension is required for this adapter but the extension is not loaded');
-        }
-
-        $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS);
-
-        // if set host, port and dbname create string connection or use tnsnames.ora name or string connection
-        if (! empty($this->_config['host']) && ! empty($this->_config['port']) && ! empty($this->_config['dbname'])) {
-            if (isset($this->_config['isSID']) && $this->_config['isSID']) {
-                $this->_config['dbname'] = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=".$this->_config['host'].")(PORT=".$this->_config['port'].")))(CONNECT_DATA=(SID=\"".$this->_config['dbname']."\")))";
-            } else {
-                $this->_config['dbname'] = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=".$this->_config['host'].")(PORT=".$this->_config['port'].")))(CONNECT_DATA=(SERVICE_NAME=\"".$this->_config['dbname']."\")))";
-            }
-        }
-
-        $connectionFuncName = ($this->_config['persistent'] == true) ? 'oci_pconnect' : 'oci_connect';
-
-        $this->_connection = @$connectionFuncName(
-                $this->_config['username'],
-                $this->_config['password'],
-                $this->_config['dbname'],
-                $this->_config['charset']);
-
-        // check the connection
-        if (!$this->_connection) {
-            /**
-             * @see Zend_Db_Adapter_Oracle_Exception
-             */
-            require_once 'Zend/Db/Adapter/Oracle/Exception.php';
-            throw new Zend_Db_Adapter_Oracle_Exception(oci_error());
-        }
-        $rs = oci_parse($this->_connection, "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD hh24:mi:ss'");
-        oci_execute($rs, OCI_COMMIT_ON_SUCCESS);
-        $rs = oci_parse($this->_connection, "ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.'");
-        oci_execute($rs, OCI_COMMIT_ON_SUCCESS);
-//        $rs = oci_parse($this->_connection, "ALTER SESSION SET NLS_SORT=BINARY_CI;");
-//        oci_execute($rs, OCI_COMMIT_ON_SUCCESS);
-//        $rs = oci_parse($this->_connection, "ALTER SESSION SET NLS_COMP=LINGUISTIC;");
-//        oci_execute($rs, OCI_COMMIT_ON_SUCCESS);
-
-    }
-
-    /**
-     * Test if a connection is active
-     *
-     * @return boolean
-     */
-    public function isConnected()
-    {
-        return ((bool) (is_resource($this->_connection)
-                    && (get_resource_type($this->_connection) == 'oci8 connection'
-                     || get_resource_type($this->_connection) == 'oci8 persistent connection')));
-        }
-
-    /**
-     * Force the connection to close.
-     *
-     * @return void
-     */
-    public function closeConnection()
-    {
-        if ($this->isConnected()) {
-            oci_close($this->_connection);
-        }
-        $this->_connection = null;
-    }
-
-    /**
-     * Activate/deactivate return of LOB as string
-     *
-     * @param string $lob_as_string
-     * @return Zend_Db_Adapter_Oracle
-     */
-    public function setLobAsString($lobAsString)
-    {
-        $this->_lobAsString = (bool) $lobAsString;
-        return $this;
-    }
-
-    /**
-     * Return whether or not LOB are returned as string
-     *
-     * @return boolean
-     */
-    public function getLobAsString()
-    {
-        if ($this->_lobAsString === null) {
-            // if never set by user, we use driver option if it exists otherwise false
-            if (isset($this->_config['driver_options']) &&
-                isset($this->_config['driver_options']['lob_as_string'])) {
-                $this->_lobAsString = (bool) $this->_config['driver_options']['lob_as_string'];
-            } else {
-                $this->_lobAsString = false;
-            }
-        }
-        return $this->_lobAsString;
-    }
-
-    /**
-     * Returns an SQL statement for preparation.
-     *
-     * @param string $sql The SQL statement with placeholders.
-     * @return Zend_Db_Statement_Oracle
-     */
-    public function prepare($sql)
-    {
-        $this->_connect();
-        $stmtClass = $this->_defaultStmtClass;
-        if (!class_exists($stmtClass)) {
-            require_once 'Zend/Loader.php';
-            Zend_Loader::loadClass($stmtClass);
-        }
-        $stmt = new $stmtClass($this, $sql);
-        if ($stmt instanceof Zend_Db_Statement_Oracle) {
-            $stmt->setLobAsString($this->getLobAsString());
-        }
-        $stmt->setFetchMode($this->_fetchMode);
-        return $stmt;
-    }
-
-    /**
-     * Quote a raw string.
-     *
-     * @param string $value     Raw string
-     * @return string           Quoted string
-     */
-    protected function _quote($value)
-    {
-        if (is_int($value) || is_float($value)) {
-            return $value;
-        }
-        $value = str_replace("'", "''", $value);
-        return "'" . addcslashes($value, "\000\n\r\\\032") . "'";
-    }
-
-    /**
-     * Quote a table identifier and alias.
-     *
-     * @param string|array|Zend_Db_Expr $ident The identifier or expression.
-     * @param string $alias An alias for the table.
-     * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.
-     * @return string The quoted identifier and alias.
-     */
-    public function quoteTableAs($ident, $alias = null, $auto = false)
-    {
-        // Oracle doesn't allow the 'AS' keyword between the table identifier/expression and alias.
-        return $this->_quoteIdentifierAs($ident, $alias, $auto, ' ');
-    }
-
-    /**
-     * Return the most recent value from the specified sequence in the database.
-     * This is supported only on RDBMS brands that support sequences
-     * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.
-     *
-     * @param string $sequenceName
-     * @return string
-     */
-    public function lastSequenceId($sequenceName)
-    {
-        try {
-            $this->_connect();
-            $sql = 'SELECT '.$this->quoteIdentifier($sequenceName, true).'.CURRVAL FROM dual';
-            $value = $this->fetchOne($sql);
-            return $value;
-        } catch(Exception $e) {
-            return NULL;
-        }
-    }
-
-    /**
-     * Generate a new value from the specified sequence in the database, and return it.
-     * This is supported only on RDBMS brands that support sequences
-     * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.
-     *
-     * @param string $sequenceName
-     * @return string
-     */
-    public function nextSequenceId($sequenceName)
-    {
-        $this->_connect();
-        $sql = 'SELECT '.$this->quoteIdentifier($sequenceName, true).'.NEXTVAL FROM dual';
-        $value = $this->fetchOne($sql);
-        return $value;
-    }
-
-    /**
-     * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
-     *
-     * As a convention, on RDBMS brands that support sequences
-     * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
-     * from the arguments and returns the last id generated by that sequence.
-     * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
-     * returns the last value generated for such a column, and the table name
-     * argument is disregarded.
-     *
-     * Oracle does not support IDENTITY columns, so if the sequence is not
-     * specified, this method returns null.
-     *
-     * @param string $tableName   OPTIONAL Name of table.
-     * @param string $primaryKey  OPTIONAL Name of primary key column.
-     * @return string
-     */
-    public function lastInsertId($tableName = null, $primaryKey = null)
-    {
-        if ($tableName !== null) {
-            $sequenceName = $tableName;
-            $sequenceName = substr($sequenceName,0,25);
-            $sequenceName .= '_s';
-            return $this->lastSequenceId($sequenceName);
-        }
-
-        // No support for IDENTITY columns; return null
-        return null;
-    }
-
-    /**
-     * Returns a list of the tables in the database.
-     *
-     * @return array
-     */
-    public function listTables()
-    {
-        $this->_connect();
-        $data = $this->fetchCol('SELECT table_name FROM all_tables');
-        return $data;
-    }
-
-    /**
-     * Returns the column descriptions for a table.
-     *
-     * The return value is an associative array keyed by the column name,
-     * as returned by the RDBMS.
-     *
-     * The value of each array element is an associative array
-     * with the following keys:
-     *
-     * SCHEMA_NAME      => string; name of schema
-     * TABLE_NAME       => string;
-     * COLUMN_NAME      => string; column name
-     * COLUMN_POSITION  => number; ordinal position of column in table
-     * DATA_TYPE        => string; SQL datatype name of column
-     * DEFAULT          => string; default expression of column, null if none
-     * NULLABLE         => boolean; true if column can have nulls
-     * LENGTH           => number; length of CHAR/VARCHAR
-     * SCALE            => number; scale of NUMERIC/DECIMAL
-     * PRECISION        => number; precision of NUMERIC/DECIMAL
-     * UNSIGNED         => boolean; unsigned property of an integer type
-     * PRIMARY          => boolean; true if column is part of the primary key
-     * PRIMARY_POSITION => integer; position of column in primary key
-     * IDENTITY         => integer; true if column is auto-generated with unique values
-     *
-     * @todo Discover integer unsigned property.
-     *
-     * @param string $tableName
-     * @param string $schemaName OPTIONAL
-     * @return array
-     */
-    public function describeTable($tableName, $schemaName = null)
-    {
-        $version = $this->getServerVersion();
-        if (($version === null) || version_compare($version, '9.0.0', '>=')) {
-            $sql = "SELECT TC.TABLE_NAME, TC.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE,
-                    TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH,
-                    TC.DATA_SCALE, TC.DATA_PRECISION, C.CONSTRAINT_TYPE, CC.POSITION, TC.CHAR_LENGTH
-                FROM ALL_TAB_COLUMNS TC
-                LEFT JOIN (ALL_CONS_COLUMNS CC JOIN ALL_CONSTRAINTS C
-                    ON (CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME AND CC.TABLE_NAME = C.TABLE_NAME AND CC.OWNER = C.OWNER AND C.CONSTRAINT_TYPE = 'P'))
-                  ON TC.TABLE_NAME = CC.TABLE_NAME AND TC.COLUMN_NAME = CC.COLUMN_NAME
-                WHERE UPPER(TC.TABLE_NAME) = UPPER(:TBNAME)";
-            $bind[':TBNAME'] = $tableName;
-            if ($schemaName) {
-                $sql .= ' AND UPPER(TC.OWNER) = UPPER(:SCNAME)';
-                $bind[':SCNAME'] = $schemaName;
-            }
-            $sql .= ' ORDER BY TC.COLUMN_ID';
-        } else {
-            $subSql="SELECT AC.OWNER, AC.TABLE_NAME, ACC.COLUMN_NAME, AC.CONSTRAINT_TYPE, ACC.POSITION
-                from ALL_CONSTRAINTS AC, ALL_CONS_COLUMNS ACC
-                  WHERE ACC.CONSTRAINT_NAME = AC.CONSTRAINT_NAME
-                    AND ACC.TABLE_NAME = AC.TABLE_NAME
-                    AND ACC.OWNER = AC.OWNER
-                    AND AC.CONSTRAINT_TYPE = 'P'
-                    AND UPPER(AC.TABLE_NAME) = UPPER(:TBNAME)";
-            $bind[':TBNAME'] = $tableName;
-            if ($schemaName) {
-                $subSql .= ' AND UPPER(ACC.OWNER) = UPPER(:SCNAME)';
-                $bind[':SCNAME'] = $schemaName;
-            }
-            $sql="SELECT TC.TABLE_NAME, TC.OWNER, TC.COLUMN_NAME, TC.DATA_TYPE,
-                    TC.DATA_DEFAULT, TC.NULLABLE, TC.COLUMN_ID, TC.DATA_LENGTH,
-                    TC.DATA_SCALE, TC.DATA_PRECISION, CC.CONSTRAINT_TYPE, CC.POSITION, TC.CHAR_LENGTH
-                FROM ALL_TAB_COLUMNS TC, ($subSql) CC
-                WHERE UPPER(TC.TABLE_NAME) = UPPER(:TBNAME)
-                  AND TC.OWNER = CC.OWNER(+) AND TC.TABLE_NAME = CC.TABLE_NAME(+) AND TC.COLUMN_NAME = CC.COLUMN_NAME(+)";
-            if ($schemaName) {
-                $sql .= ' AND UPPER(TC.OWNER) = UPPER(:SCNAME)';
-            }
-            $sql .= ' ORDER BY TC.COLUMN_ID';
-        }
-
-        $stmt = $this->query($sql, $bind);
-
-        /**
-         * Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection
-         */
-        $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
-
-        $table_name      = 0;
-        $owner           = 1;
-        $column_name     = 2;
-        $data_type       = 3;
-        $data_default    = 4;
-        $nullable        = 5;
-        $column_id       = 6;
-        $data_length     = 7;
-        $data_scale      = 8;
-        $data_precision  = 9;
-        $constraint_type = 10;
-        $position        = 11;
-        $char_length     = 12;
-
-        $desc = array();
-        foreach ($result as $key => $row) {
-            list ($primary, $primaryPosition, $identity) = array(false, null, false);
-            if ($row[$constraint_type] == 'P') {
-                $primary = true;
-                $primaryPosition = $row[$position];
-                /**
-                 * Oracle does not support auto-increment keys.
-                 */
-                $identity = false;
-            }
-            $desc[$this->foldCase($row[$column_name])] = array(
-                'SCHEMA_NAME'      => $this->foldCase($row[$owner]),
-                'TABLE_NAME'       => $this->foldCase($row[$table_name]),
-                'COLUMN_NAME'      => $this->foldCase($row[$column_name]),
-                'COLUMN_POSITION'  => $row[$column_id],
-                'DATA_TYPE'        => $row[$data_type],
-                'DEFAULT'          => $row[$data_default],
-                'NULLABLE'         => (bool) ($row[$nullable] == 'Y'),
-                //'LENGTH'           => $row[$data_length],
-                'LENGTH'           => $row[$char_length],
-                'SCALE'            => $row[$data_scale],
-                'PRECISION'        => $row[$data_precision],
-                'UNSIGNED'         => null, // @todo
-                'PRIMARY'          => $primary,
-                'PRIMARY_POSITION' => $primaryPosition,
-                'IDENTITY'         => $identity
-            );
-        }
-        return $desc;
-    }
-
-    /**
-     * Leave autocommit mode and begin a transaction.
-     *
-     * @return void
-     */
-    protected function _beginTransaction()
-    {
-        $this->_setExecuteMode(OCI_DEFAULT);
-        $this->_transactionOpen = true;
-    }
-
-    /**
-     * Commit a transaction and return to autocommit mode.
-     *
-     * @return void
-     * @throws Zend_Db_Adapter_Oracle_Exception
-     */
-    protected function _commit()
-    {
-        $this->_transactionOpen = false;
-
-        if (!oci_commit($this->_connection)) {
-            /**
-             * @see Zend_Db_Adapter_Oracle_Exception
-             */
-            require_once 'Zend/Db/Adapter/Oracle/Exception.php';
-            throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection));
-        }
-        $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS);
-    }
-
-    /**
-     * Roll back a transaction and return to autocommit mode.
-     *
-     * @return void
-     * @throws Zend_Db_Adapter_Oracle_Exception
-     */
-    protected function _rollBack()
-    {
-        $this->_transactionOpen = false;
-
-        if (!oci_rollback($this->_connection)) {
-            /**
-             * @see Zend_Db_Adapter_Oracle_Exception
-             */
-            require_once 'Zend/Db/Adapter/Oracle/Exception.php';
-            throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection));
-        }
-        $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS);
-    }
-
-    /**
-     * Set the fetch mode.
-     *
-     * @todo Support FETCH_CLASS and FETCH_INTO.
-     *
-     * @param integer $mode A fetch mode.
-     * @return void
-     * @throws Zend_Db_Adapter_Oracle_Exception
-     */
-    public function setFetchMode($mode)
-    {
-        switch ($mode) {
-            case Zend_Db::FETCH_NUM:   // seq array
-            case Zend_Db::FETCH_ASSOC: // assoc array
-            case Zend_Db::FETCH_BOTH:  // seq+assoc array
-            case Zend_Db::FETCH_OBJ:   // object
-                $this->_fetchMode = $mode;
-                break;
-            case Zend_Db::FETCH_BOUND: // bound to PHP variable
-                /**
-                 * @see Zend_Db_Adapter_Oracle_Exception
-                 */
-                require_once 'Zend/Db/Adapter/Oracle/Exception.php';
-                throw new Zend_Db_Adapter_Oracle_Exception('FETCH_BOUND is not supported yet');
-                break;
-            default:
-                /**
-                 * @see Zend_Db_Adapter_Oracle_Exception
-                 */
-                require_once 'Zend/Db/Adapter/Oracle/Exception.php';
-                throw new Zend_Db_Adapter_Oracle_Exception("Invalid fetch mode '$mode' specified");
-                break;
-        }
-    }
-
-    /**
-     * Adds an adapter-specific LIMIT clause to the SELECT statement.
-     *
-     * @param string $sql
-     * @param integer $count
-     * @param integer $offset OPTIONAL
-     * @return string
-     * @throws Zend_Db_Adapter_Oracle_Exception
-     */
-    public function limit($sql, $count, $offset = 0)
-    {
-        $count = intval($count);
-        if ($count <= 0) {
-            /**
-             * @see Zend_Db_Adapter_Oracle_Exception
-             */
-            require_once 'Zend/Db/Adapter/Oracle/Exception.php';
-            throw new Zend_Db_Adapter_Oracle_Exception("LIMIT argument count=$count is not valid");
-        }
-
-        $offset = intval($offset);
-        if ($offset < 0) {
-            /**
-             * @see Zend_Db_Adapter_Oracle_Exception
-             */
-            require_once 'Zend/Db/Adapter/Oracle/Exception.php';
-            throw new Zend_Db_Adapter_Oracle_Exception("LIMIT argument offset=$offset is not valid");
-        }
-
-        /**
-         * Oracle does not implement the LIMIT clause as some RDBMS do.
-         * We have to simulate it with subqueries and ROWNUM.
-         * Unfortunately because we use the column wildcard "*",
-         * this puts an extra column into the query result set.
-         */
-        $limit_sql = "SELECT z2.*
-            FROM (
-                SELECT z1.*, ROWNUM AS \"zend_db_rownum\"
-                FROM (
-                    " . $sql . "
-                ) z1
-            ) z2
-            WHERE z2.\"zend_db_rownum\" BETWEEN " . ($offset+1) . " AND " . ($offset+$count);
-        return $limit_sql;
-    }
-
-    /**
-     * @param integer $mode
-     * @throws Zend_Db_Adapter_Oracle_Exception
-     */
-    private function _setExecuteMode($mode)
-    {
-        switch($mode) {
-            case OCI_COMMIT_ON_SUCCESS:
-            case OCI_DEFAULT:
-            case OCI_DESCRIBE_ONLY:
-                $this->_execute_mode = $mode;
-                break;
-            default:
-                /**
-                 * @see Zend_Db_Adapter_Oracle_Exception
-                 */
-                require_once 'Zend/Db/Adapter/Oracle/Exception.php';
-                throw new Zend_Db_Adapter_Oracle_Exception("Invalid execution mode '$mode' specified");
-                break;
-        }
-    }
-
-    /**
-     * @return int
-     */
-    public function _getExecuteMode()
-    {
-        return $this->_execute_mode;
-    }
-
-    /**
-     * Identifies whether the adapter has an open transaction
-     *
-     * @return boolean
-     */
-    protected function _hasOpenTransaction()
-    {
-        return $this->_transactionOpen;
-    }
-
-    /**
-     * Inserts a table row with specified data.
-     * Add support for CLOB/BLOB
-     * Oracle does not support anonymous ('?') binds.
-     *
-     * @param mixed $table The table to insert data into.
-     * @param array $bind Column-value pairs.
-     * @return int The number of affected rows.
-     */
-    public function insert($table, array $bind)
-    {
-        // Get the table metadata
-        $columns = Tinebase_Db_Table::getTableDescriptionFromCache($table);
-        // Check the columns in the array against the database table
-        // to identify BLOB (or CLOB) columns
-        foreach (array_keys($bind) as $column) {
-            if ( in_array($columns[$column]['DATA_TYPE'], array('BLOB', 'CLOB'))) {
-                $lobs[] = $column;
-            }
-        }
-
-        // If there are no blob columns then use the normal insert procedure
-        if ( !isset($lobs)) {
-            $i = 0;
-            // extract and quote col names from the array keys
-            $cols = array();
-            $vals = array();
-            foreach ($bind as $col => $val) {
-                $cols[] = $this->quoteIdentifier($col, true);
-                if ($val instanceof Zend_Db_Expr) {
-                    $vals[] = $val->__toString();
-                    unset($bind[$col]);
-                } else {
-                    // MOD: add to_date for date column
-                    if ($val === date('Y-m-d H:i:s', strtotime($val))) {
-                        $vals[] = "TO_DATE(".':'.$col.$i.",'YYYY-MM-DD hh24:mi:ss')";
-                    } else {
-                        $vals[] = ':'.$col.$i;
-                    }
-
-                    unset($bind[$col]);
-                    $bind[':'.$col.$i] = $val;
-                }
-                $i++;
-            }
-            // build the statement
-            $sql = "INSERT INTO "
-                . $this->quoteIdentifier($table, true)
-                . ' (' . implode(', ', $cols) . ') '
-                . 'VALUES (' . implode(', ', $vals) . ')';
-
-            // execute the statement and return the number of affected rows
-            $stmt = $this->query($sql, $bind);
-            $result = $stmt->rowCount();
-        } else {
-            // There are blobs in the $bind array so insert them separately
-            $ociTypes = array('BLOB' => OCI_B_BLOB, 'CLOB' => OCI_B_CLOB);
-
-            // Extract and quote col names from the array keys
-            $i = 0;
-            $cols = array();
-            $vals = array();
-            $lobData = array();
-            $returning = array();
-
-            foreach ($bind as $col => $val) {
-                $cols[] = $this->quoteIdentifier($col, true);
-                if (in_array($col, $lobs)) {
-
-                    $lobs[array_search($col, $lobs)] = $this->quoteIdentifier($col, true);
-                    $vals[] = 'EMPTY_' . $columns[$col]['DATA_TYPE'] . '()';
-                    $lobData[':'.$col.$i] = array('ociType' => $ociTypes[$columns[$col]['DATA_TYPE']],
-                        'data'    => $val);
-                    unset($bind[$col]);
-                    $lobDescriptors[':'.$col.$i] = oci_new_descriptor($this->_connection, OCI_D_LOB);
-                    $returning[] = ':'.$col.$i;
-                    $bind[':'.$col.$i] = $lobDescriptors[':'.$col.$i];
-                } elseif ($val instanceof Zend_Db_Expr) {
-                    $vals[] = $val->__toString();
-                    unset($bind[$col]);
-                } else {
-                    $vals[] = ':'.$col.$i;
-                    unset($bind[$col]);
-                    $bind[':'.$col.$i] = $val;
-                }
-                $i++;
-            }
-
-            // build the statement
-            $sql = "INSERT INTO "
-                . $this->quoteIdentifier($table, true)
-                . ' (' . implode(', ', $cols) . ') '
-                . 'VALUES (' . implode(', ', $vals) . ') '
-                . 'RETURNING ' . implode(', ', $lobs) . ' '
-                . 'INTO '  . implode(', ', $returning);
-
-            //Tinebase_Core::getLogger()->debug("SQL INSERT\n" . $sql);
-
-            // Execute the statement
-            $stmt = new Zend_Db_Statement_Oracle($this, $sql);
-
-            foreach (array_keys($bind) as $name) {
-                if (in_array($name, array_keys($lobData))) {
-                    $stmt->bindParam($name, $bind[$name], $lobData[$name]['ociType'], -1);
-                } else {
-                    $stmt->bindParam($name, $bind[$name]);
-                }
-            }
-
-            $this->_setExecuteMode(OCI_DEFAULT);
-            //Execute without committing
-            $stmt->execute();
-
-            $this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS);
-            $result = $stmt->rowCount();
-
-            // Write the LOB data & free the descriptor
-            if (isset($lobDescriptors)) {
-                foreach ( $lobDescriptors as $name => $lobDescriptor) {
-                    $lobDescriptor->write($lobData[$name]['data']);
-                    $lobDescriptor->free();
-                }
-            }
-        }
-
-        return $result;
-    }
-
-    /**
-     * Updates table rows with specified data based on a WHERE clause.
-     *
-     * @param  mixed        $table The table to update.
-     * @param  array        $bind  Column-value pairs.
-     * @param  mixed        $where UPDATE WHERE clause(s).
-     * @return int          The number of affected rows.
-     */
-    public function update($table, array $bind, $where = '')
-    {
-        /**
-         * Build "col = ?" pairs for the statement,
-         * except for Zend_Db_Expr which is treated literally.
-         */
-        $set = array();
-        $i = 0;
-        foreach ($bind as $col => $val) {
-            if ($val instanceof Zend_Db_Expr) {
-                $val = $val->__toString();
-                unset($bind[$col]);
-            } else {
-                if ($this->supportsParameters('positional')) {
-                    // MOD: add to_date for date column
-                    if ($val == date('Y-m-d H:i:s',strtotime($val))) {
-                        $val = "TO_DATE(".'?'.",'YYYY-MM-DD hh24:mi:ss')";
-                    } else {
-                        $val = '?';
-                    }
-                } else {
-                    if ($this->supportsParameters('named')) {
-                        unset($bind[$col]);
-                        $bind[':'.$col.$i] = $val;
-                        // MOD: add to_date for date column
-                        if ($val == date('Y-m-d H:i:s',strtotime($val))) {
-                            $val = "TO_DATE(".':'.$col.$i.",'YYYY-MM-DD hh24:mi:ss')";
-                        } else {
-                            $val = ':'.$col.$i;
-                        }
-                        $i++;
-                    } else {
-                        /** @see Zend_Db_Adapter_Exception */
-                        require_once 'Zend/Db/Adapter/Exception.php';
-                        throw new Zend_Db_Adapter_Exception(get_class($this) ." doesn't support positional or named binding");
-                    }
-                }
-            }
-            $set[] = $this->quoteIdentifier($col, true) . ' = ' . $val;
-        }
-
-        $where = $this->_whereExpr($where);
-
-        /**
-         * Build the UPDATE statement
-         */
-        $sql = "UPDATE "
-            . $this->quoteIdentifier($table, true)
-            . ' SET ' . implode(', ', $set)
-            . (($where) ? " WHERE $where" : '');
-
-        /**
-         * Execute the statement and return the number of affected rows
-         */
-        if ($this->supportsParameters('positional')) {
-            $stmt = $this->query($sql, array_values($bind));
-        } else {
-            $stmt = $this->query($sql, $bind);
-        }
-        $result = $stmt->rowCount();
-        return $result;
-    }
-
-    /**
-     * Check if the adapter supports real SQL parameters.
-     *
-     * @param string $type 'positional' or 'named'
-     * @return bool
-     */
-    public function supportsParameters($type)
-    {
-        switch ($type) {
-            case 'named':
-                return true;
-            case 'positional':
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * Retrieve server version in PHP style
-     *
-     * @return string
-     */
-    public function getServerVersion()
-    {
-        $this->_connect();
-        $version = oci_server_version($this->_connection);
-        if ($version !== false) {
-            $matches = null;
-            if (preg_match('/((?:[0-9]{1,2}\.){1,3}[0-9]{1,2})/', $version, $matches)) {
-                return $matches[1];
-            } else {
-                return null;
-            }
-        } else {
-            return null;
-        }
-    }
-
-    ############################ Override methods - not included in default Zend Framework class #################
-
-
-    /*
-     * Enable emulation of positional parameters? (@see supportsParameters()}
-     *
-     * @var bool
-     */
-    protected $_supportPositionalParameters = false;
-
-    /**
-     * setter for {@see $_supportPositionalParameters}
-     *
-     * @param bool $value
-     * @return void
-     */
-    public function supportPositionalParameters($value) {
-        $this->_supportPositionalParameters = (bool)$value;
-    }
-
-    protected $_namedParamPrefix = 'param';
-
-    /**
-     * Setter for {@see $_namedParamPrefix}
-     *
-     * @param String $value
-     * @return void
-     */
-    public function setNamedParamPrefix($value) {
-        $alnumFilter = new Zend_Filter_Alnum();
-        $this->_namedParamPrefix = $alnumFilter->filter($value);
-    }
-
-    /**
-     *
-     * Override method - converts positional to named parameters before calling parent's query method
-     *
-     * Prepares and executes an SQL statement with bound data.
-     *
-     * @param  mixed  $sql  The SQL statement with placeholders.
-     *                      May be a string or Zend_Db_Select.
-     * @param  mixed  $bind An array of data to bind to the placeholders.
-     * @return Zend_Db_Statement_Interface
-     */
-    public function query($sql, $bind = array())
-    {
-        list ($sql, $bind) = $this->_positionalToNamedParameters($sql, $bind);
-        return parent::query($sql, $bind);
-    }
-
-
-    /**
-     * @todo There is a problem when {@param $sql} contains field values with question-marks that should not be replaced
-     *       and at the same time the {@param $bind} array is not empty.
-     *       in phpunit the test could be expressed like this:
-     *       <pre>
-     *       $db->query('INSERT INTO ' . $db->quoteIdentifier($tableName) . ' (' . $db->quoteIdentifier('name') . ', ' . $db->quoteIdentifier('test') . ') VALUES (' . $db->quote($value, 'text') . ', ?)', array('test value for col 2'));
-     *       $result = $db->fetchCol($db->select()->from($tableName, 'name'));
-     *       $this->assertEquals($value, $result[1]);
-     *       </pre>
-     *
-     * @param  mixed  $sql  The SQL statement with placeholders.
-     *                      May be a string or Zend_Db_Select.
-     * @param  mixed  $bind An array of data to bind to the placeholders.
-     * @return array
-     */
-    protected function _positionalToNamedParameters($sql, array $bind)
-    {
-        if ($sql instanceof Zend_Db_Select) {
-            if (empty($bind)) {
-                $bind = $sql->getBind();
-            }
-
-            $sql = $sql->assemble();
-        }
-
-        $keyCounter = 0;
-        $quotedQuestionMarksCounter = 0;
-        foreach ($bind as $key => $value)
-        {
-            if (is_int($key)) {
-                unset($bind[$key]);
-                $bind[$this->_namedParamPrefix . $keyCounter] = $value;
-
-                $position = 0;
-                while (false !== ($position = strpos($sql, '?', $quotedQuestionMarksCounter))) {
-                    if ($this->_isQuoted($sql, $position)) {
-                        $quotedQuestionMarksCounter++;
-                    } else {
-                        break;
-                    }
-                }
-                $sql = substr_replace($sql, ':' . $this->_namedParamPrefix . $keyCounter, $position, 1);
-
-                $keyCounter++;
-            }
-        }
-
-        return array($sql, $bind);
-    }
-
-    /**
-     * Determine whether a character at position {@param $position} in the string {@param $string}
-     * is within a pair of quotation marks or not.
-     *
-     * @param String $string
-     * @param int $position
-     * @param String | optional $quoteChar
-     * @param String | optional $escapeChar
-     *
-     * @return bool
-     */
-    protected function _isQuoted($string, $position, $quoteChar = "'", $escapeChar = '\\')
-    {
-        $subString = substr($string, 0, $position);
-
-        $unescapedQuoteCharsCount = 0;
-        while (false !== ($position = strpos($subString, $quoteChar))) {
-            //test if quotation mark is escaped
-            $escapeCharsCount = 0;
-            while ($subString[$position-1-$escapeCharsCount] == $escapeChar) {
-                $escapeCharsCount++;
-            }
-            if ($escapeCharsCount % 2 === 0) {
-                $unescapedQuoteCharsCount++;
-            }
-
-            $subString = substr($subString, $position+1);
-        }
-
-        return (bool)($unescapedQuoteCharsCount % 2);
-    }
-}
diff --git a/tine20/Zend/Db/Adapter/Pdo/Pgsql.php b/tine20/Zend/Db/Adapter/Pdo/Pgsql.php
deleted file mode 100644 (file)
index b5beaf1..0000000
+++ /dev/null
@@ -1,339 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Db
- * @subpackage Adapter
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/**
- * @see Zend_Db_Adapter_Pdo_Abstract
- */
-require_once 'Zend/Db/Adapter/Pdo/Abstract.php';
-
-
-/**
- * Class for connecting to PostgreSQL databases and performing common operations.
- *
- * @category   Zend
- * @package    Zend_Db
- * @subpackage Adapter
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Db_Adapter_Pdo_Pgsql extends Zend_Db_Adapter_Pdo_Abstract
-{
-
-    /**
-     * PDO type.
-     *
-     * @var string
-     */
-    protected $_pdoType = 'pgsql';
-
-    /**
-     * Keys are UPPERCASE SQL datatypes or the constants
-     * Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, or Zend_Db::FLOAT_TYPE.
-     *
-     * Values are:
-     * 0 = 32-bit integer
-     * 1 = 64-bit integer
-     * 2 = float or decimal
-     *
-     * @var array Associative array of datatypes to values 0, 1, or 2.
-     */
-    protected $_numericDataTypes = array(
-        Zend_Db::INT_TYPE    => Zend_Db::INT_TYPE,
-        Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE,
-        Zend_Db::FLOAT_TYPE  => Zend_Db::FLOAT_TYPE,
-        'INTEGER'            => Zend_Db::INT_TYPE,
-        'SERIAL'             => Zend_Db::INT_TYPE,
-        'SMALLINT'           => Zend_Db::INT_TYPE,
-        'BIGINT'             => Zend_Db::BIGINT_TYPE,
-        'BIGSERIAL'          => Zend_Db::BIGINT_TYPE,
-        'DECIMAL'            => Zend_Db::FLOAT_TYPE,
-        'DOUBLE PRECISION'   => Zend_Db::FLOAT_TYPE,
-        'NUMERIC'            => Zend_Db::FLOAT_TYPE,
-        'REAL'               => Zend_Db::FLOAT_TYPE
-    );
-
-    /**
-     * Creates a PDO object and connects to the database.
-     *
-     * @return void
-     * @throws Zend_Db_Adapter_Exception
-     */
-    protected function _connect()
-    {
-        if ($this->_connection) {
-            return;
-        }
-
-        parent::_connect();
-
-        /**
-         * Mantis #0009452 - This feature was disable for making possible to enable transaction pooling
-        if (!empty($this->_config['charset'])) {
-            $sql = "SET NAMES '" . $this->_config['charset'] . "'";
-            $this->_connection->exec($sql);
-        }
-        **/
-    }
-
-    /**
-     * Returns a list of the tables in the database.
-     *
-     * @return array
-     */
-    public function listTables()
-    {
-        // @todo use a better query with joins instead of subqueries
-        $sql = "SELECT c.relname AS table_name "
-             . "FROM pg_class c, pg_user u "
-             . "WHERE c.relowner = u.usesysid AND c.relkind = 'r' "
-             . "AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) "
-             . "AND c.relname !~ '^(pg_|sql_)' "
-             . "UNION "
-             . "SELECT c.relname AS table_name "
-             . "FROM pg_class c "
-             . "WHERE c.relkind = 'r' "
-             . "AND NOT EXISTS (SELECT 1 FROM pg_views WHERE viewname = c.relname) "
-             . "AND NOT EXISTS (SELECT 1 FROM pg_user WHERE usesysid = c.relowner) "
-             . "AND c.relname !~ '^pg_'";
-
-        return $this->fetchCol($sql);
-    }
-
-    /**
-     * Returns the column descriptions for a table.
-     *
-     * The return value is an associative array keyed by the column name,
-     * as returned by the RDBMS.
-     *
-     * The value of each array element is an associative array
-     * with the following keys:
-     *
-     * SCHEMA_NAME      => string; name of database or schema
-     * TABLE_NAME       => string;
-     * COLUMN_NAME      => string; column name
-     * COLUMN_POSITION  => number; ordinal position of column in table
-     * DATA_TYPE        => string; SQL datatype name of column
-     * DEFAULT          => string; default expression of column, null if none
-     * NULLABLE         => boolean; true if column can have nulls
-     * LENGTH           => number; length of CHAR/VARCHAR
-     * SCALE            => number; scale of NUMERIC/DECIMAL
-     * PRECISION        => number; precision of NUMERIC/DECIMAL
-     * UNSIGNED         => boolean; unsigned property of an integer type
-     * PRIMARY          => boolean; true if column is part of the primary key
-     * PRIMARY_POSITION => integer; position of column in primary key
-     * IDENTITY         => integer; true if column is auto-generated with unique values
-     *
-     * @todo Discover integer unsigned property.
-     *
-     * @param  string $tableName
-     * @param  string $schemaName OPTIONAL
-     * @return array
-     */
-    public function describeTable($tableName, $schemaName = null)
-    {
-        $sql = "SELECT
-                a.attnum,
-                n.nspname,
-                c.relname,
-                a.attname AS colname,
-                t.typname AS type,
-                a.atttypmod,
-                FORMAT_TYPE(a.atttypid, a.atttypmod) AS complete_type,
-                d.adsrc AS default_value,
-                a.attnotnull AS notnull,
-                a.attlen AS length,
-                co.contype,
-                ARRAY_TO_STRING(co.conkey, ',') AS conkey
-            FROM pg_attribute AS a
-                JOIN pg_class AS c ON a.attrelid = c.oid
-                JOIN pg_namespace AS n ON c.relnamespace = n.oid
-                JOIN pg_type AS t ON a.atttypid = t.oid
-                LEFT OUTER JOIN pg_constraint AS co ON (co.conrelid = c.oid
-                    AND a.attnum = ANY(co.conkey) AND co.contype = 'p')
-                LEFT OUTER JOIN pg_attrdef AS d ON d.adrelid = c.oid AND d.adnum = a.attnum
-            WHERE a.attnum > 0 AND c.relname = ".$this->quote($tableName);
-        if ($schemaName) {
-            $sql .= " AND n.nspname = ".$this->quote($schemaName);
-        }
-        $sql .= ' ORDER BY a.attnum';
-
-        $stmt = $this->query($sql);
-
-        // Use FETCH_NUM so we are not dependent on the CASE attribute of the PDO connection
-        $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
-
-        $attnum        = 0;
-        $nspname       = 1;
-        $relname       = 2;
-        $colname       = 3;
-        $type          = 4;
-        $atttypemod    = 5;
-        $complete_type = 6;
-        $default_value = 7;
-        $notnull       = 8;
-        $length        = 9;
-        $contype       = 10;
-        $conkey        = 11;
-
-        $desc = array();
-        foreach ($result as $key => $row) {
-            $defaultValue = $row[$default_value];
-            if ($row[$type] == 'varchar' || $row[$type] == 'bpchar' ) {
-                if (preg_match('/character(?: varying)?(?:\((\d+)\))?/', $row[$complete_type], $matches)) {
-                    if (isset($matches[1])) {
-                        $row[$length] = $matches[1];
-                    } else {
-                        $row[$length] = null; // unlimited
-                    }
-                }
-                if (preg_match("/^'(.*?)'::(?:character varying|bpchar)$/", $defaultValue, $matches)) {
-                    $defaultValue = $matches[1];
-                }
-            }
-            list($primary, $primaryPosition, $identity) = array(false, null, false);
-            if ($row[$contype] == 'p') {
-                $primary = true;
-                $primaryPosition = array_search($row[$attnum], explode(',', $row[$conkey])) + 1;
-                $identity = (bool) (preg_match('/^nextval/', $row[$default_value]));
-            }
-            $desc[$this->foldCase($row[$colname])] = array(
-                'SCHEMA_NAME'      => $this->foldCase($row[$nspname]),
-                'TABLE_NAME'       => $this->foldCase($row[$relname]),
-                'COLUMN_NAME'      => $this->foldCase($row[$colname]),
-                'COLUMN_POSITION'  => $row[$attnum],
-                'DATA_TYPE'        => $row[$type],
-                'DEFAULT'          => $defaultValue,
-                'NULLABLE'         => (bool) ($row[$notnull] != 't'),
-                'LENGTH'           => $row[$length],
-                'SCALE'            => null, // @todo
-                'PRECISION'        => null, // @todo
-                'UNSIGNED'         => null, // @todo
-                'PRIMARY'          => $primary,
-                'PRIMARY_POSITION' => $primaryPosition,
-                'IDENTITY'         => $identity
-            );
-        }
-        return $desc;
-    }
-
-
-    /**
-     * Adds an adapter-specific LIMIT clause to the SELECT statement.
-     *
-     * @param string $sql
-     * @param integer $count
-     * @param integer $offset OPTIONAL
-     * @return string
-     */
-    public function limit($sql, $count, $offset = 0)
-    {
-        $count = intval($count);
-        if ($count <= 0) {
-            /**
-             * @see Zend_Db_Adapter_Exception
-             */
-            require_once 'Zend/Db/Adapter/Exception.php';
-            throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid");
-        }
-
-        $offset = intval($offset);
-        if ($offset < 0) {
-            /**
-             * @see Zend_Db_Adapter_Exception
-             */
-            require_once 'Zend/Db/Adapter/Exception.php';
-            throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid");
-        }
-
-        $sql .= " LIMIT $count";
-        if ($offset > 0) {
-            $sql .= " OFFSET $offset";
-        }
-
-        return $sql;
-    }
-
-    /**
-     * Return the most recent value from the specified sequence in the database.
-     * This is supported only on RDBMS brands that support sequences
-     * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.
-     *
-     * @param string $sequenceName
-     * @return string
-     */
-    public function lastSequenceId($sequenceName)
-    {
-        $this->_connect();
-        $sequenceName = str_replace($this->getQuoteIdentifierSymbol(), '', (string) $sequenceName);
-        $value = $this->fetchOne("SELECT CURRVAL("
-               . $this->quote($this->quoteIdentifier($sequenceName, true))
-               . ")");
-        return $value;
-    }
-
-    /**
-     * Generate a new value from the specified sequence in the database, and return it.
-     * This is supported only on RDBMS brands that support sequences
-     * (e.g. Oracle, PostgreSQL, DB2).  Other RDBMS brands return null.
-     *
-     * @param string $sequenceName
-     * @return string
-     */
-    public function nextSequenceId($sequenceName)
-    {
-        $this->_connect();
-        $sequenceName = str_replace($this->getQuoteIdentifierSymbol(), '', (string) $sequenceName);
-        $value = $this->fetchOne("SELECT NEXTVAL("
-               . $this->quote($this->quoteIdentifier($sequenceName, true))
-               . ")");
-        return $value;
-    }
-
-    /**
-     * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column.
-     *
-     * As a convention, on RDBMS brands that support sequences
-     * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence
-     * from the arguments and returns the last id generated by that sequence.
-     * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method
-     * returns the last value generated for such a column, and the table name
-     * argument is disregarded.
-     *
-     * @param string $tableName   OPTIONAL Name of table.
-     * @param string $primaryKey  OPTIONAL Name of primary key column.
-     * @return string
-     */
-    public function lastInsertId($tableName = null, $primaryKey = null)
-    {
-        if ($tableName !== null) {
-            $sequenceName = $tableName;
-            if ($primaryKey) {
-                $sequenceName .= "_$primaryKey";
-            }
-            $sequenceName .= '_seq';
-            return $this->lastSequenceId($sequenceName);
-        }
-        return $this->_connection->lastInsertId($tableName);
-    }
-
-}
diff --git a/tine20/Zend/Db/Select.php b/tine20/Zend/Db/Select.php
deleted file mode 100644 (file)
index a98a2a5..0000000
+++ /dev/null
@@ -1,1358 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Db
- * @subpackage Select
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/**
- * @see Zend_Db_Adapter_Abstract
- */
-require_once 'Zend/Db/Adapter/Abstract.php';
-
-/**
- * @see Zend_Db_Expr
- */
-require_once 'Zend/Db/Expr.php';
-
-
-/**
- * Class for SQL SELECT generation and results.
- *
- * @category   Zend
- * @package    Zend_Db
- * @subpackage Select
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Db_Select
-{
-
-    const DISTINCT       = 'distinct';
-    const COLUMNS        = 'columns';
-    const FROM           = 'from';
-    const UNION          = 'union';
-    const WHERE          = 'where';
-    const GROUP          = 'group';
-    const HAVING         = 'having';
-    const ORDER          = 'order';
-    const LIMIT_COUNT    = 'limitcount';
-    const LIMIT_OFFSET   = 'limitoffset';
-    const FOR_UPDATE     = 'forupdate';
-
-    const INNER_JOIN     = 'inner join';
-    const LEFT_JOIN      = 'left join';
-    const RIGHT_JOIN     = 'right join';
-    const FULL_JOIN      = 'full join';
-    const CROSS_JOIN     = 'cross join';
-    const NATURAL_JOIN   = 'natural join';
-
-    const SQL_WILDCARD   = '*';
-    const SQL_SELECT     = 'SELECT';
-    const SQL_UNION      = 'UNION';
-    const SQL_UNION_ALL  = 'UNION ALL';
-    const SQL_FROM       = 'FROM';
-    const SQL_WHERE      = 'WHERE';
-    const SQL_DISTINCT   = 'DISTINCT';
-    const SQL_GROUP_BY   = 'GROUP BY';
-    const SQL_ORDER_BY   = 'ORDER BY';
-    const SQL_HAVING     = 'HAVING';
-    const SQL_FOR_UPDATE = 'FOR UPDATE';
-    const SQL_AND        = 'AND';
-    const SQL_AS         = 'AS';
-    const SQL_OR         = 'OR';
-    const SQL_ON         = 'ON';
-    const SQL_ASC        = 'ASC';
-    const SQL_DESC       = 'DESC';
-
-    const REGEX_COLUMN_EXPR = '/^([\w]*\(([^\(\)]|(?1))*\))$/';
-
-    /**
-     * Bind variables for query
-     *
-     * @var array
-     */
-    protected $_bind = array();
-
-    /**
-     * Zend_Db_Adapter_Abstract object.
-     *
-     * @var Zend_Db_Adapter_Abstract
-     */
-    protected $_adapter;
-
-    /**
-     * The initial values for the $_parts array.
-     * NOTE: It is important for the 'FOR_UPDATE' part to be last to ensure
-     * meximum compatibility with database adapters.
-     *
-     * @var array
-     */
-    protected static $_partsInit = array(
-        self::DISTINCT     => false,
-        self::COLUMNS      => array(),
-        self::UNION        => array(),
-        self::FROM         => array(),
-        self::WHERE        => array(),
-        self::GROUP        => array(),
-        self::HAVING       => array(),
-        self::ORDER        => array(),
-        self::LIMIT_COUNT  => null,
-        self::LIMIT_OFFSET => null,
-        self::FOR_UPDATE   => false
-    );
-
-    /**
-     * Specify legal join types.
-     *
-     * @var array
-     */
-    protected static $_joinTypes = array(
-        self::INNER_JOIN,
-        self::LEFT_JOIN,
-        self::RIGHT_JOIN,
-        self::FULL_JOIN,
-        self::CROSS_JOIN,
-        self::NATURAL_JOIN,
-    );
-
-    /**
-     * Specify legal union types.
-     *
-     * @var array
-     */
-    protected static $_unionTypes = array(
-        self::SQL_UNION,
-        self::SQL_UNION_ALL
-    );
-
-    /**
-     * The component parts of a SELECT statement.
-     * Initialized to the $_partsInit array in the constructor.
-     *
-     * @var array
-     */
-    protected $_parts = array();
-
-    /**
-     * Tracks which columns are being select from each table and join.
-     *
-     * @var array
-     */
-    protected $_tableCols = array();
-
-    /**
-     * Class constructor
-     *
-     * @param Zend_Db_Adapter_Abstract $adapter
-     */
-    public function __construct(Zend_Db_Adapter_Abstract $adapter)
-    {
-        $this->_adapter = $adapter;
-        $this->_parts = self::$_partsInit;
-    }
-
-    /**
-     * Get bind variables
-     *
-     * @return array
-     */
-    public function getBind()
-    {
-        return $this->_bind;
-    }
-
-    /**
-     * Set bind variables
-     *
-     * @param mixed $bind
-     * @return Zend_Db_Select
-     */
-    public function bind($bind)
-    {
-        $this->_bind = $bind;
-
-        return $this;
-    }
-
-    /**
-     * Makes the query SELECT DISTINCT.
-     *
-     * @param bool $flag Whether or not the SELECT is DISTINCT (default true).
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function distinct($flag = true)
-    {
-        $this->_parts[self::DISTINCT] = (bool) $flag;
-        return $this;
-    }
-
-    /**
-     * Adds a FROM table and optional columns to the query.
-     *
-     * The first parameter $name can be a simple string, in which case the
-     * correlation name is generated automatically.  If you want to specify
-     * the correlation name, the first parameter must be an associative
-     * array in which the key is the correlation name, and the value is
-     * the physical table name.  For example, array('alias' => 'table').
-     * The correlation name is prepended to all columns fetched for this
-     * table.
-     *
-     * The second parameter can be a single string or Zend_Db_Expr object,
-     * or else an array of strings or Zend_Db_Expr objects.
-     *
-     * The first parameter can be null or an empty string, in which case
-     * no correlation name is generated or prepended to the columns named
-     * in the second parameter.
-     *
-     * @param  array|string|Zend_Db_Expr $name The table name or an associative array
-     *                                         relating correlation name to table name.
-     * @param  array|string|Zend_Db_Expr $cols The columns to select from this table.
-     * @param  string $schema The schema name to specify, if any.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function from($name, $cols = '*', $schema = null)
-    {
-        return $this->_join(self::FROM, $name, null, $cols, $schema);
-    }
-
-    /**
-     * Specifies the columns used in the FROM clause.
-     *
-     * The parameter can be a single string or Zend_Db_Expr object,
-     * or else an array of strings or Zend_Db_Expr objects.
-     *
-     * @param  array|string|Zend_Db_Expr $cols The columns to select from this table.
-     * @param  string $correlationName Correlation name of target table. OPTIONAL
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function columns($cols = '*', $correlationName = null)
-    {
-        if ($correlationName === null && count($this->_parts[self::FROM])) {
-            $correlationNameKeys = array_keys($this->_parts[self::FROM]);
-            $correlationName = current($correlationNameKeys);
-        }
-
-        if (!array_key_exists($correlationName, $this->_parts[self::FROM])) {
-            /**
-             * @see Zend_Db_Select_Exception
-             */
-            require_once 'Zend/Db/Select/Exception.php';
-            throw new Zend_Db_Select_Exception("No table has been specified for the FROM clause");
-        }
-
-        $this->_tableCols($correlationName, $cols);
-
-        return $this;
-    }
-
-    /**
-     * Adds a UNION clause to the query.
-     *
-     * The first parameter has to be an array of Zend_Db_Select or
-     * sql query strings.
-     *
-     * <code>
-     * $sql1 = $db->select();
-     * $sql2 = "SELECT ...";
-     * $select = $db->select()
-     *      ->union(array($sql1, $sql2))
-     *      ->order("id");
-     * </code>
-     *
-     * @param  array $select Array of select clauses for the union.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function union($select = array(), $type = self::SQL_UNION)
-    {
-        if (!is_array($select)) {
-            require_once 'Zend/Db/Select/Exception.php';
-            throw new Zend_Db_Select_Exception(
-                "union() only accepts an array of Zend_Db_Select instances of sql query strings."
-            );
-        }
-
-        if (!in_array($type, self::$_unionTypes)) {
-            require_once 'Zend/Db/Select/Exception.php';
-            throw new Zend_Db_Select_Exception("Invalid union type '{$type}'");
-        }
-
-        foreach ($select as $target) {
-            $this->_parts[self::UNION][] = array($target, $type);
-        }
-
-        return $this;
-    }
-
-    /**
-     * Adds a JOIN table and columns to the query.
-     *
-     * The $name and $cols parameters follow the same logic
-     * as described in the from() method.
-     *
-     * @param  array|string|Zend_Db_Expr $name The table name.
-     * @param  string $cond Join on this condition.
-     * @param  array|string $cols The columns to select from the joined table.
-     * @param  string $schema The database name to specify, if any.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function join($name, $cond, $cols = self::SQL_WILDCARD, $schema = null)
-    {
-        return $this->joinInner($name, $cond, $cols, $schema);
-    }
-
-    /**
-     * Add an INNER JOIN table and colums to the query
-     * Rows in both tables are matched according to the expression
-     * in the $cond argument.  The result set is comprised
-     * of all cases where rows from the left table match
-     * rows from the right table.
-     *
-     * The $name and $cols parameters follow the same logic
-     * as described in the from() method.
-     *
-     * @param  array|string|Zend_Db_Expr $name The table name.
-     * @param  string $cond Join on this condition.
-     * @param  array|string $cols The columns to select from the joined table.
-     * @param  string $schema The database name to specify, if any.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function joinInner($name, $cond, $cols = self::SQL_WILDCARD, $schema = null)
-    {
-        return $this->_join(self::INNER_JOIN, $name, $cond, $cols, $schema);
-    }
-
-    /**
-     * Add a LEFT OUTER JOIN table and colums to the query
-     * All rows from the left operand table are included,
-     * matching rows from the right operand table included,
-     * and the columns from the right operand table are filled
-     * with NULLs if no row exists matching the left table.
-     *
-     * The $name and $cols parameters follow the same logic
-     * as described in the from() method.
-     *
-     * @param  array|string|Zend_Db_Expr $name The table name.
-     * @param  string $cond Join on this condition.
-     * @param  array|string $cols The columns to select from the joined table.
-     * @param  string $schema The database name to specify, if any.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function joinLeft($name, $cond, $cols = self::SQL_WILDCARD, $schema = null)
-    {
-        return $this->_join(self::LEFT_JOIN, $name, $cond, $cols, $schema);
-    }
-
-    /**
-     * Add a RIGHT OUTER JOIN table and colums to the query.
-     * Right outer join is the complement of left outer join.
-     * All rows from the right operand table are included,
-     * matching rows from the left operand table included,
-     * and the columns from the left operand table are filled
-     * with NULLs if no row exists matching the right table.
-     *
-     * The $name and $cols parameters follow the same logic
-     * as described in the from() method.
-     *
-     * @param  array|string|Zend_Db_Expr $name The table name.
-     * @param  string $cond Join on this condition.
-     * @param  array|string $cols The columns to select from the joined table.
-     * @param  string $schema The database name to specify, if any.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function joinRight($name, $cond, $cols = self::SQL_WILDCARD, $schema = null)
-    {
-        return $this->_join(self::RIGHT_JOIN, $name, $cond, $cols, $schema);
-    }
-
-    /**
-     * Add a FULL OUTER JOIN table and colums to the query.
-     * A full outer join is like combining a left outer join
-     * and a right outer join.  All rows from both tables are
-     * included, paired with each other on the same row of the
-     * result set if they satisfy the join condition, and otherwise
-     * paired with NULLs in place of columns from the other table.
-     *
-     * The $name and $cols parameters follow the same logic
-     * as described in the from() method.
-     *
-     * @param  array|string|Zend_Db_Expr $name The table name.
-     * @param  string $cond Join on this condition.
-     * @param  array|string $cols The columns to select from the joined table.
-     * @param  string $schema The database name to specify, if any.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function joinFull($name, $cond, $cols = self::SQL_WILDCARD, $schema = null)
-    {
-        return $this->_join(self::FULL_JOIN, $name, $cond, $cols, $schema);
-    }
-
-    /**
-     * Add a CROSS JOIN table and colums to the query.
-     * A cross join is a cartesian product; there is no join condition.
-     *
-     * The $name and $cols parameters follow the same logic
-     * as described in the from() method.
-     *
-     * @param  array|string|Zend_Db_Expr $name The table name.
-     * @param  array|string $cols The columns to select from the joined table.
-     * @param  string $schema The database name to specify, if any.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function joinCross($name, $cols = self::SQL_WILDCARD, $schema = null)
-    {
-        return $this->_join(self::CROSS_JOIN, $name, null, $cols, $schema);
-    }
-
-    /**
-     * Add a NATURAL JOIN table and colums to the query.
-     * A natural join assumes an equi-join across any column(s)
-     * that appear with the same name in both tables.
-     * Only natural inner joins are supported by this API,
-     * even though SQL permits natural outer joins as well.
-     *
-     * The $name and $cols parameters follow the same logic
-     * as described in the from() method.
-     *
-     * @param  array|string|Zend_Db_Expr $name The table name.
-     * @param  array|string $cols The columns to select from the joined table.
-     * @param  string $schema The database name to specify, if any.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function joinNatural($name, $cols = self::SQL_WILDCARD, $schema = null)
-    {
-        return $this->_join(self::NATURAL_JOIN, $name, null, $cols, $schema);
-    }
-
-    /**
-     * Adds a WHERE condition to the query by AND.
-     *
-     * If a value is passed as the second param, it will be quoted
-     * and replaced into the condition wherever a question-mark
-     * appears. Array values are quoted and comma-separated.
-     *
-     * <code>
-     * // simplest but non-secure
-     * $select->where("id = $id");
-     *
-     * // secure (ID is quoted but matched anyway)
-     * $select->where('id = ?', $id);
-     *
-     * // alternatively, with named binding
-     * $select->where('id = :id');
-     * </code>
-     *
-     * Note that it is more correct to use named bindings in your
-     * queries for values other than strings. When you use named
-     * bindings, don't forget to pass the values when actually
-     * making a query:
-     *
-     * <code>
-     * $db->fetchAll($select, array('id' => 5));
-     * </code>
-     *
-     * @param string   $cond  The WHERE condition.
-     * @param mixed    $value OPTIONAL The value to quote into the condition.
-     * @param int      $type  OPTIONAL The type of the given value
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function where($cond, $value = null, $type = null)
-    {
-        $this->_parts[self::WHERE][] = $this->_where($cond, $value, $type, true);
-
-        return $this;
-    }
-
-    /**
-     * Adds a WHERE condition to the query by OR.
-     *
-     * Otherwise identical to where().
-     *
-     * @param string   $cond  The WHERE condition.
-     * @param mixed    $value OPTIONAL The value to quote into the condition.
-     * @param int      $type  OPTIONAL The type of the given value
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     *
-     * @see where()
-     */
-    public function orWhere($cond, $value = null, $type = null)
-    {
-        $this->_parts[self::WHERE][] = $this->_where($cond, $value, $type, false);
-
-        return $this;
-    }
-
-    /**
-     * Adds grouping to the query.
-     *
-     * @param  array|string $spec The column(s) to group by.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function group($spec)
-    {
-        if (!is_array($spec)) {
-            $spec = array($spec);
-        }
-
-        foreach ($spec as $val) {
-            if (preg_match(self::REGEX_COLUMN_EXPR, (string) $val)) {
-                $val = new Zend_Db_Expr($val);
-            }
-            $this->_parts[self::GROUP][] = $val;
-        }
-
-        return $this;
-    }
-
-    /**
-     * Adds a HAVING condition to the query by AND.
-     *
-     * If a value is passed as the second param, it will be quoted
-     * and replaced into the condition wherever a question-mark
-     * appears. See {@link where()} for an example
-     *
-     * @param string $cond The HAVING condition.
-     * @param mixed    $value OPTIONAL The value to quote into the condition.
-     * @param int      $type  OPTIONAL The type of the given value
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function having($cond, $value = null, $type = null)
-    {
-        if ($value !== null) {
-            $cond = $this->_adapter->quoteInto($cond, $value, $type);
-        }
-
-        if ($this->_parts[self::HAVING]) {
-            $this->_parts[self::HAVING][] = self::SQL_AND . " ($cond)";
-        } else {
-            $this->_parts[self::HAVING][] = "($cond)";
-        }
-
-        return $this;
-    }
-
-    /**
-     * Adds a HAVING condition to the query by OR.
-     *
-     * Otherwise identical to orHaving().
-     *
-     * @param string $cond The HAVING condition.
-     * @param mixed    $value OPTIONAL The value to quote into the condition.
-     * @param int      $type  OPTIONAL The type of the given value
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     *
-     * @see having()
-     */
-    public function orHaving($cond, $value = null, $type = null)
-    {
-        if ($value !== null) {
-            $cond = $this->_adapter->quoteInto($cond, $value, $type);
-        }
-
-        if ($this->_parts[self::HAVING]) {
-            $this->_parts[self::HAVING][] = self::SQL_OR . " ($cond)";
-        } else {
-            $this->_parts[self::HAVING][] = "($cond)";
-        }
-
-        return $this;
-    }
-
-    /**
-     * Adds a row order to the query.
-     *
-     * @param mixed $spec The column(s) and direction to order by.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function order($spec)
-    {
-        if (!is_array($spec)) {
-            $spec = array($spec);
-        }
-
-        // force 'ASC' or 'DESC' on each order spec, default is ASC.
-        foreach ($spec as $val) {
-            if ($val instanceof Zend_Db_Expr) {
-                $expr = $val->__toString();
-                if (empty($expr)) {
-                    continue;
-                }
-                $this->_parts[self::ORDER][] = $val;
-            } else {
-                if (empty($val)) {
-                    continue;
-                }
-                $direction = self::SQL_ASC;
-                if (preg_match('/(.*\W)(' . self::SQL_ASC . '|' . self::SQL_DESC . ')\b/si', $val, $matches)) {
-                    $val = trim($matches[1]);
-                    $direction = $matches[2];
-                }
-                if (preg_match(self::REGEX_COLUMN_EXPR, (string) $val)) {
-                    $val = new Zend_Db_Expr($val);
-                }
-                $this->_parts[self::ORDER][] = array($val, $direction);
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * Sets a limit count and offset to the query.
-     *
-     * @param int $count OPTIONAL The number of rows to return.
-     * @param int $offset OPTIONAL Start returning after this many rows.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function limit($count = null, $offset = null)
-    {
-        $this->_parts[self::LIMIT_COUNT]  = (int) $count;
-        $this->_parts[self::LIMIT_OFFSET] = (int) $offset;
-        return $this;
-    }
-
-    /**
-     * Sets the limit and count by page number.
-     *
-     * @param int $page Limit results to this page number.
-     * @param int $rowCount Use this many rows per page.
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function limitPage($page, $rowCount)
-    {
-        $page     = ($page > 0)     ? $page     : 1;
-        $rowCount = ($rowCount > 0) ? $rowCount : 1;
-        $this->_parts[self::LIMIT_COUNT]  = (int) $rowCount;
-        $this->_parts[self::LIMIT_OFFSET] = (int) $rowCount * ($page - 1);
-        return $this;
-    }
-
-    /**
-     * Makes the query SELECT FOR UPDATE.
-     *
-     * @param bool $flag Whether or not the SELECT is FOR UPDATE (default true).
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function forUpdate($flag = true)
-    {
-        $this->_parts[self::FOR_UPDATE] = (bool) $flag;
-        return $this;
-    }
-
-    /**
-     * Get part of the structured information for the current query.
-     *
-     * @param string $part
-     * @return mixed
-     * @throws Zend_Db_Select_Exception
-     */
-    public function getPart($part)
-    {
-        $part = strtolower($part);
-        if (!array_key_exists($part, $this->_parts)) {
-            require_once 'Zend/Db/Select/Exception.php';
-            throw new Zend_Db_Select_Exception("Invalid Select part '$part'");
-        }
-        return $this->_parts[$part];
-    }
-
-    /**
-     * Executes the current select object and returns the result
-     *
-     * @param integer $fetchMode OPTIONAL
-     * @param  mixed  $bind An array of data to bind to the placeholders.
-     * @return PDO_Statement|Zend_Db_Statement
-     */
-    public function query($fetchMode = null, $bind = array())
-    {
-        if (!empty($bind)) {
-            $this->bind($bind);
-        }
-
-        $stmt = $this->_adapter->query($this);
-        if ($fetchMode == null) {
-            $fetchMode = $this->_adapter->getFetchMode();
-        }
-        $stmt->setFetchMode($fetchMode);
-        return $stmt;
-    }
-
-    /**
-     * Converts this object to an SQL SELECT string.
-     *
-     * @return string|null This object as a SELECT string. (or null if a string cannot be produced.)
-     */
-    public function assemble()
-    {
-        $sql = self::SQL_SELECT;
-        foreach (array_keys(self::$_partsInit) as $part) {
-            $method = '_render' . ucfirst($part);
-            if (method_exists($this, $method)) {
-                $sql = $this->$method($sql);
-            }
-        }
-        return $sql;
-    }
-
-    /**
-     * Clear parts of the Select object, or an individual part.
-     *
-     * @param string $part OPTIONAL
-     * @return Zend_Db_Select
-     */
-    public function reset($part = null)
-    {
-        if ($part == null) {
-            $this->_parts = self::$_partsInit;
-        } elseif (array_key_exists($part, self::$_partsInit)) {
-            $this->_parts[$part] = self::$_partsInit[$part];
-        }
-        return $this;
-    }
-
-    /**
-     * Gets the Zend_Db_Adapter_Abstract for this
-     * particular Zend_Db_Select object.
-     *
-     * @return Zend_Db_Adapter_Abstract
-     */
-    public function getAdapter()
-    {
-        return $this->_adapter;
-    }
-
-    /**
-     * Populate the {@link $_parts} 'join' key
-     *
-     * Does the dirty work of populating the join key.
-     *
-     * The $name and $cols parameters follow the same logic
-     * as described in the from() method.
-     *
-     * @param  null|string $type Type of join; inner, left, and null are currently supported
-     * @param  array|string|Zend_Db_Expr $name Table name
-     * @param  string $cond Join on this condition
-     * @param  array|string $cols The columns to select from the joined table
-     * @param  string $schema The database name to specify, if any.
-     * @return Zend_Db_Select This Zend_Db_Select object
-     * @throws Zend_Db_Select_Exception
-     */
-    protected function _join($type, $name, $cond, $cols, $schema = null)
-    {
-        if (!in_array($type, self::$_joinTypes) && $type != self::FROM) {
-            /**
-             * @see Zend_Db_Select_Exception
-             */
-            require_once 'Zend/Db/Select/Exception.php';
-            throw new Zend_Db_Select_Exception("Invalid join type '$type'");
-        }
-
-        if (count($this->_parts[self::UNION])) {
-            require_once 'Zend/Db/Select/Exception.php';
-            throw new Zend_Db_Select_Exception("Invalid use of table with " . self::SQL_UNION);
-        }
-
-        if (empty($name)) {
-            $correlationName = $tableName = '';
-        } elseif (is_array($name)) {
-            // Must be array($correlationName => $tableName) or array($ident, ...)
-            foreach ($name as $_correlationName => $_tableName) {
-                if (is_string($_correlationName)) {
-                    // We assume the key is the correlation name and value is the table name
-                    $tableName = $_tableName;
-                    $correlationName = $_correlationName;
-                } else {
-                    // We assume just an array of identifiers, with no correlation name
-                    $tableName = $_tableName;
-                    $correlationName = $this->_uniqueCorrelation($tableName);
-                }
-                break;
-            }
-        } elseif ($name instanceof Zend_Db_Expr|| $name instanceof Zend_Db_Select) {
-            $tableName = $name;
-            $correlationName = $this->_uniqueCorrelation('t');
-        } elseif (preg_match('/^(.+)\s+AS\s+(.+)$/i', $name, $m)) {
-            $tableName = $m[1];
-            $correlationName = $m[2];
-        } else {
-            $tableName = $name;
-            $correlationName = $this->_uniqueCorrelation($tableName);
-        }
-
-        // Schema from table name overrides schema argument
-        if (!is_object($tableName) && false !== strpos($tableName, '.')) {
-            list($schema, $tableName) = explode('.', $tableName);
-        }
-
-        $lastFromCorrelationName = null;
-        if (!empty($correlationName)) {
-            if (array_key_exists($correlationName, $this->_parts[self::FROM])) {
-                /**
-                 * @see Zend_Db_Select_Exception
-                 */
-                require_once 'Zend/Db/Select/Exception.php';
-                throw new Zend_Db_Select_Exception("You cannot define a correlation name '$correlationName' more than once");
-            }
-
-            if ($type == self::FROM) {
-                // append this from after the last from joinType
-                $tmpFromParts = $this->_parts[self::FROM];
-                $this->_parts[self::FROM] = array();
-                // move all the froms onto the stack
-                while ($tmpFromParts) {
-                    $currentCorrelationName = key($tmpFromParts);
-                    if ($tmpFromParts[$currentCorrelationName]['joinType'] != self::FROM) {
-                        break;
-                    }
-                    $lastFromCorrelationName = $currentCorrelationName;
-                    $this->_parts[self::FROM][$currentCorrelationName] = array_shift($tmpFromParts);
-                }
-            } else {
-                $tmpFromParts = array();
-            }
-            $this->_parts[self::FROM][$correlationName] = array(
-                'joinType'      => $type,
-                'schema'        => $schema,
-                'tableName'     => $tableName,
-                'joinCondition' => $cond
-                );
-            while ($tmpFromParts) {
-                $currentCorrelationName = key($tmpFromParts);
-                $this->_parts[self::FROM][$currentCorrelationName] = array_shift($tmpFromParts);
-            }
-        }
-
-        // add to the columns from this joined table
-        if ($type == self::FROM && $lastFromCorrelationName == null) {
-            $lastFromCorrelationName = true;
-        }
-        $this->_tableCols($correlationName, $cols, $lastFromCorrelationName);
-
-        return $this;
-    }
-
-    /**
-     * Handle JOIN... USING... syntax
-     *
-     * This is functionality identical to the existing JOIN methods, however
-     * the join condition can be passed as a single column name. This method
-     * then completes the ON condition by using the same field for the FROM
-     * table and the JOIN table.
-     *
-     * <code>
-     * $select = $db->select()->from('table1')
-     *                        ->joinUsing('table2', 'column1');
-     *
-     * // SELECT * FROM table1 JOIN table2 ON table1.column1 = table2.column2
-     * </code>
-     *
-     * These joins are called by the developer simply by adding 'Using' to the
-     * method name. E.g.
-     * * joinUsing
-     * * joinInnerUsing
-     * * joinFullUsing
-     * * joinRightUsing
-     * * joinLeftUsing
-     *
-     * @return Zend_Db_Select This Zend_Db_Select object.
-     */
-    public function _joinUsing($type, $name, $cond, $cols = '*', $schema = null)
-    {
-        if (empty($this->_parts[self::FROM])) {
-            require_once 'Zend/Db/Select/Exception.php';
-            throw new Zend_Db_Select_Exception("You can only perform a joinUsing after specifying a FROM table");
-        }
-
-        $join  = $this->_adapter->quoteIdentifier(key($this->_parts[self::FROM]), true);
-        $from  = $this->_adapter->quoteIdentifier($this->_uniqueCorrelation($name), true);
-
-        $joinCond = array();
-        foreach ((array)$cond as $fieldName) {
-            $cond1 = $from . '.' . $fieldName;
-            $cond2 = $join . '.' . $fieldName;
-            $joinCond[]  = $cond1 . ' = ' . $cond2;
-        }
-        $cond = implode(' '.self::SQL_AND.' ', $joinCond);
-
-        return $this->_join($type, $name, $cond, $cols, $schema);
-    }
-
-    /**
-     * Generate a unique correlation name
-     *
-     * @param string|array $name A qualified identifier.
-     * @return string A unique correlation name.
-     */
-    private function _uniqueCorrelation($name)
-    {
-        if (is_array($name)) {
-            $k = key($name);
-            $c = is_string($k) ? $k : end($name);
-        } else {
-            // Extract just the last name of a qualified table name
-            $dot = strrpos($name,'.');
-            $c = ($dot === false) ? $name : substr($name, $dot+1);
-        }
-        for ($i = 2; array_key_exists($c, $this->_parts[self::FROM]); ++$i) {
-            $c = $name . '_' . (string) $i;
-        }
-        return $c;
-    }
-
-    /**
-     * Adds to the internal table-to-column mapping array.
-     *
-     * @param  string $tbl The table/join the columns come from.
-     * @param  array|string $cols The list of columns; preferably as
-     * an array, but possibly as a string containing one column.
-     * @param  bool|string True if it should be prepended, a correlation name if it should be inserted
-     * @return void
-     */
-    protected function _tableCols($correlationName, $cols, $afterCorrelationName = null)
-    {
-        if (!is_array($cols)) {
-            $cols = array($cols);
-        }
-
-        if ($correlationName == null) {
-            $correlationName = '';
-        }
-
-        $columnValues = array();
-
-        foreach (array_filter($cols) as $alias => $col) {
-            $currentCorrelationName = $correlationName;
-            if (is_string($col)) {
-                // Check for a column matching "<column> AS <alias>" and extract the alias name
-                if (preg_match('/^(.+)\s+' . self::SQL_AS . '\s+(.+)$/i', $col, $m)) {
-                    $col = $m[1];
-                    $alias = $m[2];
-                }
-                // Check for columns that look like functions and convert to Zend_Db_Expr
-                if (preg_match('/\(.*\)/', (string) $col)) {
-                    $col = new Zend_Db_Expr($col);
-                } elseif (preg_match('/(.+)\.(.+)/', $col, $m)) {
-                    $currentCorrelationName = $m[1];
-                    $col = $m[2];
-                }
-            }
-            $columnValues[] = array($currentCorrelationName, $col, is_string($alias) ? $alias : null);
-        }
-
-        if ($columnValues) {
-
-            // should we attempt to prepend or insert these values?
-            if ($afterCorrelationName === true || is_string($afterCorrelationName)) {
-                $tmpColumns = $this->_parts[self::COLUMNS];
-                $this->_parts[self::COLUMNS] = array();
-            } else {
-                $tmpColumns = array();
-            }
-
-            // find the correlation name to insert after
-            if (is_string($afterCorrelationName)) {
-                while ($tmpColumns) {
-                    $this->_parts[self::COLUMNS][] = $currentColumn = array_shift($tmpColumns);
-                    if ($currentColumn[0] == $afterCorrelationName) {
-                        break;
-                    }
-                }
-            }
-
-            // apply current values to current stack
-            foreach ($columnValues as $columnValue) {
-                array_push($this->_parts[self::COLUMNS], $columnValue);
-            }
-
-            // finish ensuring that all previous values are applied (if they exist)
-            while ($tmpColumns) {
-                array_push($this->_parts[self::COLUMNS], array_shift($tmpColumns));
-            }
-        }
-    }
-
-    /**
-     * Internal function for creating the where clause
-     *
-     * @param string   $condition
-     * @param mixed    $value  optional
-     * @param string   $type   optional
-     * @param boolean  $bool  true = AND, false = OR
-     * @return string  clause
-     */
-    protected function _where($condition, $value = null, $type = null, $bool = true)
-    {
-        if (count($this->_parts[self::UNION])) {
-            require_once 'Zend/Db/Select/Exception.php';
-            throw new Zend_Db_Select_Exception("Invalid use of where clause with " . self::SQL_UNION);
-        }
-
-        if ($value !== null) {
-            $condition = $this->_adapter->quoteInto($condition, $value, $type);
-        }
-
-        $cond = "";
-        if ($this->_parts[self::WHERE]) {
-            if ($bool === true) {
-                $cond = self::SQL_AND . ' ';
-            } else {
-                $cond = self::SQL_OR . ' ';
-            }
-        }
-
-        return $cond . "($condition)";
-    }
-
-    /**
-     * @return array
-     */
-    protected function _getDummyTable()
-    {
-        return array();
-    }
-
-    /**
-     * Return a quoted schema name
-     *
-     * @param string   $schema  The schema name OPTIONAL
-     * @return string|null
-     */
-    protected function _getQuotedSchema($schema = null)
-    {
-        if ($schema === null) {
-            return null;
-        }
-        return $this->_adapter->quoteIdentifier($schema, true) . '.';
-    }
-
-    /**
-     * Return a quoted table name
-     *
-     * @param string   $tableName        The table name
-     * @param string   $correlationName  The correlation name OPTIONAL
-     * @return string
-     */
-    protected function _getQuotedTable($tableName, $correlationName = null)
-    {
-        return $this->_adapter->quoteTableAs($tableName, $correlationName, true);
-    }
-
-    /**
-     * Render DISTINCT clause
-     *
-     * @param string   $sql SQL query
-     * @return string
-     */
-    protected function _renderDistinct($sql)
-    {
-        if ($this->_parts[self::DISTINCT]) {
-            $sql .= ' ' . self::SQL_DISTINCT;
-        }
-
-        return $sql;
-    }
-
-    /**
-     * Render DISTINCT clause
-     *
-     * @param string   $sql SQL query
-     * @return string|null
-     */
-    protected function _renderColumns($sql)
-    {
-        if (!count($this->_parts[self::COLUMNS])) {
-            return null;
-        }
-
-        $columns = array();
-        foreach ($this->_parts[self::COLUMNS] as $columnEntry) {
-            list($correlationName, $column, $alias) = $columnEntry;
-            if ($column instanceof Zend_Db_Expr) {
-                $columns[] = $this->_adapter->quoteColumnAs($column, $alias, true);
-            } else {
-                if ($column == self::SQL_WILDCARD) {
-                    $column = new Zend_Db_Expr(self::SQL_WILDCARD);
-                    $alias = null;
-                }
-                if (empty($correlationName)) {
-                    $columns[] = $this->_adapter->quoteColumnAs($column, $alias, true);
-                } else {
-                    $columns[] = $this->_adapter->quoteColumnAs(array($correlationName, $column), $alias, true);
-                }
-            }
-        }
-
-        return $sql . ' ' . implode(', ', $columns);
-    }
-
-    /**
-     * Render FROM clause
-     *
-     * @param string   $sql SQL query
-     * @return string
-     */
-    protected function _renderFrom($sql)
-    {
-        /*
-         * If no table specified, use RDBMS-dependent solution
-         * for table-less query.  e.g. DUAL in Oracle.
-         */
-        if (empty($this->_parts[self::FROM])) {
-            $this->_parts[self::FROM] = $this->_getDummyTable();
-        }
-
-        $from = array();
-
-        foreach ($this->_parts[self::FROM] as $correlationName => $table) {
-            $tmp = '';
-
-            $joinType = ($table['joinType'] == self::FROM) ? self::INNER_JOIN : $table['joinType'];
-
-            // Add join clause (if applicable)
-            if (! empty($from)) {
-                $tmp .= ' ' . strtoupper($joinType) . ' ';
-            }
-
-            $tmp .= $this->_getQuotedSchema($table['schema']);
-            $tmp .= $this->_getQuotedTable($table['tableName'], $correlationName);
-
-            // Add join conditions (if applicable)
-            if (!empty($from) && ! empty($table['joinCondition'])) {
-                $tmp .= ' ' . self::SQL_ON . ' ' . $table['joinCondition'];
-            }
-
-            // Add the table name and condition add to the list
-            $from[] = $tmp;
-        }
-
-        // Add the list of all joins
-        if (!empty($from)) {
-            $sql .= ' ' . self::SQL_FROM . ' ' . implode("\n", $from);
-        }
-
-        return $sql;
-    }
-
-    /**
-     * Render UNION query
-     *
-     * @param string   $sql SQL query
-     * @return string
-     */
-    protected function _renderUnion($sql)
-    {
-        if ($this->_parts[self::UNION]) {
-            $parts = count($this->_parts[self::UNION]);
-            foreach ($this->_parts[self::UNION] as $cnt => $union) {
-                list($target, $type) = $union;
-                if ($target instanceof Zend_Db_Select) {
-                    $target = $target->assemble();
-                }
-                $sql .= $target;
-                if ($cnt < $parts - 1) {
-                    $sql .= ' ' . $type . ' ';
-                }
-            }
-        }
-
-        return $sql;
-    }
-
-    /**
-     * Render WHERE clause
-     *
-     * @param string   $sql SQL query
-     * @return string
-     */
-    protected function _renderWhere($sql)
-    {
-        if ($this->_parts[self::FROM] && $this->_parts[self::WHERE]) {
-            $sql .= ' ' . self::SQL_WHERE . ' ' .  implode(' ', $this->_parts[self::WHERE]);
-        }
-
-        return $sql;
-    }
-
-    /**
-     * Render GROUP clause
-     *
-     * @param string   $sql SQL query
-     * @return string
-     */
-    protected function _renderGroup($sql)
-    {
-        if ($this->_parts[self::FROM] && $this->_parts[self::GROUP]) {
-            $group = array();
-            foreach ($this->_parts[self::GROUP] as $term) {
-                $group[] = $this->_adapter->quoteIdentifier($term, true);
-            }
-            $sql .= ' ' . self::SQL_GROUP_BY . ' ' . implode(",\n\t", $group);
-        }
-
-        return $sql;
-    }
-
-    /**
-     * Render HAVING clause
-     *
-     * @param string   $sql SQL query
-     * @return string
-     */
-    protected function _renderHaving($sql)
-    {
-        if ($this->_parts[self::FROM] && $this->_parts[self::HAVING]) {
-            $sql .= ' ' . self::SQL_HAVING . ' ' . implode(' ', $this->_parts[self::HAVING]);
-        }
-
-        return $sql;
-    }
-
-    /**
-     * Render ORDER clause
-     *
-     * @param string   $sql SQL query
-     * @return string
-     */
-    protected function _renderOrder($sql)
-    {
-        if ($this->_parts[self::ORDER]) {
-            $order = array();
-            foreach ($this->_parts[self::ORDER] as $term) {
-                if (is_array($term)) {
-                    if(is_numeric($term[0]) && strval(intval($term[0])) == $term[0]) {
-                        $order[] = (int)trim($term[0]) . ' ' . $term[1];
-                    } else {
-                        $order[] = $this->_adapter->quoteIdentifier($term[0], true) . ' ' . $term[1];
-                    }
-                } elseif (is_numeric($term) && strval(intval($term)) == $term) {
-                    $order[] = (int)trim($term);
-                } else {
-                    $order[] = $this->_adapter->quoteIdentifier($term, true);
-                }
-            }
-            $sql .= ' ' . self::SQL_ORDER_BY . ' ' . implode(', ', $order);
-        }
-
-        return $sql;
-    }
-
-    /**
-     * Render LIMIT OFFSET clause
-     *
-     * @param string   $sql SQL query
-     * @return string
-     */
-    protected function _renderLimitoffset($sql)
-    {
-        $count = 0;
-        $offset = 0;
-
-        if (!empty($this->_parts[self::LIMIT_OFFSET])) {
-            $offset = (int) $this->_parts[self::LIMIT_OFFSET];
-            $count = PHP_INT_MAX;
-        }
-
-        if (!empty($this->_parts[self::LIMIT_COUNT])) {
-            $count = (int) $this->_parts[self::LIMIT_COUNT];
-        }
-
-        /*
-         * Add limits clause
-         */
-        if ($count > 0) {
-            $sql = trim($this->_adapter->limit($sql, $count, $offset));
-        }
-
-        return $sql;
-    }
-
-    /**
-     * Render FOR UPDATE clause
-     *
-     * @param string   $sql SQL query
-     * @return string
-     */
-    protected function _renderForupdate($sql)
-    {
-        if ($this->_parts[self::FOR_UPDATE]) {
-            $sql .= ' ' . self::SQL_FOR_UPDATE;
-        }
-
-        return $sql;
-    }
-
-    /**
-     * Turn magic function calls into non-magic function calls
-     * for joinUsing syntax
-     *
-     * @param string $method
-     * @param array $args OPTIONAL Zend_Db_Table_Select query modifier
-     * @return Zend_Db_Select
-     * @throws Zend_Db_Select_Exception If an invalid method is called.
-     */
-    public function __call($method, array $args)
-    {
-        $matches = array();
-
-        /**
-         * Recognize methods for Has-Many cases:
-         * findParent<Class>()
-         * findParent<Class>By<Rule>()
-         * Use the non-greedy pattern repeat modifier e.g. \w+?
-         */
-        if (preg_match('/^join([a-zA-Z]*?)Using$/', $method, $matches)) {
-            $type = strtolower($matches[1]);
-            if ($type) {
-                $type .= ' join';
-                if (!in_array($type, self::$_joinTypes)) {
-                    require_once 'Zend/Db/Select/Exception.php';
-                    throw new Zend_Db_Select_Exception("Unrecognized method '$method()'");
-                }
-                if (in_array($type, array(self::CROSS_JOIN, self::NATURAL_JOIN))) {
-                    require_once 'Zend/Db/Select/Exception.php';
-                    throw new Zend_Db_Select_Exception("Cannot perform a joinUsing with method '$method()'");
-                }
-            } else {
-                $type = self::INNER_JOIN;
-            }
-            array_unshift($args, $type);
-            return call_user_func_array(array($this, '_joinUsing'), $args);
-        }
-
-        require_once 'Zend/Db/Select/Exception.php';
-        throw new Zend_Db_Select_Exception("Unrecognized method '$method()'");
-    }
-
-    /**
-     * Implements magic method.
-     *
-     * @return string This object as a SELECT string.
-     */
-    public function __toString()
-    {
-        try {
-            $sql = $this->assemble();
-        } catch (Exception $e) {
-            trigger_error($e->getMessage(), E_USER_WARNING);
-            $sql = '';
-        }
-        return (string)$sql;
-    }
-
-}
diff --git a/tine20/Zend/Db/Table/Abstract.php b/tine20/Zend/Db/Table/Abstract.php
deleted file mode 100644 (file)
index b925cab..0000000
+++ /dev/null
@@ -1,1629 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Db
- * @subpackage Table
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-/**
- * @see Zend_Db_Adapter_Abstract
- */
-require_once 'Zend/Db/Adapter/Abstract.php';
-
-/**
- * @see Zend_Db_Adapter_Abstract
- */
-require_once 'Zend/Db/Select.php';
-
-/**
- * @see Zend_Db
- */
-require_once 'Zend/Db.php';
-
-/**
- * Class for SQL table interface.
- *
- * @category   Zend
- * @package    Zend_Db
- * @subpackage Table
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-abstract class Zend_Db_Table_Abstract
-{
-
-    const ADAPTER          = 'db';
-    const DEFINITION        = 'definition';
-    const DEFINITION_CONFIG_NAME = 'definitionConfigName';
-    const SCHEMA           = 'schema';
-    const NAME             = 'name';
-    const PRIMARY          = 'primary';
-    const COLS             = 'cols';
-    const METADATA         = 'metadata';
-    const METADATA_CACHE   = 'metadataCache';
-    const METADATA_CACHE_IN_CLASS = 'metadataCacheInClass';
-    const ROW_CLASS        = 'rowClass';
-    const ROWSET_CLASS     = 'rowsetClass';
-    const REFERENCE_MAP    = 'referenceMap';
-    const DEPENDENT_TABLES = 'dependentTables';
-    const SEQUENCE         = 'sequence';
-
-    const COLUMNS          = 'columns';
-    const REF_TABLE_CLASS  = 'refTableClass';
-    const REF_COLUMNS      = 'refColumns';
-    const ON_DELETE        = 'onDelete';
-    const ON_UPDATE        = 'onUpdate';
-
-    const CASCADE          = 'cascade';
-    const CASCADE_RECURSE  = 'cascadeRecurse';
-    const RESTRICT         = 'restrict';
-    const SET_NULL         = 'setNull';
-
-    const DEFAULT_NONE     = 'defaultNone';
-    const DEFAULT_CLASS    = 'defaultClass';
-    const DEFAULT_DB       = 'defaultDb';
-
-    const SELECT_WITH_FROM_PART    = true;
-    const SELECT_WITHOUT_FROM_PART = false;
-
-    /**
-     * Default Zend_Db_Adapter_Abstract object.
-     *
-     * @var Zend_Db_Adapter_Abstract
-     */
-    protected static $_defaultDb;
-
-    /**
-     * Optional Zend_Db_Table_Definition object
-     *
-     * @var unknown_type
-     */
-    protected $_definition = null;
-
-    /**
-     * Optional definition config name used in concrete implementation
-     *
-     * @var string
-     */
-    protected $_definitionConfigName = null;
-
-    /**
-     * Default cache for information provided by the adapter's describeTable() method.
-     *
-     * @var Zend_Cache_Core
-     */
-    protected static $_defaultMetadataCache = null;
-
-    /**
-     * Zend_Db_Adapter_Abstract object.
-     *
-     * @var Zend_Db_Adapter_Abstract
-     */
-    protected $_db;
-
-    /**
-     * The schema name (default null means current schema)
-     *
-     * @var array
-     */
-    protected $_schema = null;
-
-    /**
-     * The table name.
-     *
-     * @var string
-     */
-    protected $_name = null;
-
-    /**
-     * The table column names derived from Zend_Db_Adapter_Abstract::describeTable().
-     *
-     * @var array
-     */
-    protected $_cols;
-
-    /**
-     * The primary key column or columns.
-     * A compound key should be declared as an array.
-     * You may declare a single-column primary key
-     * as a string.
-     *
-     * @var mixed
-     */
-    protected $_primary = null;
-
-    /**
-     * If your primary key is a compound key, and one of the columns uses
-     * an auto-increment or sequence-generated value, set _identity
-     * to the ordinal index in the $_primary array for that column.
-     * Note this index is the position of the column in the primary key,
-     * not the position of the column in the table.  The primary key
-     * array is 1-based.
-     *
-     * @var integer
-     */
-    protected $_identity = 1;
-
-    /**
-     * Define the logic for new values in the primary key.
-     * May be a string, boolean true, or boolean false.
-     *
-     * @var mixed
-     */
-    protected $_sequence = true;
-
-    /**
-     * Information provided by the adapter's describeTable() method.
-     *
-     * @var array
-     */
-    protected $_metadata = array();
-
-    /**
-     * Cache for information provided by the adapter's describeTable() method.
-     *
-     * @var Zend_Cache_Core
-     */
-    protected $_metadataCache = null;
-
-    /**
-     * Flag: whether or not to cache metadata in the class
-     * @var bool
-     */
-    protected $_metadataCacheInClass = true;
-
-    /**
-     * Classname for row
-     *
-     * @var string
-     */
-    protected $_rowClass = 'Zend_Db_Table_Row';
-
-    /**
-     * Classname for rowset
-     *
-     * @var string
-     */
-    protected $_rowsetClass = 'Zend_Db_Table_Rowset';
-
-    /**
-     * Associative array map of declarative referential integrity rules.
-     * This array has one entry per foreign key in the current table.
-     * Each key is a mnemonic name for one reference rule.
-     *
-     * Each value is also an associative array, with the following keys:
-     * - columns       = array of names of column(s) in the child table.
-     * - refTableClass = class name of the parent table.
-     * - refColumns    = array of names of column(s) in the parent table,
-     *                   in the same order as those in the 'columns' entry.
-     * - onDelete      = "cascade" means that a delete in the parent table also
-     *                   causes a delete of referencing rows in the child table.
-     * - onUpdate      = "cascade" means that an update of primary key values in
-     *                   the parent table also causes an update of referencing
-     *                   rows in the child table.
-     *
-     * @var array
-     */
-    protected $_referenceMap = array();
-
-    /**
-     * Simple array of class names of tables that are "children" of the current
-     * table, in other words tables that contain a foreign key to this one.
-     * Array elements are not table names; they are class names of classes that
-     * extend Zend_Db_Table_Abstract.
-     *
-     * @var array
-     */
-    protected $_dependentTables = array();
-
-
-    protected $_defaultSource = self::DEFAULT_NONE;
-    protected $_defaultValues = array();
-
-    /**
-     * Constructor.
-     *
-     * Supported params for $config are:
-     * - db              = user-supplied instance of database connector,
-     *                     or key name of registry instance.
-     * - name            = table name.
-     * - primary         = string or array of primary key(s).
-     * - rowClass        = row class name.
-     * - rowsetClass     = rowset class name.
-     * - referenceMap    = array structure to declare relationship
-     *                     to parent tables.
-     * - dependentTables = array of child tables.
-     * - metadataCache   = cache for information from adapter describeTable().
-     *
-     * @param  mixed $config Array of user-specified config options, or just the Db Adapter.
-     * @return void
-     */
-    public function __construct($config = array())
-    {
-        /**
-         * Allow a scalar argument to be the Adapter object or Registry key.
-         */
-        if (!is_array($config)) {
-            $config = array(self::ADAPTER => $config);
-        }
-
-        if ($config) {
-            $this->setOptions($config);
-        }
-
-        $this->_setup();
-        $this->init();
-    }
-
-    /**
-     * setOptions()
-     *
-     * @param array $options
-     * @return Zend_Db_Table_Abstract
-     */
-    public function setOptions(Array $options)
-    {
-        foreach ($options as $key => $value) {
-            switch ($key) {
-                case self::ADAPTER:
-                    $this->_setAdapter($value);
-                    break;
-                case self::DEFINITION:
-                    $this->setDefinition($value);
-                    break;
-                case self::DEFINITION_CONFIG_NAME:
-                    $this->setDefinitionConfigName($value);
-                    break;
-                case self::SCHEMA:
-                    $this->_schema = (string) $value;
-                    break;
-                case self::NAME:
-                    $this->_name = (string) $value;
-                    break;
-                case self::PRIMARY:
-                    $this->_primary = (array) $value;
-                    break;
-                case self::ROW_CLASS:
-                    $this->setRowClass($value);
-                    break;
-                case self::ROWSET_CLASS:
-                    $this->setRowsetClass($value);
-                    break;
-                case self::REFERENCE_MAP:
-                    $this->setReferences($value);
-                    break;
-                case self::DEPENDENT_TABLES:
-                    $this->setDependentTables($value);
-                    break;
-                case self::METADATA_CACHE:
-                    $this->_setMetadataCache($value);
-                    break;
-                case self::METADATA_CACHE_IN_CLASS:
-                    $this->setMetadataCacheInClass($value);
-                    break;
-                case self::SEQUENCE:
-                    $this->_setSequence($value);
-                    break;
-                default:
-                    // ignore unrecognized configuration directive
-                    break;
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * setDefinition()
-     *
-     * @param Zend_Db_Table_Definition $definition
-     * @return Zend_Db_Table_Abstract
-     */
-    public function setDefinition(Zend_Db_Table_Definition $definition)
-    {
-        $this->_definition = $definition;
-        return $this;
-    }
-
-    /**
-     * getDefinition()
-     *
-     * @return Zend_Db_Table_Definition|null
-     */
-    public function getDefinition()
-    {
-        return $this->_definition;
-    }
-
-    /**
-     * setDefinitionConfigName()
-     *
-     * @param string $definition
-     * @return Zend_Db_Table_Abstract
-     */
-    public function setDefinitionConfigName($definitionConfigName)
-    {
-        $this->_definitionConfigName = $definitionConfigName;
-        return $this;
-    }
-
-    /**
-     * getDefinitionConfigName()
-     *
-     * @return string
-     */
-    public function getDefinitionConfigName()
-    {
-        return $this->_definitionConfigName;
-    }
-
-    /**
-     * @param  string $classname
-     * @return Zend_Db_Table_Abstract Provides a fluent interface
-     */
-    public function setRowClass($classname)
-    {
-        $this->_rowClass = (string) $classname;
-
-        return $this;
-    }
-
-    /**
-     * @return string
-     */
-    public function getRowClass()
-    {
-        return $this->_rowClass;
-    }
-
-    /**
-     * @param  string $classname
-     * @return Zend_Db_Table_Abstract Provides a fluent interface
-     */
-    public function setRowsetClass($classname)
-    {
-        $this->_rowsetClass = (string) $classname;
-
-        return $this;
-    }
-
-    /**
-     * @return string
-     */
-    public function getRowsetClass()
-    {
-        return $this->_rowsetClass;
-    }
-
-    /**
-     * Add a reference to the reference map
-     *
-     * @param string $ruleKey
-     * @param string|array $columns
-     * @param string $refTableClass
-     * @param string|array $refColumns
-     * @param string $onDelete
-     * @param string $onUpdate
-     * @return Zend_Db_Table_Abstract
-     */
-    public function addReference($ruleKey, $columns, $refTableClass, $refColumns,
-                                 $onDelete = null, $onUpdate = null)
-    {
-        $reference = array(self::COLUMNS         => (array) $columns,
-                           self::REF_TABLE_CLASS => $refTableClass,
-                           self::REF_COLUMNS     => (array) $refColumns);
-
-        if (!empty($onDelete)) {
-            $reference[self::ON_DELETE] = $onDelete;
-        }
-
-        if (!empty($onUpdate)) {
-            $reference[self::ON_UPDATE] = $onUpdate;
-        }
-
-        $this->_referenceMap[$ruleKey] = $reference;
-
-        return $this;
-    }
-
-    /**
-     * @param array $referenceMap
-     * @return Zend_Db_Table_Abstract Provides a fluent interface
-     */
-    public function setReferences(array $referenceMap)
-    {
-        $this->_referenceMap = $referenceMap;
-
-        return $this;
-    }
-
-    /**
-     * @param string $tableClassname
-     * @param string $ruleKey OPTIONAL
-     * @return array
-     * @throws Zend_Db_Table_Exception
-     */
-    public function getReference($tableClassname, $ruleKey = null)
-    {
-        $thisClass = get_class($this);
-        if ($thisClass === 'Zend_Db_Table') {
-            $thisClass = $this->_definitionConfigName;
-        }
-        $refMap = $this->_getReferenceMapNormalized();
-        if ($ruleKey !== null) {
-            if (!isset($refMap[$ruleKey])) {
-                require_once "Zend/Db/Table/Exception.php";
-                throw new Zend_Db_Table_Exception("No reference rule \"$ruleKey\" from table $thisClass to table $tableClassname");
-            }
-            if ($refMap[$ruleKey][self::REF_TABLE_CLASS] != $tableClassname) {
-                require_once "Zend/Db/Table/Exception.php";
-                throw new Zend_Db_Table_Exception("Reference rule \"$ruleKey\" does not reference table $tableClassname");
-            }
-            return $refMap[$ruleKey];
-        }
-        foreach ($refMap as $reference) {
-            if ($reference[self::REF_TABLE_CLASS] == $tableClassname) {
-                return $reference;
-            }
-        }
-        require_once "Zend/Db/Table/Exception.php";
-        throw new Zend_Db_Table_Exception("No reference from table $thisClass to table $tableClassname");
-    }
-
-    /**
-     * @param  array $dependentTables
-     * @return Zend_Db_Table_Abstract Provides a fluent interface
-     */
-    public function setDependentTables(array $dependentTables)
-    {
-        $this->_dependentTables = $dependentTables;
-
-        return $this;
-    }
-
-    /**
-     * @return array
-     */
-    public function getDependentTables()
-    {
-        return $this->_dependentTables;
-    }
-
-    /**
-     * set the defaultSource property - this tells the table class where to find default values
-     *
-     * @param string $defaultSource
-     * @return Zend_Db_Table_Abstract
-     */
-    public function setDefaultSource($defaultSource = self::DEFAULT_NONE)
-    {
-        if (!in_array($defaultSource, array(self::DEFAULT_CLASS, self::DEFAULT_DB, self::DEFAULT_NONE))) {
-            $defaultSource = self::DEFAULT_NONE;
-        }
-
-        $this->_defaultSource = $defaultSource;
-        return $this;
-    }
-
-    /**
-     * returns the default source flag that determines where defaultSources come from
-     *
-     * @return unknown
-     */
-    public function getDefaultSource()
-    {
-        return $this->_defaultSource;
-    }
-
-    /**
-     * set the default values for the table class
-     *
-     * @param array $defaultValues
-     * @return Zend_Db_Table_Abstract
-     */
-    public function setDefaultValues(Array $defaultValues)
-    {
-        foreach ($defaultValues as $defaultName => $defaultValue) {
-            if ((isset($this->_metadata[$defaultName]) || array_key_exists($defaultName, $this->_metadata))) {
-                $this->_defaultValues[$defaultName] = $defaultValue;
-            }
-        }
-        return $this;
-    }
-
-    public function getDefaultValues()
-    {
-        return $this->_defaultValues;
-    }
-
-
-    /**
-     * Sets the default Zend_Db_Adapter_Abstract for all Zend_Db_Table objects.
-     *
-     * @param  mixed $db Either an Adapter object, or a string naming a Registry key
-     * @return void
-     */
-    public static function setDefaultAdapter($db = null)
-    {
-        self::$_defaultDb = self::_setupAdapter($db);
-    }
-
-    /**
-     * Gets the default Zend_Db_Adapter_Abstract for all Zend_Db_Table objects.
-     *
-     * @return Zend_Db_Adapter_Abstract or null
-     */
-    public static function getDefaultAdapter()
-    {
-        return self::$_defaultDb;
-    }
-
-    /**
-     * @param  mixed $db Either an Adapter object, or a string naming a Registry key
-     * @return Zend_Db_Table_Abstract Provides a fluent interface
-     */
-    protected function _setAdapter($db)
-    {
-        $this->_db = self::_setupAdapter($db);
-        return $this;
-    }
-
-    /**
-     * Gets the Zend_Db_Adapter_Abstract for this particular Zend_Db_Table object.
-     *
-     * @return Zend_Db_Adapter_Abstract
-     */
-    public function getAdapter()
-    {
-        return $this->_db;
-    }
-
-    /**
-     * @param  mixed $db Either an Adapter object, or a string naming a Registry key
-     * @return Zend_Db_Adapter_Abstract
-     * @throws Zend_Db_Table_Exception
-     */
-    protected static function _setupAdapter($db)
-    {
-        if ($db === null) {
-            return null;
-        }
-        if (is_string($db)) {
-            require_once 'Zend/Registry.php';
-            $db = Zend_Registry::get($db);
-        }
-        if (!$db instanceof Zend_Db_Adapter_Abstract) {
-            require_once 'Zend/Db/Table/Exception.php';
-            throw new Zend_Db_Table_Exception('Argument must be of type Zend_Db_Adapter_Abstract, or a Registry key where a Zend_Db_Adapter_Abstract object is stored');
-        }
-        return $db;
-    }
-
-    /**
-     * Sets the default metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable().
-     *
-     * If $defaultMetadataCache is null, then no metadata cache is used by default.
-     *
-     * @param  mixed $metadataCache Either a Cache object, or a string naming a Registry key
-     * @return void
-     */
-    public static function setDefaultMetadataCache($metadataCache = null)
-    {
-        self::$_defaultMetadataCache = self::_setupMetadataCache($metadataCache);
-    }
-
-    /**
-     * Gets the default metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable().
-     *
-     * @return Zend_Cache_Core or null
-     */
-    public static function getDefaultMetadataCache()
-    {
-        return self::$_defaultMetadataCache;
-    }
-
-    /**
-     * Sets the metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable().
-     *
-     * If $metadataCache is null, then no metadata cache is used. Since there is no opportunity to reload metadata
-     * after instantiation, this method need not be public, particularly because that it would have no effect
-     * results in unnecessary API complexity. To configure the metadata cache, use the metadataCache configuration
-     * option for the class constructor upon instantiation.
-     *
-     * @param  mixed $metadataCache Either a Cache object, or a string naming a Registry key
-     * @return Zend_Db_Table_Abstract Provides a fluent interface
-     */
-    protected function _setMetadataCache($metadataCache)
-    {
-        $this->_metadataCache = self::_setupMetadataCache($metadataCache);
-        return $this;
-    }
-
-    /**
-     * Gets the metadata cache for information returned by Zend_Db_Adapter_Abstract::describeTable().
-     *
-     * @return Zend_Cache_Core or null
-     */
-    public function getMetadataCache()
-    {
-        return $this->_metadataCache;
-    }
-
-    /**
-     * Indicate whether metadata should be cached in the class for the duration
-     * of the instance
-     *
-     * @param  bool $flag
-     * @return Zend_Db_Table_Abstract
-     */
-    public function setMetadataCacheInClass($flag)
-    {
-        $this->_metadataCacheInClass = (bool) $flag;
-        return $this;
-    }
-
-    /**
-     * Retrieve flag indicating if metadata should be cached for duration of
-     * instance
-     *
-     * @return bool
-     */
-    public function metadataCacheInClass()
-    {
-        return $this->_metadataCacheInClass;
-    }
-
-    /**
-     * @param mixed $metadataCache Either a Cache object, or a string naming a Registry key
-     * @return Zend_Cache_Core
-     * @throws Zend_Db_Table_Exception
-     */
-    protected static function _setupMetadataCache($metadataCache)
-    {
-        if ($metadataCache === null) {
-            return null;
-        }
-        if (is_string($metadataCache)) {
-            require_once 'Zend/Registry.php';
-            $metadataCache = Zend_Registry::get($metadataCache);
-        }
-        if (!$metadataCache instanceof Zend_Cache_Core) {
-            require_once 'Zend/Db/Table/Exception.php';
-            throw new Zend_Db_Table_Exception('Argument must be of type Zend_Cache_Core, or a Registry key where a Zend_Cache_Core object is stored');
-        }
-        return $metadataCache;
-    }
-
-    /**
-     * Sets the sequence member, which defines the behavior for generating
-     * primary key values in new rows.
-     * - If this is a string, then the string names the sequence object.
-     * - If this is boolean true, then the key uses an auto-incrementing
-     *   or identity mechanism.
-     * - If this is boolean false, then the key is user-defined.
-     *   Use this for natural keys, for example.
-     *
-     * @param mixed $sequence
-     * @return Zend_Db_Table_Adapter_Abstract Provides a fluent interface
-     */
-    protected function _setSequence($sequence)
-    {
-        $this->_sequence = $sequence;
-
-        return $this;
-    }
-
-    /**
-     * Turnkey for initialization of a table object.
-     * Calls other protected methods for individual tasks, to make it easier
-     * for a subclass to override part of the setup logic.
-     *
-     * @return void
-     */
-    protected function _setup()
-    {
-        $this->_setupDatabaseAdapter();
-        $this->_setupTableName();
-    }
-
-    /**
-     * Initialize database adapter.
-     *
-     * @return void
-     * @throws Zend_Db_Table_Exception
-     */
-    protected function _setupDatabaseAdapter()
-    {
-        if (! $this->_db) {
-            $this->_db = self::getDefaultAdapter();
-            if (!$this->_db instanceof Zend_Db_Adapter_Abstract) {
-                require_once 'Zend/Db/Table/Exception.php';
-                throw new Zend_Db_Table_Exception('No adapter found for ' . get_class($this));
-            }
-        }
-    }
-
-    /**
-     * Initialize table and schema names.
-     *
-     * If the table name is not set in the class definition,
-     * use the class name itself as the table name.
-     *
-     * A schema name provided with the table name (e.g., "schema.table") overrides
-     * any existing value for $this->_schema.
-     *
-     * @return void
-     */
-    protected function _setupTableName()
-    {
-        if (! $this->_name) {
-            $this->_name = get_class($this);
-        } else if (strpos($this->_name, '.')) {
-            list($this->_schema, $this->_name) = explode('.', $this->_name);
-        }
-    }
-
-    /**
-     * Initializes metadata.
-     *
-     * If metadata cannot be loaded from cache, adapter's describeTable() method is called to discover metadata
-     * information. Returns true if and only if the metadata are loaded from cache.
-     *
-     * @return boolean
-     * @throws Zend_Db_Table_Exception
-     */
-    protected function _setupMetadata()
-    {
-        if ($this->metadataCacheInClass() && (count($this->_metadata) > 0)) {
-            return true;
-        }
-
-        // Assume that metadata will be loaded from cache
-        $isMetadataFromCache = true;
-
-        // If $this has no metadata cache but the class has a default metadata cache
-        if (null === $this->_metadataCache && null !== self::$_defaultMetadataCache) {
-            // Make $this use the default metadata cache of the class
-            $this->_setMetadataCache(self::$_defaultMetadataCache);
-        }
-
-        // If $this has a metadata cache
-        if (null !== $this->_metadataCache) {
-            // Define the cache identifier where the metadata are saved
-
-            //get db configuration
-            $dbConfig = $this->_db->getConfig();
-
-            $port = isset($dbConfig['options']['port'])
-                  ? ':'.$dbConfig['options']['port']
-                  : (isset($dbConfig['port'])
-                  ? ':'.$dbConfig['port']
-                  : null);
-
-            $host = isset($dbConfig['options']['host'])
-                  ? ':'.$dbConfig['options']['host']
-                  : (isset($dbConfig['host'])
-                  ? ':'.$dbConfig['host']
-                  : null);
-
-            // Define the cache identifier where the metadata are saved
-            $cacheId = md5( // port:host/dbname:schema.table (based on availabilty)
-                    $port . $host . '/'. $dbConfig['dbname'] . ':'
-                  . $this->_schema. '.' . $this->_name
-            );
-        }
-
-        // If $this has no metadata cache or metadata cache misses
-        if (null === $this->_metadataCache || !($metadata = $this->_metadataCache->load($cacheId))) {
-            // Metadata are not loaded from cache
-            $isMetadataFromCache = false;
-            // Fetch metadata from the adapter's describeTable() method
-            $metadata = $this->_db->describeTable($this->_name, $this->_schema);
-            // If $this has a metadata cache, then cache the metadata
-            if (null !== $this->_metadataCache && !$this->_metadataCache->save($metadata, $cacheId)) {
-                trigger_error('Failed saving metadata to metadataCache', E_USER_NOTICE);
-            }
-        }
-
-        // Assign the metadata to $this
-        $this->_metadata = $metadata;
-
-        // Return whether the metadata were loaded from cache
-        return $isMetadataFromCache;
-    }
-
-    /**
-     * Retrieve table columns
-     *
-     * @return array
-     */
-    protected function _getCols()
-    {
-        if (null === $this->_cols) {
-            $this->_setupMetadata();
-            $this->_cols = array_keys($this->_metadata);
-        }
-        return $this->_cols;
-    }
-
-    /**
-     * Initialize primary key from metadata.
-     * If $_primary is not defined, discover primary keys
-     * from the information returned by describeTable().
-     *
-     * @return void
-     * @throws Zend_Db_Table_Exception
-     */
-    protected function _setupPrimaryKey()
-    {
-        if (!$this->_primary) {
-            $this->_setupMetadata();
-            $this->_primary = array();
-            if(! empty($this->_metadata)) {
-                foreach ($this->_metadata as $col) {
-                    if ($col['PRIMARY']) {
-                        $this->_primary[$col['PRIMARY_POSITION']] = $col['COLUMN_NAME'];
-                        if ($col['IDENTITY']) {
-                            $this->_identity = $col['PRIMARY_POSITION'];
-                        }
-                    }
-                }
-                // if no primary key was specified and none was found in the metadata
-                // then throw an exception.
-                if (empty($this->_primary)) {
-                    require_once 'Zend/Db/Table/Exception.php';
-                    throw new Zend_Db_Table_Exception("A table must have a primary key, but none was found for table '{$this->_name}'");
-                }
-            } else  {
-                Tinebase_Core::getLogger()->warn(__METHOD__.'::'.__LINE__." No table found");
-                return false;
-            }
-        } else if (!is_array($this->_primary)) {
-            $this->_primary = array(1 => $this->_primary);
-        } else if (isset($this->_primary[0])) {
-            array_unshift($this->_primary, null);
-            unset($this->_primary[0]);
-        }
-
-        $cols = $this->_getCols();
-        if (! array_intersect((array) $this->_primary, $cols) == (array) $this->_primary) {
-            require_once 'Zend/Db/Table/Exception.php';
-            throw new Zend_Db_Table_Exception("Primary key column(s) ("
-                . implode(',', (array) $this->_primary)
-                . ") are not columns in this table ("
-                . implode(',', $cols)
-                . ")");
-        }
-
-        $primary    = (array) $this->_primary;
-        $pkIdentity = $primary[(int) $this->_identity];
-
-        /**
-         * Special case for PostgreSQL: a SERIAL key implicitly uses a sequence
-         * object whose name is "<table>_<column>_seq".
-         */
-        if ($this->_sequence === true && $this->_db instanceof Zend_Db_Adapter_Pdo_Pgsql) {
-            $this->_sequence = $this->_db->quoteIdentifier("{$this->_name}_{$pkIdentity}_seq");
-            if ($this->_schema) {
-                $this->_sequence = $this->_db->quoteIdentifier($this->_schema) . '.' . $this->_sequence;
-            }
-        }
-    }
-
-    /**
-     * Returns a normalized version of the reference map
-     *
-     * @return array
-     */
-    protected function _getReferenceMapNormalized()
-    {
-        $referenceMapNormalized = array();
-
-        foreach ($this->_referenceMap as $rule => $map) {
-
-            $referenceMapNormalized[$rule] = array();
-
-            foreach ($map as $key => $value) {
-                switch ($key) {
-
-                    // normalize COLUMNS and REF_COLUMNS to arrays
-                    case self::COLUMNS:
-                    case self::REF_COLUMNS:
-                        if (!is_array($value)) {
-                            $referenceMapNormalized[$rule][$key] = array($value);
-                        } else {
-                            $referenceMapNormalized[$rule][$key] = $value;
-                        }
-                        break;
-
-                    // other values are copied as-is
-                    default:
-                        $referenceMapNormalized[$rule][$key] = $value;
-                        break;
-                }
-            }
-        }
-
-        return $referenceMapNormalized;
-    }
-
-    /**
-     * Initialize object
-     *
-     * Called from {@link __construct()} as final step of object instantiation.
-     *
-     * @return void
-     */
-    public function init()
-    {
-    }
-
-    /**
-     * Returns table information.
-     *
-     * You can elect to return only a part of this information by supplying its key name,
-     * otherwise all information is returned as an array.
-     *
-     * @param  string $key The specific info part to return OPTIONAL
-     * @return mixed
-     * @throws Zend_Db_Table_Exception
-     */
-    public function info($key = null)
-    {
-        $this->_setupPrimaryKey();
-
-        $info = array(
-            self::SCHEMA           => $this->_schema,
-            self::NAME             => $this->_name,
-            self::COLS             => $this->_getCols(),
-            self::PRIMARY          => (array) $this->_primary,
-            self::METADATA         => $this->_metadata,
-            self::ROW_CLASS        => $this->getRowClass(),
-            self::ROWSET_CLASS     => $this->getRowsetClass(),
-            self::REFERENCE_MAP    => $this->_referenceMap,
-            self::DEPENDENT_TABLES => $this->_dependentTables,
-            self::SEQUENCE         => $this->_sequence
-        );
-
-        if ($key === null) {
-            return $info;
-        }
-
-        if (!(isset($info[$key]) || array_key_exists($key, $info))) {
-            require_once 'Zend/Db/Table/Exception.php';
-            throw new Zend_Db_Table_Exception('There is no table information for the key "' . $key . '"');
-        }
-
-        return $info[$key];
-    }
-
-    /**
-     * Returns an instance of a Zend_Db_Table_Select object.
-     *
-     * @param bool $withFromPart Whether or not to include the from part of the select based on the table
-     * @return Zend_Db_Table_Select
-     */
-    public function select($withFromPart = self::SELECT_WITHOUT_FROM_PART)
-    {
-        require_once 'Zend/Db/Table/Select.php';
-        $select = new Zend_Db_Table_Select($this);
-        if ($withFromPart == self::SELECT_WITH_FROM_PART) {
-            $select->from($this->info(self::NAME), Zend_Db_Table_Select::SQL_WILDCARD, $this->info(self::SCHEMA));
-        }
-        return $select;
-    }
-
-    /**
-     * Inserts a new row.
-     *
-     * @param  array  $data  Column-value pairs.
-     * @return mixed         The primary key of the row inserted.
-     */
-    public function insert(array $data)
-    {
-        $this->_setupPrimaryKey();
-
-        /**
-         * Zend_Db_Table assumes that if you have a compound primary key
-         * and one of the columns in the key uses a sequence,
-         * it's the _first_ column in the compound key.
-         */
-        $primary = (array) $this->_primary;
-        $pkIdentity = $primary[(int)$this->_identity];
-
-
-        /**
-         * If the primary key can be generated automatically, and no value was
-         * specified in the user-supplied data, then omit it from the tuple.
-         *
-         * Note: this checks for sensible values in the supplied primary key
-         * position of the data.  The following values are considered empty:
-         *   null, false, true, '', array()
-         */
-        if (array_key_exists($pkIdentity, $data)) {
-            if ($data[$pkIdentity] === null                                        // null
-                || $data[$pkIdentity] === ''                                       // empty string
-                || is_bool($data[$pkIdentity])                                     // boolean
-                || (is_array($data[$pkIdentity]) && empty($data[$pkIdentity]))) {  // empty array
-                unset($data[$pkIdentity]);
-            }
-        }
-
-        /**
-         * If this table uses a database sequence object and the data does not
-         * specify a value, then get the next ID from the sequence and add it
-         * to the row.  We assume that only the first column in a compound
-         * primary key takes a value from a sequence.
-         */
-        if (is_string($this->_sequence) && !isset($data[$pkIdentity])) {
-            $data[$pkIdentity] = $this->_db->nextSequenceId($this->_sequence);
-        }
-
-        /**
-         * INSERT the new row.
-         */
-        $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name;
-        $this->_db->insert($tableSpec, $data);
-
-        /**
-         * Fetch the most recent ID generated by an auto-increment
-         * or IDENTITY column, unless the user has specified a value,
-         * overriding the auto-increment mechanism.
-         */
-        if ($this->_sequence === true && !isset($data[$pkIdentity])) {
-            $data[$pkIdentity] = $this->_db->lastInsertId();
-        }
-
-        /**
-         * Return the primary key value if the PK is a single column,
-         * else return an associative array of the PK column/value pairs.
-         */
-        $pkData = array_intersect_key($data, array_flip($primary));
-        if (count($primary) == 1) {
-            reset($pkData);
-            return current($pkData);
-        }
-
-        return $pkData;
-    }
-
-    /**
-     * Check if the provided column is an identity of the table
-     *
-     * @param  string $column
-     * @throws Zend_Db_Table_Exception
-     * @return boolean
-     */
-    public function isIdentity($column)
-    {
-        $this->_setupPrimaryKey();
-
-        if (!isset($this->_metadata[$column])) {
-            /**
-             * @see Zend_Db_Table_Exception
-             */
-            require_once 'Zend/Db/Table/Exception.php';
-
-            throw new Zend_Db_Table_Exception('Column "' . $column . '" not found in table.');
-        }
-
-        return (bool) $this->_metadata[$column]['IDENTITY'];
-    }
-
-    /**
-     * Updates existing rows.
-     *
-     * @param  array        $data  Column-value pairs.
-     * @param  array|string $where An SQL WHERE clause, or an array of SQL WHERE clauses.
-     * @return int          The number of rows updated.
-     */
-    public function update(array $data, $where)
-    {
-        $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name;
-        return $this->_db->update($tableSpec, $data, $where);
-    }
-
-    /**
-     * Called by a row object for the parent table's class during save() method.
-     *
-     * @param  string $parentTableClassname
-     * @param  array  $oldPrimaryKey
-     * @param  array  $newPrimaryKey
-     * @return int
-     */
-    public function _cascadeUpdate($parentTableClassname, array $oldPrimaryKey, array $newPrimaryKey)
-    {
-        $this->_setupMetadata();
-        $rowsAffected = 0;
-        foreach ($this->_getReferenceMapNormalized() as $map) {
-            if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_UPDATE])) {
-                switch ($map[self::ON_UPDATE]) {
-                    case self::CASCADE:
-                        $newRefs = array();
-                        $where = array();
-                        for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) {
-                            $col = $this->_db->foldCase($map[self::COLUMNS][$i]);
-                            $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]);
-                            if ((isset($newPrimaryKey[$refCol]) || array_key_exists($refCol, $newPrimaryKey))) {
-                                $newRefs[$col] = $newPrimaryKey[$refCol];
-                            }
-                            $type = $this->_metadata[$col]['DATA_TYPE'];
-                            $where[] = $this->_db->quoteInto(
-                                $this->_db->quoteIdentifier($col, true) . ' = ?',
-                                $oldPrimaryKey[$refCol], $type);
-                        }
-                        $rowsAffected += $this->update($newRefs, $where);
-                        break;
-                    default:
-                        // no action
-                        break;
-                }
-            }
-        }
-        return $rowsAffected;
-    }
-
-    /**
-     * Deletes existing rows.
-     *
-     * @param  array|string $where SQL WHERE clause(s).
-     * @return int          The number of rows deleted.
-     */
-    public function delete($where)
-    {
-        $depTables = $this->getDependentTables();
-        if (!empty($depTables)) {
-            $resultSet = $this->fetchAll($where);
-            if (count($resultSet) > 0 ) {
-                foreach ($resultSet as $row) {
-                    /**
-                     * Execute cascading deletes against dependent tables
-                     */
-                    foreach ($depTables as $tableClass) {
-                        $t = self::getTableFromString($tableClass, $this);
-                        $t->_cascadeDelete(
-                            get_class($this), $row->getPrimaryKey()
-                        );
-                    }
-                }
-            }
-        }
-
-        $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name;
-        return $this->_db->delete($tableSpec, $where);
-    }
-
-    /**
-     * Called by parent table's class during delete() method.
-     *
-     * @param  string $parentTableClassname
-     * @param  array  $primaryKey
-     * @return int    Number of affected rows
-     */
-    public function _cascadeDelete($parentTableClassname, array $primaryKey)
-    {
-        // setup metadata
-        $this->_setupMetadata();
-
-        // get this class name
-        $thisClass = get_class($this);
-        if ($thisClass === 'Zend_Db_Table') {
-            $thisClass = $this->_definitionConfigName;
-        }
-
-        $rowsAffected = 0;
-
-        foreach ($this->_getReferenceMapNormalized() as $map) {
-            if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_DELETE])) {
-
-                $where = array();
-
-                // CASCADE or CASCADE_RECURSE
-                if (in_array($map[self::ON_DELETE], array(self::CASCADE, self::CASCADE_RECURSE))) {
-                    for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) {
-                        $col = $this->_db->foldCase($map[self::COLUMNS][$i]);
-                        $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]);
-                        $type = $this->_metadata[$col]['DATA_TYPE'];
-                        $where[] = $this->_db->quoteInto(
-                            $this->_db->quoteIdentifier($col, true) . ' = ?',
-                            $primaryKey[$refCol], $type);
-                    }
-                }
-
-                // CASCADE_RECURSE
-                if ($map[self::ON_DELETE] == self::CASCADE_RECURSE) {
-
-                    /**
-                     * Execute cascading deletes against dependent tables
-                     */
-                    $depTables = $this->getDependentTables();
-                    if (!empty($depTables)) {
-                        foreach ($depTables as $tableClass) {
-                            $t = self::getTableFromString($tableClass, $this);
-                            foreach ($this->fetchAll($where) as $depRow) {
-                                $rowsAffected += $t->_cascadeDelete($thisClass, $depRow->getPrimaryKey());
-                            }
-                        }
-                    }
-                }
-
-                // CASCADE or CASCADE_RECURSE
-                if (in_array($map[self::ON_DELETE], array(self::CASCADE, self::CASCADE_RECURSE))) {
-                    $rowsAffected += $this->delete($where);
-                }
-
-            }
-        }
-        return $rowsAffected;
-    }
-
-    /**
-     * Fetches rows by primary key.  The argument specifies one or more primary
-     * key value(s).  To find multiple rows by primary key, the argument must
-     * be an array.
-     *
-     * This method accepts a variable number of arguments.  If the table has a
-     * multi-column primary key, the number of arguments must be the same as
-     * the number of columns in the primary key.  To find multiple rows in a
-     * table with a multi-column primary key, each argument must be an array
-     * with the same number of elements.
-     *
-     * The find() method always returns a Rowset object, even if only one row
-     * was found.
-     *
-     * @param  mixed $key The value(s) of the primary keys.
-     * @return Zend_Db_Table_Rowset_Abstract Row(s) matching the criteria.
-     * @throws Zend_Db_Table_Exception
-     */
-    public function find()
-    {
-        $this->_setupPrimaryKey();
-        $args = func_get_args();
-        $keyNames = array_values((array) $this->_primary);
-
-        if (count($args) < count($keyNames)) {
-            require_once 'Zend/Db/Table/Exception.php';
-            throw new Zend_Db_Table_Exception("Too few columns for the primary key");
-        }
-
-        if (count($args) > count($keyNames)) {
-            require_once 'Zend/Db/Table/Exception.php';
-            throw new Zend_Db_Table_Exception("Too many columns for the primary key");
-        }
-
-        $whereList = array();
-        $numberTerms = 0;
-        foreach ($args as $keyPosition => $keyValues) {
-            $keyValuesCount = count($keyValues);
-            // Coerce the values to an array.
-            // Don't simply typecast to array, because the values
-            // might be Zend_Db_Expr objects.
-            if (!is_array($keyValues)) {
-                $keyValues = array($keyValues);
-            }
-            if ($numberTerms == 0) {
-                $numberTerms = $keyValuesCount;
-            } else if ($keyValuesCount != $numberTerms) {
-                require_once 'Zend/Db/Table/Exception.php';
-                throw new Zend_Db_Table_Exception("Missing value(s) for the primary key");
-            }
-            $keyValues = array_values($keyValues);
-            for ($i = 0; $i < $keyValuesCount; ++$i) {
-                if (!isset($whereList[$i])) {
-                    $whereList[$i] = array();
-                }
-                $whereList[$i][$keyPosition] = $keyValues[$i];
-            }
-        }
-
-        $whereClause = null;
-        if (count($whereList)) {
-            $whereOrTerms = array();
-            $tableName = $this->_db->quoteTableAs($this->_name, null, true);
-            foreach ($whereList as $keyValueSets) {
-                $whereAndTerms = array();
-                foreach ($keyValueSets as $keyPosition => $keyValue) {
-                    $type = $this->_metadata[$keyNames[$keyPosition]]['DATA_TYPE'];
-                    $columnName = $this->_db->quoteIdentifier($keyNames[$keyPosition], true);
-                    $whereAndTerms[] = $this->_db->quoteInto(
-                        $tableName . '.' . $columnName . ' = ?',
-                        $keyValue, $type);
-                }
-                $whereOrTerms[] = '(' . implode(' AND ', $whereAndTerms) . ')';
-            }
-            $whereClause = '(' . implode(' OR ', $whereOrTerms) . ')';
-        }
-
-        // issue ZF-5775 (empty where clause should return empty rowset)
-        if ($whereClause == null) {
-            $rowsetClass = $this->getRowsetClass();
-            if (!class_exists($rowsetClass)) {
-                require_once 'Zend/Loader.php';
-                Zend_Loader::loadClass($rowsetClass);
-            }
-            return new $rowsetClass(array('table' => $this, 'rowClass' => $this->getRowClass(), 'stored' => true));
-        }
-
-        return $this->fetchAll($whereClause);
-    }
-
-    /**
-     * Fetches all rows.
-     *
-     * Honors the Zend_Db_Adapter fetch mode.
-     *
-     * @param string|array|Zend_Db_Table_Select $where  OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object.
-     * @param string|array                      $order  OPTIONAL An SQL ORDER clause.
-     * @param int                               $count  OPTIONAL An SQL LIMIT count.
-     * @param int                               $offset OPTIONAL An SQL LIMIT offset.
-     * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode.
-     */
-    public function fetchAll($where = null, $order = null, $count = null, $offset = null)
-    {
-        if (!($where instanceof Zend_Db_Table_Select)) {
-            $select = $this->select();
-
-            if ($where !== null) {
-                $this->_where($select, $where);
-            }
-
-            if ($order !== null) {
-                $this->_order($select, $order);
-            }
-
-            if ($count !== null || $offset !== null) {
-                $select->limit($count, $offset);
-            }
-
-        } else {
-            $select = $where;
-        }
-
-        $rows = $this->_fetch($select);
-
-        $data  = array(
-            'table'    => $this,
-            'data'     => $rows,
-            'readOnly' => $select->isReadOnly(),
-            'rowClass' => $this->getRowClass(),
-            'stored'   => true
-        );
-
-        $rowsetClass = $this->getRowsetClass();
-        if (!class_exists($rowsetClass)) {
-            require_once 'Zend/Loader.php';
-            Zend_Loader::loadClass($rowsetClass);
-        }
-        return new $rowsetClass($data);
-    }
-
-    /**
-     * Fetches one row in an object of type Zend_Db_Table_Row_Abstract,
-     * or returns null if no row matches the specified criteria.
-     *
-     * @param string|array|Zend_Db_Table_Select $where  OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object.
-     * @param string|array                      $order  OPTIONAL An SQL ORDER clause.
-     * @param int                               $offset OPTIONAL An SQL OFFSET value.
-     * @return Zend_Db_Table_Row_Abstract|null The row results per the
-     *     Zend_Db_Adapter fetch mode, or null if no row found.
-     */
-    public function fetchRow($where = null, $order = null, $offset = null)
-    {
-        if (!($where instanceof Zend_Db_Table_Select)) {
-            $select = $this->select();
-
-            if ($where !== null) {
-                $this->_where($select, $where);
-            }
-
-            if ($order !== null) {
-                $this->_order($select, $order);
-            }
-
-            $select->limit(1, ((is_numeric($offset)) ? (int) $offset : null));
-
-        } else {
-            $select = $where->limit(1, $where->getPart(Zend_Db_Select::LIMIT_OFFSET));
-        }
-
-        $rows = $this->_fetch($select);
-
-        if (count($rows) == 0) {
-            return null;
-        }
-
-        $data = array(
-            'table'   => $this,
-            'data'     => $rows[0],
-            'readOnly' => $select->isReadOnly(),
-            'stored'  => true
-        );
-
-        $rowClass = $this->getRowClass();
-        if (!class_exists($rowClass)) {
-            require_once 'Zend/Loader.php';
-            Zend_Loader::loadClass($rowClass);
-        }
-        return new $rowClass($data);
-    }
-
-    /**
-     * Fetches a new blank row (not from the database).
-     *
-     * @return Zend_Db_Table_Row_Abstract
-     * @deprecated since 0.9.3 - use createRow() instead.
-     */
-    public function fetchNew()
-    {
-        return $this->createRow();
-    }
-
-    /**
-     * Fetches a new blank row (not from the database).
-     *
-     * @param  array $data OPTIONAL data to populate in the new row.
-     * @param  string $defaultSource OPTIONAL flag to force default values into new row
-     * @return Zend_Db_Table_Row_Abstract
-     */
-    public function createRow(array $data = array(), $defaultSource = null)
-    {
-        $cols     = $this->_getCols();
-        $defaults = array_combine($cols, array_fill(0, count($cols), null));
-
-        // nothing provided at call-time, take the class value
-        if ($defaultSource == null) {
-            $defaultSource = $this->_defaultSource;
-        }
-
-        if (!in_array($defaultSource, array(self::DEFAULT_CLASS, self::DEFAULT_DB, self::DEFAULT_NONE))) {
-            $defaultSource = self::DEFAULT_NONE;
-        }
-
-        if ($defaultSource == self::DEFAULT_DB) {
-            foreach ($this->_metadata as $metadataName => $metadata) {
-                if (($metadata['DEFAULT'] != null) &&
-                    ($metadata['NULLABLE'] !== true || ($metadata['NULLABLE'] === true && isset($this->_defaultValues[$metadataName]) && $this->_defaultValues[$metadataName] === true)) &&
-                    (!(isset($this->_defaultValues[$metadataName]) && $this->_defaultValues[$metadataName] === false))) {
-                    $defaults[$metadataName] = $metadata['DEFAULT'];
-                }
-            }
-        } elseif ($defaultSource == self::DEFAULT_CLASS && $this->_defaultValues) {
-            foreach ($this->_defaultValues as $defaultName => $defaultValue) {
-                if ((isset($defaults[$defaultName]) || array_key_exists($defaultName, $defaults))) {
-                    $defaults[$defaultName] = $defaultValue;
-                }
-            }
-        }
-
-        $config = array(
-            'table'    => $this,
-            'data'     => $defaults,
-            'readOnly' => false,
-            'stored'   => false
-        );
-
-        $rowClass = $this->getRowClass();
-        if (!class_exists($rowClass)) {
-            require_once 'Zend/Loader.php';
-            Zend_Loader::loadClass($rowClass);
-        }
-        $row = new $rowClass($config);
-        $row->setFromArray($data);
-        return $row;
-    }
-
-    /**
-     * Generate WHERE clause from user-supplied string or array
-     *
-     * @param  string|array $where  OPTIONAL An SQL WHERE clause.
-     * @return Zend_Db_Table_Select
-     */
-    protected function _where(Zend_Db_Table_Select $select, $where)
-    {
-        $where = (array) $where;
-
-        foreach ($where as $key => $val) {
-            // is $key an int?
-            if (is_int($key)) {
-                // $val is the full condition
-                $select->where($val);
-            } else {
-                // $key is the condition with placeholder,
-                // and $val is quoted into the condition
-                $select->where($key, $val);
-            }
-        }
-
-        return $select;
-    }
-
-    /**
-     * Generate ORDER clause from user-supplied string or array
-     *
-     * @param  string|array $order  OPTIONAL An SQL ORDER clause.
-     * @return Zend_Db_Table_Select
-     */
-    protected function _order(Zend_Db_Table_Select $select, $order)
-    {
-        if (!is_array($order)) {
-            $order = array($order);
-        }
-
-        foreach ($order as $val) {
-            $select->order($val);
-        }
-
-        return $select;
-    }
-
-    /**
-     * Support method for fetching rows.
-     *
-     * @param  Zend_Db_Table_Select $select  query options.
-     * @return array An array containing the row results in FETCH_ASSOC mode.
-     */
-    protected function _fetch(Zend_Db_Table_Select $select)
-    {
-        $stmt = $this->_db->query($select);
-        $data = $stmt->fetchAll(Zend_Db::FETCH_ASSOC);
-        return $data;
-    }
-
-    /**
-     * Get table gateway object from string
-     *
-     * @param  string                 $tableName
-     * @param  Zend_Db_Table_Abstract $referenceTable
-     * @throws Zend_Db_Table_Row_Exception
-     * @return Zend_Db_Table_Abstract
-     */
-    public static function getTableFromString($tableName, Zend_Db_Table_Abstract $referenceTable = null)
-    {
-        if ($referenceTable instanceof Zend_Db_Table_Abstract) {
-            $tableDefinition = $referenceTable->getDefinition();
-
-            if ($tableDefinition !== null && $tableDefinition->hasTableConfig($tableName)) {
-                return new Zend_Db_Table($tableName, $tableDefinition);
-            }
-        }
-
-        // assume the tableName is the class name
-        if (!class_exists($tableName)) {
-            try {
-                require_once 'Zend/Loader.php';
-                Zend_Loader::loadClass($tableName);
-            } catch (Zend_Exception $e) {
-                require_once 'Zend/Db/Table/Row/Exception.php';
-                throw new Zend_Db_Table_Row_Exception($e->getMessage(), $e->getCode(), $e);
-            }
-        }
-
-        $options = array();
-
-        if ($referenceTable instanceof Zend_Db_Table_Abstract) {
-            $options['db'] = $referenceTable->getAdapter();
-        }
-
-        if (isset($tableDefinition) && $tableDefinition !== null) {
-            $options[Zend_Db_Table_Abstract::DEFINITION] = $tableDefinition;
-        }
-
-        return new $tableName($options);
-    }
-
-}
diff --git a/tine20/Zend/Filter/Empty.php b/tine20/Zend/Filter/Empty.php
deleted file mode 100644 (file)
index 11ffd07..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Filter
- * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-/**
- * @see Zend_Filter_Interface
- */
-require_once 'Zend/Filter/Interface.php';
-
-/**
- * @category   Zend
- * @package    Zend_Filter
- * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Filter_Empty implements Zend_Filter_Interface
-{
-
-    /**
-     * Replacement pattern
-     * @var mixed
-     */
-    protected $_replacement = null;
-    
-    /**
-     * Constructor
-     *
-     * @param  string $replace
-     * @return void
-     */
-    public function __construct($replacement)
-    {
-        $this->setReplacement($replacement);
-    }
-    
-    /**
-     * Set the Replacement pattern/string for the preg_replace called in filter
-     *
-     * @param mixed $replacement - same as the second argument of preg_replace
-     * @return Zend_Filter_PregReplace
-     */
-    public function setReplacement($replacement)
-    {
-        $this->_replacement = $replacement;
-        return $this;
-    }
-    
-    /**
-     * Get currently set replacement value
-     *
-     * @return string
-     */
-    public function getReplacement()
-    {
-        return $this->_replacement;
-    }
-
-    /**
-     * Perform regexp replacement as filter
-     *
-     * @param  string $value
-     * @return string
-     */
-    public function filter($value)
-    {
-        return empty($value) ? $this->_replacement : $value;
-    }
-}
\ No newline at end of file
diff --git a/tine20/Zend/Http/Cookie.php b/tine20/Zend/Http/Cookie.php
deleted file mode 100644 (file)
index ccb19c6..0000000
+++ /dev/null
@@ -1,428 +0,0 @@
-<?php
-
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Http
- * @subpackage Cookie
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @version    $Id$
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-
-/**
- * @see Zend_Uri_Http
- */
-require_once 'Zend/Uri/Http.php';
-
-
-/**
- * Zend_Http_Cookie is a class describing an HTTP cookie and all it's parameters.
- *
- * Zend_Http_Cookie is a class describing an HTTP cookie and all it's parameters. The
- * class also enables validating whether the cookie should be sent to the server in
- * a specified scenario according to the request URI, the expiry time and whether
- * session cookies should be used or not. Generally speaking cookies should be
- * contained in a Cookiejar object, or instantiated manually and added to an HTTP
- * request.
- *
- * See http://wp.netscape.com/newsref/std/cookie_spec.html for some specs.
- *
- * @category   Zend
- * @package    Zend_Http
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Http_Cookie
-{
-    /**
-     * Cookie name
-     *
-     * @var string
-     */
-    protected $name;
-
-    /**
-     * Cookie value
-     *
-     * @var string
-     */
-    protected $value;
-
-    /**
-     * Cookie expiry date
-     *
-     * @var int
-     */
-    protected $expires;
-
-    /**
-     * Cookie domain
-     *
-     * @var string
-     */
-    protected $domain;
-
-    /**
-     * Cookie path
-     *
-     * @var string
-     */
-    protected $path;
-
-    /**
-     * Whether the cookie is secure or not
-     *
-     * @var boolean
-     */
-    protected $secure;
-
-    /**
-     * Whether the cookie value has been encoded/decoded
-     *
-     * @var boolean
-     */
-    protected $encodeValue;
-
-    /**
-     * Cookie object constructor
-     *
-     * @todo Add validation of each one of the parameters (legal domain, etc.)
-     *
-     * @param string $name
-     * @param string $value
-     * @param string $domain
-     * @param int $expires
-     * @param string $path
-     * @param bool $secure
-     */
-    public function __construct($name, $value, $domain, $expires = null, $path = null, $secure = false)
-    {
-        if (preg_match("/[=,; \t\r\n\013\014]/", $name)) {
-            require_once 'Zend/Http/Exception.php';
-            throw new Zend_Http_Exception("Cookie name cannot contain these characters: =,; \\t\\r\\n\\013\\014 ({$name})");
-        }
-
-        if (! $this->name = (string) $name) {
-            require_once 'Zend/Http/Exception.php';
-            throw new Zend_Http_Exception('Cookies must have a name');
-        }
-
-        if (! $this->domain = (string) $domain) {
-            require_once 'Zend/Http/Exception.php';
-            throw new Zend_Http_Exception('Cookies must have a domain');
-        }
-
-        $this->value = (string) $value;
-        $this->expires = ($expires === null ? null : (int) $expires);
-        $this->path = ($path ? $path : '/');
-        $this->secure = $secure;
-    }
-
-    /**
-     * Get Cookie name
-     *
-     * @return string
-     */
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * Get cookie value
-     *
-     * @return string
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * Get cookie domain
-     *
-     * @return string
-     */
-    public function getDomain()
-    {
-        return $this->domain;
-    }
-
-    /**
-     * Get the cookie path
-     *
-     * @return string
-     */
-    public function getPath()
-    {
-        return $this->path;
-    }
-
-    /**
-     * Get the expiry time of the cookie, or null if no expiry time is set
-     *
-     * @return int|null
-     */
-    public function getExpiryTime()
-    {
-        return $this->expires;
-    }
-
-    /**
-     * Check whether the cookie should only be sent over secure connections
-     *
-     * @return boolean
-     */
-    public function isSecure()
-    {
-        return $this->secure;
-    }
-
-    /**
-     * Check whether the cookie has expired
-     *
-     * Always returns false if the cookie is a session cookie (has no expiry time)
-     *
-     * @param int $now Timestamp to consider as "now"
-     * @return boolean
-     */
-    public function isExpired($now = null)
-    {
-        if ($now === null) $now = time();
-        if (is_int($this->expires) && $this->expires < $now) {
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Check whether the cookie is a session cookie (has no expiry time set)
-     *
-     * @return boolean
-     */
-    public function isSessionCookie()
-    {
-        return ($this->expires === null);
-    }
-
-    /**
-     * Checks whether the cookie should be sent or not in a specific scenario
-     *
-     * @param string|Zend_Uri_Http $uri URI to check against (secure, domain, path)
-     * @param boolean $matchSessionCookies Whether to send session cookies
-     * @param int $now Override the current time when checking for expiry time
-     * @return boolean
-     */
-    public function match($uri, $matchSessionCookies = true, $now = null)
-    {
-        if (is_string ($uri)) {
-            $uri = Zend_Uri_Http::factory($uri);
-        }
-
-        // Make sure we have a valid Zend_Uri_Http object
-        if (! ($uri->valid() && ($uri->getScheme() == 'http' || $uri->getScheme() =='https'))) {
-            require_once 'Zend/Http/Exception.php';
-            throw new Zend_Http_Exception('Passed URI is not a valid HTTP or HTTPS URI');
-        }
-
-        // Check that the cookie is secure (if required) and not expired
-        if ($this->secure && $uri->getScheme() != 'https') return false;
-        if ($this->isExpired($now)) return false;
-        if ($this->isSessionCookie() && ! $matchSessionCookies) return false;
-
-        // Check if the domain matches
-        if (! self::matchCookieDomain($this->getDomain(), $uri->getHost())) {
-            return false;
-        }
-
-        // Check that path matches using prefix match
-        if (! self::matchCookiePath($this->getPath(), $uri->getPath())) {
-            return false;
-        }
-
-        // If we didn't die until now, return true.
-        return true;
-    }
-
-    /**
-     * Get the cookie as a string, suitable for sending as a "Cookie" header in an
-     * HTTP request
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        if ($this->encodeValue) {
-            // bugfix to make Asterisk happy
-            // we receive a cookie like this: "sdfsdfs" and sent back a cookie like this %22sdfsdfs%22 otherwise
-            $value = urlencode($this->value);
-            $value = str_replace('%22', '"', $value);
-            return $this->name . '=' . urlencode($value) . ';';
-        }
-        return $this->name . '=' . $this->value . ';';
-    }
-
-    /**
-     * Generate a new Cookie object from a cookie string
-     * (for example the value of the Set-Cookie HTTP header)
-     *
-     * @param string $cookieStr
-     * @param Zend_Uri_Http|string $refUri Reference URI for default values (domain, path)
-     * @param boolean $encodeValue Whether or not the cookie's value should be
-     *                             passed through urlencode/urldecode
-     * @return Zend_Http_Cookie A new Zend_Http_Cookie object or false on failure.
-     */
-    public static function fromString($cookieStr, $refUri = null, $encodeValue = true)
-    {
-        // Set default values
-        if (is_string($refUri)) {
-            $refUri = Zend_Uri_Http::factory($refUri);
-        }
-
-        $name    = '';
-        $value   = '';
-        $domain  = '';
-        $path    = '';
-        $expires = null;
-        $secure  = false;
-        $parts   = explode(';', $cookieStr);
-
-        // If first part does not include '=', fail
-        if (strpos($parts[0], '=') === false) return false;
-
-        // Get the name and value of the cookie
-        list($name, $value) = explode('=', trim(array_shift($parts)), 2);
-        $name  = trim($name);
-        if ($encodeValue) {
-            $value = urldecode(trim($value));
-        }
-
-        // Set default domain and path
-        if ($refUri instanceof Zend_Uri_Http) {
-            $domain = $refUri->getHost();
-            $path = $refUri->getPath();
-            $path = substr($path, 0, strrpos($path, '/'));
-        }
-
-        // Set other cookie parameters
-        foreach ($parts as $part) {
-            $part = trim($part);
-            if (strtolower($part) == 'secure') {
-                $secure = true;
-                continue;
-            }
-
-            $keyValue = explode('=', $part, 2);
-            if (count($keyValue) == 2) {
-                list($k, $v) = $keyValue;
-                switch (strtolower($k))    {
-                    case 'expires':
-                        if(($expires = strtotime($v)) === false) {
-                            /**
-                             * The expiration is past Tue, 19 Jan 2038 03:14:07 UTC
-                             * the maximum for 32-bit signed integer. Zend_Date
-                             * can get around that limit.
-                             *
-                             * @see Zend_Date
-                             */
-                            require_once 'Zend/Date.php';
-
-                            $expireDate = new Zend_Date($v);
-                            $expires = $expireDate->getTimestamp();
-                        }
-                        break;
-
-                    case 'path':
-                        $path = $v;
-                        break;
-
-                    case 'domain':
-                        $domain = $v;
-                        break;
-
-                    default:
-                        break;
-                }
-            }
-        }
-
-        if ($name !== '') {
-            $ret = new self($name, $value, $domain, $expires, $path, $secure);
-            $ret->encodeValue = ($encodeValue) ? true : false;
-            return $ret;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Check if a cookie's domain matches a host name.
-     *
-     * Used by Zend_Http_Cookie and Zend_Http_CookieJar for cookie matching
-     *
-     * @param  string $cookieDomain
-     * @param  string $host
-     *
-     * @return boolean
-     */
-    public static function matchCookieDomain($cookieDomain, $host)
-    {
-        if (! $cookieDomain) {
-            require_once 'Zend/Http/Exception.php';
-            throw new Zend_Http_Exception("\$cookieDomain is expected to be a cookie domain");
-        }
-
-        if (! $host) {
-            require_once 'Zend/Http/Exception.php';
-            throw new Zend_Http_Exception("\$host is expected to be a host name");
-        }
-
-        $cookieDomain = strtolower($cookieDomain);
-        $host = strtolower($host);
-
-        if ($cookieDomain[0] == '.') {
-            $cookieDomain = substr($cookieDomain, 1);
-        }
-
-        // Check for either exact match or suffix match
-        return ($cookieDomain == $host ||
-                preg_match('/\.' . preg_quote($cookieDomain) . '$/', $host));
-    }
-
-    /**
-     * Check if a cookie's path matches a URL path
-     *
-     * Used by Zend_Http_Cookie and Zend_Http_CookieJar for cookie matching
-     *
-     * @param  string $cookiePath
-     * @param  string $path
-     * @return boolean
-     */
-    public static function matchCookiePath($cookiePath, $path)
-    {
-        if (! $cookiePath) {
-            require_once 'Zend/Http/Exception.php';
-            throw new Zend_Http_Exception("\$cookiePath is expected to be a cookie path");
-        }
-
-        if (! $path) {
-            require_once 'Zend/Http/Exception.php';
-            throw new Zend_Http_Exception("\$path is expected to be a host name");
-        }
-
-        return (strpos($path, $cookiePath) === 0);
-    }
-}
diff --git a/tine20/Zend/Json/Client.php b/tine20/Zend/Json/Client.php
deleted file mode 100644 (file)
index 7cf3d29..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_XmlRpc
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/**
- * For handling the HTTP connection to the JSON-RPC service
- * @see Zend_Http_Client
- */
-require_once 'Zend/Http/Client.php';
-
-/**
- * Enables object chaining for calling namespaced JSON-RPC methods.
- * @see Zend_Json_Client_ServerProxy
- */
-require_once 'Zend/Json/Client/ServerProxy.php';
-
-/**
- * Introspects remote servers using the JSON-RPC de facto system.* methods
- * @see Zend_Json_Client_ServerIntrospection
- */
-require_once 'Zend/Json/Client/ServerIntrospection.php';
-
-/**
- * Json-RPC Request
- * @see Zend_Json_Server_Request
- */
-require_once 'Zend/Json/Server/Request.php';
-
-/**
- * Json-RPC Response
- * @see Zend_Json_Client_Response
- */
-require_once 'Zend/Json/Client/Response.php';
-
-/**
- * Zend Version
- * @see Zend_Version
- */
-require_once 'Zend/Json/Decoder.php';
-
-/**
- * Zend Version
- * @see Zend_Version
- */
-require_once 'Zend/Json/Encoder.php';
-
-/**
- * Zend Version
- * @see Zend_Version
- */
-require_once 'Zend/Version.php';
-
-/**
- * An JSON-RPC client implementation
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Json_Client
-{
-    /**
-     * Full address of the JSON-RPC service
-     * @var string
-     * @example http://json.example.com/index.php
-     */
-    protected $_serverAddress;
-
-    /**
-     * HTTP Client to use for requests
-     * @var Zend_Http_Client
-     */
-    protected $_httpClient = null;
-
-    /**
-     * Introspection object
-     * @var Zend_Http_Client_Introspector
-     */
-    protected $_introspector = null;
-
-    /**
-     * Request of the last method call
-     * @var Zend_XmlRpc_Request
-     */
-    protected $_lastRequest = null;
-
-    /**
-     * Response received from the last method call
-     * @var Zend_XmlRpc_Response
-     */
-    protected $_lastResponse = null;
-
-    /**
-     * Proxy object for more convenient method calls
-     * @var array of Zend_XmlRpc_Client_ServerProxy
-     */
-    protected $_proxyCache = array();
-
-    /**
-     * Flag for skipping system lookup
-     * @var bool
-     */
-    protected $_skipSystemLookup = false;
-    
-    /**
-     * Create a new XML-RPC client to a remote server
-     *
-     * @param  string            $server      Full address of the XML-RPC service
-     *                                        (e.g. http://json.example.com/index.php)
-     * @param  Zend_Http_Client  $httpClient  HTTP Client to use for requests
-     * @return void
-     */
-    public function __construct($server, Zend_Http_Client $httpClient = null)
-    {
-        if ($httpClient === null) {
-            $this->_httpClient = new Zend_Http_Client();
-        } else {
-            $this->_httpClient = $httpClient;
-        }
-
-        $this->_introspector  = new Zend_Json_Client_ServerIntrospection($this);
-        $this->_serverAddress = $server;
-    }
-
-
-    /**
-     * Sets the HTTP client object to use for connecting the JSON-RPC server.
-     *
-     * @param  Zend_Http_Client $httpClient
-     * @return Zend_Http_Client
-     */
-    public function setHttpClient(Zend_Http_Client $httpClient)
-    {
-        return $this->_httpClient = $httpClient;
-    }
-
-
-    /**
-     * Gets the HTTP client object.
-     *
-     * @return Zend_Http_Client
-     */
-    public function getHttpClient()
-    {
-        return $this->_httpClient;
-    }
-
-
-    /**
-     * Sets the object used to introspect remote servers
-     *
-     * @param  Zend_Json_Client_ServerIntrospection
-     * @return Zend_Json_Client_ServerIntrospection
-     */
-    public function setIntrospector(Zend_Json_Client_ServerIntrospection $introspector)
-    {
-        return $this->_introspector = $introspector;
-    }
-
-
-    /**
-     * Gets the introspection object.
-     *
-     * @return Zend_Json_Client_ServerIntrospection
-     */
-    public function getIntrospector()
-    {
-        return $this->_introspector;
-    }
-
-
-   /**
-     * The request of the last method call
-     *
-     * @return Zend_Json_Server_Request
-     */
-    public function getLastRequest()
-    {
-        return $this->_lastRequest;
-    }
-
-
-    /**
-     * The response received from the last method call
-     *
-     * @return Zend_Json_Client_Response
-     */
-    public function getLastResponse()
-    {
-        return $this->_lastResponse;
-    }
-
-
-    /**
-     * Returns a proxy object for more convenient method calls
-     *
-     * @param $namespace  Namespace to proxy or empty string for none
-     * @return Zend_Json_Client_ServerProxy
-     */
-    public function getProxy($namespace = '')
-    {
-        if (empty($this->_proxyCache[$namespace])) {
-            $proxy = new Zend_Json_Client_ServerProxy($this, $namespace);
-            $this->_proxyCache[$namespace] = $proxy;
-        }
-        return $this->_proxyCache[$namespace];
-    }
-
-    /**
-     * Set skip system lookup flag
-     *
-     * @param  bool $flag
-     * @return Zend_XmlRpc_Client
-     */
-    public function setSkipSystemLookup($flag = true)
-    {
-        $this->_skipSystemLookup = (bool) $flag;
-        return $this;
-    }
-
-    /**
-     * Skip system lookup when determining if parameter should be array or struct?
-     *
-     * @return bool
-     */
-    public function skipSystemLookup()
-    {
-        return $this->_skipSystemLookup;
-    }
-
-    /**
-     * Perform an JSON-RPC request and return a response.
-     *
-     * @param Zend_Json_Server_Request $request
-     * @param null|Zend_Json_Client_Response $response
-     * @return void
-     * @throws Zend_Json_Client_HttpException
-     */
-    public function doRequest($request, $response = null)
-    {
-        $this->_lastRequest = $request;
-
-        #iconv_set_encoding('input_encoding', 'UTF-8');
-        #iconv_set_encoding('output_encoding', 'UTF-8');
-        #iconv_set_encoding('internal_encoding', 'UTF-8');
-
-        $http = $this->getHttpClient();
-
-        $http->setUri($this->_serverAddress);
-        $http->setHeaders(array(
-            'Content-Type: application/json-rpc; charset=utf-8',
-            'User-Agent: Zend_Json_Client/' . Zend_Version::VERSION,
-            'Accept: application/json-rpc',
-        ));
-
-        $json = $this->_lastRequest->__toString();
-        
-        $http->setRawData($json);
-        $httpResponse = $http->request(Zend_Http_Client::POST);
-
-        if (! $httpResponse->isSuccessful()) {
-            /**
-             * Exception thrown when an HTTP error occurs
-             * @see Zend_XmlRpc_Client_HttpException
-             */
-            require_once 'Zend/Json/Client/HttpException.php';
-            throw new Zend_Json_Client_HttpException($httpResponse->getMessage(), $httpResponse->getStatus());
-        }
-
-        if ($response === null) {
-            $response = new Zend_Json_Client_Response();
-        }
-        $this->_lastResponse = $response;
-        
-        $this->_lastResponse->loadJson($httpResponse->getBody());
-    }
-
-    /**
-     * Send an JSON-RPC request to the service (for a specific method)
-     *
-     * @param  string $method Name of the method we want to call
-     * @param  array $params Array of parameters for the method
-     * @return mixed
-     * @throws Zend_Json_Client_FaultException
-     */
-    public function call($method, $params=array())
-    {
-        if (!$this->skipSystemLookup() && !empty($method)) {
-            $signature = $this->getIntrospector()->getMethodSignature($method);
-            
-            foreach ($params as $key => $param) {
-                if(is_int($key)) {
-                    // positional parameters
-                    // can't validate them
-                    continue;
-                }
-                
-                $keyFound = false;
-
-                foreach($signature["parameters"] as $parameter) {
-                    if($parameter['name'] == "$key") {
-                        $keyFound = true;
-                    }
-                }
-                
-                if($keyFound !== true) {
-                    throw new Zend_Json_Client_FaultException("named parameter $key not found in SMD");
-                }
-            }
-        }
-
-        $request = new Zend_Json_Server_Request();
-        $request->setVersion('2.0');
-        $request->setId(1);
-        $request->setMethod($method);
-        $request->setParams($params);
-
-        $this->doRequest($request);
-
-        if ($this->_lastResponse->isError()) {
-            $fault = $this->_lastResponse->getError();
-            /**
-             * Exception thrown when an JSON-RPC fault is returned
-             * @see Zend_Json_Client_FaultException
-             */
-            require_once 'Zend/Json/Client/FaultException.php';
-            throw new Zend_Json_Client_FaultException($fault->getMessage(), $fault->getCode());
-        }
-
-        return $this->_lastResponse->getResult();
-    }
-}
diff --git a/tine20/Zend/Json/Client/Exception.php b/tine20/Zend/Json/Client/Exception.php
deleted file mode 100644 (file)
index f262ec0..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/**
- * Zend_Json_Exception
- */
-require_once 'Zend/Json/Exception.php';
-
-
-/**
- * Base class for all Zend_Json_Client_* exceptions
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Json_Client_Exception extends Zend_Json_Exception
-{}
diff --git a/tine20/Zend/Json/Client/FaultException.php b/tine20/Zend/Json/Client/FaultException.php
deleted file mode 100644 (file)
index 059e3f3..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/** Zend_Json_Client_Exception */
-require_once 'Zend/Json/Client/Exception.php';
-
-
-/**
- * Thrown by Zend_Json_Client when an JSON-RPC fault response is returned.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Json_Client_FaultException extends Zend_Json_Client_Exception
-{}
diff --git a/tine20/Zend/Json/Client/HttpException.php b/tine20/Zend/Json/Client/HttpException.php
deleted file mode 100644 (file)
index 64fc578..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/**
- * Zend_Json_Client_Exception
- */
-require_once 'Zend/Json/Client/Exception.php';
-
-
-/**
- * Thrown by Zend_Json_Client when an HTTP error occurs during an
- * JSON-RPC method call.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Json_Client_HttpException extends Zend_Json_Client_Exception
-{}
diff --git a/tine20/Zend/Json/Client/IntrospectException.php b/tine20/Zend/Json/Client/IntrospectException.php
deleted file mode 100644 (file)
index 234af4a..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/**
- * Zend_Json_Client_Exception
- */
-require_once 'Zend/Json/Client/Exception.php';
-
-
-/**
- * Thrown by Zend_Json_Client_Introspection when any error occurs.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Json_Client_IntrospectException extends Zend_Json_Client_Exception
-{}
diff --git a/tine20/Zend/Json/Client/Response.php b/tine20/Zend/Json/Client/Response.php
deleted file mode 100644 (file)
index e0a1d2f..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Server
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-/**
- * Json-RPC Response
- * @see Zend_Json_Server_Response
- */
-require_once 'Zend/Json/Server/Response.php';
-
-/**
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Server
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Json_Client_Response extends Zend_Json_Server_Response
-{
-    /**
-     * initialize JSON-RPC object with JSON response from server
-     * @param string $json the json encoded response
-     * @return void
-     */
-    public function loadJson($json)
-    {
-        $response = Zend_Json::decode($json);
-        
-        if((isset($response['error']) || array_key_exists('error', $response))) {
-            $this->setError(new Zend_Json_Server_Error(
-                $response['error']['message'],
-                $response['error']['code'],
-                $response['error']['data']
-            ));
-        } else {
-            $this->setResult($response['result']);
-        }
-        
-        if((isset($response['jsonrpc']) || array_key_exists('jsonrpc', $response))) {
-            $this->setVersion($response['jsonrpc']);
-        }
-        
-        if((isset($response['id']) || array_key_exists('id', $response))) {
-            $this->setId($response['jsonrpc']);
-        }
-    }
-}
\ No newline at end of file
diff --git a/tine20/Zend/Json/Client/SMD.php b/tine20/Zend/Json/Client/SMD.php
deleted file mode 100644 (file)
index 4841340..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Server
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-/**
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Server
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Json_Client_SMD
-{
-    /**
-     * @var array json decoded SMD response
-     */
-    protected $_smd = null;
-    
-    /**
-     * load and decode json encoded SMD response
-     * 
-     * @param string $json json encoded SMD response
-     * @return void
-     */
-    public function loadJson($json)
-    {
-        $this->_smd = Zend_Json_Decoder::decode($json);
-    }
-    
-    /**
-     * return method signature for requested method
-     * 
-     * @param string $method name of the method
-     * @return array method signature
-     * @throws Zend_Json_Client_IntrospectException
-     */
-    public function getMethodSignature($method)
-    {
-        if(!(isset($this->_smd['services'][$method]) || array_key_exists($method, $this->_smd['services']))) {
-            /**
-             * Exception thrown when method not found
-             * @see Zend_Json_Client_IntrospectException
-             */
-            require_once 'Zend/Json/Client/IntrospectException.php';
-            throw new Zend_Json_Client_IntrospectException("method $method not found in smd");
-        }
-        
-        return $this->_smd['services'][$method];
-    }
-}
\ No newline at end of file
diff --git a/tine20/Zend/Json/Client/ServerIntrospection.php b/tine20/Zend/Json/Client/ServerIntrospection.php
deleted file mode 100644 (file)
index 7d914c3..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-
-/**
- * Wraps the JSON-RPC SMD introspection methods
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Json_Client_ServerIntrospection
-{
-    /**
-     * @var Zend_Json_Client
-     */
-    private $_client = null;
-
-    /**
-     * @var Zend_Json_Client_SMD
-     */
-    private $_smd = null;
-    
-    /**
-     * @param Zend_Json_Client $client
-     */
-    public function __construct(Zend_Json_Client $client)
-    {
-        $this->_client = $client;
-    }
-
-    /**
-     * Call system.methodSignature() for the given method
-     *
-     * @param  array  $method
-     * @return array  array(array(return, param, param, param...))
-     */
-    public function getMethodSignature($method)
-    {
-        if($this->_smd === null) {
-            $this->fetchSMD();
-        }
-        $signature = $this->_smd->getMethodSignature($method);
-        
-        return $signature;
-    }
-
-    public function setSMD(Zend_Json_Client_SMD $_smd)
-    {
-        $this->_smd = $_smd;
-    }
-
-    /**
-     * Call system.listMethods()
-     *
-     * @param  array  $method
-     * @return array  array(method, method, method...)
-     */
-    public function fetchSMD()
-    {
-        $request = new Zend_Json_Server_Request();
-        $request->setVersion('2.0');
-        $request->setId(1);
-        
-        $this->_smd = new Zend_Json_Client_SMD();
-        $this->_client->doRequest($request, $this->_smd);
-        
-        return $this->_smd;        
-    }
-}
diff --git a/tine20/Zend/Json/Client/ServerProxy.php b/tine20/Zend/Json/Client/ServerProxy.php
deleted file mode 100644 (file)
index 39493a4..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-
-/**
- * The namespace decorator enables object chaining to permit
- * calling JSON-RPC namespaced functions like "foo.bar.baz()"
- * as "$remote->foo->bar->baz()".
- *
- * @category   Zend
- * @package    Zend_Json
- * @subpackage Client
- * @author     Lars Kneschke <l.kneschke@metaways.de>
- * @copyright  Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
- * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Json_Client_ServerProxy
-{
-    /**
-     * @var Zend_Json_Client
-     */
-    private $_client = null;
-
-    /**
-     * @var string
-     */
-    private $_namespace = '';
-
-
-    /**
-     * @var array of Zend_Json_Client_ServerProxy
-     */
-    private $_cache = array();
-
-
-    /**
-     * Class constructor
-     *
-     * @param string             $namespace
-     * @param Zend_Json_Client $client
-     */
-    public function __construct($client, $namespace = '')
-    {
-        $this->_namespace = $namespace;
-        $this->_client    = $client;
-    }
-
-
-    /**
-     * Get the next successive namespace
-     *
-     * @param string $name
-     * @return Zend_Json_Client_ServerProxy
-     */
-    public function __get($namespace)
-    {
-        $namespace = ltrim("$this->_namespace.$namespace", '.');
-        if (!isset($this->_cache[$namespace])) {
-            $this->_cache[$namespace] = new $this($this->_client, $namespace);
-        }
-        return $this->_cache[$namespace];
-    }
-
-
-    /**
-     * Call a method in this namespace.
-     *
-     * @param  string $methodN
-     * @param  array $args
-     * @return mixed
-     */
-    public function __call($method, $args)
-    {
-        $method = ltrim("$this->_namespace.$method", '.');
-        return $this->_client->call($method, $args);
-    }
-}
diff --git a/tine20/Zend/Json/Server.php b/tine20/Zend/Json/Server.php
deleted file mode 100644 (file)
index fcf1cb3..0000000
+++ /dev/null
@@ -1,600 +0,0 @@
-<?php
-/**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category   Zend
- * @package    Zend_Json
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- * @version    $Id$
- */
-
-/**
- * @see Zend_Server_Abstract
- */
-require_once 'Zend/Server/Abstract.php';
-
-/**
- * @category   Zend
- * @package    Zend_Json
- * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license    http://framework.zend.com/license/new-bsd     New BSD License
- */
-class Zend_Json_Server extends Zend_Server_Abstract
-{
-    /**#@+
-     * Version Constants
-     */
-    const VERSION_1 = '1.0';
-    const VERSION_2 = '2.0';
-    /**#@-*/
-
-    /**
-     * Flag: whether or not to auto-emit the response
-     * @var bool
-     */
-    protected $_autoEmitResponse = true;
-
-    /**
-     * Flag: whether or not to auto handle exceptions
-     * @var bool
-     */
-    protected $_autoHandleExceptions = true;
-
-    /**
-     * @var bool Flag; allow overwriting existing methods when creating server definition
-     */
-    protected $_overwriteExistingMethods = true;
-
-    /**
-     * Request object
-     * @var Zend_Json_Server_Request
-     */
-    protected $_request;
-
-    /**
-     * Response object
-     * @var Zend_Json_Server_Response
-     */
-    protected $_response;
-
-    /**
-     * SMD object
-     * @var Zend_Json_Server_Smd
-     */
-    protected $_serviceMap;
-
-    /**
-     * SMD class accessors
-     * @var array
-     */
-    protected $_smdMethods;
-
-    /**
-     * @var Zend_Server_Description
-     */
-    protected $_table;
-
-    /**
-     * Attach a function or callback to the server
-     *
-     * @param  string|array $function Valid PHP callback
-     * @param  string $namespace  Ignored
-     * @return Zend_Json_Server
-     */
-    public function addFunction($function, $namespace = '')
-    {
-        if (!is_string($function) && (!is_array($function) || (2 > count($function)))) {
-            require_once 'Zend/Json/Server/Exception.php';
-            throw new Zend_Json_Server_Exception('Unable to attach function; invalid');
-        }
-
-        if (!is_callable($function)) {
-            require_once 'Zend/Json/Server/Exception.php';
-            throw new Zend_Json_Server_Exception('Unable to attach function; does not exist');
-        }
-
-        $argv = null;
-        if (2 < func_num_args()) {
-            $argv = func_get_args();
-            $argv = array_slice($argv, 2);
-        }
-
-        require_once 'Zend/Server/Reflection.php';
-        if (is_string($function)) {
-            $method = Zend_Server_Reflection::reflectFunction($function, $argv, $namespace);
-        } else {
-            $class  = array_shift($function);
-            $action = array_shift($function);
-            $reflection = Zend_Server_Reflection::reflectClass($class, $argv, $namespace);
-            $methods = $reflection->getMethods();
-            $found   = false;
-            foreach ($methods as $method) {
-                if ($action == $method->getName()) {
-                    $found = true;
-                    break;
-                }
-            }
-            if (!$found) {
-                $this->fault('Method not found', -32601);
-                return $this;
-            }
-        }
-
-        $definition = $this->_buildSignature($method);
-        $this->_addMethodServiceMap($definition);
-
-        return $this;
-    }
-
-    /**
-     * Register a class with the server
-     *
-     * @param  string $class
-     * @param  string $namespace Ignored
-     * @param  mixed $argv Ignored
-     * @return Zend_Json_Server
-     */
-    public function setClass($class, $namespace = '', $argv = null)
-    {
-        $argv = null;
-        if (3 < func_num_args()) {
-            $argv = func_get_args();
-            $argv = array_slice($argv, 3);
-        }
-
-        require_once 'Zend/Server/Reflection.php';
-        $reflection = Zend_Server_Reflection::reflectClass($class, $argv, $namespace);
-
-        foreach ($reflection->getMethods() as $method) {
-            $definition = $this->_buildSignature($method, $class);
-            $this->_addMethodServiceMap($definition);
-        }
-        return $this;
-    }
-
-    /**
-     * Indicate fault response
-     *
-     * @param  string $fault
-     * @param  int $code
-     * @return false
-     */
-    public function fault($fault = null, $code = 404, $data = null)
-    {
-        require_once 'Zend/Json/Server/Error.php';
-        $error = new Zend_Json_Server_Error($fault, $code, $data);
-        $this->getResponse()->setError($error);
-        return $error;
-    }
-
-    /**
-     * Handle request
-     *
-     * @param  Zend_Json_Server_Request $request
-     * @return null|Zend_Json_Server_Response
-     */
-    public function handle($request = false)
-    {
-        if ((false !== $request) && (!$request instanceof Zend_Json_Server_Request)) {
-            require_once 'Zend/Json/Server/Exception.php';
-            throw new Zend_Json_Server_Exception('Invalid request type provided; cannot handle');
-        } elseif ($request) {
-            $this->setRequest($request);
-        }
-
-        // Handle request
-        $this->_handle();
-
-        // Get response
-        $response = $this->_getReadyResponse();
-
-        // Emit response?
-        if ($this->autoEmitResponse()) {
-            echo $response;
-            return;
-        }
-
-        // or return it?
-        return $response;
-    }
-
-    /**
-     * Load function definitions
-     *
-     * @param  array|Zend_Server_Definition $definition
-     * @return void
-     */
-    public function loadFunctions($definition)
-    {
-        if (!is_array($definition) && (!$definition instanceof Zend_Server_Definition)) {
-            require_once 'Zend/Json/Server/Exception.php';
-            throw new Zend_Json_Server_Exception('Invalid definition provided to loadFunctions()');
-        }
-
-        foreach ($definition as $key => $method) {
-            $this->_table->addMethod($method, $key);
-            $this->_addMethodServiceMap($method);
-        }
-    }
-
-    public function setPersistence($mode)
-    {
-    }
-
-    /**
-     * Set request object
-     *
-     * @param  Zend_Json_Server_Request $request
-     * @return Zend_Json_Server
-     */
-    public function setRequest(Zend_Json_Server_Request $request)
-    {
-        $this->_request = $request;
-        return $this;
-    }
-
-    /**
-     * Get JSON-RPC request object
-     *
-     * @return Zend_Json_Server_Request
-     */
-    public function getRequest()
-    {
-        if (null === ($request = $this->_request)) {
-            require_once 'Zend/Json/Server/Request/Http.php';
-            $this->setRequest(new Zend_Json_Server_Request_Http());
-        }
-        return $this->_request;
-    }
-
-    /**
-     * Set response object
-     *
-     * @param  Zend_Json_Server_Response $response
-     * @return Zend_Json_Server
-     */
-    public function setResponse(Zend_Json_Server_Response $response)
-    {
-        $this->_response = $response;
-        return $this;
-    }
-
-    /**
-     * Get response object
-     *
-     * @return Zend_Json_Server_Response
-     */
-    public function getResponse()
-    {
-        if (null === ($response = $this->_response)) {
-            require_once 'Zend/Json/Server/Response/Http.php';
-            $this->setResponse(new Zend_Json_Server_Response_Http());
-        }
-        return $this->_response;
-    }
-
-    /**
-     * Set flag indicating whether or not to auto-emit response
-     *
-     * @param  bool $flag
-     * @return Zend_Json_Server
-     */
-    public function setAutoEmitResponse($flag)
-    {
-        $this->_autoEmitResponse = (bool) $flag;
-        return $this;
-    }
-
-    /**
-     * Will we auto-emit the response?
-     *
-     * @return bool
-     */
-    public function autoEmitResponse()
-    {
-        return $this->_autoEmitResponse;
-    }
-
-    /**
-     * Set flag indicating whether or not to auto handle exceptions
-     *
-     * @param  bool $flag
-     * @return Zend_Json_Server
-     */
-    public function setAutoHandleExceptions($flag)
-    {
-        $this->_autoHandleExceptions = (bool) $flag;
-        return $this;
-    }
-
-    /**
-     * Will we auto handle exceptions?
-     *
-     * @return bool
-     */
-    public function autoHandleExceptions()
-    {
-        return $this->_autoHandleExceptions;
-    }
-
-    // overloading for SMD metadata
-    /**
-     * Overload to accessors of SMD object
-     *
-     * @param  string $method
-     * @param  array $args
-     * @return mixed
-     */
-    public function __call($method, $args)
-    {
-        if (preg_match('/^(set|get)/', $method, $matches)) {
-            if (in_array($method, $this->_getSmdMethods())) {
-                if ('set' == $matches[1]) {
-                    $value = array_shift($args);
-                    $this->getServiceMap()->$method($value);
-                    return $this;
-                } else {
-                    return $this->getServiceMap()->$method();
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Retrieve SMD object
-     *
-     * @return Zend_Json_Server_Smd
-     */
-    public function getServiceMap()
-    {
-        if (null === $this->_serviceMap) {
-            require_once 'Zend/Json/Server/Smd.php';
-            $this->_serviceMap = new Zend_Json_Server_Smd();
-        }
-        return $this->_serviceMap;
-    }
-
-    /**
-     * Add service method to service map
-     *
-     * @param  Zend_Server_Reflection_Function $method
-     * @return void
-     */
-    protected function _addMethodServiceMap(Zend_Server_Method_Definition $method)
-    {
-        $serviceInfo = array(
-            'name'   => $method->getName(),
-            'return' => $this->_getReturnType($method),
-        );
-        $params = $this->_getParams($method);
-        $serviceInfo['params'] = $params;
-        $serviceMap = $this->getServiceMap();
-        if (false !== $serviceMap->getService($serviceInfo['name'])) {
-            $serviceMap->removeService($serviceInfo['name']);
-        }
-        $serviceMap->addService($serviceInfo);
-    }
-
-    /**
-     * Translate PHP type to JSON type
-     *
-     * @param  string $type
-     * @return string
-     */
-    protected function _fixType($type)
-    {
-        return $type;
-    }
-
-    /**
-     * Get default params from signature
-     *
-     * @param  array $args
-     * @param  array $params
-     * @return array
-     */
-    protected function _getDefaultParams(array $args, array $params)
-    {
-        $defaultParams = array_slice($params, count($args));
-        foreach ($defaultParams as $param) {
-            $value = null;
-            if ((isset($param['default']) || array_key_exists('default', $param))) {
-                $value = $param['default'];
-            }
-            array_push($args, $value);
-        }
-        return $args;
-    }
-
-    /**
-     * Get method param type
-     *
-     * @param  Zend_Server_Reflection_Function_Abstract $method
-     * @return string|array
-     */
-    protected function _getParams(Zend_Server_Method_Definition $method)
-    {
-        $params = array();
-        foreach ($method->getPrototypes() as $prototype) {
-            foreach ($prototype->getParameterObjects() as $key => $parameter) {
-                if (!isset($params[$key])) {
-                    $params[$key] = array(
-                        'type'     => $parameter->getType(),
-                        'name'     => $parameter->getName(),
-                        'optional' => $parameter->isOptional(),
-                    );
-                    if (null !== ($default = $parameter->getDefaultValue())) {
-                        $params[$key]['default'] = $default;
-                    }
-                    $description = $parameter->getDescription();
-                    if (!empty($description)) {
-                        $params[$key]['description'] = $description;
-                    }
-                    continue;
-                }
-                $newType = $parameter->getType();
-                if (!is_array($params[$key]['type'])) {
-                    if ($params[$key]['type'] == $newType) {
-                        continue;
-                    }
-                    $params[$key]['type'] = (array) $params[$key]['type'];
-                } elseif (in_array($newType, $params[$key]['type'])) {
-                    continue;
-                }
-                array_push($params[$key]['type'], $parameter->getType());
-            }
-        }
-        return $params;
-    }
-
-    /**
-     * Set response state
-     *
-     * @return Zend_Json_Server_Response
-     */
-    protected function _getReadyResponse()
-    {
-        $request  = $this->getRequest();
-        $response = $this->getResponse();
-
-        $response->setServiceMap($this->getServiceMap());
-        if (null !== ($id = $request->getId())) {
-            $response->setId($id);
-        }
-        if (null !== ($version = $request->getVersion())) {
-            $response->setVersion($version);
-        }
-
-        return $response;
-    }
-
-    /**
-     * Get method return type
-     *
-     * @param  Zend_Server_Reflection_Function_Abstract $method
-     * @return string|array
-     */
-    protected function _getReturnType(Zend_Server_Method_Definition $method)
-    {
-        $return = array();
-        foreach ($method->getPrototypes() as $prototype) {
-            $return[] = $prototype->getReturnType();
-        }
-        if (1 == count($return)) {
-            return $return[0];
-        }
-        return $return;
-    }
-
-    /**
-     * Retrieve list of allowed SMD methods for proxying
-     *
-     * @return array
-     */
-    protected function _getSmdMethods()
-    {
-        if (null === $this->_smdMethods) {
-            $this->_smdMethods = array();
-            require_once 'Zend/Json/Server/Smd.php';
-            $methods = get_class_methods('Zend_Json_Server_Smd');
-            foreach ($methods as $key => $method) {
-                if (!preg_match('/^(set|get)/', $method)) {
-                    continue;
-                }
-                if (strstr($method, 'Service')) {
-                    continue;
-                }
-                $this->_smdMethods[] = $method;
-            }
-        }
-        return $this->_smdMethods;
-    }
-
-    /**
-     * Internal method for handling request
-     *
-     * @return void
-     */
-    protected function _handle()
-    {
-        $request = $this->getRequest();
-
-        if (!$request->isMethodError() && (null === $request->getMethod())) {
-            return $this->fault('Invalid Request', -32600);
-        }
-
-        if ($request->isMethodError()) {
-            return $this->fault('Invalid Request', -32600);
-        }
-
-        $method = $request->getMethod();
-        if (!$this->_table->hasMethod($method)) {
-            return $this->fault('Method not found', -32601);
-        }
-
-        $params        = $request->getParams();
-        $invocable     = $this->_table->getMethod($method);
-        $serviceMap    = $this->getServiceMap();
-        $service       = $serviceMap->getService($method);
-        $serviceParams = $service->getParams();
-
-        if (count($params) < count($serviceParams)) {
-            $params = $this->_getDefaultParams($params, $serviceParams);
-        }
-
-        //Make sure named parameters are passed in correct order
-        if ( is_string( key( $params ) ) ) {
-
-            $callback = $invocable->getCallback();
-            if ('function' == $callback->getType()) {
-                $reflection = new ReflectionFunction( $callback->getFunction() );
-                $refParams  = $reflection->getParameters();
-            } else {
-
-                $reflection = new ReflectionMethod(
-                    $callback->getClass(),
-                    $callback->getMethod()
-                );
-                $refParams = $reflection->getParameters();
-            }
-
-            $orderedParams = array();
-            foreach( $reflection->getParameters() as $refParam ) {
-                if( isset( $params[ $refParam->getName() ] ) ) {
-                    $orderedParams[ $refParam->getName() ] = $params[ $refParam->getName() ];
-                } elseif( $refParam->isOptional() ) {
-                    $orderedParams[ $refParam->getName() ] = $refParam->getDefaultValue();
-