2010年8月30日星期一

[fw-db] Zend_Db_Table sequences and MySql problem

Hi,

I have a problem with Zend_Db_Table / Zend_Db_Table_Abstract and would like to ask for some advice.
In my current project I am trying to support both MySql and Oracle Databases.
I am using subtypes of Zend_Db_Table defining objects representing my database tables on the php side, a simple example:

[code]

class Model_MailWorklist extends Zend_Db_Table

{

protected $_schema = 'ONLINEMARKETING';

protected $_name = 'BACKGROUND_MAIL_WORKLIST';

protected $_primary = 'ID';

protected $_sequence = 'ONLINEMARKETING.COUNTER_BG_WORK';

}

[/code]

As one may have noticed I am using sequences with my Oracle database, so something like this just works fine:

[code]

...

$_mailWorkList = new Model_MailWorklist();

$_nextPrimaryKey = $_mailWorkList

->insert

(

array

(

'SUBSCRIBER_ID' => $_singleTransferRecipientId,

'NEWSLETTER_ID' => $_newsletterDispatchNewsletterId,

'DISPATCH_DATE' => $newsletterDispatchDateTime,

'DISPATCHED' => 0,

'DISPATCH_TYPE' => 'main'

)

);

...

[/code]

Now I am tying to use the same code with my MySql Database, which rather uses [i] auto_increment [/i], instead of sequences.
Sine I need to define [i] protected $_sequence [/i] for handling my Oracle database, I hoped that for the MySql case Zend_Db_Table will just ignore the specified sequence and the [i]insert()[/i] function returns the next inserted primary key. But as long as [i] protected $_sequence [/i] is set to some string value in my Model_MailWorklist-Class, Zend will try to use it and the [i]insert()[/i] function just returns [i]FALSE[/i]. The responsible Framework code:

[code]

abstract class Zend_Db_Table_Abstract

{

...

protected $_sequence = true;

public function insert(array $data)

{

...

if (is_string($this->_sequence) && !isset($data[$pkIdentity])) {

$data[$pkIdentity] = $this->_db->nextSequenceId($this->_sequence);

}

...

[/code]

:\ ... Now I dislike the solution of adding a check for the database type currently active to every init method of subtypes of Zend_Db_Table and set [i]$this->_sequence [/i] if running on Oracle.
My current "brute force solution" is extending Zend_Db_Table, lests say ZendX_Db_Table:

[code]

class ZendX_Db_Table extends Zend_Db_Table

{

public function __construct($config = array(), $definition = null)

{

parent::__construct($config, $definition);

$this->set_transparent_sequence();

}

private function set_transparent_sequence()

{

if( $this->_db instanceof Zend_Db_Adapter_Pdo_Mysql )

{

$this->_sequence = true;

}

}

}

[/code]

The only problem, now I need to use ZendX_Db_Table instead of Zend_Db_Table in my whole application. My question is, is there maybe a more efficient way instead of introducing a whole new class level to my application, just to make Zend ignore sequences when working with MySql?
Is this even a Zend-Bug or does this behaviour make sense and there is a reason supporting sequences in MySql?

Regards,

Richard Tantius
Software Engineer

Gotenstr. 7-9
53175 Bonn
Tel.: +49 (0)228 / 4 22 86 - 32
Fax.: +49 (0)228 / 4 22 86 - 66
E-Mail: r.tantius@binserv.de
Web: www.binserv.de
www.binforcepro.de

Geschäftsführer: Rüdiger Jakob
Registergericht: Siegburg HRB 6765
Hauptsitz der Gesellschaft.: Pfarrer-Wichert-Str. 35, 53639 Königswinter
Diese E-Mail einschließlich eventuell angehängter Dateien enthält vertrauliche und/oder rechtlich geschützte Informationen. Wenn Sie nicht der richtige Adressat sind und diese E-Mail irrtümlich erhalten haben, dürfen Sie weder den Inhalt dieser E-Mail nutzen noch dürfen Sie die eventuell angehängten Dateien öffnen und auch nichts kopieren oder weitergeben/verbreiten. Bitte verständigen Sie den Absender und löschen Sie diese E-Mail und eventuell angehängte Dateien umgehend. Vielen Dank!

没有评论: