SlideShare a Scribd company logo
IBM DB2 Embedded SQL for PHP

Александр Веремьев
cawaspb@gmail.com
Что такое
встраиваемый SQL
      ?????
$dbname = 'db_name';
$dbuser = 'username';
$dbpwd = 'password';

EXEC SQL connect to :$dbname user :$dbuser using :$dbpwd;
...
$userid = $_POST['userid'];
$password = $_POST['password'];
EXEC SQL select firstname, lastname
           into :$firstname, :$lastname
           from users
           where login = :$userid AND password = :$password;

if ($SQLCODE == 100 /* NOT FOUND */) {
   echo "Wrong login/password combination.n";
} else {
    echo $firstname . "n"
       . $lastname . "n";
}
EXEC SQL DECLARE c1 CURSOR for
  select id, time, subject, message
    from emails
    where userid = :$userid AND status = 'NEW';


EXEC SQL BEGIN DECLARE SECTION;
  INTEGER      $email_id;
  TMESTAMP     $time;
  VARCHAR(256) $subject;
  CLOB(16M)    $message_body;
EXEC SQL END DECLARE SECTION;

EXEC SQL OPEN c1;
EXEC SQL FETCH c1 into :$email_id, :$time, :$subject, :$message_body;

while ($SQLCODE != 100 /* NOT FOUND */) {
  // process message
  ...
  EXEC SQL FETCH c1 into :$email_id, :$time, :$subject, :$message_body;
}
Часть SQL-92 стандарта


Непосредственная поддержка со стороны СУБД в тех или иных
языках:

- IBM DB2 (C/C++, Java, COBOL, FORTRAN, REXX)
- Oracle (Ada, C/C++, COBOL, FORTRAN, Pascal, PL/I)
- PostgreSQL (C/C++, COBOL)
- Microsof SQL Server (COBOL)
- MySQL (COBOL)
- Sybase
-…
IBM DB2 Embedded SQL for PHP support:

PHP extension db2_embsql



db2_embsql_precompile($input_file, $dbname, $options_string);


db2_embsql_precompile_string($php_code, $dbname, $options_string);
Особенности реализации встроенного SQL в IBM DB2.
    Static SQL.
<?php                                                                                                        <?php
/**                                                                                                          /**
 * Zend Framework                                                                                             * Zend Framework
 *                                                                                                            *
 * LICENSE                                                                                                    * LICENSE
 *                                                                                                            *
 * This source file is subject to the new BSD license that is bundled                                         * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.                                                                 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:                                               * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd                                                                  * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to                                             * 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                                                 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.                                                 * to license@zend.com so we can send you a copy immediately.
 *                                                                                                            *
 * @category     Zend                                                                                         * @category    Zend
 * @package      Zend_Pdf                                                                                     * @package     Zend_Pdf
 * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)                        * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license      http://framework.zend.com/license/new-bsd     New BSD License                                * @license     http://framework.zend.com/license/new-bsd     New BSD License
 * @version      $Id: Pdf.php 22908 2010-08-25 20:52:47Z alexander $                                          * @version     $Id: Pdf.php 22908 2010-08-25 20:52:47Z alexander $
 */                                                                                                           */
                                                                                                             /** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */




                                                                                                       DB2
/** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */
/** @todo Section should be removed with ZF 2.0 release as obsolete              */                          /** @todo Section should be removed with ZF 2.0 release as obsolete            */
/** Zend_Pdf_Page */                                                                                         /** Zend_Pdf_Page */
require_once 'Zend/Pdf/Page.php';                                                                            require_once 'Zend/Pdf/Page.php';
/** Zend_Pdf_Canvas */                                                                                       /** Zend_Pdf_Canvas */
require_once 'Zend/Pdf/Canvas.php';                                                                          require_once 'Zend/Pdf/Canvas.php';
/** Internally used classes */                                                                               /** Internally used classes */
require_once 'Zend/Pdf/Element/Dictionary.php';                                                              require_once 'Zend/Pdf/Element/Dictionary.php';
require_once 'Zend/Pdf/Element/Name.php';                                                                    require_once 'Zend/Pdf/Element/Name.php';
require_once 'Zend/Pdf/Element/Null.php';                                                                    require_once 'Zend/Pdf/Element/Null.php';
require_once 'Zend/Pdf/Element/Numeric.php';                                                                 require_once 'Zend/Pdf/Element/Numeric.php';
require_once 'Zend/Pdf/Element/String.php';                                                                  require_once 'Zend/Pdf/Element/String.php';
/**                                                                                                          /**
 * General entity which describes PDF document.                                                               * General entity which describes PDF document.
 * It implements document abstraction with a document level operations.                                       * It implements document abstraction with a document level operations.
 *                                                                                                            *
 * Class is used to create new PDF document or load existing document.                                        * Class is used to create new PDF document or load existing document.
 * See details in a class constructor description                                                             * See details in a class constructor description
 *                                                                                                            *
 * Class agregates document level properties and entities (pages, bookmarks,                                  * Class agregates document level properties and entities (pages, bookmarks,
 * document level actions, attachments, form object, etc)                                                     * document level actions, attachments, form object, etc)
 *                                                                                                            *
 * @category     Zend                                                                                         * @category    Zend
 * @package      Zend_Pdf                                                                                     * @package     Zend_Pdf
 * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)                        * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license      http://framework.zend.com/license/new-bsd     New BSD License                                * @license     http://framework.zend.com/license/new-bsd     New BSD License
 */                                                                                                           */
