<?php␊ |
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */␊ |
/*␊ |
# ***** BEGIN LICENSE BLOCK *****␊ |
# This file is part of InDefero, an open source project management application.␊ |
# Copyright (C) 2008 Céondo Ltd and contributors.␊ |
#␊ |
# InDefero is free software; you can redistribute it and/or modify␊ |
# it under the terms of the GNU General Public License as published by␊ |
# the Free Software Foundation; either version 2 of the License, or␊ |
# (at your option) any later version.␊ |
#␊ |
# InDefero is distributed in the hope that it will be useful,␊ |
# but WITHOUT ANY WARRANTY; without even the implied warranty of␊ |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the␊ |
# GNU General Public License for more details.␊ |
#␊ |
# You should have received a copy of the GNU General Public License␊ |
# along with this program; if not, write to the Free Software␊ |
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA␊ |
#␊ |
# ***** END LICENSE BLOCK ***** */␊ |
␊ |
/**␊ |
* Configuration of the objects.␊ |
*␊ |
* It is just storing a list of key/value pairs associated to␊ |
* different objects. If you use this table for your model, do not␊ |
* forget to drop the corresponding keys in your preDelete call.␊ |
*/␊ |
class IDF_Gconf extends Pluf_Model␊ |
{␊ |
public $_model = __CLASS__;␊ |
public $datacache = null;␊ |
public $dirty = array();␊ |
public $f = null;␊ |
protected $_mod = null;␊ |
␊ |
function init()␊ |
{␊ |
$this->_a['table'] = 'idf_gconf';␊ |
$this->_a['model'] = __CLASS__;␊ |
$this->_a['cols'] = array(␊ |
// It is mandatory to have an "id" column.␊ |
'id' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Sequence',␊ |
//It is automatically added.␊ |
'blank' => true, ␊ |
),␊ |
'model_class' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Varchar',␊ |
'blank' => false,␊ |
'size' => 150,␊ |
'verbose' => __('model class'),␊ |
),␊ |
'model_id' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Integer',␊ |
'blank' => false,␊ |
'verbose' => __('model id'),␊ |
),␊ |
'vkey' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Varchar',␊ |
'blank' => false,␊ |
'size' => 50,␊ |
'verbose' => __('key'),␊ |
),␊ |
'vdesc' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Text',␊ |
'blank' => false,␊ |
'verbose' => __('value'),␊ |
),␊ |
);␊ |
$this->_a['idx'] = array('model_vkey_idx' =>␊ |
array(␊ |
'col' => 'model_class, model_id, vkey',␊ |
'type' => 'unique',␊ |
),␊ |
);␊ |
$this->f = new IDF_Config_DataProxy($this);␊ |
}␊ |
␊ |
function setModel($model)␊ |
{␊ |
$this->datacache = null;␊ |
$this->_mod = $model;␊ |
}␊ |
␊ |
function initCache()␊ |
{␊ |
$this->datacache = array();␊ |
$this->dirty = array();␊ |
$sql = new Pluf_SQL('model_class=%s AND model_id=%s',␊ |
array($this->_mod->_model, $this->_mod->id));␊ |
foreach ($this->getList(array('filter' => $sql->gen())) as $val) {␊ |
$this->datacache[$val->vkey] = $val->vdesc;␊ |
$this->dirty[$val->vkey] = $val->id;␊ |
}␊ |
}␊ |
␊ |
/**␊ |
* FIXME: This is not efficient when setting a large number of␊ |
* values in a loop.␊ |
*/␊ |
function setVal($key, $value)␊ |
{␊ |
if (!is_null($this->getVal($key, null)) ␊ |
and $value == $this->getVal($key)) {␊ |
return;␊ |
}␊ |
if (isset($this->dirty[$key])) {␊ |
// we get to check if deleted by other process + update␊ |
$conf = new IDF_Gconf($this->dirty[$key]);␊ |
if ($conf->id == $this->dirty[$key]) {␊ |
$conf->vdesc = $value;␊ |
$conf->update();␊ |
$this->datacache[$key] = $value;␊ |
return;␊ |
}␊ |
} ␊ |
// we insert␊ |
$conf = new IDF_Gconf();␊ |
$conf->model_class = $this->_mod->_model;␊ |
$conf->model_id = $this->_mod->id;␊ |
$conf->vkey = $key;␊ |
$conf->vdesc = $value;␊ |
$conf->create();␊ |
$this->datacache[$key] = $value;␊ |
$this->dirty[$key] = $conf->id;␊ |
}␊ |
␊ |
function getVal($key, $default='')␊ |
{␊ |
if ($this->datacache === null) {␊ |
$this->initCache();␊ |
}␊ |
return (isset($this->datacache[$key])) ? $this->datacache[$key] : $default;␊ |
}␊ |
␊ |
function delVal($key, $initcache=true)␊ |
{␊ |
$gconf = new IDF_Gconf();␊ |
$sql = new Pluf_SQL('vkey=%s AND model_class=%s AND model_id=%s', array($key, $this->_mod->_model, $this->_mod->id));␊ |
foreach ($gconf->getList(array('filter' => $sql->gen())) as $c) {␊ |
$c->delete();␊ |
}␊ |
if ($initcache) {␊ |
$this->initCache();␊ |
}␊ |
}␊ |
␊ |
/**␊ |
* Drop the conf of a model.␊ |
*␊ |
* If your model is using this table, just add the following line␊ |
* in your preDelete() method:␊ |
*␊ |
* IDF_Gconf::dropForModel($this)␊ |
*␊ |
* It will take care of the cleaning.␊ |
*/␊ |
static public function dropForModel($model)␊ |
{␊ |
$table = Pluf::factory(__CLASS__)->getSqlTable();␊ |
$sql = new Pluf_SQL('model_class=%s AND model_id=%s',␊ |
array($model->_model, $model->id));␊ |
$db = &Pluf::db();␊ |
$db->execute('DELETE FROM '.$table.' WHERE '.$sql->gen());␊ |
}␊ |
␊ |
static public function dropUser($signal, &$params)␊ |
{␊ |
self::dropForModel($params['user']);␊ |
}␊ |
}␊ |