} } 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; }
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; }