Skip to content

A CakePHP2 Postgres database driver without getColumnMeta() support

License

Notifications You must be signed in to change notification settings

johannesnagl/cakephp2-postgres-no-meta

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

CakePHP2 - Postgres driver without getColumnMeta and special escaping support

This driver was changed in two ways:

  1. The default CakePHP 2.x Postgres driver uses getColumnMeta to infer column types from the server. Although the PHP part has been optimized in recent years [1], it still incurs an overhead to hit the Postgres database on every call with a query like SELECT RELNAME FROM PG_CLASS WHERE OID=... [2]

Thus, this implementation is born which foregoes any use of the meta data and simply uses PDO::FETCH_ASSOC.

  1. There's a problem with special crafted SQL statements which contain the \ character [3] which actually isn't CakePHP specific but a problem of the underlying PDO/PgSQL driver [4].

The method \Postgres::value() was overriden to apply the special C-style escape operation to strings [5].

Installation

  1. Add the line "mfn/cakephp2-postgres-no-meta": "^0.0.2" to your app/composer.json
  2. Run php composer.phar require mfn/cakephp2-postgres-no-meta
  3. Load the plugin in app/Config/bootstrap.php with the line
CakePlugin::load('PostgresNoMeta');
  1. Use the driver in your app/Config/database.php: PostgresNoMeta.Database/PostgresNoMeta (instead of Database/Postgres)
  2. Profit!

Rational

During the switch of a big application from MySQL to Postgres it was discovered that much overhead was lost on Postgres and it was finally discovered that these meta queries incur a measurable overhead.

The individual queries are very fast but, depending on your queries, they may add up until a measurable point.

In our case there were performance improvement of up to 50% without any additional changes except activating this class. YMMV.

A little bit later also found problems with the generated SQL statements, which in special cases were translated from:

INSERT INTO models(field) VALUES('\'':1');

to

INSERT INTO models(field) VALUES('\''$1');

before sent to the server, causing various problems.

Further reference

About

A CakePHP2 Postgres database driver without getColumnMeta() support

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • PHP 100.0%