Code Monkey home page Code Monkey logo

cakephp2-postgres-no-meta's Introduction

CakePHP2 - Postgres driver with custom adaptions

This driver was changed in the following 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].

  1. The default PHP/PDO lastInsertId always returns a string. This driver is adapted to return an integer if is_numeric returns true on it. This allows easier integration with codebases using strict_types=1.

Requirements and Installation

  1. You need at least CakePHP 2.10.12
    For CakePHP >= 2.0 and < 2.10.12 , you can use version 0.0.2 of this package
  2. Add the line "mfn/cakephp2-postgres-no-meta": "^0.0.6" to your app/composer.json
  3. Run php composer.phar require mfn/cakephp2-postgres-no-meta
  4. 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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.