Mercurial > hg > fapweb
view createdb.php @ 104:c7b1eb993240
Cosmetics.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 21 Oct 2013 15:17:04 +0300 |
parents | c6b9041078ec |
children | 324f3a415237 |
line wrap: on
line source
#!/usr/bin/php <? require "mconfig.inc.php"; require "msite.inc.php"; // Check if we are running from commandline or not if (php_sapi_name() != "cli" || !empty($_SERVER["REMOTE_ADDR"])) { header("Status: 404 Not Found"); die(); } // The defaults we put in $siteDefaults = array( "maxAttendeesHard" => array(VT_INT, 60, "Maximum attendees (HARD limit, 0 = no limit)"), "maxAttendeesSoft" => array(VT_INT, 50, "Maximum attendees (soft limit, 0 = no limit)"), "userTimeout" => array(VT_INT, 120, "User pages (voting, entry submission) timeout in minutes"), "admTimeout" => array(VT_INT, 15, "Administration interface timeout in minutes"), "showAdmin" => array(VT_BOOL, false, "Always show administration interface link on the menu"), "showAttendees" => array(VT_BOOL, false, "Show attendees list"), "allowRegister" => array(VT_BOOL, false, "Enable event registration"), "allowVoting" => array(VT_BOOL, false, "Enable voting (individual compos must be enabled as well)"), "showResults" => array(VT_BOOL, false, "Enable results page"), "showResultsASCII" => array(VT_BOOL, true, "Show results as ASCII instead of HTML table"), "showResAuthors" => array(VT_BOOL, false, "Show entry authors on results page"), "requireEMail" => array(VT_BOOL, false, "Require e-mail address in registrations"), "registerInfoText" => array(VT_TEXT, "<p> Only your <b>handle</b> and the answer to the botcheck are strictly required. If you plan on joining the IRC channel (<a href=\"irc://#fap2013@ircnet\">#fap2013 @ IRCNet</a>) or staying up to date by other means, <b>e-mail</b> is not required either. </p>", "Registration page info text"), "registerPostText" => array(VT_TEXT, "<p>Now go make a demo about it!</p>", "Successful post-registration note text"), "registerPostNoEmail" => array(VT_TEXT, " <h2>By the way ...</h2> <p>As you did not specify an e-mail contact address, you'll have to get updates and information about the location (if you don't already know it) by some other means (IRC, for example.)</p> ", "No e-mail address registration note"), "eventDescription" => array(VT_TEXT, " <h1>Event program & schedule</h1> <ul> <li><b>Aegis</b> of DSS and FAG will be performing a DJ gig.</li> <li>.. and possible additional live acts. More info to come.</li> </ul> <h2>Friday 30.11.</h2> <ul> <li><b>18:00</b> - <i>Doors open</i>.</li> <li><b>22:00</b> - DJ set by Aegis.</li> </ul> <h2>Saturday 1.12.</h2> <ul> <li><b>14:00</b> - Deadline for remote entries.</li> <li><b>18:00</b> - Deadline for the entries delivered on location.</li> <li><b>20:00</b> - Competitions start.</li> </ul> Competition schedule and voting deadline will depend on number of entries. <h2>Sunday 2.12.</h2> <ul> <li><b>12:00</b> - Party over?</li> </ul> ", "Event general description / timetables etc."), "compoDescription" => array(VT_TEXT, " <h1>General</h1> <p class=\"notice\"> YOU <b>MUST</b> HAVE AT LEAST ONE ENTRY TO COMPETITIONS IF YOU COME TO THE PARTY. </p> <p class=\"note\"> If there are enough entries, then AGA/OCS/ECS demos will be run in separate compos. <br /> Remote entries are welcome! </p> <p> The compo machine will be an <b>A1200 with an 060/50 and lots of RAM</b>. An <b>A500 1.3 512k/512k</b> will also be available if your prod is not AGA compatible. </p> <h1>Compos</h1> ", "Compo general description"), "siteInfoText" => array(VT_TEXT, " <a href=\"news\"> <img src=\"img/fapsm.png\" alt=\"Finnish Amiga Party 2013\" class=\"logo\" /></a> <div id=\"date\"> 5.-8.12.2013<br /> Helsinki, Finland<br /> @ old location<br /> <span class=\"notice\">Entry 15 EUR + prod</span> </div>", "Site header text"), "newsDescription" => array(VT_TEXT, " <div style=\"text-align: center;\"> <img src=\"img/fap.png\" alt=\"FAP\" /> <p> Pure Amiga demoscene party, all traditional Amiga compos and purely Amiga-oriented program. <br /> <span class=\"notice\"> YOU <b>MUST</b> HAVE AT LEAST ONE ENTRY TO COMPETITIONS IF YOU COME TO THE PARTY. </span> </p> </div>", "News page header text"), "entrySubmitInfo" => array(VT_TEXT, "Rules for entry submission ... ", "Entry submission information blurb"), "siteMenuHeader" => array(VT_TEXT, "<div>13.FAP:> <span class=\"mblink\">■</span></div>", "Site menu header text"), "siteMenuFooter" => array(VT_TEXT, "", "Site menu footer text"), ); $sqlTables = array( "settings" => "key VARCHAR(32) PRIMARY KEY, vtype INT, vstr VARCHAR(128), vtext TEXT, vint INT, desc VARCHAR(128)", "news" => "id INTEGER PRIMARY KEY AUTOINCREMENT, utime INT, title VARCHAR(128), text VARCHAR(4096), author VARCHAR(64), persist INT DEFAULT 0", "compos" => "id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(128), description VARCHAR(4096), visible INT DEFAULT 0, voting INT DEFAULT 0, showAuthors INT DEFAULT 0", "entries" => "id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(64), author VARCHAR(64), compo_id INT DEFAULT NULL, filename VARCHAR(256) DEFAULT NULL", "attendees" => "id INTEGER PRIMARY KEY AUTOINCREMENT, regtime INT, name VARCHAR(64), groups VARCHAR(64), oneliner VARCHAR(64), email VARCHAR(80), key_id INT DEFAULT NULL", "votekeys" => "id INTEGER PRIMARY KEY AUTOINCREMENT, key VARCHAR(64), active INT DEFAULT 0", "votes" => "id INTEGER PRIMARY KEY AUTOINCREMENT, entry_id INT DEFAULT NULL, voter_id INT DEFAULT NULL, value INT DEFAULT 0", ); $siteTestData = array( "news" => array( "utime,title,text,author", time().",%s,%s,%s", array("Today's news", "We. Are. Back.", "orgaz"), array("Good news, everybody!", "...", "The Professor"), ), "votekeys" => array( "key", "%s", array("k5nYXNjQ"), array("msD3mDqH"), array("7jjnqt5z"), array("c7jcfk1G"), ), "attendees" => array( "regtime,name,groups,oneliner,email", "%d,%s,%s,%s,%s", array(time()-0, "man with no alias", "supergroup", "foo-bar", "c@supergroup.com"), array(time()-15, "man with alias", "supergroup", "hi!", "c@supergroup.com"), array(time()-30, "alias with a man", "supergroup", "mega super kewl rulets", "x@microsoft.com"), ), "compos" => array( "name,description,visible,voting", "%s,%s,1,1", array("Graphics", "Anything in standard resolutions."), array("Protracker music", "Standard 4-channel Protracker MOD music."), ), "entries" => array( "name,author,compo_id,filename", "%s,%s,%d,%s", array("my dong", "visualice/hjb", 1, "juice.lbm"), array("kondom", "ccr/TNSP", 1, "kondom.lbm"), array("penis song", "reed/flt", 2, "penis.mod"), array("jenkka", "aegis", 2, "jenkka.mod"), ), ); // // Helper functions // function stCArg($index) { global $argc, $argv; if ($index < $argc) return $argv[$index]; else return FALSE; } function stCArgLC($index) { global $argc, $argv; if ($index < $argc) return strtolower($argv[$index]); else return FALSE; } function stCSQLError($sql) { global $db; die("Error executing SQL query: ".implode("; ", $db->errorInfo())." in statement \"".$sql."\"\n"); exit; } function stConnectDB($dbspec) { global $db; try { $db = new PDO($dbspec); } catch (PDOException $e) { error_log("Could not connect to SQL database '".$dbspec."': ".$e->getMessage()."."); return FALSE; } return TRUE; } function stCreateOneTable($name, $schema) { return (stExecSQL("CREATE TABLE ".$name." (".$schema.")") !== FALSE) ? TRUE : FALSE; } function stCreateTables() { global $sqlTables; echo "Creating tables...\n"; foreach ($sqlTables as $name => $schema) { echo " - '".$name."'\n"; if (!stCreateOneTable($name, $schema)) return FALSE; } return TRUE; } function stAddSettings() { global $siteDefaults; echo "Adding settings to settings table.\n"; foreach ($siteDefaults as $key => $data) { switch ($data[0]) { case VT_TEXT: $type = "%s"; $var = "vtext"; break; case VT_STR: $type = "%s"; $var = "vstr"; break; case VT_BOOL: $type = "%b"; $var = "vint"; break; case VT_INT: $type = "%d"; $var = "vint"; break; default: die("Invalid type in default settings '".$key."', type=".$data[0]."\n"); } $sql = stPrepareSQL( "INSERT INTO settings (key,vtype,".$var.",desc) VALUES (%s,%d,".$type.",%s)", $key, $data[0], $data[1], $data[2]); stExecSQL($sql); } } function stAddTestData() { global $siteTestData; echo "Adding test data.\n"; foreach ($siteTestData as $table => $data) { echo " - ".$table."...\n"; if (count($data) >= 3) { for ($n = 2; $n < count($data); $n++) { $arr = array_merge( array("INSERT INTO ".$table." (".$data[0].") VALUES (".$data[1].")"), $data[$n]); $sql = call_user_func_array('stPrepareSQL', $arr); stExecSQL($sql); } } else { echo " Invalid table / data definition.\n"; } } } // // Main program starts // if ($argc < 2) { echo "Usage: ".$argv[0]." <mode> [args]\n". "Where mode is one of following:\n". "\n". " new [dbspec] Create a new database with given PDO spec\n". " or default to the one in mconfig.inc.php\n". "\n". " test [dbspec] Like new, but add initial test data.\n". "\n"; exit; } if (!isset($siteSettings["voteKeyMode"]) || $siteSettings["voteKeyMode"] < 0) { echo "FATAL ERROR! VoteKeyMode not set in site settings! This setting ". "MUST be defined and should not be changed after database creation.\n"; exit; } // Check if database spec provided, if not use default if (($spec = stCArg(2)) === FALSE) $spec = $siteSettings["sqlDB"]; // Try to connect to database if (!stConnectDB($spec)) die("Could not connect to SQL database '".$spec."'.\n"); echo "Using database spec '".$spec."'.\n"; // Act according to specified command $addData = FALSE; switch (stCArgLC(1)) { case "test": $addData = TRUE; case "new": if (stCreateTables()) stAddSettings(); if ($addData) stAddTestData(); if (substr($spec, 0, 7) == "sqlite:") { $filename = substr($spec, 7); echo "NOTICE! It seems you have SQLite database in use, changing permission ". "of the target file '".$filename."' to 0600, for security. You may have to ". "loosen up that for the things to actually work, but be careful. Having your ". "database world-readable in the web is NOT good.\n"; if (chmod($filename, 0600) === FALSE) { echo "ERROR! Could not set permissions!\n"; } } break; default: echo "ERROR! Invalid operation mode '".stCArg(1)."'.\n"; break; } // // Clean up permissions // foreach (array("createdb.php") as $filename) { if (chmod($filename, 0700) === FALSE) { echo "ERROR! Could not set permissions for '$filename'!\n"; } } ?>