class Zend_Pdf                                                                                               class Zend_Pdf
{                                                                                                            {
   /**** Class Constants ****/                                                                                  /**** Class Constants ****/
     /**                                                                                                          /**
      * Version number of generated PDF documents.                                                                 * Version number of generated PDF documents.
      */                                                                                                           */
     const PDF_VERSION = '1.4';                                                                                   const PDF_VERSION = '1.4';
     /**                                                                                                          /**
      * PDF file header.                                                                                           * PDF file header.
      */                                                                                                           */
     const PDF_HEADER = "%PDF-1.4n%xE2xE3xCFxD3n";
     /**                                                                                                     * * *
      * Pages collection
      *                                                                                                          /**
      * @todo implement it as a class, which supports ArrayAccess and Iterator interfaces,                         * Set user defined memory manager
      *        to provide incremental parsing and pages tree updating.                                             *
      *        That will give good performance and memory (PDF size) benefits.                                     * @param Zend_Memory_Manager $memoryManager
      *                                                                                                            */
      * @var array    - array of Zend_Pdf_Page object                                                             static public function setMemoryManager(Zend_Memory_Manager $memoryManager)
      */                                                                                                          {
     public $pages = array();                                                                                         self::$_memoryManager = $memoryManager;
     /**                                                                                                          }
      * List of inheritable attributesfor pages tree                                                         }
      *
      * @var array
      */
     protected static $_inheritableAttributes = array('Resources', 'MediaBox', 'CropBox', 'Rotate');
     /**
      * Request used memory manager
      *
      * @return Zend_Memory_Manager
      */
     static public function getMemoryManager()
     {
         if (self::$_memoryManager === null) {
              require_once 'Zend/Memory.php';
              self::$_memoryManager = Zend_Memory::factory('none');
         }
         return self::$_memoryManager;
     }
     /**
      * Set user defined memory manager
      *
      * @param Zend_Memory_Manager $memoryManager
      */
     static public function setMemoryManager(Zend_Memory_Manager $memoryManager)
     {
         self::$_memoryManager = $memoryManager;
     }
     /**
      * Set the document-level JavaScript
      *
      * @param string $javascript
      */
     public function setJavaScript($javascript)
     {
         $this->_javaScript = $javascript;
     }
     /**
      * Convert date to PDF format (it's close to ASN.1 (Abstract Syntax Notation
      * One) defined in ISO/IEC 8824).
      *
      * @todo This really isn't the best location for this method. It should
      *    probably actually exist as Zend_Pdf_Element_Date or something like that.
      *
      * @todo Address the following E_STRICT issue:
      *    PHP Strict Standards: date(): It is not safe to rely on the system's




                                                                                                                                            .BND
      *    timezone settings. Please use the date.timezone setting, the TZ
      *    environment variable or the date_default_timezone_set() function. In
      *    case you used any of those methods and you are still getting this
      *    warning, you most likely misspelled the timezone identifier.
      *
      * @param integer $timestamp (optional) If omitted, uses the current time.
      * @return string
      */
     public static function pdfDate($timestamp = null)
     {
         if ($timestamp === null) {
              $date = date('D:YmdHisO');
         } else {
              $date = date('D:YmdHisO', $timestamp);
         }
         return substr_replace($date, ''', -2, 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.




                                                                                                             PHP код
 *




                                                                                      PHP код
 * @category     Zend
 * @package      Zend_Pdf
 * @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: Pdf.php 22908 2010-08-25 20:52:47Z alexander $
 */
/** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */
/** @todo Section should be removed with ZF 2.0 release as obsolete              */
/** Zend_Pdf_Page */
require_once 'Zend/Pdf/Page.php';
/** Zend_Pdf_Canvas */
require_once 'Zend/Pdf/Canvas.php';
/** Internally used classes */
require_once 'Zend/Pdf/Element/Dictionary.php';
require_once 'Zend/Pdf/Element/Name.php';
require_once 'Zend/Pdf/Element/Null.php';
require_once 'Zend/Pdf/Element/Numeric.php';
require_once 'Zend/Pdf/Element/String.php';
/**
 * General entity which describes PDF document.
 * It implements document abstraction with a document level operations.
 *
 * Class is used to create new PDF document or load existing document.
 * See details in a class constructor description
 *
 * Class agregates document level properties and entities (pages, bookmarks,
 * document level actions, attachments, form object, etc)
 *
 * @category     Zend
 * @package      Zend_Pdf
 * @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_Pdf
{
   /**** Class Constants ****/
     /**
      * Version number of generated PDF documents.
      */
     const PDF_VERSION = '1.4';
     /**
      * PDF file header.
      */
     const PDF_HEADER = "%PDF-1.4n%xE2xE3xCFxD3n";
     /**
      * Pages collection
      *
      * @todo implement it as a class, which supports ArrayAccess and Iterator
interfaces,
      *        to provide incremental parsing and pages tree updating.
      *        That will give good performance and memory (PDF size) benefits.
      *
      * @var array    - array of Zend_Pdf_Page object
      */
     public $pages = array();
     /**
      * List of inheritable attributesfor pages tree
      *
      * @var array
      */
     protected static $_inheritableAttributes = array('Resources', 'MediaBox',
'CropBox', 'Rotate');
     /**
      * Request used memory manager
      *
      * @return Zend_Memory_Manager
      */
     static public function getMemoryManager()
     {
         if (self::$_memoryManager === null) {
              require_once 'Zend/Memory.php';
              self::$_memoryManager = Zend_Memory::factory('none');
         }
         return self::$_memoryManager;
     }
     /**
      * Set user defined memory manager
      *
      * @param Zend_Memory_Manager $memoryManager
      */
     static public function setMemoryManager(Zend_Memory_Manager $memoryManager)
     {
         self::$_memoryManager = $memoryManager;
     }
     /**
      * Set the document-level JavaScript
      *
      * @param string $javascript
      */
     public function setJavaScript($javascript)
     {
         $this->_javaScript = $javascript;
     }
     /**
      * Convert date to PDF format (it's close to ASN.1 (Abstract Syntax Notation




                                                                                       SQL
      * One) defined in ISO/IEC 8824).
      *
      * @todo This really isn't the best location for this method. It should
      *    probably actually exist as Zend_Pdf_Element_Date or something like that.




                                                                                                Компиляция
      *
      * @todo Address the following E_STRICT issue:
      *    PHP Strict Standards: date(): It is not safe to rely on the system's
      *    timezone settings. Please use the date.timezone setting, the TZ
      *    environment variable or the date_default_timezone_set() function. In
      *    case you used any of those methods and you are still getting this
      *    warning, you most likely misspelled the timezone identifier.
      *
      * @param integer $timestamp (optional) If omitted, uses the current time.
      * @return string
      */
     public static function pdfDate($timestamp = null)
     {
         if ($timestamp === null) {
              $date = date('D:YmdHisO');
         } else {
              $date = date('D:YmdHisO', $timestamp);
         }
         return substr_replace($date, ''', -2, 0) . ''';
     }
}
Статический SQL.


- отсутствие повторной компиляции, использование готового плана
выполнения (отличные результаты на OLTP нагрузке);


- защита от SQL injection;


- улучшенная модель security.
Связывание типов.


              PHP                              SQL

- динамическая типизация        - статическая типизация

- слабая типизация              - строгая типизация1




 1
  поддерживается неявный кастинг для некоторого подмножества
 типов.
Связывание типов.


          PHP                 SQL


    $var1 (integer)
                      SELECT … INTO :$var1 …
    …

    $var1 (string)
                      INSERT INTO … VALUES(:$var1, …)




    $var2 (float)
                      SELECT … WHERE COL1 > :$var2
    $var1 (string)
Связывание типов, C/C++:

EXEC SQL BEGIN DECLARE SECTION;
  char dbName[16];
  char userid[30];
  char passwd[30];

  SQL TYPE IS CLOB(2M) img_data;
EXEC SQL END DECLARE SECTION;

...

EXEC SQL CONNECT TO :dbName USER :userid USING :passwd;
db2_embsql extension:


1. Декларативность секции
   EXEC SQL BEGIN DECLARE SECTION;
   …
   EXEC SQL END DECLARE SECTION;




2. Физическое размещение HV в модуле extension’а.
3. Маппинг имѐн host variables (и производных lvalue конструкций)
   на внутренние имена HV в SQL выражениях, отправляемых на
   прекомпиляцию.


   $this->myCoolVariable
   $values[$index]->val
   $options['my_cool_option']
   …
Маппинг типов:

SMALLINT (16-bit integer)   -   integrer
INTEGER (32-bit integer)    -   integrer
BIGINT   (64-bit integer)   -   integrer

REAL                        -   float
DOUBLE                      -   float

DECIMAL                     -   STRING

CHAR(n)                     -   STRING
CHAR(n) FOR BIT DATA        -   STRING
VARCHAR(n)                  -   STRING
CLOB(n)                     -   STRING
BLOB(n)                     -   STRING

DATE                        -   STRING
TIME                        -   STRING
TIMESTAMP                   -   STRING

...
Решение проблемы предугадывания типов, input/output variables:


EXEC SQL SELECT LOGIN, FIRSTNAME, LASTNAME
          INTO :$login, :$firstname, :$lastname
          FROM USERS
          WHERE ID = :$user_id;


vs


EXEC SQL INSERT INTO USERS
        VALUES( :$login, :$firstname, :$lastname);
Декларация “базовых” переменных:

EXEC SQL BEGIN DECLARE SECTION;
        VARCHAR(32) $login;
        VARCHAR(64) $firstname,
        VARCHAR(64) $lastname;
EXEC SQL BEGIN DECLARE SECTION;

...

$login     = $this->login;
$firstname = $this->firstname;
$lastname = $this->lastname;

EXEC SQL INSERT INTO USERS
        VALUES(:$login, :$firstname, :$lastname);
Декларация “производных” переменных:

EXEC SQL BEGIN DECLARE SECTION;
        VARCHAR(32) $this->login;
        VARCHAR(64) $this->firstname,
        VARCHAR(64) $this->lastname;
EXEC SQL BEGIN DECLARE SECTION;

...

EXEC SQL INSERT INTO USERS
        VALUES( :$this->login,
                :$this->firstname,
                :$this->lastname);
Как работают вызовы SQL statements:

<?php
/**
 * Zend Framework
 *
                                                                                                                  DB2 Run         Database
 * 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
                                                                                                                  Time Services   Manager
                                                                                                       SELECT …
 * 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_Pdf
 * @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: Pdf.php 22908 2010-08-25 20:52:47Z alexander $
 */
/** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */
/** @todo Section should be removed with ZF 2.0 release as obsolete              */
/** Zend_Pdf_Page */
require_once 'Zend/Pdf/Page.php';
/** Zend_Pdf_Canvas */
require_once 'Zend/Pdf/Canvas.php';
/** Internally used classes */
require_once 'Zend/Pdf/Element/Dictionary.php';
require_once 'Zend/Pdf/Element/Name.php';




                                                                                                       :HV1
require_once 'Zend/Pdf/Element/Null.php';
require_once 'Zend/Pdf/Element/Numeric.php';
require_once 'Zend/Pdf/Element/String.php';
/**
 * General entity which describes PDF document.
 * It implements document abstraction with a document level operations.
 *
 * Class is used to create new PDF document or load existing document.
 * See details in a class constructor description
 *
 * Class agregates document level properties and entities (pages, bookmarks,




                                                                                                       :HV2
 * document level actions, attachments, form object, etc)
 *
 * @category     Zend
 * @package      Zend_Pdf
 * @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_Pdf
{
   /**** Class Constants ****/
     /**
      * Version number of generated PDF documents.
      */
     const PDF_VERSION = '1.4';
     /**
      * PDF file header.
                                                                                                                    CALL
      */
     const PDF_HEADER = "%PDF-1.4n%xE2xE3xCFxD3n";
     /**
      * Pages collection
      *
      * @todo implement it as a class, which supports ArrayAccess and Iterator interfaces,
      *        to provide incremental parsing and pages tree updating.
      *        That will give good performance and memory (PDF size) benefits.
      *
      * @var array    - array of Zend_Pdf_Page object
      */
     public $pages = array();
     /**




                                                                                                                                             Packages
      * List of inheritable attributesfor pages tree




                                                                                                                                             Packages
      *




                                                                                                                                              Packages
      * @var array
      */
     protected static $_inheritableAttributes = array('Resources', 'MediaBox', 'CropBox', 'Rotate');
     /**
      * Request used memory manager
      *
      * @return Zend_Memory_Manager
      */
     static public function getMemoryManager()
     {
         if (self::$_memoryManager === null) {
              require_once 'Zend/Memory.php';
              self::$_memoryManager = Zend_Memory::factory('none');
         }
         return self::$_memoryManager;
     }
     /**
      * Set user defined memory manager
      *
      * @param Zend_Memory_Manager $memoryManager
      */
     static public function setMemoryManager(Zend_Memory_Manager $memoryManager)
     {
         self::$_memoryManager = $memoryManager;
     }
     /**
      * Set the document-level JavaScript
      *
      * @param string $javascript
      */
     public function setJavaScript($javascript)
     {
         $this->_javaScript = $javascript;
     }
     /**
      * Convert date to PDF format (it's close to ASN.1 (Abstract Syntax Notation
      * One) defined in ISO/IEC 8824).
      *




                                                                                                                                              Data
      * @todo This really isn't the best location for this method. It should




                                                                                                                                             Packages
      *    probably actually exist as Zend_Pdf_Element_Date or something like that.




                                                                                                                                             Packages
      *
      * @todo Address the following E_STRICT issue:
      *    PHP Strict Standards: date(): It is not safe to rely on the system's
      *    timezone settings. Please use the date.timezone setting, the TZ
      *    environment variable or the date_default_timezone_set() function. In
      *    case you used any of those methods and you are still getting this
      *    warning, you most likely misspelled the timezone identifier.
      *
      * @param integer $timestamp (optional) If omitted, uses the current time.
      * @return string
      */
     public static function pdfDate($timestamp = null)
     {
         if ($timestamp === null) {
              $date = date('D:YmdHisO');
         } else {



                                                                                                                   Result
              $date = date('D:YmdHisO', $timestamp);
         }
         return substr_replace($date, ''', -2, 0) . ''';
     }
}



                                                                                                       :HV3
пример прекомпилированного С кода:

/*
EXEC SQL select count(*) into :tbl_cnt   from   syscat.tables;
*/

{
#line 39 "dbconn.sqc"
  sqlastrt(sqla_program_id, &sqla_rtinfo, &sqlca);
#line 39 "dbconn.sqc"
  sqlaaloc(3,1,2,0L);
    {
      struct sqla_setdata_list sql_setdlist[1];
#line 39 "dbconn.sqc"
      sql_setdlist[0].sqltype = 496; sql_setdlist[0].sqllen = 4;
#line 39 "dbconn.sqc"
      sql_setdlist[0].sqldata = (void*)&tbl_cnt;
#line 39 "dbconn.sqc"
      sql_setdlist[0].sqlind = 0L;
#line 39 "dbconn.sqc"
      sqlasetdata(3,0,1,sql_setdlist,0L,0L);
    }
#line 39 "dbconn.sqc"
  sqlacall((unsigned short)24,1,0,3,0L);
#line 39 "dbconn.sqc"
  sqlastop(0L);
}

#line 39 "dbconn.sqc"

 EMB_SQL_CHECK("Count tables");

 printf("select count(*) from syscat.tables;n--------n %dn", tbl_cnt);
Архитектура extension’а как магазинного автомата:

                                                                                            Очередь вызовов
PHP engine

  <?php
  /**
   * Zend Framework
   *




                                                                                           DB2_ESQL
   * 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.




                                                                                           extension
   *
   * @category     Zend
   * @package      Zend_Pdf
   * @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: Pdf.php 22908 2010-08-25 20:52:47Z alexander $
   */
  /** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */
  /** @todo Section should be removed with ZF 2.0 release as obsolete              */
  /** Zend_Pdf_Page */
  require_once 'Zend/Pdf/Page.php';
  /** Zend_Pdf_Canvas */
  require_once 'Zend/Pdf/Canvas.php';
  /** Internally used classes */
  require_once 'Zend/Pdf/Element/Dictionary.php';
  /**
   * General entity which describes PDF document.
   * It implements document abstraction with a document level operations.
   *
   * Class is used to create new PDF document or load existing document.
                                                                                           sqlaaloc(...)
   * See details in a class constructor description
   *
     *
   * @category
   * @package
                   Zend
                   Zend_Pdf
   * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
                                                                                           sqlacall(...)
   * @license      http://framework.zend.com/license/new-bsd     New BSD License


  {
   */
  class Zend_Pdf

     /**** Class Constants ****/
       /**
                                                                                           sqlacmpd(...)
        * Version number of generated PDF documents.
        */
       const PDF_VERSION = '1.4';
       /**
        * PDF file header.
        */
                                                                                           sqladloc(...)
       const PDF_HEADER = "%PDF-1.4n%xE2xE3xCFxD3n";

  /**
       /**

        * List of inheritable attributesfor pages tree
        *
        * @var array
                                                                                           sqlastls(...)
        */
       protected static $_inheritableAttributes = array('Resources', 'MediaBox',
  'CropBox', 'Rotate');
       /**
        * Request used memory manager
        *
                                                                                           sqlastlv(...)
        * @return Zend_Memory_Manager


       {
        */
       static public function getMemoryManager()

           if (self::$_memoryManager === null) {
                require_once 'Zend/Memory.php';
                                                                                           sqlastlva(...)
                self::$_memoryManager = Zend_Memory::factory('none');


       }
       /**
           }
           return self::$_memoryManager;


        * Set user defined memory manager
                                                                                           sqlasetdata(...)
        *
        * @param Zend_Memory_Manager $memoryManager
        */
       static public function setMemoryManager(Zend_Memory_Manager $memoryManager)
       {
           self::$_memoryManager = $memoryManager;
                                                                                           sqlastop(...)
       }
       /**
        * Set the document-level JavaScript
        *
        * @param string $javascript
        */
                                                                                           sqlastrt(...)
       public function setJavaScript($javascript)
       {

       }
       /**
           $this->_javaScript = $javascript;


        * Convert date to PDF format (it's close to ASN.1 (Abstract Syntax Notation
                                                                                           sqlausda(...)
        * One) defined in ISO/IEC 8824).
        *
        * @todo This really isn't the best location for this method. It should
        *    probably actually exist as Zend_Pdf_Element_Date or something like that.
        *
        * @todo Address the following E_STRICT issue:
        *    PHP Strict Standards: date(): It is not safe to rely on the system's
        *    timezone settings. Please use the date.timezone setting, the TZ
        *    environment variable or the date_default_timezone_set() function. In
        *    case you used any of those methods and you are still getting this
        *    warning, you most likely misspelled the timezone identifier.
        *
        * @param integer $timestamp (optional) If omitted, uses the current time.
        * @return string
        */
       public static function pdfDate($timestamp = null)
       {
           if ($timestamp === null) {
                $date = date('D:YmdHisO');
           } else {
                $date = date('D:YmdHisO', $timestamp);
           }
           return substr_replace($date, ''', -2, 0) . ''';




                                                                                           НV area
       }
  }
Плюсы:

- cтатичность SQL;

- отсутствие фазы компиляции запроса на этапе выполнения;

- отсутствие фазы построения плана запроса на этапе выполнения;

- проверка SQL на этапе прекомпиляции;

- защищѐнность от вымывания кэшей SQL запросов;

- управляемость планов выполнения, возможность вести
сравнительную статистику по изменяемости планов
по модулям приложений, пакет как measurement объѐмов и
характера данных в проекции приложения;

- модель security – права на выполнение на уровне пакета.
Минусы:

- cтатичность SQL;

- дополнительная фаза - прекомпиляция;

- необходимость существования соответствующих объектов
базы на момент компиляции;

- прирост производительности незаметен на длительных
запросах (10 и более секунд);

- слабая ориентированность на “ad hoc” запросы:
имеется поддержка динамического SQL, но она ничем
не лучше native подходов с помощью odbc/cli;

- отсутствие выигрыша для редко выполняемых запросов.
Ограничения embedded SQL:

- невозможность использования Host variables в именах
объектов имѐн таблиц, функций, процедур, …, кроме как
при использовании динамического SQL (PREPAPRE, EXECUTE);

- невозможность использования scrollable курсоров;
IBM DB2 и динамический SQL для PHP:
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.swg.im.dbclient.php.doc/doc/c0021523.html




1. ibm_db2 extension
http://www.php.net/manual/en/book.ibm-db2.php



2. pdo_ibm driver
http://www.php.net/manual/en/book.pdo.php



3. Unified odbc extension
http://www.php.net/manual/en/book.uodbc.php
Способы увеличения производительности динамического SQL:

- увеличение размера STATEMENT CACHE – pckachesz
имеется некоторая точка насыщения, предмет для мониторинга:
* pkg_cache_lookups (package cache lookups)
* pkg_cache_inserts (package cache inserts)
* pkg_cache_size_top (package cache high water mark)
* pkg_cache_num_overflows (package cache overflows)


- использование параметризованных запросов
есть “Но” – план выполнения будет строиться без учѐта реального
значения параметра


- StmtConcentrator CLI/ODBC параметр
- конвертирование динамического SQL в статический:

1. Коллектор запросов (CLI/ODBC параметры):
STATICMODE=CAPTURE
STATICCAPFILE=<path>
STATICPACKAGE=<package_schema>.<package_name>

2. Работа приложения

3. db2cap bind …

4. STATICMODE=MATCH
Планы


- Пре-релиз конец мая – начало июня.


- Релиз, передача в Open Source – конец июня.
Embedded SQL

            vs

ORM frameworks/ActiveRecord

           ???
Вопросы




Александр Веремьев
cawaspb@gmail.com

More Related Content

PDF
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
PPT
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
PDF
Deprecated: Foundations of Zend Framework 2
PPT
Composer - Package Management for PHP. Silver Bullet?
PDF
A quick start on Zend Framework 2
PDF
Composer: putting dependencies on the score
PDF
Composer, putting dependencies on the score
PDF
Quick start on Zend Framework 2
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
Deprecated: Foundations of Zend Framework 2
Composer - Package Management for PHP. Silver Bullet?
A quick start on Zend Framework 2
Composer: putting dependencies on the score
Composer, putting dependencies on the score
Quick start on Zend Framework 2

What's hot (20)

PDF
Gradle in a Polyglot World
PDF
Zend Framework 2 - Basic Components
PDF
Zend\Expressive - höher, schneller, weiter
PDF
Dependency Management with Composer
PDF
Deployment Tactics
ODP
Vagrant move over, here is Docker
PPT
Happy porting x86 application to android
PDF
Submit PHP: Standards in PHP world. Михайло Морозов
PDF
Datagrids with Symfony 2, Backbone and Backgrid
PDF
Cryptography with Zend Framework
PDF
Composer for Busy Developers - php|tek13
PPT
Migrating PriceChirp to Rails 3.0: The Pain Points
PDF
Gearman work queue in php
PDF
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
PDF
Dependency management with Composer
PDF
Commcon 2018
PDF
Zend Framework 2 - presentation
ODP
Mastering Namespaces in PHP
PDF
Security Goodness with Ruby on Rails
PDF
Buildr In Action @devoxx france 2012
Gradle in a Polyglot World
Zend Framework 2 - Basic Components
Zend\Expressive - höher, schneller, weiter
Dependency Management with Composer
Deployment Tactics
Vagrant move over, here is Docker
Happy porting x86 application to android
Submit PHP: Standards in PHP world. Михайло Морозов
Datagrids with Symfony 2, Backbone and Backgrid
Cryptography with Zend Framework
Composer for Busy Developers - php|tek13
Migrating PriceChirp to Rails 3.0: The Pain Points
Gearman work queue in php
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Dependency management with Composer
Commcon 2018
Zend Framework 2 - presentation
Mastering Namespaces in PHP
Security Goodness with Ruby on Rails
Buildr In Action @devoxx france 2012
Ad

Viewers also liked (20)

PDF
Statby school 2555_m3_1057012007
PPTX
What is a canadian
PPT
UBiT 2010 lik UBiT next
PPTX
Using Student Research Center
PPT
ALP. Short facts
PPTX
news file
PPTX
How to make your destination pintastic! (Part 1)
PDF
Acta ci 121106
PPTX
Using Student Research Center
PPT
Latino voters in Arizona and SB1070
PDF
Правила и Условия Программы
PDF
Mailrouting t shootingfinal
PDF
สถาปนากรุงรัตนโกสินทร์
PDF
Codesign Athens Course Gentes
PDF
Titan Awards Sponsorship Packet
PDF
สงครามครูเสด 2003
PDF
ฟ้เดล กัสโตร
PDF
Anexo ás normas, calendario previo (aprobado)
PDF
Process Consulting Perspective
PDF
Why businesses should talktojason the Leeds public relations and communicatio...
Statby school 2555_m3_1057012007
What is a canadian
UBiT 2010 lik UBiT next
Using Student Research Center
ALP. Short facts
news file
How to make your destination pintastic! (Part 1)
Acta ci 121106
Using Student Research Center
Latino voters in Arizona and SB1070
Правила и Условия Программы
Mailrouting t shootingfinal
สถาปนากรุงรัตนโกสินทร์
Codesign Athens Course Gentes
Titan Awards Sponsorship Packet
สงครามครูเสด 2003
ฟ้เดล กัสโตร
Anexo ás normas, calendario previo (aprobado)
Process Consulting Perspective
Why businesses should talktojason the Leeds public relations and communicatio...
Ad

Similar to ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL (Александр Веремьев) (20)

PPTX
Zend Products and PHP for IBMi
PDF
Zend Framework 2 quick start
PDF
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
PDF
Getting started with PHP on IBM i
PDF
ZF2 Presentation @PHP Tour 2011 in Lille
DOCX
Zend framework 2.0
PDF
Zend Framework Handout
PDF
Zend Framework Handout
PPT
Demo
PDF
What's new with Zend server
PDF
A Tale of Two Toolkits
PPT
PPT
Greenathan
PPT
Greenathan
PPT
PPT
PPT
werwer
PPT
PPT
PPT
sdfsdf
Zend Products and PHP for IBMi
Zend Framework 2 quick start
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
Getting started with PHP on IBM i
ZF2 Presentation @PHP Tour 2011 in Lille
Zend framework 2.0
Zend Framework Handout
Zend Framework Handout
Demo
What's new with Zend server
A Tale of Two Toolkits
Greenathan
Greenathan
werwer
sdfsdf

More from ZFConf Conference (20)

PPTX
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
PDF
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
PDF
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ODP
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
PPT
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
PPTX
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
PPTX
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
PPT
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
PDF
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
PPT
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
PPT
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ODP
ZFConf 2010: Zend Framework and Doctrine
PPT
ZFConf 2010: History of e-Shtab.ru
PPTX
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
PPT
ZFConf 2010: Performance of Zend Framework Applications
PPT
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
PPTX
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
PPT
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
PPT
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
PPT
ZFConf 2010: Zend Framework and Multilingual
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2010: Zend Framework and Multilingual

Recently uploaded (20)

PPTX
1. Introduction to Computer Programming.pptx
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
A comparative analysis of optical character recognition models for extracting...
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
A Presentation on Artificial Intelligence
PDF
cuic standard and advanced reporting.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Approach and Philosophy of On baking technology
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Spectral efficient network and resource selection model in 5G networks
PPT
Teaching material agriculture food technology
1. Introduction to Computer Programming.pptx
Diabetes mellitus diagnosis method based random forest with bat algorithm
20250228 LYD VKU AI Blended-Learning.pptx
A comparative analysis of optical character recognition models for extracting...
MYSQL Presentation for SQL database connectivity
Unlocking AI with Model Context Protocol (MCP)
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
A Presentation on Artificial Intelligence
cuic standard and advanced reporting.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Per capita expenditure prediction using model stacking based on satellite ima...
SOPHOS-XG Firewall Administrator PPT.pptx
gpt5_lecture_notes_comprehensive_20250812015547.pdf
MIND Revenue Release Quarter 2 2025 Press Release
Digital-Transformation-Roadmap-for-Companies.pptx
Approach and Philosophy of On baking technology
Network Security Unit 5.pdf for BCA BBA.
Assigned Numbers - 2025 - Bluetooth® Document
Spectral efficient network and resource selection model in 5G networks
Teaching material agriculture food technology

ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL (Александр Веремьев)

  • 1. IBM DB2 Embedded SQL for PHP Александр Веремьев [email protected]
  • 3. $dbname = 'db_name'; $dbuser = 'username'; $dbpwd = 'password'; EXEC SQL connect to :$dbname user :$dbuser using :$dbpwd; ... $userid = $_POST['userid']; $password = $_POST['password']; EXEC SQL select firstname, lastname into :$firstname, :$lastname from users where login = :$userid AND password = :$password; if ($SQLCODE == 100 /* NOT FOUND */) { echo "Wrong login/password combination.n"; } else { echo $firstname . "n" . $lastname . "n"; }
  • 4. EXEC SQL DECLARE c1 CURSOR for select id, time, subject, message from emails where userid = :$userid AND status = 'NEW'; EXEC SQL BEGIN DECLARE SECTION; INTEGER $email_id; TMESTAMP $time; VARCHAR(256) $subject; CLOB(16M) $message_body; EXEC SQL END DECLARE SECTION; EXEC SQL OPEN c1; EXEC SQL FETCH c1 into :$email_id, :$time, :$subject, :$message_body; while ($SQLCODE != 100 /* NOT FOUND */) { // process message ... EXEC SQL FETCH c1 into :$email_id, :$time, :$subject, :$message_body; }
  • 5. Часть SQL-92 стандарта Непосредственная поддержка со стороны СУБД в тех или иных языках: - IBM DB2 (C/C++, Java, COBOL, FORTRAN, REXX) - Oracle (Ada, C/C++, COBOL, FORTRAN, Pascal, PL/I) - PostgreSQL (C/C++, COBOL) - Microsof SQL Server (COBOL) - MySQL (COBOL) - Sybase -…
  • 6. IBM DB2 Embedded SQL for PHP support: PHP extension db2_embsql db2_embsql_precompile($input_file, $dbname, $options_string); db2_embsql_precompile_string($php_code, $dbname, $options_string);
  • 7. Особенности реализации встроенного SQL в IBM DB2. Static SQL. <?php <?php /** /** * Zend Framework * Zend Framework * * * LICENSE * LICENSE * * * This source file is subject to the new BSD license that is bundled * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * 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 * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * to [email protected] so we can send you a copy immediately. * * * @category Zend * @category Zend * @package Zend_Pdf * @package Zend_Pdf * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id: Pdf.php 22908 2010-08-25 20:52:47Z alexander $ * @version $Id: Pdf.php 22908 2010-08-25 20:52:47Z alexander $ */ */ /** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */ DB2 /** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */ /** @todo Section should be removed with ZF 2.0 release as obsolete */ /** @todo Section should be removed with ZF 2.0 release as obsolete */ /** Zend_Pdf_Page */ /** Zend_Pdf_Page */ require_once 'Zend/Pdf/Page.php'; require_once 'Zend/Pdf/Page.php'; /** Zend_Pdf_Canvas */ /** Zend_Pdf_Canvas */ require_once 'Zend/Pdf/Canvas.php'; require_once 'Zend/Pdf/Canvas.php'; /** Internally used classes */ /** Internally used classes */ require_once 'Zend/Pdf/Element/Dictionary.php'; require_once 'Zend/Pdf/Element/Dictionary.php'; require_once 'Zend/Pdf/Element/Name.php'; require_once 'Zend/Pdf/Element/Name.php'; require_once 'Zend/Pdf/Element/Null.php'; require_once 'Zend/Pdf/Element/Null.php'; require_once 'Zend/Pdf/Element/Numeric.php'; require_once 'Zend/Pdf/Element/Numeric.php'; require_once 'Zend/Pdf/Element/String.php'; require_once 'Zend/Pdf/Element/String.php'; /** /** * General entity which describes PDF document. * General entity which describes PDF document. * It implements document abstraction with a document level operations. * It implements document abstraction with a document level operations. * * * Class is used to create new PDF document or load existing document. * Class is used to create new PDF document or load existing document. * See details in a class constructor description * See details in a class constructor description * * * Class agregates document level properties and entities (pages, bookmarks, * Class agregates document level properties and entities (pages, bookmarks, * document level actions, attachments, form object, etc) * document level actions, attachments, form object, etc) * * * @category Zend * @category Zend * @package Zend_Pdf * @package Zend_Pdf * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @license http://framework.zend.com/license/new-bsd New BSD License */ */ class Zend_Pdf class Zend_Pdf { { /**** Class Constants ****/ /**** Class Constants ****/ /** /** * Version number of generated PDF documents. * Version number of generated PDF documents. */ */ const PDF_VERSION = '1.4'; const PDF_VERSION = '1.4'; /** /** * PDF file header. * PDF file header. */ */ const PDF_HEADER = "%PDF-1.4n%xE2xE3xCFxD3n"; /** * * * * Pages collection * /** * @todo implement it as a class, which supports ArrayAccess and Iterator interfaces, * Set user defined memory manager * to provide incremental parsing and pages tree updating. * * That will give good performance and memory (PDF size) benefits. * @param Zend_Memory_Manager $memoryManager * */ * @var array - array of Zend_Pdf_Page object static public function setMemoryManager(Zend_Memory_Manager $memoryManager) */ { public $pages = array(); self::$_memoryManager = $memoryManager; /** } * List of inheritable attributesfor pages tree } * * @var array */ protected static $_inheritableAttributes = array('Resources', 'MediaBox', 'CropBox', 'Rotate'); /** * Request used memory manager * * @return Zend_Memory_Manager */ static public function getMemoryManager() { if (self::$_memoryManager === null) { require_once 'Zend/Memory.php'; self::$_memoryManager = Zend_Memory::factory('none'); } return self::$_memoryManager; } /** * Set user defined memory manager * * @param Zend_Memory_Manager $memoryManager */ static public function setMemoryManager(Zend_Memory_Manager $memoryManager) { self::$_memoryManager = $memoryManager; } /** * Set the document-level JavaScript * * @param string $javascript */ public function setJavaScript($javascript) { $this->_javaScript = $javascript; } /** * Convert date to PDF format (it's close to ASN.1 (Abstract Syntax Notation * One) defined in ISO/IEC 8824). * * @todo This really isn't the best location for this method. It should * probably actually exist as Zend_Pdf_Element_Date or something like that. * * @todo Address the following E_STRICT issue: * PHP Strict Standards: date(): It is not safe to rely on the system's .BND * timezone settings. Please use the date.timezone setting, the TZ * environment variable or the date_default_timezone_set() function. In * case you used any of those methods and you are still getting this * warning, you most likely misspelled the timezone identifier. * * @param integer $timestamp (optional) If omitted, uses the current time. * @return string */ public static function pdfDate($timestamp = null) { if ($timestamp === null) { $date = date('D:YmdHisO'); } else { $date = date('D:YmdHisO', $timestamp); } return substr_replace($date, ''', -2, 0) . '''; } }
  • 8. <?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 [email protected] so we can send you a copy immediately. PHP код * PHP код * @category Zend * @package Zend_Pdf * @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: Pdf.php 22908 2010-08-25 20:52:47Z alexander $ */ /** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */ /** @todo Section should be removed with ZF 2.0 release as obsolete */ /** Zend_Pdf_Page */ require_once 'Zend/Pdf/Page.php'; /** Zend_Pdf_Canvas */ require_once 'Zend/Pdf/Canvas.php'; /** Internally used classes */ require_once 'Zend/Pdf/Element/Dictionary.php'; require_once 'Zend/Pdf/Element/Name.php'; require_once 'Zend/Pdf/Element/Null.php'; require_once 'Zend/Pdf/Element/Numeric.php'; require_once 'Zend/Pdf/Element/String.php'; /** * General entity which describes PDF document. * It implements document abstraction with a document level operations. * * Class is used to create new PDF document or load existing document. * See details in a class constructor description * * Class agregates document level properties and entities (pages, bookmarks, * document level actions, attachments, form object, etc) * * @category Zend * @package Zend_Pdf * @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_Pdf { /**** Class Constants ****/ /** * Version number of generated PDF documents. */ const PDF_VERSION = '1.4'; /** * PDF file header. */ const PDF_HEADER = "%PDF-1.4n%xE2xE3xCFxD3n"; /** * Pages collection * * @todo implement it as a class, which supports ArrayAccess and Iterator interfaces, * to provide incremental parsing and pages tree updating. * That will give good performance and memory (PDF size) benefits. * * @var array - array of Zend_Pdf_Page object */ public $pages = array(); /** * List of inheritable attributesfor pages tree * * @var array */ protected static $_inheritableAttributes = array('Resources', 'MediaBox', 'CropBox', 'Rotate'); /** * Request used memory manager * * @return Zend_Memory_Manager */ static public function getMemoryManager() { if (self::$_memoryManager === null) { require_once 'Zend/Memory.php'; self::$_memoryManager = Zend_Memory::factory('none'); } return self::$_memoryManager; } /** * Set user defined memory manager * * @param Zend_Memory_Manager $memoryManager */ static public function setMemoryManager(Zend_Memory_Manager $memoryManager) { self::$_memoryManager = $memoryManager; } /** * Set the document-level JavaScript * * @param string $javascript */ public function setJavaScript($javascript) { $this->_javaScript = $javascript; } /** * Convert date to PDF format (it's close to ASN.1 (Abstract Syntax Notation SQL * One) defined in ISO/IEC 8824). * * @todo This really isn't the best location for this method. It should * probably actually exist as Zend_Pdf_Element_Date or something like that. Компиляция * * @todo Address the following E_STRICT issue: * PHP Strict Standards: date(): It is not safe to rely on the system's * timezone settings. Please use the date.timezone setting, the TZ * environment variable or the date_default_timezone_set() function. In * case you used any of those methods and you are still getting this * warning, you most likely misspelled the timezone identifier. * * @param integer $timestamp (optional) If omitted, uses the current time. * @return string */ public static function pdfDate($timestamp = null) { if ($timestamp === null) { $date = date('D:YmdHisO'); } else { $date = date('D:YmdHisO', $timestamp); } return substr_replace($date, ''', -2, 0) . '''; } }
  • 9. Статический SQL. - отсутствие повторной компиляции, использование готового плана выполнения (отличные результаты на OLTP нагрузке); - защита от SQL injection; - улучшенная модель security.
  • 10. Связывание типов. PHP SQL - динамическая типизация - статическая типизация - слабая типизация - строгая типизация1 1 поддерживается неявный кастинг для некоторого подмножества типов.
  • 11. Связывание типов. PHP SQL $var1 (integer) SELECT … INTO :$var1 … … $var1 (string) INSERT INTO … VALUES(:$var1, …) $var2 (float) SELECT … WHERE COL1 > :$var2 $var1 (string)
  • 12. Связывание типов, C/C++: EXEC SQL BEGIN DECLARE SECTION; char dbName[16]; char userid[30]; char passwd[30]; SQL TYPE IS CLOB(2M) img_data; EXEC SQL END DECLARE SECTION; ... EXEC SQL CONNECT TO :dbName USER :userid USING :passwd;
  • 13. db2_embsql extension: 1. Декларативность секции EXEC SQL BEGIN DECLARE SECTION; … EXEC SQL END DECLARE SECTION; 2. Физическое размещение HV в модуле extension’а.
  • 14. 3. Маппинг имѐн host variables (и производных lvalue конструкций) на внутренние имена HV в SQL выражениях, отправляемых на прекомпиляцию. $this->myCoolVariable $values[$index]->val $options['my_cool_option'] …
  • 15. Маппинг типов: SMALLINT (16-bit integer) - integrer INTEGER (32-bit integer) - integrer BIGINT (64-bit integer) - integrer REAL - float DOUBLE - float DECIMAL - STRING CHAR(n) - STRING CHAR(n) FOR BIT DATA - STRING VARCHAR(n) - STRING CLOB(n) - STRING BLOB(n) - STRING DATE - STRING TIME - STRING TIMESTAMP - STRING ...
  • 16. Решение проблемы предугадывания типов, input/output variables: EXEC SQL SELECT LOGIN, FIRSTNAME, LASTNAME INTO :$login, :$firstname, :$lastname FROM USERS WHERE ID = :$user_id; vs EXEC SQL INSERT INTO USERS VALUES( :$login, :$firstname, :$lastname);
  • 17. Декларация “базовых” переменных: EXEC SQL BEGIN DECLARE SECTION; VARCHAR(32) $login; VARCHAR(64) $firstname, VARCHAR(64) $lastname; EXEC SQL BEGIN DECLARE SECTION; ... $login = $this->login; $firstname = $this->firstname; $lastname = $this->lastname; EXEC SQL INSERT INTO USERS VALUES(:$login, :$firstname, :$lastname);
  • 18. Декларация “производных” переменных: EXEC SQL BEGIN DECLARE SECTION; VARCHAR(32) $this->login; VARCHAR(64) $this->firstname, VARCHAR(64) $this->lastname; EXEC SQL BEGIN DECLARE SECTION; ... EXEC SQL INSERT INTO USERS VALUES( :$this->login, :$this->firstname, :$this->lastname);
  • 19. Как работают вызовы SQL statements: <?php /** * Zend Framework * DB2 Run Database * 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 Time Services Manager SELECT … * 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 [email protected] so we can send you a copy immediately. * * @category Zend * @package Zend_Pdf * @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: Pdf.php 22908 2010-08-25 20:52:47Z alexander $ */ /** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */ /** @todo Section should be removed with ZF 2.0 release as obsolete */ /** Zend_Pdf_Page */ require_once 'Zend/Pdf/Page.php'; /** Zend_Pdf_Canvas */ require_once 'Zend/Pdf/Canvas.php'; /** Internally used classes */ require_once 'Zend/Pdf/Element/Dictionary.php'; require_once 'Zend/Pdf/Element/Name.php'; :HV1 require_once 'Zend/Pdf/Element/Null.php'; require_once 'Zend/Pdf/Element/Numeric.php'; require_once 'Zend/Pdf/Element/String.php'; /** * General entity which describes PDF document. * It implements document abstraction with a document level operations. * * Class is used to create new PDF document or load existing document. * See details in a class constructor description * * Class agregates document level properties and entities (pages, bookmarks, :HV2 * document level actions, attachments, form object, etc) * * @category Zend * @package Zend_Pdf * @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_Pdf { /**** Class Constants ****/ /** * Version number of generated PDF documents. */ const PDF_VERSION = '1.4'; /** * PDF file header. CALL */ const PDF_HEADER = "%PDF-1.4n%xE2xE3xCFxD3n"; /** * Pages collection * * @todo implement it as a class, which supports ArrayAccess and Iterator interfaces, * to provide incremental parsing and pages tree updating. * That will give good performance and memory (PDF size) benefits. * * @var array - array of Zend_Pdf_Page object */ public $pages = array(); /** Packages * List of inheritable attributesfor pages tree Packages * Packages * @var array */ protected static $_inheritableAttributes = array('Resources', 'MediaBox', 'CropBox', 'Rotate'); /** * Request used memory manager * * @return Zend_Memory_Manager */ static public function getMemoryManager() { if (self::$_memoryManager === null) { require_once 'Zend/Memory.php'; self::$_memoryManager = Zend_Memory::factory('none'); } return self::$_memoryManager; } /** * Set user defined memory manager * * @param Zend_Memory_Manager $memoryManager */ static public function setMemoryManager(Zend_Memory_Manager $memoryManager) { self::$_memoryManager = $memoryManager; } /** * Set the document-level JavaScript * * @param string $javascript */ public function setJavaScript($javascript) { $this->_javaScript = $javascript; } /** * Convert date to PDF format (it's close to ASN.1 (Abstract Syntax Notation * One) defined in ISO/IEC 8824). * Data * @todo This really isn't the best location for this method. It should Packages * probably actually exist as Zend_Pdf_Element_Date or something like that. Packages * * @todo Address the following E_STRICT issue: * PHP Strict Standards: date(): It is not safe to rely on the system's * timezone settings. Please use the date.timezone setting, the TZ * environment variable or the date_default_timezone_set() function. In * case you used any of those methods and you are still getting this * warning, you most likely misspelled the timezone identifier. * * @param integer $timestamp (optional) If omitted, uses the current time. * @return string */ public static function pdfDate($timestamp = null) { if ($timestamp === null) { $date = date('D:YmdHisO'); } else { Result $date = date('D:YmdHisO', $timestamp); } return substr_replace($date, ''', -2, 0) . '''; } } :HV3
  • 20. пример прекомпилированного С кода: /* EXEC SQL select count(*) into :tbl_cnt from syscat.tables; */ { #line 39 "dbconn.sqc" sqlastrt(sqla_program_id, &sqla_rtinfo, &sqlca); #line 39 "dbconn.sqc" sqlaaloc(3,1,2,0L); { struct sqla_setdata_list sql_setdlist[1]; #line 39 "dbconn.sqc" sql_setdlist[0].sqltype = 496; sql_setdlist[0].sqllen = 4; #line 39 "dbconn.sqc" sql_setdlist[0].sqldata = (void*)&tbl_cnt; #line 39 "dbconn.sqc" sql_setdlist[0].sqlind = 0L; #line 39 "dbconn.sqc" sqlasetdata(3,0,1,sql_setdlist,0L,0L); }
  • 21. #line 39 "dbconn.sqc" sqlacall((unsigned short)24,1,0,3,0L); #line 39 "dbconn.sqc" sqlastop(0L); } #line 39 "dbconn.sqc" EMB_SQL_CHECK("Count tables"); printf("select count(*) from syscat.tables;n--------n %dn", tbl_cnt);
  • 22. Архитектура extension’а как магазинного автомата: Очередь вызовов PHP engine <?php /** * Zend Framework * DB2_ESQL * 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 [email protected] so we can send you a copy immediately. extension * * @category Zend * @package Zend_Pdf * @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: Pdf.php 22908 2010-08-25 20:52:47Z alexander $ */ /** User land classes and interfaces turned on by Zend/Pdf.php file inclusion. */ /** @todo Section should be removed with ZF 2.0 release as obsolete */ /** Zend_Pdf_Page */ require_once 'Zend/Pdf/Page.php'; /** Zend_Pdf_Canvas */ require_once 'Zend/Pdf/Canvas.php'; /** Internally used classes */ require_once 'Zend/Pdf/Element/Dictionary.php'; /** * General entity which describes PDF document. * It implements document abstraction with a document level operations. * * Class is used to create new PDF document or load existing document. sqlaaloc(...) * See details in a class constructor description * * * @category * @package Zend Zend_Pdf * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) sqlacall(...) * @license http://framework.zend.com/license/new-bsd New BSD License { */ class Zend_Pdf /**** Class Constants ****/ /** sqlacmpd(...) * Version number of generated PDF documents. */ const PDF_VERSION = '1.4'; /** * PDF file header. */ sqladloc(...) const PDF_HEADER = "%PDF-1.4n%xE2xE3xCFxD3n"; /** /** * List of inheritable attributesfor pages tree * * @var array sqlastls(...) */ protected static $_inheritableAttributes = array('Resources', 'MediaBox', 'CropBox', 'Rotate'); /** * Request used memory manager * sqlastlv(...) * @return Zend_Memory_Manager { */ static public function getMemoryManager() if (self::$_memoryManager === null) { require_once 'Zend/Memory.php'; sqlastlva(...) self::$_memoryManager = Zend_Memory::factory('none'); } /** } return self::$_memoryManager; * Set user defined memory manager sqlasetdata(...) * * @param Zend_Memory_Manager $memoryManager */ static public function setMemoryManager(Zend_Memory_Manager $memoryManager) { self::$_memoryManager = $memoryManager; sqlastop(...) } /** * Set the document-level JavaScript * * @param string $javascript */ sqlastrt(...) public function setJavaScript($javascript) { } /** $this->_javaScript = $javascript; * Convert date to PDF format (it's close to ASN.1 (Abstract Syntax Notation sqlausda(...) * One) defined in ISO/IEC 8824). * * @todo This really isn't the best location for this method. It should * probably actually exist as Zend_Pdf_Element_Date or something like that. * * @todo Address the following E_STRICT issue: * PHP Strict Standards: date(): It is not safe to rely on the system's * timezone settings. Please use the date.timezone setting, the TZ * environment variable or the date_default_timezone_set() function. In * case you used any of those methods and you are still getting this * warning, you most likely misspelled the timezone identifier. * * @param integer $timestamp (optional) If omitted, uses the current time. * @return string */ public static function pdfDate($timestamp = null) { if ($timestamp === null) { $date = date('D:YmdHisO'); } else { $date = date('D:YmdHisO', $timestamp); } return substr_replace($date, ''', -2, 0) . '''; НV area } }
  • 23. Плюсы: - cтатичность SQL; - отсутствие фазы компиляции запроса на этапе выполнения; - отсутствие фазы построения плана запроса на этапе выполнения; - проверка SQL на этапе прекомпиляции; - защищѐнность от вымывания кэшей SQL запросов; - управляемость планов выполнения, возможность вести сравнительную статистику по изменяемости планов по модулям приложений, пакет как measurement объѐмов и характера данных в проекции приложения; - модель security – права на выполнение на уровне пакета.
  • 24. Минусы: - cтатичность SQL; - дополнительная фаза - прекомпиляция; - необходимость существования соответствующих объектов базы на момент компиляции; - прирост производительности незаметен на длительных запросах (10 и более секунд); - слабая ориентированность на “ad hoc” запросы: имеется поддержка динамического SQL, но она ничем не лучше native подходов с помощью odbc/cli; - отсутствие выигрыша для редко выполняемых запросов.
  • 25. Ограничения embedded SQL: - невозможность использования Host variables в именах объектов имѐн таблиц, функций, процедур, …, кроме как при использовании динамического SQL (PREPAPRE, EXECUTE); - невозможность использования scrollable курсоров;
  • 26. IBM DB2 и динамический SQL для PHP: http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.swg.im.dbclient.php.doc/doc/c0021523.html 1. ibm_db2 extension http://www.php.net/manual/en/book.ibm-db2.php 2. pdo_ibm driver http://www.php.net/manual/en/book.pdo.php 3. Unified odbc extension http://www.php.net/manual/en/book.uodbc.php
  • 27. Способы увеличения производительности динамического SQL: - увеличение размера STATEMENT CACHE – pckachesz имеется некоторая точка насыщения, предмет для мониторинга: * pkg_cache_lookups (package cache lookups) * pkg_cache_inserts (package cache inserts) * pkg_cache_size_top (package cache high water mark) * pkg_cache_num_overflows (package cache overflows) - использование параметризованных запросов есть “Но” – план выполнения будет строиться без учѐта реального значения параметра - StmtConcentrator CLI/ODBC параметр
  • 28. - конвертирование динамического SQL в статический: 1. Коллектор запросов (CLI/ODBC параметры): STATICMODE=CAPTURE STATICCAPFILE=<path> STATICPACKAGE=<package_schema>.<package_name> 2. Работа приложения 3. db2cap bind … 4. STATICMODE=MATCH
  • 29. Планы - Пре-релиз конец мая – начало июня. - Релиз, передача в Open Source – конец июня.
  • 30. Embedded SQL vs ORM frameworks/ActiveRecord ???