view createdb.php @ 106:324f3a415237

Add extra HTML + sponsors box to layout.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 21 Oct 2013 22:11:40 +0300
parents c7b1eb993240
children 671330b7f5d1
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 &amp; 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:&gt; <span class=\"mblink\">&#9632;</span></div>", "Site menu header text"),
  "siteMenuFooter" => array(VT_TEXT, "", "Site menu footer text"),
  "siteExtraHTML" => array(VT_TEXT, "<div id=\"sponsors\">Gentle Eye</div>", "Extra global HTML code (f.e. sponsors box)"),
);

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

?>