Beispiel #1
0
/**
 * Creer une table,
 * ou ajouter les champs manquants si elle existe deja
 *
 * http://doc.spip.org/@creer_ou_upgrader_table
 *
 * @param string $table
 * @param array $desc
 * @param bool|string $autoinc
 *   'auto' pour detecter automatiquement si le champ doit etre autoinc ou non
 *   en fonction de la table
 * @param bool $upgrade
 * @param string $serveur
 * @return void
 */
function creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade = false, $serveur = '')
{
    $sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false;
    if (!$sql_desc) {
        if ($autoinc === 'auto') {
            $autoinc = base_determine_autoinc($table, $desc);
        }
        sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
    } else {
        // ajouter les champs manquants
        // on ne supprime jamais les champs, car c'est dangereux
        // c'est toujours a faire manuellement
        $last = '';
        foreach ($desc['field'] as $field => $type) {
            if (!isset($sql_desc['field'][$field])) {
                sql_alter("TABLE {$table} ADD {$field} {$type}" . ($last ? " AFTER {$last}" : ""), $serveur);
            }
            $last = $field;
        }
        foreach ($desc['key'] as $key => $type) {
            // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
            // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
            if (!isset($sql_desc['key'][$key]) and !isset($sql_desc['key']["{$key} {$type}"])) {
                sql_alter("TABLE {$table} ADD {$key} ({$type})", $serveur);
            }
            $last = $field;
        }
    }
}
Beispiel #2
0
/**
 * Créer une table,
 * ou ajouter les champs manquants si elle existe déjà
 *
 * @param string $table
 * @param array $desc
 * @param bool|string $autoinc
 *   'auto' pour detecter automatiquement si le champ doit etre autoinc ou non
 *   en fonction de la table
 * @param bool $upgrade
 * @param string $serveur
 * @return void
 */
function creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade = false, $serveur = '')
{
    #spip_log("creer_ou_upgrader_table table=$table autoinc=$autoinc upgrade=$upgrade","dbinstall"._LOG_INFO_IMPORTANTE);
    $sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false;
    #if (!$sql_desc) $sql_desc = false;
    #spip_log("table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
    if (!$sql_desc) {
        if ($autoinc === 'auto') {
            $autoinc = base_determine_autoinc($table, $desc);
        }
        #spip_log("sql_create $table autoinc=$autoinc","dbinstall"._LOG_INFO_IMPORTANTE);
        sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
        // verifier la bonne installation de la table (php-fpm es-tu la ?)
        $sql_desc = sql_showtable($table, true, $serveur);
        #if (!$sql_desc) $sql_desc = false;
        #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
        if (!$sql_desc) {
            // on retente avec un sleep ?
            sleep(1);
            sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
            $sql_desc = sql_showtable($table, true, $serveur);
            #if (!$sql_desc) $sql_desc = false;
            #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
            if (!$sql_desc) {
                spip_log("Echec creation table {$table}", "maj" . _LOG_CRITIQUE);
            }
        }
    } else {
        #spip_log("sql_alter $table ... (on s'en fiche)","dbinstall"._LOG_INFO_IMPORTANTE);
        // ajouter les champs manquants
        // on ne supprime jamais les champs, car c'est dangereux
        // c'est toujours a faire manuellement
        $last = '';
        foreach ($desc['field'] as $field => $type) {
            if (!isset($sql_desc['field'][$field])) {
                sql_alter("TABLE {$table} ADD {$field} {$type}" . ($last ? " AFTER {$last}" : ""), $serveur);
            }
            $last = $field;
        }
        foreach ($desc['key'] as $key => $type) {
            // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
            // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
            if (!isset($sql_desc['key'][$key]) and !isset($sql_desc['key']["{$key} {$type}"])) {
                sql_alter("TABLE {$table} ADD {$key} ({$type})", $serveur);
            }
            $last = $field;
        }
    }
}