Newer
Older
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2008 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
// infos :
// il ne faut pas avoir de PDO::CONSTANTE dans ce fichier sinon php4 se tue !
// idem, il ne faut pas de $obj->toto()->toto sinon php4 se tue !
# todo : get/set_caracteres ?
# todo : REPAIR TABLE ?
/*
*
* regroupe le maximum de fonctions qui peuvent cohabiter
* D'abord les fonctions d'abstractions de SPIP
*
*/
function req_sqlite_dist($addr, $port, $login, $pass, $db='', $prefixe='', $ldap='', $sqlite_version=''){
static $last_connect = array();
// si provient de selectdb
// un code pour etre sur que l'on vient de select_db()
if (strpos($db, $code = '@selectdb@')!==false) {
foreach (array('addr','port','login','pass','prefixe','ldap') as $a){
$$a = $last_connect[$a];
}
$db = str_replace($code, '', $db);
}
/*
* En sqlite, seule l'adresse du fichier est importante.
* Ce sera $db le nom, et le path _DIR_DB
*/
_sqlite_init();
// un nom de base demande et impossible d'obtenir la base, on s'en va
if ($db && !is_file($f = _DIR_DB . $db . '.sqlite') && !is_writable(_DIR_DB))
return false;
// charger les modules sqlite au besoin
if (!_sqlite_charger_version($sqlite_version)) {
spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!");
return false;
}
// chargement des constantes
// il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
$define = "spip_sqlite".$sqlite_version."_constantes";
$define();
$ok = false;
if (!$db){
// si installation -> base temporaire tant qu'on ne connait pas son vrai nom
if (defined('_ECRIRE_INSTALL') && _ECRIRE_INSTALL){
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// creation d'une base temporaire pour le debut d'install
$tmp = _DIR_DB . "_sqlite".$sqlite_version."_install.sqlite";
if ($sqlite_version == 3)
$ok = $link = new PDO("sqlite:$tmp");
else
$ok = $link = sqlite_open($tmp, _SQLITE_CHMOD, $err);
$db = "_sqlite".$sqlite_version."_install";
// sinon, on arrete finalement
} else {
return false;
}
} else {
// Ouvrir (eventuellement creer la base)
// si pas de version fourni, on essaie la 3, sinon la 2
if ($sqlite_version == 3) {
$ok = $link = new PDO("sqlite:$f");
} else {
$ok = $link = sqlite_open($f, _SQLITE_CHMOD, $err);
}
}
if (!$ok){
spip_log("Impossible d'ouvrir la base de donnee SQLite ($sqlite_version) : $f ");
return false;
}
if ($link) {
$last_connect = array (
'addr' => $addr,
'port' => $port,
'login' => $login,
'pass' => $pass,
'db' => $db,
'prefixe' => $prefixe,
'ldap' => $ldap
);
}
return array(
'db' => $db,
'prefixe' => $prefixe ? $prefixe : $db,
'link' => $link,
'ldap' => $ldap,
);
}
// obsolete, ne plus utiliser
/*
cerdic
a validé
function spip_query_db($query, $serveur='',$requeter=true) {
return spip_sqlite_query($query, $serveur);
}
*/
// Fonction de requete generale, munie d'une trace a la demande
cerdic
a validé
function spip_sqlite_query($query, $serveur='',$requeter=true) {
#spip_log("spip_sqlite_query() > $query");
_sqlite_init();
$requete = new sqlite_traiter_requete($query, $serveur);
$requete->traduire_requete(); // mysql -> sqlite
cerdic
a validé
if (!$requeter) return $requete->query;
return $requete->executer_requete();
}
/* ordre alphabetique pour les autres */
cerdic
a validé
function spip_sqlite_alter($query, $serveur='',$requeter=true){
$query = _sqlite_remplacements_definitions_table($query);
cerdic
a validé
$query = spip_sqlite_query("ALTER $query",$serveur,false);
/*
* la il faut faire les transformations
* si ALTER TABLE x (DROP|CHANGE) y
*
* 1) recuperer "ALTER TABLE table "
* 2) spliter les sous requetes (,)
* 3) faire chaque requete independemment
*/
// 1
if (preg_match("/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is", $query, $regs)){
$debut = $regs[1];
$table = $regs[3];
$suite = $regs[4];
spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite');
return false;
// 2
$todo = explode(',', $suite);
// 3
$resultats = array();
foreach ($todo as $do){
$do = trim($do);
if (!preg_match('/(DROP|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME|ADD COLUMN|ADD)\s*([^\s]*)\s*(.*)?/', $do, $matches)){
spip_log("SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)", 'sqlite');
return false;
}
$cle = strtoupper($matches[1]);
$colonne_origine = $matches[2];
$colonne_destination = '';
$def = $matches[3];
switch($cle){
// allez, on simule, on simule !
case 'DROP':
if (!_sqlite_modifier_table(
$table,
$table,
$colonne_origine,
'', // colonne origine -> rien !
'',
$serveur)){
return false;
}
break;
case 'CHANGE COLUMN':
case 'CHANGE':
// recuperer le nom de la future colonne
$def = trim($def);
$colonne_destination = substr($def, 0, strpos($def,' '));
$def = substr($def, strlen($colonne_destination)+1);
if (!_sqlite_modifier_table(
$table,
$table,
$colonne_origine,
$colonne_destination,
$def,
$serveur)){
return false;
}
break;
case 'MODIFY':
if (!_sqlite_modifier_table(
$table,
$table,
$colonne_origine,
$colonne_origine,
$def,
$serveur)){
return false;
}
break;
// pas geres en sqlite2
case 'RENAME':
$do = "RENAME TO" . substr($do,6);
case 'RENAME TO':
if (_sqlite_is_version(3, '', $serveur)){
$requete = new sqlite_traiter_requete("$debut $do", $serveur);
if (!$requete->executer_requete()){
spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite');
return false;
}
// artillerie lourde pour sqlite2 !
} else {
$table_dest = trim(substr($do, 9));
if (!_sqlite_modifier_table($table, $table_dest, '', '', '', $serveur)){
spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite');
return false;
}
}
break;
// pas geres en sqlite2
case 'ADD COLUMN':
$do = "ADD".substr($do, 10);
case 'ADD':
default:
if (preg_match('/^(.*)(BEFORE|AFTER)(.*)$/is', $do, $matches)) {
$do = $matches[1];
}
if (_sqlite_is_version(3, '', $serveur)){
$requete = new sqlite_traiter_requete("$debut $do", $serveur);
if (!$requete->executer_requete()){
spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite');
return false;
}
break;
// artillerie lourde pour sqlite2 !
} else {
$def = trim(substr($do, 3));
$colonne_ajoutee = substr($def, 0, strpos($def,' '));
$def = substr($def, strlen($colonne_ajoutee)+1);
if (!_sqlite_modifier_table($table, $table, '', $colonne_ajoutee, $def, $serveur)){
spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite');
return false;
}
}
break;
}
// tout est bon, ouf !
spip_log("SQLite ($serveur) : Changements OK : $debut $do");
}
spip_log("SQLite ($serveur) : fin ALTER TABLE OK !");
return true;
}
// Fonction de creation d'une table SQL nommee $nom
cerdic
a validé
function spip_sqlite_create($nom, $champs, $cles, $autoinc=false, $temporary=false, $serveur='',$requeter=true) {
$query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists=true, $serveur, $requeter);
if (!$query) return false;
cerdic
a validé
return spip_sqlite_query($query, $serveur, $requeter);
// Fonction de creation d'une vue SQL nommee $nom
function spip_sqlite_create_view($nom, $query_select, $serveur='',$requeter=true) {
if (!$query_select) return false;
// vue deja presente
if (sql_showtable($nom, false, $serveur)) {
spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)");
return false;
}
$query = "CREATE VIEW $nom AS ". $query_select;
return spip_sqlite_query($query, $serveur, $requeter);
}
// en PDO/sqlite3, il faut calculer le count par une requete count(*)
// pour les resultats de SELECT
// cela est fait sans spip_sqlite_query()
cerdic
a validé
function spip_sqlite_count($r, $serveur='',$requeter=true) {
if (!$r) return 0;
if (_sqlite_is_version(3, '', $serveur)){
// select ou autre (insert, update,...) ?
if (isset($r->spipSqliteRowCount)) {
// Ce compte est faux s'il y a des limit dans la requete :(
// il retourne le nombre d'enregistrements sans le limit
return $r->spipSqliteRowCount;
} else {
return $r->rowCount();
}
} else {
return sqlite_num_rows($r);
}
}
cerdic
a validé
function spip_sqlite_countsel($from = array(), $where = array(), $groupby = '', $limit = '', $sousrequete = '', $having = array(), $serveur='',$requeter=true) {
$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
$r = spip_sqlite_select("COUNT($c)", $from, $where,'', '', $limit,
cerdic
a validé
$having, $serveur, $requeter);
cerdic
a validé
if ($r && $requeter) {
if (_sqlite_is_version(3,'',$serveur)){
list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
} else {
list($r) = spip_sqlite_fetch($r, SPIP_SQLITE2_NUM, $serveur);
}
}
return $r;
}
cerdic
a validé
function spip_sqlite_delete($table, $where='', $serveur='',$requeter=true) {
return spip_sqlite_query(
_sqlite_calculer_expression('DELETE FROM', $table, ',')
. _sqlite_calculer_expression('WHERE', $where),
cerdic
a validé
$serveur, $requeter);
cerdic
a validé
function spip_sqlite_drop_table($table, $exist='', $serveur='',$requeter=true) {
/* simuler le IF EXISTS - version 2 */
if ($exist && _sqlite_is_version(2, '', $serveur)){
$a = spip_sqlite_showtable($table, $serveur);
if (!$a) return true;
$exist = '';
}
cerdic
a validé
return spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter);
// supprime une vue
function spip_sqlite_drop_view($view, $exist='', $serveur='',$requeter=true) {
if ($exist) $exist =" IF EXISTS";
/* simuler le IF EXISTS - version 2 */
if ($exist && _sqlite_is_version(2, '', $serveur)){
$a = spip_sqlite_showtable($view, $serveur);
if (!$a) return true;
$exist = '';
}
return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
}
cerdic
a validé
function spip_sqlite_error($query='', $serveur='',$requeter=true) {
$link = _sqlite_link($serveur);
if (_sqlite_is_version(3, $link)){
$errs = $link->errorInfo();
$s = '';
foreach($errs as $n=>$e){
$s .= "\n$n : $e";
}
} elseif ($link) {
$s = sqlite_error_string(sqlite_last_error($link));
} else {
$s = ": aucune ressource sqlite (link)";
}
if ($s) spip_log("$s - $query", 'sqlite');
return $s;
}
cerdic
a validé
function spip_sqlite_errno($serveur='',$requeter=true) {
$link = _sqlite_link($serveur);
if (_sqlite_is_version(3, $link)){
$t = $link->errorInfo();
$s = $t[1];
} elseif ($link) {
$s = sqlite_last_error($link);
} else {
$s = ": aucune ressource sqlite (link)";
}
if ($s) spip_log("Erreur sqlite $s");
return $s;
}
cerdic
a validé
function spip_sqlite_explain($query, $serveur='',$requeter=true){
if (strpos(ltrim($query), 'SELECT') !== 0) return array();
$requete = new sqlite_traiter_requete("$query", $serveur);
$requete->traduire_requete(); // mysql -> sqlite
$requete->query = 'EXPLAIN ' . $requete->query;
cerdic
a validé
if (!$requeter) return $requete;
// on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
$requete->tracer = false;
$r = $requete->executer_requete();
return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
}
cerdic
a validé
function spip_sqlite_fetch($r, $t='', $serveur='',$requeter=true) {
$link = _sqlite_link($serveur);
if (!$t) {
if (_sqlite_is_version(3, $link)) {
$t = SPIP_SQLITE3_ASSOC;
} else {
$t = SPIP_SQLITE2_ASSOC;
}
}
if (_sqlite_is_version(3, $link)){
if ($r) $retour = $r->fetch($t);
} elseif ($r) {
$retour = sqlite_fetch_array($r, $t);
}
// les version 2 et 3 parfois renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
// suppression de 'table.' pour toutes les cles (c'est un peu violent !)
if ($retour){
$new = array();
foreach ($retour as $cle=>$val){
if (($pos = strpos($cle, '.'))!==false){
$cle = substr($cle,++$pos);
}
$new[$cle] = $val;
}
$retour = &$new;
}
//echo "<br />";print_r($retour);
cerdic
a validé
function spip_sqlite_free($r, $serveur='',$requeter=true) {
//return sqlite_free_result($r);
}
cerdic
a validé
function spip_sqlite_get_charset($charset=array(), $serveur='',$requeter=true){
//$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
//return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
}
function spip_sqlite_hex($v){
return "0x" . $v;
}
cerdic
a validé
function spip_sqlite_in($val, $valeurs, $not='', $serveur='',$requeter=true) {
$n = $i = 0;
$in_sql ="";
while ($n = strpos($valeurs, ',', $n+1)) {
if ((++$i) >= 255) {
$in_sql .= "($val $not IN (" .
substr($valeurs, 0, $n) .
"))\n" .
($not ? "AND\t" : "OR\t");
$valeurs = substr($valeurs, $n+1);
$i = $n = 0;
}
}
$in_sql .= "($val $not IN ($valeurs))";
return "($in_sql)";
}
cerdic
a validé
function spip_sqlite_insert($table, $champs, $valeurs, $desc='', $serveur='',$requeter=true) {
$connexion = $GLOBALS['connexions'][$serveur ? $serveur : 0];
$prefixe = $connexion['prefixe'];
$sqlite = $connexion['link'];
$db = $connexion['db'];
if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table);
$t = !isset($_GET['var_profile']) ? 0 : trace_query_start();
$query="INSERT OR REPLACE INTO $table $champs VALUES $valeurs";
cerdic
a validé
if (!$requeter) return $query;
if ($r = spip_sqlite_query($query, $serveur)) {
if (_sqlite_is_version(3, $sqlite)) $nb = $sqlite->lastInsertId();
else $nb = sqlite_last_insert_rowid($sqlite);
} else {
if ($e = spip_sqlite_errno($serveur)) // Log de l'erreur eventuelle
$e .= spip_sqlite_error($query, $serveur); // et du fautif
}
return $t ? trace_query_end($query, $t, $nb, $e, $serveur) : $nb;
cerdic
a validé
function spip_sqlite_insertq($table, $couples=array(), $desc=array(), $serveur='',$requeter=true) {
if (!$desc) $desc = description_table($table);
if (!$desc) die("$table insertion sans description");
$fields = isset($desc['field'])?$desc['field']:array();
foreach ($couples as $champ => $val) {
$couples[$champ]= _sqlite_calculer_cite($val, $fields[$champ]);
}
// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
cerdic
a validé
return spip_sqlite_insert($table, "(".join(',',array_keys($couples)).")", "(".join(',', $couples).")", $desc, $serveur, $requeter);
function spip_sqlite_insertq_multi($table, $tab_couples=array(), $desc=array(), $serveur='',$requeter=true) {
foreach ($tab_couples as $couples) {
$retour = spip_sqlite_insertq($table, $couples, $desc, $serveur, $requeter);
}
// renvoie le dernier id d'autoincrement ajoute
return $retour;
}
cerdic
a validé
function spip_sqlite_listdbs($serveur='',$requeter=true) {
_sqlite_init();
if (!is_dir($d = substr(_DIR_DB,0,-1))){
return array();
}
include_spip('inc/flock');
$bases = preg_files($d, $pattern = '(.*)\.sqlite$');
$bds = array();
foreach($bases as $b){
// pas de bases commencant pas sqlite
// (on s'en sert pour l'installation pour simuler la presence d'un serveur)
// les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
if (strpos($b, '_sqlite')) continue;
$bds[] = preg_replace(";.*/$pattern;iS",'$1', $b);
}
return $bds;
}
function spip_sqlite_multi ($objet, $lang) {
$r = "PREG_REPLACE("
. $objet
. ",'<multi>.*[\[]"
. $lang
. "[\]]([^\[]*).*</multi>', '$1') AS multi";
return $r;
}
cerdic
a validé
function spip_sqlite_optimize($table, $serveur='',$requeter=true){
spip_sqlite_query("OPTIMIZE TABLE ". $table, $serveur); // <- a verifier mais ca doit pas etre ca !
return true;
}
// avoir le meme comportement que _q()
function spip_sqlite_quote($v){
if (is_int($v)) return strval($v);
if (is_array($v)) return join(",", array_map('spip_sqlite_quote', $v));
if (function_exists('sqlite_escape_string')) {
return "'" . sqlite_escape_string($v) . "'";
}
// trouver un link sqlite3 pour faire l'echappement
foreach ($GLOBALS['connexions'] as $s) {
if (_sqlite_is_version(3, $l = $s['link'])){
return $l->quote($v);
}
}
}
cerdic
a validé
function spip_sqlite_repair($table, $serveur='',$requeter=true){
return spip_sqlite_query("REPAIR TABLE $table", $serveur, $requeter); // <- ca m'ettonerait aussi ca !
function spip_sqlite_replace($table, $couples, $desc=array(), $serveur='',$requeter=true) {
if (!$desc) $desc = description_table($table);
if (!$desc) die("$table insertion sans description");
$fields = isset($desc['field'])?$desc['field']:array();
foreach ($couples as $champ => $val) {
$couples[$champ]= _sqlite_calculer_cite($val, $fields[$champ]);
}
// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
return spip_sqlite_query("REPLACE INTO $table (" . join(',',array_keys($couples)) . ') VALUES (' .join(',',$couples) . ')', $serveur);
}
function spip_sqlite_replace_multi($table, $tab_couples, $desc=array(), $serveur='',$requeter=true) {
// boucler pour trainter chaque requete independemment
foreach ($tab_couples as $couples){
$retour = spip_sqlite_replace($table, $couples, $desc, $serveur,$requeter);
}
// renvoie le dernier id
return $retour;
cerdic
a validé
function spip_sqlite_select($select, $from, $where='', $groupby='', $orderby='', $limit='', $having='', $serveur='',$requeter=true) {
// version() n'est pas connu de sqlite
$select = str_replace('version()', 'sqlite_version()',$select);
// recomposer from
$from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
$query =
_sqlite_calculer_expression('SELECT', $select, ', ')
. _sqlite_calculer_expression('FROM', $from, ', ')
. _sqlite_calculer_expression('WHERE', $where)
. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
. _sqlite_calculer_expression('HAVING', $having)
. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) :'')
. ($limit ? "\nLIMIT $limit" : '');
// Erreur ? C'est du debug de squelette, ou une erreur du serveur
if (isset($GLOBALS['var_mode']) AND $GLOBALS['var_mode'] == 'debug') {
include_spip('public/debug');
boucle_debug_requete($query);
}
cerdic
a validé
if (!($res = spip_sqlite_query($query, $serveur, $requeter))) {
include_spip('public/debug');
erreur_requete_boucle(substr($query, 7),
spip_sqlite_errno($serveur),
spip_sqlite_error($query, $serveur) );
}
return $res;
}
cerdic
a validé
function spip_sqlite_selectdb($db, $serveur='',$requeter=true) {
_sqlite_init();
// interdire la creation d'une nouvelle base,
// sauf si on est dans l'installation
if (!is_file($f = _DIR_DB . $db . '.sqlite')
&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL))
return false;
// se connecter a la base indiquee
// avec les identifiants connus
$index = $serveur ? $serveur : 0;
if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db , $serveur, '', '')){
if (($db==$link['db']) && $GLOBALS['connexions'][$index] = $link)
return $db;
} else {
spip_log("Impossible de selectionner la base $db", 'sqlite');
return false;
}
}
cerdic
a validé
function spip_sqlite_set_charset($charset, $serveur='',$requeter=true){
#spip_log("changement de charset sql : "."SET NAMES "._q($charset));
# return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
}
cerdic
a validé
function spip_sqlite_showbase($match, $serveur='',$requeter=true){
return spip_sqlite_query('SELECT name FROM sqlite_master WHERE type LIKE "'.$match.'"', $serveur, $requeter);
cerdic
a validé
function spip_sqlite_showtable($nom_table, $serveur='',$requeter=true){
. ' (SELECT * FROM sqlite_master UNION ALL'
. ' SELECT * FROM sqlite_temp_master)'
. " WHERE tbl_name LIKE '$nom_table'"
. " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
. 'ORDER BY substr(type,2,1), name';
cerdic
a validé
$a = spip_sqlite_query($query, $serveur, $requeter);
cerdic
a validé
if (!$requeter) return $a;
if (!($a = spip_sqlite_fetch($a, null, $serveur))) return "";
$vue = ($a['type'] == 'view'); // table | vue
// c'est une table
// il faut parser le create
if (!$vue) {
if (!preg_match("/^[^(),]*\((([^()]*(\([^()]*\))?[^()]*)*)\)[^()]*$/", array_shift($a), $r))
return "";
else {
if (preg_match("/^(.*?),([^,]*KEY.*)$/s", $dec, $r)) {
$namedkeys = $r[2];
$dec = $r[1];
}
else
$namedkeys = "";
$fields = array();
foreach (explode(",",$dec) as $v) {
preg_match("/^\s*([^\s]+)\s+(.*)/",$v,$r);
$fields[strtolower($r[1])] = $r[2];
}
$keys = array();
foreach(preg_split('/\)\s*,?/',$namedkeys) as $v) {
if (preg_match("/^\s*([^(]*)\((.*)$/",$v,$r)) {
$k = str_replace("`", '', trim($r[1]));
$t = strtolower(str_replace("`", '', $r[2]));
if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t;
}
// c'est une vue, on liste les champs disponibles simplement
} else {
if ($res = sql_fetsel('*',$nom_table,'','','','1','',$serveur)){ // limit 1
$fields = array();
foreach($res as $c=>$v) $fields[$c]='';
$keys = array();
} else {
return "";
}
/*
* me demande si les cles servent au compilateur de spip
* car vu que sqlite le gere pas, je sais pas ce que ca donne ...
*/
return array('field' => $fields, 'key' => $keys);
cerdic
a validé
function spip_sqlite_update($table, $champs, $where='', $desc='', $serveur='',$requeter=true) {
// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
$set = array();
foreach ($champs as $champ => $val)
$set[] = $champ . "=$val";
if (!empty($set))
return spip_sqlite_query(
_sqlite_calculer_expression('UPDATE', $table, ',')
. _sqlite_calculer_expression('SET', $set, ',')
. _sqlite_calculer_expression('WHERE', $where),
cerdic
a validé
$serveur, $requeter);
cerdic
a validé
function spip_sqlite_updateq($table, $champs, $where='', $desc=array(), $serveur='',$requeter=true) {
if (!$champs) return;
if (!$desc) $desc = description_table($table);
if (!$desc) die("$table insertion sans description");
$fields = $desc['field'];
// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
$set = array();
foreach ($champs as $champ => $val) {
$set[] = $champ . '=' . _sqlite_calculer_cite($val, $fields[$champ]);
}
return spip_sqlite_query(
_sqlite_calculer_expression('UPDATE', $table, ',')
. _sqlite_calculer_expression('SET', $set, ',')
. _sqlite_calculer_expression('WHERE', $where),
cerdic
a validé
$serveur, $requeter);
}
/*
*
* Ensuite les fonctions non abstraites
* crees pour l'occasion de sqlite
*
*/
// fonction pour la premiere connexion a un serveur SQLite
function _sqlite_init(){
if (!defined('_DIR_DB')) define('_DIR_DB', _DIR_ETC . 'bases/');
if (!defined('_SQLITE_CHMOD')) define('_SQLITE_CHMOD', _SPIP_CHMOD);
if (!is_dir($d = _DIR_DB)){
include_spip('inc/flock');
sous_repertoire($d);
}
}
// teste la version sqlite du link en cours
cerdic
a validé
function _sqlite_is_version($version='', $link='', $serveur='',$requeter=true){
if ($link==='') $link = _sqlite_link($serveur);
if (!$link) return false;
if (is_a($link, 'PDO')){
$v = 3;
} else {
$v = 2;
}
if (!$version) return $v;
return ($version == $v);
}
// retrouver un link (et definir les fonctions externes sqlite->php)
// $recharger devient inutile (a supprimer ?)
function _sqlite_link($serveur = '', $recharger = false){
static $charge = array();
if ($recharger) $charge[$serveur] = false;
$link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
if ($link && !$charge[$serveur]){
include_spip('req/sqlite_fonctions');
_sqlite_init_functions($link);
$charge[$serveur] = true;
}
return $link;
}
/* ordre alphabetique pour les autres */
// renvoie les bons echappements (pas sur les fonctions now())
function _sqlite_calculer_cite($v, $type) {
if (sql_test_date($type) AND preg_match('/^\w+\(/', $v)
OR (sql_test_int($type)
AND (is_numeric($v)
OR (ctype_xdigit(substr($v,2))
AND $v[0]=='0' AND $v[1]=='x'))))
return $v;
//else return ("'" . spip_sqlite_quote($v) . "'");
else return (spip_sqlite_quote($v));
}
// renvoie grosso modo "$expression join($join, $v)"
function _sqlite_calculer_expression($expression, $v, $join = 'AND'){
if (empty($v))
return '';
$exp = "\n$expression ";
if (!is_array($v)) {
return $exp . $v;
} else {
if (strtoupper($join) === 'AND')
return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
else
return $exp . join($join, $v);
}
}
// pour conversion 0+x ? (pas la peine en sqlite)
function _sqlite_calculer_order($orderby) {
return (is_array($orderby)) ? join(", ", $orderby) : $orderby;
}
// renvoie des 'nom AS alias'
function _sqlite_calculer_select_as($args){
$res = '';
foreach($args as $k => $v) {
if (substr($k,-1)=='@') {
// c'est une jointure qui se refere au from precedent
// pas de virgule
$res .= ' ' . $v ;
}
else {
if (!is_numeric($k)) {
$p = strpos($v, " ");
if ($p)
$v = substr($v,0,$p) . " AS '$k'" . substr($v,$p);
else $v .= " AS '$k'";
}
$res .= ', ' . $v ;
}
}
// renvoie les bonnes parentheses pour des where imbriquees
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
function _sqlite_calculer_where($v){
if (!is_array($v))
return $v ;
$op = array_shift($v);
if (!($n=count($v)))
return $op;
else {
$arg = _sqlite_calculer_where(array_shift($v));
if ($n==1) {
return "$op($arg)";
} else {
$arg2 = _sqlite_calculer_where(array_shift($v));
if ($n==2) {
return "($arg $op $arg2)";
} else return "($arg $op ($arg2) : $v[0])";
}
}
}
/*
* Charger les modules sqlite (si possible) (juste la version demandee),
* ou, si aucune version, renvoie les versions sqlite dispo
* sur ce serveur dans un array
*/