On 4/4/07, Larry Garfield <larry@garfieldtech.com> wrote:
This is an RFC of sorts. :-)
1) It turns out that PDO from PECL running under PHP 5.1.6, at least, has
issues. Specifically, segfault issues on otherwise perfectly sane queries.
This is apparently a known issue with 5.1.6, and one of the reasons 5.2
exists. :-) At present, I have no solution for it other than saying "well,
the PDO support is only if you're running 5.2, otherwise use the existing
MySQL/PostgreSQL drivers, deal". Does anyone have a problem with that, and
if so, an alternate solution?
2) Like any wrapper, PDO, while it offers some really nice features with a
common API (like C-level prepared statements, which are what I'm mainly
after), has some "lowest common denominator" issues. The main one I've run
into so far is that there is no reliable equivalent of mysql_num_rows() for
SELECT statements, only for data-changing statements[3]. In testing it
doesn't look like the MySQL PDO driver returns anything useful for rowCount()
on SELECT. That gives us 3 options.
A) Stop using db_num_rows() on result sets. (It's a database-specific feature
in the first place.) In places where we use it, use a separate count(*)
query instead. That's the more database-agnostic method, and is what the PHP
manual recommends[3]. If we go this route, it will involve removing the
db_num_rows() function from the existing mysql and postgres drivers and
refactoring core queries accordingly.
B) Instead, have the PDO wrapper do a full ->fetchAll() on the result set.
That gives an array of array or object records (specified in the fetchAll()),
which can then be simply sizeof()ed in the PDO/db_num_rows() implementation.
The downside here is that you need to specify in the fetchAll() whether you
want objects or arrays. To not horribly break any existing APIs (I'm trying
to minimize the footprint for now; we can break everything later), we'd need
to therefore fetchAll() as an array in the PDO driver and then cast back to
an object in db_fetch_object() (or vice versa). That feels quite nasty to
me, honestly, and is probably a not-unnoticeable performance hit.
C) Drop the PDO idea. It should come as no surprise that this is my least
favorite option. :-(
I am hoping I can get this into Drupal 6, but time will tell if I can get it
ready in time.