}
} else {
    echo "No old schema exists => generate code for creation of complete database<br>\n";
    $warning = "<p><font color='red' size='+1'>WARNING! the database will be <b>completely erased / overwritten</b> when you click on the buttons below. Be sure you know what you are doing!</font></p>\n";
    echo $warning;
    $OLD = array();
}
$new_schema = "{$BASEDIR}/schema/{$new_schema_name}";
echo "NEW schema: '{$new_schema}'<br><br>\n";
unset($SCHEMA);
unset($EXTRA);
require_once $new_schema;
if (@$EXTRA) {
    $SCHEMA = array_merge_recursive($SCHEMA, $EXTRA);
}
$check = db_check_syntax($SCHEMA, $SYNTAX);
if ($check) {
    die("bad syntax in NEW: {$check}\n");
}
$NEW = db_mangle_schema($SCHEMA);
$text = "<?php // this file was automatically generated by the schema precompiler from '{$new_schema}'.\n\n// ====> DO NOT EDIT! <===\n\n";
$text .= "\$SCHEMA =\n" . db_data_to_code($NEW);
$text .= ";\n?>\n";
$outname = "{$BASEDIR}/compiled/{$new_schema_name}";
_writefile($outname, $text);
$outname = "{$BASEDIR}/compiled/schema.php";
_writefile($outname, $text);
echo "done.<br>\n";
$SCHEMA = $NEW;
echo "<br>---------------------------------------------------<br><br>\n";
foreach ($CONFIG["CONNECTIONS"] as $database => $ddef) {
function db_enforce_syntax($STRUCTURE, $SYNTAX)
{
    global $debug;
    if (@$debug) {
        $err = db_check_syntax($STRUCTURE, $SYNTAX);
        if ($err) {
            die("BAD SYNTAX: {$err}");
        }
    }
}
function _db_open(&$database, $write, $do_init = false)
{
    global $CONN_CACHE;
    if (!$database) {
        $database = _db_maindatabase();
    }
    // use dynamic programming for connections
    if (isset($CONN_CACHE[$database][$write])) {
        return $CONN_CACHE[$database][$write];
    }
    global $BASEDIR;
    global $SYNTAX_CONFIG;
    global $CONFIG;
    global $BASENAME;
    global $USER;
    global $PASSWD;
    global $ERROR;
    global $debug;
    if (!@$CONFIG["CONNECTIONS"]) {
        // use some reasonable default
        if (!$BASENAME) {
            $BASENAME = "main";
        }
        $CONFIG["CONNECTIONS"] = array("DEFAULT" => array("MASTER" => "localhost", "BASENAME" => $BASENAME));
    }
    $ERROR = db_check_syntax($CONFIG, $SYNTAX_CONFIG);
    if ($ERROR) {
        print_r($CONFIG);
        echo "<br>\n";
        die("_db_open syntax error: {$ERROR}");
        return null;
    }
    $driver = _db_get_driver($database);
    $host = @$CONFIG["CONNECTIONS"][$database]["MASTER"];
    if (!$host) {
        $host = "localhost";
    }
    $basename = @$CONFIG["CONNECTIONS"][$database]["BASENAME"];
    if (!$basename) {
        $basename = @$CONFIG["CONNECTIONS"][$database]["BASE"];
    }
    if (!$basename) {
        $basename = $BASENAME;
    }
    if ($do_init) {
        $basename = "";
    }
    $user = @$CONFIG["CONNECTIONS"][$database]["USER"];
    if (!$user) {
        $user = $USER;
    }
    $passwd = @$CONFIG["CONNECTIONS"][$database]["PASSWD"];
    if (!$passwd) {
        $passwd = $PASSWD;
    }
    if (!$write && @$CONFIG["CONNECTIONS"][$database]["SLAVES"]) {
        // randomly determine a mirror for reading
        $max = count($CONFIG["CONNECTIONS"][$database]["SLAVES"]);
        $idx = crc32($USER) % $max;
        $host = $CONFIG["CONNECTIONS"][$database]["SLAVES"][$idx];
    }
    if ($debug) {
        echo "_db_open driver={$driver} host={$host}, user={$user}, passwd={$passwd}, basename={$basename}<br>\n";
    }
    $call = "{$driver}_do_open";
    $connection = $call($host, $user, $passwd, $basename);
    if (!$connection) {
        return null;
    }
    $CONN_CACHE[$database][$write] = $connection;
    return $connection;
}
Example #4
0
function _db_mangle_update($qstruct)
{
    global $ERROR;
    global $SCHEMA;
    global $SYNTAX_UPDATE;
    if ($error = db_check_syntax($qstruct, $SYNTAX_UPDATE)) {
        echo "update qstruct error: {$error}<br>\n";
        global $debug;
        if ($debug) {
            echo "syntax: ";
            print_r($qstruct);
            echo "<br>\n";
        }
        $ERROR = $error;
        return null;
    }
    $table = $qstruct["TABLE"];
    foreach ($SCHEMA[$table]["FIELDS"] as $field => $fdef) {
        if (@$fdef["VIRTUAL"]) {
            continue;
        }
        if (@$fdef["AUTO_FIELD"] || db_access_field($table, $field, "w")) {
            $qstruct["UPDATE_FIELDS"][] = $field;
        }
        $qstruct["ALL_FIELDS"][] = $field;
    }
    return $qstruct;
}
function db_mangle_schema($MYSCHEMA)
{
    global $SYNTAX_SCHEMA;
    global $CONFIG;
    global $SCHEMA;
    $error = db_check_syntax($MYSCHEMA, $SYNTAX_SCHEMA);
    if ($error) {
        die("bad syntax in schema: {$error}<br>\n");
    }
    // adding components...
    if (@$CONFIG["USE_BUSINESS_ENGINE"]) {
        global $ENGINE_SCHEMA, $ENGINE_EXTRA;
        $tmp = array_replace_recursive($ENGINE_SCHEMA, $ENGINE_EXTRA);
        $MYSCHEMA = array_replace_recursive($tmp, $MYSCHEMA);
    }
    if (@$CONFIG["USE_AUTH"]) {
        global $USER_SCHEMA, $USER_EXTRA;
        $tmp = array_replace_recursive($USER_SCHEMA, $USER_EXTRA);
        $MYSCHEMA = array_replace_recursive($tmp, $MYSCHEMA);
        global $PROFILE_SCHEMA;
        $MYSCHEMA = array_replace_recursive($PROFILE_SCHEMA, $MYSCHEMA);
    }
    // mangling
    $oldschema = $SCHEMA;
    $SCHEMA = $MYSCHEMA;
    $MYSCHEMA = _db_pass_temporal($MYSCHEMA);
    $MYSCHEMA = _db_update_profiles($MYSCHEMA);
    $MYSCHEMA = _db_pass_main($MYSCHEMA);
    $MYSCHEMA = _db_pass_typeinfo($MYSCHEMA);
    $SCHEMA = $oldschema;
    return $MYSCHEMA;
}