function maj_vieille_base_10000_create($server='') { global $tables_principales, $tables_auxiliaires, $tables_images, $tables_sequences, $tables_documents, $tables_mime; // Note: les mises à jour reexecutent ce code pour s'assurer // de la conformite de la base // pas de panique sur "already exists" et "duplicate entry" donc. $fcreate = sql_serveur('create', $server); $freplace = sql_serveur('replace', $server); $fupdate = sql_serveur('update', $server); foreach($tables_principales as $k => $v) $fcreate($k, $v['field'], $v['key'], true); foreach($tables_auxiliaires as $k => $v) $fcreate($k, $v['field'], $v['key'], false); // Init ou Re-init ==> replace pas insert $desc = $tables_principales['spip_types_documents']; foreach($tables_images as $k => $v) { $freplace('spip_types_documents', array('extension' => $k, 'inclus' => 'image', 'titre' => $v), $desc); } foreach($tables_sequences as $k => $v) $freplace('spip_types_documents', array('extension' => $k, 'titre' => $v, 'inclus'=> 'embed'), $desc); foreach($tables_documents as $k => $v) $freplace('spip_types_documents', array('extension' => $k, 'titre' => $v, 'inclus' => 'non'), $desc); foreach ($tables_mime as $extension => $type_mime) $freplace('spip_types_documents', array("mime_type" => $type_mime, "extension" => $extension), $desc); }
function boucle_DOCUMENTS($id_boucle, &$boucles) { $boucle =& $boucles[$id_boucle]; $id_table = $boucle->id_table; // on ne veut pas des fichiers de taille nulle, // sauf s'ils sont distants (taille inconnue) array_unshift($boucle->where, array("'({$id_table}.taille > 0 OR {$id_table}.distant=\\'oui\\')'")); /** * N'afficher que les modes de documents que l'on accepte * Utiliser le "pipeline medias_documents_visibles" pour en ajouter */ if (!isset($boucle->modificateur['criteres']['mode']) and !isset($boucle->modificateur['tout'])) { $modes = pipeline('medias_documents_visibles', array('image', 'document')); $f = sql_serveur('quote', $boucle->sql_serveur, true); $modes = addslashes(join(',', array_map($f, array_unique($modes)))); array_unshift($boucle->where, array("'IN'", "'{$id_table}.mode'", "'({$modes})'")); } return calculer_boucle($id_boucle, $boucles); }
/** * Retourne une expression IN pour le gestionnaire de base de données * * Retourne un code à insérer dans une requête SQL pour récupérer * les éléments d'une colonne qui appartiennent à une liste donnée * * @example * `sql_in('id_rubrique', array(3,4,5))` * retourne approximativement «id_rubrique IN (3,4,5)» selon ce qu'attend * le gestionnaire de base de donnée du connecteur en cours. * * @api * @param string $val * Colonne SQL sur laquelle appliquer le test * @param string|array $valeurs * Liste des valeurs possibles (séparés par des virgules si string) * @param string $not * - '' sélectionne les éléments correspondant aux valeurs * - 'NOT' inverse en sélectionnant les éléments ne correspondant pas aux valeurs * @param string $serveur * Nom du connecteur * @param bool|string $option * Peut avoir 2 valeurs : * * - continue -> ne pas echouer en cas de serveur sql indisponible * - true ou false -> retourne l'expression * @return string * Expression de requête SQL **/ function sql_in($val, $valeurs, $not = '', $serveur = '', $option = true) { if (is_array($valeurs)) { $f = sql_serveur('quote', $serveur, true); if (!is_string($f) or !$f) { return false; } $valeurs = join(',', array_map($f, array_unique($valeurs))); } elseif (isset($valeurs[0]) and $valeurs[0] === ',') { $valeurs = substr($valeurs, 1); } if (!strlen(trim($valeurs))) { return $not ? "0=0" : '0=1'; } $f = sql_serveur('in', $serveur, $option === 'continue' or $option === false); if (!is_string($f) or !$f) { return false; } return $f($val, $valeurs, $not, $serveur, $option !== false); }
function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db){ global $spip_version_base; // Prefix des tables : // contrairement a ce qui est dit dans le message (trop strict mais c'est // pour notre bien), on va tolerer les chiffres en plus des minuscules // S'il n'est pas defini par mes_options/inc/mutualiser, on va le creer // a partir de ce qui est envoye a l'installation if (!defined('_INSTALL_TABLE_PREFIX')) { $table_prefix = ($GLOBALS['table_prefix'] != 'spip') ? $GLOBALS['table_prefix'] : trim(preg_replace(',[^a-z0-9],','',strtolower(_request('tprefix')))); // S'il est vide on remet spip if (!$table_prefix) $table_prefix = 'spip'; } else { $table_prefix = _INSTALL_TABLE_PREFIX; } $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, 0, $login_db, $pass_db, '', $server_db); $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; $fquery = sql_serveur('query', $server_db); if ($choix_db == "new_spip") { $re = ',^[a-z_][a-z_0-9-]*$,i'; if (preg_match($re, $sel_db)) sql_create_base($sel_db, $server_db); else { $re = "Le nom de la base doit correspondre a $re"; spip_log($re); return "<!--\n$re\n-->"; } } // on rejoue la connexion apres avoir teste si il faut lui indiquer // un sql_mode install_mode_appel($server_db, false); $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, $server_db); $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; // Completer le tableau decrivant la connexion $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix; $GLOBALS['connexions'][$server_db]['db'] = $sel_db; $old = sql_showbase($table_prefix . "_meta", $server_db); if ($old) $old = sql_fetch($old, $server_db); if (!$old) { // Si possible, demander au serveur d'envoyer les textes // dans le codage std de SPIP, $charset = sql_get_charset(_DEFAULT_CHARSET, $server_db); if ($charset) { sql_set_charset($charset['charset'], $server_db); $GLOBALS['meta']['charset_sql_base'] = $charset['charset']; $GLOBALS['meta']['charset_collation_sql_base'] = $charset['collation']; $GLOBALS['meta']['charset_sql_connexion'] = $charset['charset']; $charsetbase = $charset['charset']; } else { spip_log(_DEFAULT_CHARSET . " inconnu du serveur SQL"); $charsetbase = 'standard'; } spip_log("Creation des tables. Codage $charsetbase"); creer_base($server_db); // AT LAST creer_base_types_doc($server_db); // memoriser avec quel charset on l'a creee if ($charset) { $t = array('nom' => 'charset_sql_base', 'valeur' => $charset['charset'], 'impt' => 'non'); @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'charset_collation_sql_base'; $t['valeur'] = $charset['collation']; @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'charset_sql_connexion'; $t['valeur'] = $charset['charset']; @sql_insertq('spip_meta', $t, '', $server_db); } $t = array('nom' => 'version_installee', 'valeur' => $spip_version_base, 'impt' => 'non'); @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'nouvelle_install'; $t['valeur'] = 1; @sql_insertq('spip_meta', $t, '', $server_db); // positionner la langue par defaut du site si un cookie de lang a ete mis if (isset($_COOKIE['spip_lang_ecrire'])){ @sql_insertq('spip_meta', array('nom'=>'langue_site','valeur'=>$_COOKIE['spip_lang_ecrire']), '', $server_db); } } else { // pour recreer les tables disparues au besoin spip_log("Table des Meta deja la. Verification des autres."); creer_base($server_db); $fupdateq = sql_serveur('updateq', $server_db); $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='version_installee'", $server_db); if ($r) $r = sql_fetch($r, $server_db); $version_installee = !$r ? 0 : (double) $r['valeur']; if (!$version_installee OR ($spip_version_base < $version_installee)) { $fupdateq('spip_meta', array('valeur'=>$spip_version_base, 'impt'=>'non'), "nom='version_installee'", $server_db); spip_log("nouvelle version installee: $spip_version_base"); } // eliminer la derniere operation d'admin mal terminee // notamment la mise a jour @$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'", $server_db); } $ligne_rappel = install_mode_appel($server_db); $result_ok = @$fquery("SELECT COUNT(*) FROM spip_meta", $server_db); if (!$result_ok) return "<!--\nvielle = $old rappel= $ligne_rappel\n-->"; if ($chmod_db) { install_fichier_connexion(_FILE_CHMOD_TMP, "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', ". sprintf('0%3o',$chmod_db).");\n"); } if (preg_match(',(.*):(.*),', $adresse_db, $r)) list(,$adresse_db, $port) = $r; else $port = ''; // si ce fichier existe a cette etape c'est qu'il provient // d'une installation qui ne l'a pas cree correctement. // Le supprimer pour que _FILE_CONNECT_TMP prime. if (_FILE_CONNECT AND file_exists(_FILE_CONNECT)) spip_unlink(_FILE_CONNECT); install_fichier_connexion(_FILE_CONNECT_TMP, $ligne_rappel . install_connexion($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db, $table_prefix)); return ''; }
function creer_base_types_doc($serveur='') { global $tables_images, $tables_sequences, $tables_documents, $tables_mime; // Init ou Re-init ==> replace pas insert $freplace = sql_serveur('replace', $serveur); foreach ($tables_mime as $extension => $type_mime) { if (isset($tables_images[$extension])) { $titre = $tables_images[$extension]; $inclus='image'; } else if (isset($tables_sequences[$extension])) { $titre = $tables_sequences[$extension]; $inclus='embed'; } else { $inclus='non'; if (isset($tables_documents[$extension])) $titre = $tables_documents[$extension]; else $titre = ''; } $freplace('spip_types_documents', array('mime_type' => $type_mime, 'titre' => $titre, 'inclus' => $inclus, 'extension' => $extension, 'upload' => 'oui' ), '', $serveur); } }
function sql_in($val, $valeurs, $not='', $serveur='', $option=true) { if (is_array($valeurs)) { $f = sql_serveur('quote', $serveur, true); if (!is_string($f) OR !$f) return false; $valeurs = join(',', array_map($f, array_unique($valeurs))); } elseif ($valeurs[0]===',') $valeurs = substr($valeurs,1); if (!strlen(trim($valeurs))) return ($not ? "0=0" : '0=1'); $f = sql_serveur('in', $serveur, $option==='continue' OR $option===false); if (!is_string($f) OR !$f) return false; return $f($val, $valeurs, $not, $serveur, $option!==false); }
function spip_create_vieille_table($table,$fields,$keys,$autoinc){ static $fcreate = null; $serveur = $GLOBALS['serveur_vieille_base']; if (!$fcreate) $fcreate = sql_serveur('create', $serveur); $fcreate($table,$fields,$keys,$autoinc,false,$serveur); }