Source for file Ethna_AppObject.php
Documentation is available at Ethna_AppObject.php
// vim: foldmethod=marker
* @author Masaki Fujimoto <fujimoto@php.net>
* @license http://www.opensource.org/licenses/bsd-license.php The BSD License
* @author Masaki Fujimoto <fujimoto@php.net>
* @todo remove dependency on PEAR::DB
* @todo quoteidentifier は Ethna_AppSQL に持っていくべき
/** @var object Ethna_Backend backendオブジェクト */
/** @var object Ethna_Config 設定オブジェクト */
/** @var object Ethna_I18N i18nオブジェクト */
/** @var object Ethna_ActionForm アクションフォームオブジェクト */
/** @var object Ethna_ActionForm アクションフォームオブジェクト(省略形) */
/** @var object Ethna_Session セッションオブジェクト */
/** @var string DB定義プレフィクス */
/** @var array テーブル定義。対応するDB上のテーブル名を指定します。*/
/** @var array プロパティ定義。テーブルのカラム定義を記述します。 */
/** @var array プロパティ。各カラムに対応する実際の値です。 */
/** @var array プロパティ(バックアップ) */
/** @var int プロパティ定義キャッシュ有効期間(sec) */
var $prop_def_cache_lifetime =
86400;
/** @var array プライマリキー定義 */
/** @var int オブジェクトID (プライマリーキーの値) */
* Ethna_AppObjectクラスのコンストラクタ
* @param object Ethna_Backend &$backend Ethna_Backendオブジェクト
* @param mixed $key_type レコードを特定するためのカラム名
* @param mixed $key レコードを特定するためのカラム値
* @param array $prop プロパティ(レコードの値)一覧
* @return mixed 0:正常終了 -1:キー/プロパティ未指定 Ethna_Error:エラー
function Ethna_AppObject(&$backend, $key_type =
null, $key =
null, $prop =
null)
$this->backend =
& $backend;
$this->config =
& $backend->getConfig();
$this->action_form =
& $backend->getActionForm();
$this->af =
& $this->action_form;
$this->session =
& $backend->getSession();
$ctl =
& $backend->getController();
} else if (is_null($db_list['rw'])) {
"Ethna_AppObjectを利用するにはデータベース設定が必要です",
$this->my_db_rw =
& $db_list['rw'];
$this->my_db_ro =
& $db_list['ro'];
// XXX: app objはdb typeを知らなくても動くべき
$this->my_db_type =
$this->my_db_rw->getType();
// 現在、記述可能なテーブルは常に一つで、primaryはtrue
$this->table_def =
array($this->table_def =>
array('primary' =>
true));
// プロパティ定義(テーブルのカラム定義)自動取得
// データベースから自動取得され、キャッシュされる
if (isset
($this->prop_def[$k]['primary']) ==
false) {
$this->prop_def[$k]['primary'] =
false;
foreach ($this->prop_def as $k =>
$v) {
if ($v['primary'] ==
false) {
$this->id_def =
array($this->id_def, $k);
// perhaps for adding object
// $key_type, $key が指定されたらDBから値を取得し、設定する
// $prop が設定された場合はそれを設定する
$this->_setPropByDB($key_type, $key);
$this->_setPropByValue($prop);
$this->prop_backup =
$this->prop;
foreach ($this->id_def as $k) {
$this->id[] =
$this->prop[$k];
$this->id =
$this->prop[$this->id_def];
* プライマリーキーの値が設定されてなければ不正なオブジェクトです。
* @return bool true:有効 false:無効
return is_null($this->id[0]) ?
false :
true;
return is_null($this->id) ?
false :
true;
* isValid()メソッドはオブジェクト自体が有効かどうかを判定するのに対し
* isActive()はオブジェクトがアプリケーションとして有効かどうかを返す
* @return bool true:アクティブ false:非アクティブ
* オブジェクトのプロパティ定義(カラム定義)を返す
* @return array オブジェクトのプロパティ定義
* @return mixed プライマリキーとなるプロパティ名
* オブジェクトID(primary keyの値)を返す
* @param string $key プロパティ名(カラム名)
* @return mixed プロパティ(カラムの値)
if (isset
($this->prop_def[$key]) ==
false) {
if (isset
($this->prop[$key])) {
return $this->prop[$key];
* プロパティ値と、表示用の値が違う場合 (「県」等)に、
* @param string $key プロパティ(カラム)名
* @return string プロパティ(カラム)の表示名
* オブジェクトプロパティ表示名(詳細)へのアクセサ
* プロパティ値と、表示用の値が違う場合 (「県」等)に、
* @param string $key プロパティ(カラム)名
* @return string プロパティ(カラム)の表示名(詳細)
* すべての getName メソッドの戻り値を配列として返します。
* @return array プロパティ表示名を格納した連想配列
foreach ($this->prop_def as $key =>
$elt) {
$object[$elt['form_name']] =
$this->getName($key);
* オブジェクトプロパティ(カラムに対応した値)を設定します。
* @param string $key プロパティ(カラム)名
* @param string $value プロパティ値
function set($key, $value)
if (isset
($this->prop_def[$key]) ==
false) {
$this->prop[$key] =
$value;
* オブジェクトプロパティを指定の形式でダンプする(現在はCSV形式のみサポート)
* @param string $type ダンプ形式("csv"...)
* @return string ダンプ結果(エラーの場合はnull)
function dump($type =
"csv")
* フォーム値からオブジェクトプロパティをインポートする
* @param int $option インポートオプション
* OBJECT_IMPORT_IGNORE_NULL: フォーム値が送信されていない場合はスキップ
* OBJECT_IMPORT_CONVERT_NULL: フォーム値が送信されていない場合、空文字列に変換
foreach ($this->getDef() as $k =>
$def) {
$value =
$this->af->get($def['form_name']);
// フォームから値が送信されていない場合の振舞い
* オブジェクトプロパティをフォーム値にエクスポートする
foreach ($this->getDef() as $k =>
$def) {
$this->af->set($def['form_name'], $this->get($k));
* @return mixed 0:正常終了 Ethna_Error:エラー
* @todo remove dependency on PEAR::DB
// primary key 定義が sequence の場合、
// next idの取得: (pgsqlの場合のみ)
foreach (to_array($this->id_def) as $id_def) {
if (isset
($this->prop_def[$id_def]['seq'])
&&
$this->prop_def[$id_def]['seq']) {
// NOTE: このapp object以外からinsertがないことが前提
$next_id =
$this->my_db_rw->getNextId(
$this->prop_def[$id_def]['table'], $id_def);
if ($next_id !==
null &&
$next_id >=
0) {
$this->prop[$id_def] =
$next_id;
$sql =
$this->_getSQL_Add();
for ($i =
0; $i <
4; $i++
) {
$r =
& $this->my_db_rw->query($sql);
// エラーの場合 -> 重複キーエラーの場合はリトライ
$duplicate_key_list =
$this->_getDuplicateKeyList();
return $duplicate_key_list;
&&
count($duplicate_key_list) >
0) {
foreach ($duplicate_key_list as $k) {
// last insert idの取得: (mysql, sqliteのみ)
// primary key の 'seq' フラグがある(最初の)プロパティに入れる
$insert_id =
$this->my_db_rw->getInsertId();
if ($insert_id !==
null &&
$insert_id >=
0) {
foreach (to_array($this->id_def) as $id_def) {
if (isset
($this->prop_def[$id_def]['seq'])
&&
$this->prop_def[$id_def]['seq']) {
$this->prop[$id_def] =
$insert_id;
foreach ($this->id_def as $k) {
$this->id[] =
$this->prop[$k];
} else if (isset
($this->prop[$this->id_def])) {
$this->id =
$this->prop[$this->id_def];
$this->prop_backup =
$this->prop;
$this->_clearPropCache();
* @return mixed 0:正常終了 Ethna_Error:エラー
* @todo remove dependency on PEAR::DB
$sql =
$this->_getSQL_Update();
// エラーの場合 -> 重複キーエラーの場合はリトライ(4回)
for ($i =
0; $i <
4; $i++
) { // magic number
$r =
& $this->my_db_rw->query($sql);
$duplicate_key_list =
$this->_getDuplicateKeyList();
return $duplicate_key_list;
&&
count($duplicate_key_list) >
0) {
foreach ($duplicate_key_list as $k) {
$affected_rows =
$this->my_db_rw->affectedRows();
if ($affected_rows <=
0) {
$this->backend->log(LOG_DEBUG, "update query with 0 updated rows");
$this->prop_backup =
$this->prop;
$this->_clearPropCache();
* MySQLのREPLACE文に相当する動作を行う(add()で重複エラーが発生したら
* @return mixed 0:正常終了 >0:オブジェクトID(追加時) Ethna_Error:エラー
* @todo remove dependency on PEAR::DB
for ($i =
0; $i <
3; $i++
) { // magic number
$r =
$this->my_db_rw->query($sql);
* @return mixed 0:正常終了 Ethna_Error:エラー
* @todo remove dependency on PEAR::DB
$sql =
$this->_getSQL_Remove();
$r =
& $this->my_db_rw->query($sql);
$this->id =
$this->prop =
$this->prop_backup =
null;
$this->_clearPropCache();
* オブジェクトID(プライマリーキーの値)を検索する
* @param array $filter WHERE検索条件(カラム名をキー、値には実際の条件値か、Ethna_AppSearchObjectを指定)
* @param array $order 検索結果ソート条件
* (カラム名をキー。値には、昇順の場合は OBJECT_SORT_ASC, 降順の場合は OBJECT_SORT_DESC)
* @param int $offset 検索結果取得オフセット
* @param int $count 検索結果取得数
* @return mixed array(0 => 検索条件にマッチした件数,
* 1 => $offset, $countにより指定された件数のオブジェクトID一覧)
* TODO: remove dependency on PEAR::DB
function searchId($filter =
null, $order =
null, $offset =
null, $count =
null)
$sql =
$this->_getSQL_SearchLength($filter);
$r =
& $this->my_db_ro->query($sql);
$row =
$this->my_db_ro->fetchRow($r, DB_FETCHMODE_ASSOC);
$length =
$row['id_count'];
$sql =
$this->_getSQL_SearchId($filter, $order, $offset, $count);
$r =
& $this->my_db_ro->query($sql);
for ($i =
0; $i <
$n; $i++
) {
$row =
$this->my_db_ro->fetchRow($r, DB_FETCHMODE_ASSOC);
// プライマリキーが1カラムならスカラー値に変換
$row =
$row[$this->id_def];
$length =
count($id_list);
return array($length, $id_list);
* @param array $keys 取得するプロパティ(カラム名)
* @param array $filter WHERE検索条件(カラム名をキー、値には実際の条件値か、Ethna_AppSearchObjectを指定)
* @param array $order 検索結果ソート条件
* (カラム名をキー。値には、昇順の場合は OBJECT_SORT_ASC, 降順の場合は OBJECT_SORT_DESC)
* @param int $offset 検索結果取得オフセット
* @param int $count 検索結果取得数
* @return mixed array(0 => 検索条件にマッチした件数,
* 1 => $offset, $countにより指定された件数のオブジェクトプロパティ一覧)
* TODO: remove dependency on PEAR::DB
function searchProp($keys =
null, $filter =
null, $order =
null,
$offset =
null, $count =
null)
$sql =
$this->_getSQL_SearchLength($filter);
$r =
& $this->my_db_ro->query($sql);
$row =
$this->my_db_ro->fetchRow($r, DB_FETCHMODE_ASSOC);
$length =
$row['id_count'];
$sql =
$this->_getSQL_SearchProp($keys, $filter, $order, $offset, $count);
$r =
& $this->my_db_ro->query($sql);
for ($i =
0; $i <
$n; $i++
) {
$row =
$this->my_db_ro->fetchRow($r, DB_FETCHMODE_ASSOC);
$length =
count($prop_list);
return array($length, $prop_list);
* オブジェクトのアプリケーションデフォルトプロパティを設定する
* コンストラクタにより指定されたキーにマッチするエントリがなかった場合の
* デフォルトプロパティをここで設定することが出来る
* @param mixed $key_type 検索キー名
* @param mixed $key_type 検索キー名
* TODO: depend on PEAR::DB
function _setPropByDB($key_type, $key)
global $_ETHNA_APP_OBJECT_CACHE;
foreach ($key_type as $elt) {
if (isset
($this->prop_def[$elt]) ==
false) {
if (is_array($_ETHNA_APP_OBJECT_CACHE) ==
false
$_ETHNA_APP_OBJECT_CACHE[$class_name] =
array();
$cache_key =
serialize(array($key_type, $key));
$this->prop =
$_ETHNA_APP_OBJECT_CACHE[$class_name][$cache_key];
$sql =
$this->_getSQL_Select($key_type, $key);
$r =
& $this->my_db_ro->query($sql);
trigger_error("Invalid key (multiple rows found) [$key]", E_USER_ERROR);
$this->prop =
$this->my_db_ro->fetchRow($r, DB_FETCHMODE_ASSOC);
$_ETHNA_APP_OBJECT_CACHE[$class_name][$cache_key] =
$this->prop;
* コンストラクタで指定されたプロパティを設定する
* @param array $prop プロパティ一覧
function _setPropByValue($prop)
foreach ($def as $key =>
$value) {
if ($value['primary'] && isset
($prop[$key]) ==
false) {
$this->prop[$key] =
$prop[$key];
* @return string オブジェクトのプライマリテーブル名
function _getPrimaryTable()
// {{{ _getDuplicateKeyList
* @return mixed 0:重複なし Ethna_Error:エラー array:重複キーのプロパティ名一覧
* TODO: depend on PEAR::DB
function _getDuplicateKeyList()
$duplicate_key_list =
array();
// 現在設定されているプライマリキーにNULLが含まれる場合は検索しない
foreach (to_array($this->id_def) as $k) {
if (isset
($this->prop[$k]) ==
false ||
is_null($this->prop[$k])) {
// プライマリキーはmulti columnsになり得るので別扱い
$sql =
$this->_getSQL_Duplicate($this->id_def);
$r =
& $this->my_db_rw->query($sql);
} else if ($r->numRows() >
0) {
// we can overwrite $key_list here
$duplicate_key_list =
to_array($this->id_def);
foreach ($this->prop_def as $k =>
$v) {
if ($v['primary'] ==
true ||
$v['key'] ==
false) {
$sql =
$this->_getSQL_Duplicate($k);
$r =
& $this->my_db_rw->query($sql);
} else if ($r->NumRows() >
0) {
$duplicate_key_list[] =
$k;
if (count($duplicate_key_list) >
0) {
return $duplicate_key_list;
* オブジェクトプロパティを取得するSQL文を構築する
* @param array $key_type 検索キーとなるプロパティ(カラム)名一覧
* @param array $key $key_typeに対応するキー一覧
function _getSQL_Select($key_type, $key)
for ($i =
0; $i <
count($key_type); $i++
) {
$this->my_db_ro->quoteIdentifier(array_keys($this->table_def)));
$this->my_db_ro->quoteIdentifier(array_keys($this->prop_def)));
for ($i =
0; $i <
count($key_type); $i++
) {
$this->my_db_ro->quoteIdentifier($key_type[$i]), $key[$i]);
$sql =
"SELECT $columns FROM $tables $condition";
* @return string オブジェクトを追加するためのINSERT文
$this->my_db_rw->quoteIdentifier(array_keys($this->table_def)));
$prop_arg_list =
$this->prop;
foreach ($this->prop_def as $k =>
$v) {
if (isset
($prop_arg_list[$k]) ==
false) {
$key_list[] =
$this->my_db_rw->quoteIdentifier($k);
$set_list[] =
$prop_arg_list[$k];
$key_list =
implode(', ', $key_list);
$set_list =
implode(', ', $set_list);
$sql =
"INSERT INTO $tables ($key_list) VALUES ($set_list)";
* オブジェクトプロパティを更新するSQL文を構築する
* @return オブジェクトプロパティを更新するためのUPDATE文
function _getSQL_Update()
$this->my_db_rw->quoteIdentifier(array_keys($this->table_def)));
$prop_arg_list =
$this->prop;
foreach ($this->prop_def as $k =>
$v) {
$this->my_db_rw->quoteIdentifier($k),
foreach (to_array($this->id_def) as $k) {
$v =
$this->prop_backup[$k]; // equals to $this->id
$this->my_db_rw->quoteIdentifier($k), $v);
$sql =
"UPDATE $tables SET $set_list $condition";
* @return string オブジェクトを削除するためのDELETE文
function _getSQL_Remove()
$this->my_db_rw->quoteIdentifier(array_keys($this->table_def)));
foreach (to_array($this->id_def) as $k) {
$v =
$this->prop_backup[$k]; // equals to $this->id
$this->my_db_rw->quoteIdentifier($k), $v);
$sql =
"DELETE FROM $tables $condition";
* オブジェクトプロパティのユニークチェックを行うSQL文を構築する
* @param mixed $key ユニークチェックを行うプロパティ名
* @return string ユニークチェックを行うためのSELECT文
function _getSQL_Duplicate($key)
$this->my_db_ro->quoteIdentifier(array_keys($this->table_def)));
$this->my_db_ro->quoteIdentifier(array_keys($this->prop_def)));
// 検索条件(現在設定されているプライマリキーは検索対象から除く)
foreach (to_array($this->id_def) as $k) {
$value =
$primary_value[$n];
$this->my_db_ro->quoteIdentifier($k), $v);
$sql =
"SELECT $columns FROM $tables $condition";
// {{{ _getSQL_SearchLength
* オブジェクト検索総数(offset, count除外)を取得するSQL文を構築する
* @param array $filter WHERE検索条件(カラム名をキー、値には実際の条件値か、Ethna_AppSearchObjectを指定)
* @return string 検索総数を取得するためのSELECT文
function _getSQL_SearchLength($filter)
$this->my_db_ro->quoteIdentifier(array_keys($this->table_def)));
// プライマリーキー以外の検索条件が含まれていた
// その解釈は _SQLPlugin_SearchTable に任せる
if ($this->_isAdditionalField($filter)) {
$column_id =
$this->my_db_ro->quoteIdentifier($this->_getPrimaryTable())
.
"." .
$this->my_db_ro->quoteIdentifier($id_def[0]);
$id_count =
$this->my_db_ro->quoteIdentifier('id_count');
$condition =
$this->_getSQL_SearchCondition($filter);
if ($this->my_db_type ===
'sqlite') {
$sql =
"SELECT COUNT(*) AS $id_count FROM "
.
" (SELECT DISTINCT $column_id FROM $tables $condition)";
$sql =
"SELECT COUNT(DISTINCT $column_id) AS $id_count "
.
"FROM $tables $condition";
* オブジェクトID(プライマリーキー)検索を行うSQL文を構築する
* @param array $filter WHERE検索条件(カラム名をキー、値には実際の条件値か、Ethna_AppSearchObjectを指定)
* @param array $order 検索結果ソート条件
* (カラム名をキー。値には、昇順の場合は OBJECT_SORT_ASC, 降順の場合は OBJECT_SORT_DESC)
* @param int $offset 検索結果取得オフセット
* @param int $count 検索結果取得数
* @return string オブジェクト検索を行うSELECT文
function _getSQL_SearchId($filter, $order, $offset, $count)
$this->my_db_ro->quoteIdentifier(array_keys($this->table_def)));
if ($this->_isAdditionalField($filter)
||
$this->_isAdditionalField($order)) {
foreach (to_array($this->id_def) as $id) {
$column_id .=
$this->my_db_ro->quoteIdentifier($this->_getPrimaryTable())
.
"." .
$this->my_db_ro->quoteIdentifier($id);
$condition =
$this->_getSQL_SearchCondition($filter);
foreach ($order as $k =>
$v) {
$sort .=
sprintf("%s %s", $this->my_db_ro->quoteIdentifier($k),
$limit =
sprintf("LIMIT %d", $count);
$limit .=
sprintf(" OFFSET %d", $offset);
$sql =
"SELECT DISTINCT $column_id FROM $tables $condition $sort $limit";
// {{{ _getSQL_SearchProp
* オブジェクトプロパティ検索を行うSQL文を構築する
* @param array $keys 取得プロパティ(カラム名)一覧
* @param array $filter WHERE検索条件(カラム名をキー、値には実際の条件値か、Ethna_AppSearchObjectを指定)
* @param array $order 検索結果ソート条件
* (カラム名をキー。値には、昇順の場合は OBJECT_SORT_ASC, 降順の場合は OBJECT_SORT_DESC)
* @param int $offset 検索結果取得オフセット
* @param int $count 検索結果取得数
* @return string オブジェクト検索を行うSELECT文
function _getSQL_SearchProp($keys, $filter, $order, $offset, $count)
$this->my_db_ro->quoteIdentifier(array_keys($this->table_def)));
if ($this->_isAdditionalField($filter)
||
$this->_isAdditionalField($order)) {
$p_table =
$this->_getPrimaryTable();
// プライマリーキー以外の検索キーが含まれていた
// 場合は、その解釈を _SQLPlugin_SearchPropDef に任せる
// これによって、複数のテーブルの条件を指定することが
if ($this->_isAdditionalField($filter)
||
$this->_isAdditionalField($order)) {
$search_prop_def =
array();
foreach ($keys as $key) {
$t = isset
($def[$key]['table']) ?
$def[$key]['table'] :
$p_table;
$this->my_db_ro->quoteIdentifier($t),
$this->my_db_ro->quoteIdentifier($key));
$condition =
$this->_getSQL_SearchCondition($filter);
foreach ($order as $k =>
$v) {
$this->my_db_ro->quoteIdentifier($k),
$limit =
sprintf("LIMIT %d", $count);
$limit .=
sprintf(" OFFSET %d", $offset);
$sql =
"SELECT $column FROM $tables $condition $sort $limit";
// {{{ _getSQL_SearchCondition
* @param array $filter WHERE検索条件(カラム名をキー、値には実際の条件値か、Ethna_AppSearchObjectを指定)
* @return string オブジェクト検索の条件文(エラーならnull)
function _getSQL_SearchCondition($filter)
$p_table =
$this->_getPrimaryTable();
// プライマリーキー以外の検索キーが含まれていた
// 場合は、その解釈を _SQLPlugin_SearchPropDef に任せる
// これによって、複数のテーブルの条件を指定することが
if ($this->_isAdditionalField($filter)) {
$search_prop_def =
array();
$prop_def =
array_merge($this->prop_def, $search_prop_def);
foreach ($filter as $k =>
$v) {
if (isset
($prop_def[$k]) ==
false) {
$t = isset
($prop_def[$k]['table']) ?
$prop_def[$k]['table'] :
$p_table;
// 細かい条件を指定するには、Ethna_AppSearchObject
// を使う必要がある 文字列の場合は LIKE, 数値の場合
// Ethna_AppSearchObjectが指定されている場合
$condition .=
$v->toString(
$this->my_db_ro->quoteIdentifier($t)
.
'.'.
$this->my_db_ro->quoteIdentifier($k));
// Ethna_AppSearchObjectが配列で指定されている場合
$condition .=
$so->toString(
$this->my_db_ro->quoteIdentifier($t)
.
'.'.
$this->my_db_ro->quoteIdentifier($k));
$this->my_db_ro->quoteIdentifier($t)
.
'.'.
$this->my_db_ro->quoteIdentifier($k),
$this->my_db_ro->quoteIdentifier($t)
.
'.'.
$this->my_db_ro->quoteIdentifier($k),
// {{{ _SQLPlugin_SearchTable
* オブジェクト検索SQLプラグイン(追加テーブル)
* return " LEFT JOIN bar_tbl ON foo_tbl.user_id=bar_tbl.user_id";
* @return string テーブルJOINのSQL文
// {{{ _SQLPlugin_SearchPropDef
* オブジェクト検索SQLプラグイン(追加条件定義)
* $search_prop_def = array(
* 'primary' => true, 'key' => true, 'type' => VAR_TYPE_INT,
* 'form_name' => 'group_id', 'table' => 'group_user_tbl',
* return $search_prop_def;
* オブジェクトプロパティをCSV形式でダンプする
foreach ($this->getDef() as $k =>
$def) {
// {{{ _isAdditionalField
* (検索条件|ソート条件)フィールドにプライマリーキー以外
* @param array $field (検索条件|ソート条件)定義
* @return bool true:含まれる false:含まれない
function _isAdditionalField($field)
foreach ($field as $key =>
$value) {
if ($value->isTarget($key)) {
function _clearPropCache()
foreach (array('_ETHNA_APP_OBJECT_CACHE',
'_ETHNA_APP_MANAGER_OL_CACHE',
'_ETHNA_APP_MANAGER_OPL_CACHE',
'_ETHNA_APP_MANAGER_OP_CACHE') as $key) {
unset
($GLOBALS[$key][$class_name]);
* DBオブジェクト(read only/read-write)を取得する
* @return array array('ro' => {read only db object}, 'rw' => {read-write db object})
$r =
array('ro' =>
null, 'rw' =>
null);
foreach ($db_list as $elt) {
// 特定のプレフィクスが指定されたDB接続を利用
strlen($this->db_prefix)) !=
0) {
$varname =
$elt['varname'];
$this->$varname =
& $elt['db'];
if ($r['ro'] ==
null &&
$r['rw'] !=
null) {
* (クラス名→テーブル名のルールを変えたい場合は
if (preg_match('/(\w+)_(.*)/', $class_name, $match) ==
0) {
// PHP 4は常に小文字を返す...のでPHP 5専用
$table =
preg_replace('/^([A-Z])/e', "strtolower('\$1')", $table);
$table =
preg_replace('/([A-Z])/e', "'_' . strtolower('\$1')", $table);
// JOIN には対応していないので、記述可能なテーブルは
// 常に一つ、かつ primary は trueになる
return array($table =>
array('primary' =>
true));
* プロパティ定義を取得します。キャッシュされている場合は、
foreach ($this->table_def as $table_name =>
$table_attr) {
$cache_manager->setNamespace('ethna_app_object');
$cache_key =
md5($this->my_db_ro->getDSN() .
'-' .
$table_name);
if ($cache_manager->isCached($cache_key, $this->prop_def_cache_lifetime)) {
$prop_def =
$cache_manager->get($cache_key,
$this->prop_def_cache_lifetime);
$r =
$this->my_db_ro->getMetaData($table_name);
foreach ($r as $i =>
$field_def) {
$primary =
in_array('primary_key', $field_def['flags']);
$seq =
in_array('sequence', $field_def['flags']);
$required =
in_array('not_null', $field_def['flags']);
$key =
in_array('primary_key', $field_def['flags'])
||
in_array('multiple_key', $field_def['flags'])
||
in_array('unique_key', $field_def['flags']);
switch ($field_def['type']) {
$prop_def[$field_def['name']] =
array(
'length' =>
$field_def['len'],
$cache_manager->set($cache_key, $prop_def);
// {{{ _fieldNameToFormName
* データベースフィールド名に対応するフォーム名を取得する
return $field_def['name'];
Documentation generated on Fri, 11 Nov 2011 03:59:17 +0900 by phpDocumentor 1.4.3