*/
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'syntax.php');
require_once(DOKU_INC.'inc/infoutils.php');
/**
* This is the base class for all syntax classes, providing some general stuff
*/
class helper_plugin_data extends DokuWiki_Plugin {
var $db = null;
/**
* constructor
*/
function helper_plugin_data(){
if (!extension_loaded('sqlite')) {
$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
@dl($prefix . 'sqlite.' . PHP_SHLIB_SUFFIX);
}
if(!function_exists('sqlite_open')){
msg('data plugin: SQLite support missing in this PHP install - plugin will not work',-1);
}
}
/**
* return some info
*/
function getInfo(){
return array(
'author' => 'Andreas Gohr',
'email' => 'andi@splitbrain.org',
'date' => '2008-02-08',
'name' => 'Structured Data Plugin',
'desc' => 'Add and query structured data in your wiki',
'url' => 'http://wiki.splitbrain.org/plugins:data',
);
}
/**
* Makes sure the given data fits with the given type
*/
function _cleanData($value, $type){
$value = trim($value);
if(!$value) return '';
switch($type){
case 'page':
return cleanID($value);
case 'nspage':
return cleanID($value);
case 'dt':
if(preg_match('/^(\d\d\d\d)-(\d\d?)-(\d\d?)$/',$value,$m)){
return sprintf('%d-%02d-%02d',$m[1],$m[2],$m[3]);
}
return '';
case 'url':
$value = strtolower($value);
if(!preg_match('!^[a-z]+://!',$value)) $value='http://'.$value;
default:
return $value;
}
}
/**
* Return XHTML formated data, depending on type
*/
function _formatData($key, $value, $type, &$R){
$vals = explode("\n",$value);
$outs = array();
foreach($vals as $val){
$val = trim($val);
if($val=='') continue;
switch($type){
case 'page':
$outs[] = $R->internallink(":$val",NULL,NULL,true);
break;
case 'title':
list($id,$title) = explode('|',$val,2);
$outs[] = $R->internallink(":$id",$title,NULL,true);
break;
case 'nspage':
$outs[] = $R->internallink(":$key:$val",NULL,NULL,true);
break;
case 'url':
$outs[] = ''.hsc($val).'';
break;
case 'tag':
$outs[] = ''.hsc($val).'';
break;
default:
$outs[] = hsc($val);
}
}
return join(', ',$outs);
}
/**
* Split a column name into its parts
*
* @returns array with key, type, ismulti, title
*/
function _column($col){
if(strtolower(substr($col,-1)) == 's'){
$col = substr($col,0,-1);
$multi = true;
}else{
$multi = false;
}
list($key,$type) = explode('_',$col,2);
return array(utf8_strtolower($key),utf8_strtolower($type),$multi,$key);
}
/**
* Open the database
*/
function _dbconnect(){
global $conf;
$dbfile = $conf['cachedir'].'/dataplugin.sqlite';
$init = (!@file_exists($dbfile) || !@filesize($dbfile));
$error='';
$this->db = sqlite_open($dbfile, 0666, $error);
if(!$this->db){
msg("data plugin: failed to open SQLite database ($error)",-1);
return false;
}
if($init) $this->_initdb();
return true;
}
/**
* create the needed tables
*/
function _initdb(){
sqlite_query($this->db,'CREATE TABLE pages (pid INTEGER PRIMARY KEY, page, title);');
sqlite_query($this->db,'CREATE UNIQUE INDEX idx_page ON pages(page);');
sqlite_query($this->db,'CREATE TABLE data (eid INTEGER PRIMARY KEY, pid INTEGER, key, value);');
sqlite_query($this->db,'CREATE INDEX idx_key ON data(key);');
}
}