<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Contains the Translation2_Container_mdb2 class
*
* PHP versions 4 and 5
*
* LICENSE: Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @category Internationalization
* @package Translation2
* @author Lorenzo Alberton <l.alberton@quipo.it>
* @copyright 2004-2008 Lorenzo Alberton
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause)
* @version CVS: $Id: mdb2.php 305985 2010-12-05 22:55:33Z clockwerx $
* @link http://pear.php.net/package/Translation2
*/
/**
* require Translation2_Container class
*/
require_once 'Translation2/Container.php';
/**
* Storage driver for fetching data from a database
*
* This storage driver can use all databases which are supported
* by the PEAR::MDB2 abstraction layer to fetch data.
*
* @category Internationalization
* @package Translation2
* @author Lorenzo Alberton <l.alberton@quipo.it>
* @copyright 2004-2008 Lorenzo Alberton
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause)
* @version CVS: $Id: mdb2.php 305985 2010-12-05 22:55:33Z clockwerx $
* @link http://pear.php.net/package/Translation2
*/
class Translation2_Container_mdb2 extends Translation2_Container
{
// {{{ class vars
/**
* MDB2 object
* @var object
*/
var $db = null;
/**
* query counter
* @var integer
* @access private
*/
var $_queries = 0;
// }}}
// {{{ init
/**
* Initialize the container
*
* @param string &$db Connection data or MDB2 object
*
* @return boolean|PEAR_Error object if something went wrong
*/
function init(&$db)
{
$this->_setDefaultOptions();
if (PEAR::isError($err = $this->_connect($db))) {
return $err;
}
return true;
}
// }}}
// {{{ _connect()
/**
* Connect to database by using the given DSN string
*
* @param mixed &$db DSN string | array | MDB2 object
*
* @return boolean|PEAR_Error on error
* @access private
*/
function _connect(&$db)
{
if (is_object($db) && is_a($db, 'MDB2_Driver_Common')) {
$this->db = &$db;
} elseif (is_string($db) || is_array($db)) {
include_once 'MDB2.php';
$this->db =& MDB2::connect($db);
} elseif (is_object($db) && MDB2::isError($db)) {
return PEAR::raiseError($db->getMessage(), $db->code);
} else {
return PEAR::raiseError('The given dsn was not valid in file '
. __FILE__ . ' at line ' . __LINE__,
TRANSLATION2_ERROR_CANNOT_CONNECT,
PEAR_ERROR_RETURN);
}
if (PEAR::isError($this->db)) {
return $this->db;
}
return true;
}
// }}}
// {{{ _setDefaultOptions()
/**
* Set some default options
*
* @return void
* @access private
*/
function _setDefaultOptions()
{
$this->options['langs_avail_table'] = 'langs';
$this->options['lang_id_col'] = 'id';
$this->options['lang_name_col'] = 'name';
$this->options['lang_meta_col'] = 'meta';
$this->options['lang_errmsg_col'] = 'error_text';
$this->options['lang_encoding_col'] = 'encoding';
$this->options['strings_default_table'] = 'i18n';
$this->options['strings_tables'] = array(); // 'lang_id' => 'table_name'
$this->options['string_id_col'] = 'id';
$this->options['string_page_id_col'] = 'page_id';
$this->options['string_page_id_col_length'] = 50;
$this->options['string_text_col'] = '%s'; // col_name if one table per lang is used,
// or a pattern (i.e. "tr_%s" => "tr_EN_US")
}
// }}}
// {{{ setCharset()
/**
* Set charset used to read/store the translations
*
* @param string $charset character set (encoding)
*
* @return PEAR_Error on error
*/
function setCharset($charset)
{
return $this->db->setCharset($charset);
}
// }}}
// {{{ fetchLangs()
/**
* Fetch the available langs if they're not cached yet.
*
* @return PEAR_Error on error
*/
function fetchLangs()
{
$query = sprintf('SELECT %s AS id, %s AS name, %s AS meta, %s AS error_text, %s AS encoding FROM %s',
$this->db->quoteIdentifier($this->options['lang_id_col'], true),
$this->db->quoteIdentifier($this->options['lang_name_col'], true),
$this->db->quoteIdentifier($this->options['lang_meta_col'], true),
$this->db->quoteIdentifier($this->options['lang_errmsg_col'], true),
$this->db->quoteIdentifier($this->options['lang_encoding_col'], true),
$this->db->quoteIdentifier($this->options['langs_avail_table'], true)
);
++$this->_queries;
$res = $this->db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);
if (PEAR::isError($res)) {
return $res;
}
foreach ($res as $row) {
$row = array_change_key_case($row, CASE_LOWER);
$this->langs[$row['id']] = $row;
}
}
// }}}
// {{{ getPage()
/**
* Returns an array of the strings in the selected page
*
* @param string $pageID page/group ID
* @param string $langID language ID
*
* @return array
*/
function getPage($pageID = null, $langID = null)
{
$langID = $this->_getLangID($langID);
if (PEAR::isError($langID)) {
return $langID;
}
$lang_col = $this->_getLangCol($langID);
$table = $this->_getLangTable($langID);
$query = sprintf('SELECT %s, %s FROM %s WHERE %s ',
$this->db->quoteIdentifier($this->options['string_id_col'], true),
$this->db->quoteIdentifier($lang_col, true),
$this->db->quoteIdentifier($table, true),
$this->db->quoteIdentifier($this->options['string_page_id_col'], true)
);
if (is_null($pageID)) {
$query .= 'IS NULL';
} else {
$query .= ' = ' . $this->db->quote($pageID, 'text');
}
++$this->_queries;
$res = $this->db->query($query);
if (PEAR::isError($res)) {
return $res;
}
$strings = array();
while (list($key, $value) = $res->fetchRow(MDB2_FETCHMODE_ORDERED)) {
$strings[$key] = $value;
}
$res->free();
return $strings;
}
// }}}
// {{{ getOne()
/**
* Get a single item from the container
*
* @param string $stringID string ID
* @param string $pageID page/group ID
* @param string $langID language ID
*
* @return string
*/
function getOne($stringID, $pageID = null, $langID = null)
{
$langID = $this->_getLangID($langID);
if (PEAR::isError($langID)) {
return $langID;
}
$lang_col = $this->_getLangCol($langID);
$table = $this->_getLangTable($langID);
$query = sprintf('SELECT %s FROM %s WHERE %s = %s AND %s',
$this->db->quoteIdentifier($lang_col, true),
$this->db->quoteIdentifier($table, true),
$this->db->quoteIdentifier($this->options['string_id_col'], true),
$this->db->quote($stringID, 'text'),
$this->db->quoteIdentifier($this->options['string_page_id_col'], true)
);
if (is_null($pageID)) {
$query .= ' IS NULL';
} else {
$query .= ' = ' . $this->db->quote($pageID, 'text');
}
++$this->_queries;
return $this->db->queryOne($query);
}
// }}}
// {{{ getStringID()
/**
* Get the stringID for the given string
*
* @param string $string string
* @param string $pageID page/group ID
*
* @return string
*/
function getStringID($string, $pageID = null)
{
$lang_col = $this->_getLangCol($this->currentLang['id']);
$table = $this->_getLangTable($this->currentLang['id']);
$query = sprintf('SELECT %s FROM %s WHERE %s = %s AND %s',
$this->db->quoteIdentifier($this->options['string_id_col'], true),
$this->db->quoteIdentifier($table, true),
$this->db->quoteIdentifier($lang_col, true),
$this->db->quote($string, 'text'),
$this->db->quoteIdentifier($this->options['string_page_id_col'], true)
);
if (is_null($pageID)) {
$query .= ' IS NULL';
} else {
$query .= ' = ' . $this->db->quote($pageID, 'text');
}
++$this->_queries;
return $this->db->queryOne($query);
}
// }}}
// {{{ _getLangTable()
/**
* Get the table a language is stored in
*
* @param string $langID language ID
*
* @return string table $langID is stored in
* @access private
*/
function _getLangTable($langID)
{
if (isset($this->options['strings_tables'][$langID])) {
return $this->options['strings_tables'][$langID];
}
return str_replace('%s', $langID, $this->options['strings_default_table']);
}
// }}}
// {{{ _getLangCol()
/**
* Get the column a language's string is stored in
*
* @param string $langID language ID
*
* @return string column $langID is stored in
* @access private
*/
function _getLangCol($langID)
{
static $cols;
if (!isset($cols[$langID])) {
if (isset($this->options['string_text_col']) &&
!empty($this->options['string_text_col'])) {
$cols[$langID] = str_replace('%s', $langID, $this->options['string_text_col']);
} else {
$cols[$langID] = $langID;
}
}
return $cols[$langID];
}
// }}}
}
?>
Copyright 2K16 - 2K18 Indonesian Hacker Rulez