astrXbian/www/jukebox/backends/sql/mysql/specifics.php

961 lines
42 KiB
PHP

<?php
define('SQL_RANDOM_SORT', 'RAND()');
define('SQL_TAG_CONCAT', "GROUP_CONCAT(t.Name SEPARATOR ', ') ");
function connect_to_database($sp = true) {
global $mysqlc, $prefs;
if ($mysqlc !== null) {
logger::error("MYSQL", "AWOOOGA! ATTEMPTING MULTIPLE DATABASE CONNECTIONS!");
return;
}
try {
if (is_numeric($prefs['mysql_port'])) {
logger::debug("SQL_CONNECT", "Connecting using hostname and port");
$dsn = "mysql:host=".$prefs['mysql_host'].";port=".$prefs['mysql_port'].";dbname=".$prefs['mysql_database'];
} else {
logger::debug("SQL_CONNECT", "Connecting using unix socket");
$dsn = "mysql:unix_socket=".$prefs['mysql_port'].";dbname=".$prefs['mysql_database'];
}
$mysqlc = new PDO($dsn, $prefs['mysql_user'], $prefs['mysql_password']);
logger::debug("SQL_CONNECT", "Connected to MySQL");
generic_sql_query("SET NAMES utf8", true);
generic_sql_query('SET SESSION sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"', true);
readCollectionPlayer($sp);
} catch (Exception $e) {
logger::fail("SQL_CONNECT", "Database connect failure - ".$e);
sql_init_fail($e->getMessage());
}
}
function close_database() {
global $mysqlc;
$mysqlc = null;
}
function check_sql_tables() {
global $mysqlc, $prefs;
if (generic_sql_query("CREATE TABLE IF NOT EXISTS Tracktable(".
"TTindex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"PRIMARY KEY(TTindex), ".
"Title VARCHAR(255), ".
"Albumindex INT UNSIGNED, ".
"TrackNo SMALLINT UNSIGNED, ".
"Duration INT UNSIGNED, ".
"Artistindex INT UNSIGNED, ".
"Disc TINYINT(3) UNSIGNED, ".
"Uri VARCHAR(2000), ".
"LastModified CHAR(32), ".
"Hidden TINYINT(1) UNSIGNED DEFAULT 0, ".
"DateAdded TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ".
"isSearchResult TINYINT(1) UNSIGNED DEFAULT 0, ".
"justAdded TINYINT(1) UNSIGNED DEFAULT 1, ".
"Sourceindex INT UNSIGNED DEFAULT NULL, ".
"LinkChecked TINYINT(1) UNSIGNED DEFAULT 0, ".
"isAudiobook TINYINT(1) UNSIGNED DEFAULT 0, ".
"INDEX(Albumindex), ".
"INDEX(Title), ".
"INDEX(TrackNo)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " Tracktable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking Tracktable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS Albumtable(".
"Albumindex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"PRIMARY KEY(Albumindex), ".
"Albumname VARCHAR(255), ".
"AlbumArtistindex INT UNSIGNED, ".
"AlbumUri VARCHAR(255), ".
"Year YEAR, ".
"Searched TINYINT(1) UNSIGNED, ".
"ImgKey CHAR(32), ".
"mbid CHAR(40), ".
"ImgVersion INT UNSIGNED DEFAULT ".ROMPR_IMAGE_VERSION.", ".
"Domain CHAR(32), ".
"Image VARCHAR(255), ".
"justUpdated TINYINT(1) UNSIGNED DEFAULT 1, ".
"INDEX(Albumname), ".
"INDEX(AlbumArtistindex), ".
"INDEX(Domain), ".
"INDEX(ImgKey)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " Albumtable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking Albumtable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS Artisttable(".
"Artistindex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"PRIMARY KEY(Artistindex), ".
"Artistname VARCHAR(255), ".
"INDEX(Artistname)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " Artisttable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking Artisttable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS Ratingtable(".
"TTindex INT UNSIGNED, ".
"PRIMARY KEY(TTindex), ".
"Rating TINYINT(1) UNSIGNED) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " Ratingtable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking Ratingtable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS Progresstable(".
"TTindex INT UNSIGNED, ".
"PRIMARY KEY(TTindex), ".
"Progress INT UNSIGNED) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " Progresstable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking Progresstable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS Tagtable(".
"Tagindex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"PRIMARY KEY(Tagindex), ".
"Name VARCHAR(255)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " Tagtable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking Tagtable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS TagListtable(".
"Tagindex INT UNSIGNED NOT NULL REFERENCES Tagtable(Tagindex), ".
"TTindex INT UNSIGNED NOT NULL REFERENCES Tracktable(TTindex), ".
"PRIMARY KEY (Tagindex, TTindex)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " TagListtable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking TagListtable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS Playcounttable(".
"TTindex INT UNSIGNED NOT NULL REFERENCES Tracktable(TTindex), ".
"Playcount INT UNSIGNED NOT NULL, ".
"SyncCount INT UNSIGNED DEFAULT 0, ".
"LastPlayed TIMESTAMP, ".
"PRIMARY KEY (TTindex)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " Playcounttable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking Playcounttable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS Podcasttable(".
"PODindex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"FeedURL TEXT, ".
"LastUpdate INT UNSIGNED, ".
"Image VARCHAR(255), ".
"Title VARCHAR(255), ".
"Artist VARCHAR(255), ".
"RefreshOption TINYINT(2) UNSIGNED DEFAULT 0, ".
"SortMode TINYINT(2) UNSIGNED DEFAULT 0, ".
"HideDescriptions TINYINT(1) UNSIGNED DEFAULT 0, ".
"DisplayMode TINYINT(2) UNSIGNED DEFAULT 0, ".
"DaysToKeep INT UNSIGNED DEFAULT 0, ".
"NumToKeep INT UNSIGNED DEFAULT 0, ".
"KeepDownloaded TINYINT(1) UNSIGNED DEFAULT 0, ".
"AutoDownload TINYINT(1) UNSIGNED DEFAULT 0, ".
"DaysLive INT, ".
"Version TINYINT(2), ".
"Subscribed TINYINT(1) NOT NULL DEFAULT 1, ".
"Description TEXT, ".
"LastPubDate INT UNSIGNED DEFAULT NULL, ".
"Category VARCHAR(255) NOT NULL, ".
"PRIMARY KEY (PODindex)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " Podcasttable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking Podcasttable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS PodcastTracktable(".
"PODTrackindex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"JustUpdated TINYINT(1), ".
"PODindex INT UNSIGNED, ".
"Title VARCHAR(255), ".
"Artist VARCHAR(255), ".
"Duration INT UNSIGNED, ".
"PubDate INT, ".
"FileSize INT UNSIGNED, ".
"Description TEXT, ".
"Link TEXT, ".
"Guid TEXT, ".
"Localfilename VARCHAR(255), ".
"Downloaded TINYINT(1) UNSIGNED DEFAULT 0, ".
"Listened TINYINT(1) UNSIGNED DEFAULT 0, ".
"New TINYINT(1) UNSIGNED DEFAULT 1, ".
"Deleted TINYINT(1) UNSIGNED DEFAULT 0, ".
"Progress INT UNSIGNED DEFAULT 0, ".
"INDEX (PODindex), ".
"PRIMARY KEY (PODTrackindex), ".
"INDEX (Title)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " PodcastTracktable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking PodcastTracktable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS RadioStationtable(".
"Stationindex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"Number SMALLINT UNSIGNED DEFAULT 65535, ".
"IsFave TINYINT(1), ".
"StationName VARCHAR(255), ".
"PlaylistUrl TEXT, ".
"Image VARCHAR(255), ".
"PRIMARY KEY (Stationindex)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " RadioStationtable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking RadioStationtable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS RadioTracktable(".
"Trackindex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"Stationindex INT UNSIGNED REFERENCES RadioStationtable(Stationindex), ".
"TrackUri TEXT, ".
"PrettyStream TEXT, ".
"PRIMARY KEY (Trackindex)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " RadioTracktable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking RadioTracktable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS WishlistSourcetable(".
"Sourceindex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"SourceName VARCHAR(255), ".
"SourceImage VARCHAR(255), ".
"SourceUri TEXT, ".
"PRIMARY KEY (Sourceindex)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " WishlistSourcetable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking WishlistSourcetable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS AlbumsToListenTotable(".
"Listenindex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"JsonData TEXT, ".
"PRIMARY KEY (Listenindex)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " AlbumsToListenTotabletable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking AlbumsToListenTotable : ".$err);
}
if (generic_sql_query("CREATE TABLE IF NOT EXISTS BackgroundImageTable(".
"BgImageIndex INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE, ".
"Skin VARCHAR(255), ".
"BrowserID VARCHAR(20) DEFAULT NULL, ".
"Filename VARCHAR(255), ".
"Orientation TINYINT(2), ".
"PRIMARY KEY (BgImageIndex), ".
"INDEX (Skin), ".
"INDEX (BrowserID)) ENGINE=InnoDB", true))
{
logger::log("MYSQL_CONNECT", " BackgounrdImageTable OK");
} else {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking BackgroundImageTable : ".$err);
}
if (!generic_sql_query("CREATE TABLE IF NOT EXISTS Statstable(Item CHAR(11), PRIMARY KEY(Item), Value INT UNSIGNED) ENGINE=InnoDB", true)) {
$err = $mysqlc->errorInfo()[2];
return array(false, "Error While Checking Statstable : ".$err);
}
// Check schema version and update tables as necessary
$sv = simple_query('Value', 'Statstable', 'Item', 'SchemaVer', 0);
if ($sv == 0) {
logger::log("SQL_CONNECT", "No Schema Version Found - initialising table");
generic_sql_query("INSERT INTO Statstable (Item, Value) VALUES ('ListVersion', '0')", true);
generic_sql_query("INSERT INTO Statstable (Item, Value) VALUES ('ArtistCount', '0')", true);
generic_sql_query("INSERT INTO Statstable (Item, Value) VALUES ('AlbumCount', '0')", true);
generic_sql_query("INSERT INTO Statstable (Item, Value) VALUES ('TrackCount', '0')", true);
generic_sql_query("INSERT INTO Statstable (Item, Value) VALUES ('TotalTime', '0')", true);
generic_sql_query("INSERT INTO Statstable (Item, Value) VALUES ('CollType', '999')", true);
generic_sql_query("INSERT INTO Statstable (Item, Value) VALUES ('SchemaVer', '".ROMPR_SCHEMA_VERSION."')", true);
$sv = ROMPR_SCHEMA_VERSION;
logger::log("MYSQL_CONNECT", "Statstable populated");
create_update_triggers();
create_conditional_triggers();
create_playcount_triggers();
}
if ($sv > ROMPR_SCHEMA_VERSION) {
logger::log("MYSQL_CONNECT", "Schema Mismatch! We are version ".ROMPR_SCHEMA_VERSION." but database is version ".$sv);
return array(false, "Your database has version number ".$sv." but this version of rompr only handles version ".ROMPR_SCHEMA_VERSION);
}
while ($sv < ROMPR_SCHEMA_VERSION) {
switch ($sv) {
case 0:
logger::error("SQL", "BIG ERROR! No Schema Version found!!");
return array(false, "Database Error - could not read schema version. Cannot continue.");
break;
case 1:
logger::log("SQL", "Updating FROM Schema version 1 TO Schema version 2");
generic_sql_query("ALTER TABLE Albumtable DROP Directory", true);
generic_sql_query("UPDATE Statstable SET Value = 2 WHERE Item = 'SchemaVer'", true);
break;
case 2:
logger::log("SQL", "Updating FROM Schema version 2 TO Schema version 3");
generic_sql_query("ALTER TABLE Tracktable ADD Hidden TINYINT(1) UNSIGNED DEFAULT 0", true);
generic_sql_query("UPDATE Tracktable SET Hidden = 0 WHERE Hidden IS NULL", true);
generic_sql_query("UPDATE Statstable SET Value = 3 WHERE Item = 'SchemaVer'", true);
break;
case 3:
logger::log("SQL", "Updating FROM Schema version 3 TO Schema version 4");
generic_sql_query("UPDATE Tracktable SET Disc = 1 WHERE Disc IS NULL OR Disc = 0", true);
generic_sql_query("UPDATE Statstable SET Value = 4 WHERE Item = 'SchemaVer'", true);
break;
case 4:
logger::log("SQL", "Updating FROM Schema version 4 TO Schema version 5");
generic_sql_query("UPDATE Albumtable SET Searched = 0 WHERE Image NOT LIKE 'albumart%'", true);
generic_sql_query("ALTER TABLE Albumtable DROP Image", true);
generic_sql_query("UPDATE Statstable SET Value = 5 WHERE Item = 'SchemaVer'", true);
break;
case 5:
logger::log("SQL", "Updating FROM Schema version 5 TO Schema version 6");
generic_sql_query("DROP INDEX Disc on Tracktable", true);
generic_sql_query("UPDATE Statstable SET Value = 6 WHERE Item = 'SchemaVer'", true);
break;
case 6:
logger::log("SQL", "Updating FROM Schema version 6 TO Schema version 7");
// This was going to be a nice datestamp but newer versions of mysql don't work that way
generic_sql_query("ALTER TABLE Tracktable ADD DateAdded TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP", true);
generic_sql_query("UPDATE Tracktable SET DateAdded = FROM_UNIXTIME(LastModified) WHERE LastModified IS NOT NULL AND LastModified > 0", true);
generic_sql_query("UPDATE Statstable SET Value = 7 WHERE Item = 'SchemaVer'", true);
break;
case 7:
logger::log("SQL", "Updating FROM Schema version 7 TO Schema version 8");
// Since we've changed the way we're joining artist names together,
// rather than force the database to be recreated and screw up everyone's
// tags and rating, just modify the artist data.
$stmt = sql_prepare_query_later("UPDATE Artisttable SET Artistname = ? WHERE Artistindex = ?");
if ($stmt !== FALSE) {
$result = generic_sql_query("SELECT * FROM Artisttable", false, PDO::FETCH_OBJ);
foreach ($result as $obj) {
$artist = (string) $obj->Artistname;
$art = explode(' & ', $artist);
if (count($art) > 2) {
$f = array_slice($art, 0, count($art) - 1);
$newname = implode($f, ", ")." & ".$art[count($art) - 1];
logger::log("UPGRADE_SCHEMA", "Updating artist name from ".$artist." to ".$newname);
$stmt->execute(array($newname, $obj->Artistindex));
}
}
}
generic_sql_query("UPDATE Statstable SET Value = 8 WHERE Item = 'SchemaVer'", true);
$stmt = null;
break;
case 8:
logger::log("SQL", "Updating FROM Schema version 8 TO Schema version 9");
// We removed the image column earlier, but I've decided we need it again
// because some mopidy backends supply images and archiving them all makes
// creating the collection take waaaaay too long.
generic_sql_query("ALTER TABLE Albumtable ADD Image VARCHAR(255)", true);
// So we now need to recreate the image database. Sadly this means that people using Beets will lose their album images.
$result = generic_sql_query("SELECT Albumindex, ImgKey FROM Albumtable", false, PDO::FETCH_OBJ);
foreach ($result as $obj) {
if (file_exists('albumart/small/'.$obj->ImgKey.'.jpg')) {
generic_sql_query("UPDATE Albumtable SET Image = 'albumart/small/".$obj->ImgKey.".jpg', Searched = 1 WHERE Albumindex = ".$obj->Albumindex, true);
} else {
generic_sql_query("UPDATE Albumtable SET Image = '', Searched = 0 WHERE Albumindex = ".$obj->Albumindex, true);
}
}
generic_sql_query("UPDATE Statstable SET Value = 9 WHERE Item = 'SchemaVer'", true);
break;
case 9:
logger::log("SQL", "Updating FROM Schema version 9 TO Schema version 10");
generic_sql_query("ALTER TABLE Albumtable DROP NumDiscs", true);
generic_sql_query("UPDATE Statstable SET Value = 10 WHERE Item = 'SchemaVer'", true);
break;
case 10:
logger::log("SQL", "Updating FROM Schema version 10 TO Schema version 11");
generic_sql_query("ALTER TABLE Albumtable DROP IsOneFile", true);
generic_sql_query("UPDATE Statstable SET Value = 11 WHERE Item = 'SchemaVer'", true);
break;
case 11:
logger::log("SQL", "Updating FROM Schema version 11 TO Scheme version 12");
generic_sql_query("ALTER TABLE Tracktable ADD isSearchResult TINYINT(1) UNSIGNED DEFAULT 0", true);
generic_sql_query("UPDATE Statstable SET Value = 12 WHERE Item = 'SchemaVer'", true);
break;
case 12:
logger::log("SQL", "Updating FROM Schema version 12 TO Scheme version 13");
generic_sql_query("ALTER TABLE Albumtable CHANGE Spotilink AlbumUri VARCHAR(255)", true);
generic_sql_query("UPDATE Statstable SET Value = 13 WHERE Item = 'SchemaVer'", true);
break;
case 13:
logger::log("SQL", "Updating FROM Schema version 13 TO Scheme version 14");
// Nothing to do here, this is for SQLite only.
generic_sql_query("UPDATE Statstable SET Value = 14 WHERE Item = 'SchemaVer'", true);
break;
case 14:
logger::log("SQL", "Updating FROM Schema version 14 TO Scheme version 15");
generic_sql_query("ALTER TABLE Tracktable MODIFY LastModified CHAR(32)", true);
generic_sql_query("UPDATE Statstable SET Value = 15 WHERE Item = 'SchemaVer'", true);
break;
case 15:
logger::log("SQL", "Updating FROM Schema version 15 TO Schema version 16");
albumImageBuggery();
generic_sql_query("UPDATE Statstable SET Value = 16 WHERE Item = 'SchemaVer'", true);
break;
case 16:
logger::log("SQL", "Updating FROM Schema version 16 TO Schema version 17");
// Early MPD versions had LastModified as an integer value. They changed it to a datestamp some time ago but I didn't notice
$r = generic_sql_query("SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Tracktable' AND COLUMN_NAME = 'LastModified'");
foreach ($r as $obj) {
logger::log("MYSQL_INIT", "Data Type of LastModified is ".$obj['DATA_TYPE']);
if ($obj['DATA_TYPE'] == 'int') {
logger::log("MYSQL_INIT", "Modifying Tracktable");
generic_sql_query("ALTER TABLE Tracktable ADD LM CHAR(32)", true);
generic_sql_query("UPDATE Tracktable SET LM = LastModified", true);
generic_sql_query("ALTER TABLE Tracktable DROP LastModified", true);
generic_sql_query("ALTER TABLE Tracktable CHANGE LM LastModified CHAR(32)", true);
}
}
generic_sql_query("UPDATE Statstable SET Value = 17 WHERE Item = 'SchemaVer'", true);
break;
case 17:
logger::log("SQL", "Updating FROM Schema version 17 TO Schema version 18");
include("utils/podcastupgrade.php");
generic_sql_query("UPDATE Statstable SET Value = 18 WHERE Item = 'SchemaVer'", true);
break;
case 18:
logger::log("SQL", "Updating FROM Schema version 18 TO Schema version 19");
$result = generic_sql_query('SELECT Tracktable.Uri AS uri, Tracktable.TTindex, Tracktable.Title AS ttit, Albumtable.*, Trackimagetable.Image AS ti FROM Tracktable JOIN Albumtable USING (Albumindex) LEFT JOIN Trackimagetable USING (TTindex) WHERE Tracktable.Uri LIKE "soundcloud:%"', false, PDO::FETCH_OBJ);
foreach ($result as $obj) {
logger::log("SQL", " Creating new Album ".$obj->ttit." Image ".$obj->ti);
$ti = $obj->ti;
if (preg_match('/^http/', $ti)) {
$ti = 'getRemoteImage.php?url='.$ti;
}
if (sql_prepare_query(true, null, null, null,
"INSERT INTO Albumtable
(Albumname, AlbumArtistindex, AlbumUri, Year, Searched, ImgKey, mbid, Domain, Image)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?)",
$obj->ttit, $obj->AlbumArtistindex, $obj->uri, $obj->Year, $obj->Searched, $obj->ImgKey, $obj->mbid, $obj->Domain, $ti
)) {
$retval = $mysqlc->lastInsertId();
logger::log("SQL", " .. success, Albumindex ".$retval);
generic_sql_query("UPDATE Tracktable SET Albumindex = ".$retval." WHERE TTindex = ".$obj->TTindex, true);
} else {
logger::log("SQL", " .. ERROR!");
}
}
generic_sql_query("UPDATE Statstable SET Value = 19 WHERE Item = 'SchemaVer'", true);
break;
case 19:
logger::log("SQL", "Updating FROM Schema version 19 TO Schema version 20");
$result = generic_sql_query('SELECT Tracktable.Uri AS uri, Tracktable.TTindex, Tracktable.Title AS ttit, Albumtable.*, Trackimagetable.Image AS ti FROM Tracktable JOIN Albumtable USING (Albumindex) LEFT JOIN Trackimagetable USING (TTindex) WHERE Tracktable.Uri LIKE "youtube:%"', false, PDO::FETCH_OBJ);
foreach ($result as $obj) {
logger::log("SQL", " Creating new Album ".$obj->ttit." Image ".$obj->ti);
$ti = $obj->ti;
if (preg_match('/^http/', $ti)) {
$ti = 'getRemoteImage.php?url='.$ti;
}
if (sql_prepare_query(true, null, null, null,
"INSERT INTO Albumtable
(Albumname, AlbumArtistindex, AlbumUri, Year, Searched, ImgKey, mbid, Domain, Image)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?)",
$obj->ttit, $obj->AlbumArtistindex, $obj->uri, $obj->Year, $obj->Searched, $obj->ImgKey, $obj->mbid, $obj->Domain, $ti
)) {
$retval = $mysqlc->lastInsertId();
logger::log("SQL", " .. success, Albumindex ".$retval);
generic_sql_query("UPDATE Tracktable SET Albumindex = ".$retval." WHERE TTindex = ".$obj->TTindex, true);
} else {
logger::error("SQL", " .. ERROR!");
}
}
generic_sql_query("UPDATE Statstable SET Value = 20 WHERE Item = 'SchemaVer'", true);
break;
case 20:
logger::log("SQL", "Updating FROM Schema version 20 TO Schema version 21");
generic_sql_query("DROP TABLE Trackimagetable", true);
generic_sql_query("UPDATE Statstable SET Value = 21 WHERE Item = 'SchemaVer'", true);
break;
case 21:
logger::log("SQL", "Updating FROM Schema version 21 TO Schema version 22");
generic_sql_query("ALTER TABLE Playcounttable ADD LastPlayed TIMESTAMP NULL", true);
generic_sql_query("UPDATE Statstable SET Value = 22 WHERE Item = 'SchemaVer'", true);
break;
case 22:
logger::log("SQL", "Updating FROM Schema version 22 TO Schema version 23");
generic_sql_query("ALTER TABLE Podcasttable ADD Version TINYINT(2)", true);
generic_sql_query("ALTER TABLE PodcastTracktable ADD Guid VARCHAR(2000)", true);
generic_sql_query("ALTER TABLE PodcastTracktable ADD Localfilename VARCHAR(255)", true);
generic_sql_query("UPDATE Podcasttable SET Version = 1 WHERE PODindex IS NOT NULL", true);
generic_sql_query("UPDATE Statstable SET Value = 23 WHERE Item = 'SchemaVer'", true);
break;
case 23:
logger::log("SQL", "Updating FROM Schema version 23 TO Schema version 24");
generic_sql_query("ALTER TABLE Tracktable CHANGE DateAdded DateAdded TIMESTAMP DEFAULT CURRENT_TIMESTAMP", true);
generic_sql_query("UPDATE Statstable SET Value = 24 WHERE Item = 'SchemaVer'", true);
break;
case 24:
logger::log("SQL", "Updating FROM Schema version 24 TO Schema version 25");
generic_sql_query("ALTER DATABASE romprdb CHARACTER SET utf8 COLLATE utf8_unicode_ci", true);
generic_sql_query("UPDATE Statstable SET Value = 25 WHERE Item = 'SchemaVer'", true);
break;
case 25:
logger::log("SQL", "Updating FROM Schema version 25 TO Schema version 26");
generic_sql_query("ALTER TABLE Tracktable ADD justAdded TINYINT(1) UNSIGNED DEFAULT 1", true);
generic_sql_query("UPDATE Statstable SET Value = 26 WHERE Item = 'SchemaVer'", true);
break;
case 26:
logger::log("SQL", "Updating FROM Schema version 26 TO Schema version 27");
generic_sql_query("ALTER TABLE Albumtable ADD justUpdated TINYINT(1) UNSIGNED DEFAULT 1", true);
generic_sql_query("UPDATE Statstable SET Value = 27 WHERE Item = 'SchemaVer'", true);
break;
case 27:
logger::log("SQL", "Updating FROM Schema version 27 TO Schema version 28");
rejig_wishlist_tracks();
generic_sql_query("UPDATE Statstable SET Value = 28 WHERE Item = 'SchemaVer'", true);
break;
case 28:
logger::log("SQL", "Updating FROM Schema version 28 TO Schema version 29");
create_update_triggers();
generic_sql_query("UPDATE Statstable SET Value = 29 WHERE Item = 'SchemaVer'", true);
break;
case 29:
logger::log("SQL", "Updating FROM Schema version 29 TO Schema version 30");
include('utils/radioupgrade.php');
generic_sql_query("UPDATE Statstable SET Value = 30 WHERE Item = 'SchemaVer'", true);
break;
case 30:
logger::log("SQL", "Updating FROM Schema version 30 TO Schema version 31");
generic_sql_query("ALTER TABLE PodcastTracktable CHANGE Description Description TEXT", true);
generic_sql_query("ALTER TABLE PodcastTracktable CHANGE Link Link TEXT", true);
generic_sql_query("ALTER TABLE PodcastTracktable CHANGE Guid Guid TEXT", true);
generic_sql_query("ALTER TABLE Podcasttable CHANGE FeedURL FeedURL TEXT", true);
generic_sql_query("ALTER TABLE Podcasttable CHANGE Description Description TEXT", true);
generic_sql_query("ALTER TABLE Tracktable CHANGE Uri Uri TEXT", true);
generic_sql_query("UPDATE Statstable SET Value = 31 WHERE Item = 'SchemaVer'", true);
break;
case 31:
logger::log("SQL", "Updating FROM Schema version 31 TO Schema version 32");
generic_sql_query("ALTER TABLE Podcasttable ADD Subscribed TINYINT(1) NOT NULL DEFAULT 1", true);
generic_sql_query("UPDATE Statstable SET Value = 32 WHERE Item = 'SchemaVer'", true);
break;
case 32:
logger::log("SQL", "Updating FROM Schema version 32 TO Schema version 33");
generic_sql_query("DROP TRIGGER IF EXISTS track_insert_trigger", true);
generic_sql_query("DROP TRIGGER IF EXISTS track_update_trigger", true);
create_conditional_triggers();
generic_sql_query("UPDATE Statstable SET Value = 33 WHERE Item = 'SchemaVer'", true);
break;
case 33:
logger::log("SQL", "Updating FROM Schema version 33 TO Schema version 34");
generic_sql_query("ALTER TABLE Albumtable ADD ImgVersion INT UNSIGNED DEFAULT ".ROMPR_IMAGE_VERSION, true);
generic_sql_query("UPDATE Albumtable SET ImgVersion = 1",true);
generic_sql_query("UPDATE Statstable SET Value = 34 WHERE Item = 'SchemaVer'", true);
break;
case 34:
logger::log("SQL", "Updating FROM Schema version 34 TO Schema version 35");
generic_sql_query("ALTER TABLE Tracktable ADD Sourceindex INT UNSIGNED DEFAULT NULL", true);
generic_sql_query("UPDATE Statstable SET Value = 35 WHERE Item = 'SchemaVer'", true);
break;
case 35:
generic_sql_query("UPDATE Statstable SET Value = 36 WHERE Item = 'SchemaVer'", true);
break;
case 36:
logger::log("SQL", "Updating FROM Schema version 35 TO Schema version 37");
$localpods = generic_sql_query("SELECT PODTrackindex, PODindex, LocalFilename FROM PodcastTracktable WHERE LocalFilename IS NOT NULL");
foreach ($localpods as $pod) {
sql_prepare_query(true, null, null, null, "UPDATE PodcastTracktable SET LocalFilename = ? WHERE PODTrackindex = ?", '/prefs/podcasts/'.$pod['PODindex'].'/'.$pod['PODTrackindex'].'/'.$pod['LocalFilename'], $pod['PODTrackindex']);
}
generic_sql_query("UPDATE Statstable SET Value = 37 WHERE Item = 'SchemaVer'", true);
break;
case 37:
logger::log("SQL", "Updating FROM Schema version 37 TO Schema version 38");
generic_sql_query("ALTER TABLE Albumtable MODIFY ImgVersion INT UNSIGNED DEFAULT ".ROMPR_IMAGE_VERSION, true);
generic_sql_query("UPDATE Statstable SET Value = 38 WHERE Item = 'SchemaVer'", true);
break;
case 38:
logger::log("SQL", "Updating FROM Schema version 38 TO Schema version 39");
generic_sql_query("ALTER TABLE Podcasttable ADD LastPubDate INT UNSIGNED DEFAULT NULL", true);
generic_sql_query("CREATE INDEX ptt ON PodcastTracktable (Title)", true);
require_once('includes/podcastfunctions.php');
upgrade_podcasts_to_version();
generic_sql_query("UPDATE Statstable SET Value = 39 WHERE Item = 'SchemaVer'", true);
break;
case 39:
logger::log("SQL", "Updating FROM Schema version 39 TO Schema version 40");
// Takes too long. It'll happen when they get refreshed anyway.
// require_once('includes/podcastfunctions.php');
// upgrade_podcast_images();
generic_sql_query("UPDATE Statstable SET Value = 40 WHERE Item = 'SchemaVer'", true);
break;
case 40:
logger::log("SQL", "Updating FROM Schema version 40 TO Schema version 41");
generic_sql_query("ALTER TABLE Podcasttable ADD Category VARCHAR(255) NOT NULL", true);
generic_sql_query("UPDATE Statstable SET Value = 41 WHERE Item = 'SchemaVer'", true);
break;
case 41:
logger::log("SQL", "Updating FROM Schema version 41 TO Schema version 42");
generic_sql_query("ALTER TABLE PodcastTracktable ADD Progress INT UNSIGNED DEFAULT 0", true);
generic_sql_query("UPDATE Statstable SET Value = 42 WHERE Item = 'SchemaVer'", true);
break;
case 42:
logger::log("SQL", "Updating FROM Schema version 42 TO Schema version 43");
update_stream_images(43);
generic_sql_query("UPDATE Statstable SET Value = 43 WHERE Item = 'SchemaVer'", true);
break;
case 43:
logger::log("SQL", "Updating FROM Schema version 43 TO Schema version 44");
empty_modified_cache_dirs(44);
generic_sql_query("UPDATE Statstable SET Value = 44 WHERE Item = 'SchemaVer'", true);
break;
case 44:
logger::log("SQL", "Updating FROM Schema version 44 TO Schema version 45");
upgrade_host_defs(45);
generic_sql_query("UPDATE Statstable SET Value = 45 WHERE Item = 'SchemaVer'", true);
break;
case 45:
logger::log("SQL", "Updating FROM Schema version 45 TO Schema version 46");
generic_sql_query("UPDATE Statstable SET Value = 46 WHERE Item = 'SchemaVer'", true);
break;
case 46:
logger::log("SQL", "Updating FROM Schema version 46 TO Schema version 47");
generic_sql_query("ALTER TABLE Playcounttable ADD SyncCount INT UNSIGNED DEFAULT 0", true);
generic_sql_query("UPDATE Statstable SET Value = 47 WHERE Item = 'SchemaVer'", true);
create_playcount_triggers();
break;
case 47:
logger::log("SQL", "Updating FROM Schema version 47 TO Schema version 48");
// Some versions had a default value and an on update for LastPlayed, which is WRONG and fucks things up
generic_sql_query("ALTER TABLE Playcounttable ALTER LastPlayed DROP DEFAULT", true);
generic_sql_query("ALTER TABLE Playcounttable CHANGE LastPlayed LastPlayed TIMESTAMP NULL", true);
generic_sql_query("UPDATE Statstable SET Value = 48 WHERE Item = 'SchemaVer'", true);
break;
case 48:
logger::log("SQL", "Updating FROM Schema version 48 TO Schema version 49");
upgrade_host_defs(49);
generic_sql_query("UPDATE Statstable SET Value = 49 WHERE Item = 'SchemaVer'", true);
break;
case 49:
logger::log("SQL", "Updating FROM Schema version 49 TO Schema version 50");
generic_sql_query("ALTER TABLE Tracktable ADD LinkChecked TINYINT(1) UNSIGNED DEFAULT 0", true);
generic_sql_query("UPDATE Statstable SET Value = 50 WHERE Item = 'SchemaVer'", true);
break;
case 50:
logger::log("SQL", "Updating FROM Schema version 50 TO Schema version 51");
// Something wierd happened and I lost half my triggers. In case it happens to anyone else...
generic_sql_query("DROP TRIGGER IF EXISTS track_insert_trigger", true);
generic_sql_query("DROP TRIGGER IF EXISTS track_update_trigger", true);
generic_sql_query("DROP TRIGGER IF EXISTS rating_update_trigger", true);
generic_sql_query("DROP TRIGGER IF EXISTS rating_insert_trigger", true);
generic_sql_query("DROP TRIGGER IF EXISTS tag_delete_trigger", true);
generic_sql_query("DROP TRIGGER IF EXISTS tag_insert_trigger", true);
generic_sql_query("DROP TRIGGER IF EXISTS tag_remove_trigger", true);
generic_sql_query("DROP TRIGGER IF EXISTS track_delete_trigger", true);
create_conditional_triggers();
create_update_triggers();
generic_sql_query("UPDATE Statstable SET Value = 51 WHERE Item = 'SchemaVer'", true);
break;
case 51:
logger::log("SQL", "Updating FROM Schema version 51 TO Schema version 52");
generic_sql_query("ALTER TABLE Tracktable ADD isAudiobook TINYINT(1) UNSIGNED DEFAULT 0", true);
generic_sql_query("UPDATE Statstable SET Value = 52 WHERE Item = 'SchemaVer'", true);
break;
case 52:
logger::log("SQL", "Updating FROM Schema version 52 TO Schema version 53");
create_progress_triggers();
generic_sql_query("UPDATE Statstable SET Value = 53 WHERE Item = 'SchemaVer'", true);
break;
case 53:
logger::log("SQL", "Updating FROM Schema version 53 TO Schema version 54");
require_once ('utils/backgroundimages.php');
first_upgrade_of_user_backgrounds();
generic_sql_query("UPDATE Statstable SET Value = 54 WHERE Item = 'SchemaVer'", true);
break;
case 54:
logger::log("SQL", "Updating FROM Schema version 54 TO Schema version 55");
generic_sql_query("INSERT INTO Statstable (Item, Value) VALUES ('PodUpPid', 0)", true);
generic_sql_query("UPDATE Statstable SET Value = 55 WHERE Item = 'SchemaVer'", true);
break;
case 55:
logger::log("SQL", "Updating FROM Schema version 55 TO Schema version 56");
generic_sql_query("INSERT INTO Statstable (Item, Value) VALUES ('Updating', '0')", true);
generic_sql_query("UPDATE Statstable SET Value = 56 WHERE Item = 'SchemaVer'", true);
break;
}
$sv++;
}
return array(true, "");
}
function delete_oldtracks() {
// generic_sql_query("DELETE Tracktable FROM Tracktable JOIN Playcounttable USING (TTindex) WHERE Hidden = 1 AND DATE_SUB(CURDATE(), INTERVAL 6 MONTH) > DateAdded AND Playcount < 2", true);
}
function delete_orphaned_artists() {
generic_sql_query("DROP TABLE IF EXISTS Croft", true);
generic_sql_query("DROP TABLE IF EXISTS Cruft", true);
generic_sql_query("CREATE TEMPORARY TABLE Croft(Artistindex INT UNSIGNED NOT NULL UNIQUE, PRIMARY KEY(Artistindex)) AS SELECT Artistindex FROM Tracktable UNION SELECT AlbumArtistindex FROM Albumtable", true);
generic_sql_query("CREATE TEMPORARY TABLE Cruft(Artistindex INT UNSIGNED NOT NULL UNIQUE, PRIMARY KEY(Artistindex)) AS SELECT Artistindex FROM Artisttable WHERE Artistindex NOT IN (SELECT Artistindex FROM Croft)", true);
generic_sql_query("DELETE Artisttable FROM Artisttable INNER JOIN Cruft ON Artisttable.Artistindex = Cruft.Artistindex", true);
}
function hide_played_tracks() {
generic_sql_query("CREATE TEMPORARY TABLE Fluff(TTindex INT UNSIGNED NOT NULL UNIQUE, PRIMARY KEY(TTindex)) AS SELECT TTindex FROM Tracktable JOIN Playcounttable USING (TTindex) WHERE isSearchResult = 2", true);
generic_sql_query("UPDATE Tracktable SET Hidden = 1, isSearchResult = 0 WHERE TTindex IN (SELECT TTindex FROM Fluff)", true);
}
function sql_recent_tracks() {
global $prefs;
$qstring = "SELECT TTindex FROM Tracktable WHERE (DATE_SUB(CURDATE(),INTERVAL 60 DAY) <= DateAdded) AND Hidden = 0 AND isSearchResult < 2 AND isAudiobook = 0 AND Uri IS NOT NULL";
if ($prefs['collection_player'] == 'mopidy' && $prefs['player_backend'] == 'mpd') {
$qstring .= ' AND Uri LIKE "local:%"';
}
return $qstring." ORDER BY RAND()";
}
function sql_recent_albums() {
global $prefs;
$qstring = "SELECT TTindex, Albumindex, TrackNo FROM Tracktable WHERE DATE_SUB(CURDATE(),INTERVAL 60 DAY) <= DateAdded AND Hidden = 0 AND isSearchResult < 2 AND isAudiobook = 0 AND Uri IS NOT NULL";
if ($prefs['collection_player'] == 'mopidy' && $prefs['player_backend'] == 'mpd') {
$qstring .= ' AND Uri LIKE "local:%"';
}
return $qstring;
}
function sql_recently_played() {
return "SELECT t.Uri, t.Title, a.Artistname, al.Albumname, al.Image, al.ImgKey, UNIX_TIMESTAMP(p.LastPlayed) AS unixtime FROM Tracktable AS t JOIN Playcounttable AS p USING (TTindex) JOIN Albumtable AS al USING (albumindex) JOIN Artisttable AS a ON (a.Artistindex = al.AlbumArtistindex) WHERE DATE_SUB(CURDATE(),INTERVAL 14 DAY) <= p.LastPlayed AND p.LastPlayed IS NOT NULL ORDER BY p.LastPlayed DESC";
}
function recently_played_playlist() {
$qstring = "SELECT TTindex FROM Playcounttable JOIN Tracktable USING (TTindex) WHERE DATE_SUB(CURDATE(),INTERVAL 14 DAY) <= LastPlayed AND LastPlayed IS NOT NULL AND isAudiobook = 0 AND Hidden = 0";
return $qstring;
}
function sql_two_weeks() {
return "DATE_SUB(CURDATE(),INTERVAL 14 DAY) > LastPlayed";
}
function sql_two_weeks_include($days) {
return "DATE_SUB(CURDATE(),INTERVAL ".$days." DAY) <= LastPlayed AND LastPlayed IS NOT NULL";
}
function sql_to_unixtime($s) {
return "UNIX_TIMESTAMP(".$s.")";
}
function track_date_check($range, $flag) {
if ($flag == 'b') {
return '';
}
switch ($range) {
case ADDED_ALL_TIME:
return '';
break;
case ADDED_TODAY:
return 'AND DATE_SUB(CURDATE(), INTERVAL 1 DAY) <= DateAdded';
break;
case ADDED_THIS_WEEK:
return 'AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DateAdded';
break;
case ADDED_THIS_MONTH:
return 'AND DATE_SUB(CURDATE(), INTERVAL 1 MONTH) <= DateAdded';
break;
case ADDED_THIS_YEAR:
return 'AND DATE_SUB(CURDATE(), INTERVAL 1 YEAR) <= DateAdded';
break;
default:
logger::warn("SQL", "ERROR! Unknown Collection Range ".$range);
return '';
break;
}
}
function create_conditional_triggers() {
generic_sql_query("CREATE TRIGGER track_insert_trigger AFTER INSERT ON Tracktable
FOR EACH ROW
BEGIN
IF (NEW.Hidden=0)
THEN
UPDATE Albumtable SET justUpdated = 1 WHERE Albumindex = NEW.Albumindex;
END IF;
END;", true);
generic_sql_query("CREATE TRIGGER track_update_trigger AFTER UPDATE ON Tracktable
FOR EACH ROW
BEGIN
IF (NEW.Hidden=0)
THEN
UPDATE Albumtable SET justUpdated = 1 WHERE Albumindex = NEW.Albumindex;
UPDATE Albumtable SET justUpdated = 1 WHERE Albumindex = OLD.Albumindex;
END IF;
END;", true);
}
function create_playcount_triggers() {
generic_sql_query("CREATE TRIGGER syncupdatetrigger BEFORE UPDATE ON Playcounttable
FOR EACH ROW
BEGIN
IF (NEW.Playcount > OLD.Playcount)
THEN
SET NEW.SyncCount = OLD.SyncCount + 1;
END IF;
END;", true);
generic_sql_query("CREATE TRIGGER syncinserttrigger BEFORE INSERT ON Playcounttable
FOR EACH ROW
BEGIN
SET NEW.SyncCount = 1;
END;", true);
}
function create_update_triggers() {
logger::debug("MYSQL", "Creating Triggers for update operation");
generic_sql_query("CREATE TRIGGER rating_update_trigger AFTER UPDATE ON Ratingtable
FOR EACH ROW
BEGIN
UPDATE Albumtable SET justUpdated = 1 WHERE Albumindex = (SELECT Albumindex FROM Tracktable WHERE TTindex = NEW.TTindex);
UPDATE Tracktable SET Hidden = 0, justAdded = 1 WHERE Hidden = 1 AND TTindex = NEW.TTindex;
UPDATE Tracktable SET isSearchResult = 1, LastModified = NULL, justAdded = 1 WHERE isSearchResult > 1 AND TTindex = NEW.TTindex;
END;", true);
generic_sql_query("CREATE TRIGGER rating_insert_trigger AFTER INSERT ON Ratingtable
FOR EACH ROW
BEGIN
UPDATE Albumtable SET justUpdated = 1 WHERE Albumindex = (SELECT Albumindex FROM Tracktable WHERE TTindex = NEW.TTindex);
UPDATE Tracktable SET Hidden = 0, justAdded = 1 WHERE Hidden = 1 AND TTindex = NEW.TTindex;
UPDATE Tracktable SET isSearchResult = 1, LastModified = NULL, justAdded = 1 WHERE isSearchResult > 1 AND TTindex = NEW.TTindex;
END;", true);
generic_sql_query("CREATE TRIGGER tag_delete_trigger AFTER DELETE ON Tagtable
FOR EACH ROW
BEGIN
DELETE FROM TagListtable WHERE Tagindex = OLD.Tagindex;
END;", true);
generic_sql_query("CREATE TRIGGER tag_insert_trigger AFTER INSERT ON TagListtable
FOR EACH ROW
BEGIN
UPDATE Albumtable SET justUpdated = 1 WHERE Albumindex = (SELECT Albumindex FROM Tracktable WHERE TTindex = NEW.TTindex);
UPDATE Tracktable SET Hidden = 0, justAdded = 1 WHERE Hidden = 1 AND TTindex = NEW.TTindex;
UPDATE Tracktable SET isSearchResult = 1, LastModified = NULL, justAdded = 1 WHERE isSearchResult > 1 AND TTindex = NEW.TTindex;
END;", true);
generic_sql_query("CREATE TRIGGER tag_remove_trigger AFTER DELETE ON TagListtable
FOR EACH ROW
UPDATE Albumtable SET justUpdated = 1 WHERE Albumindex = (SELECT Albumindex FROM Tracktable WHERE TTindex = OLD.TTindex);", true);
generic_sql_query("CREATE TRIGGER track_delete_trigger AFTER DELETE ON Tracktable
FOR EACH ROW
UPDATE Albumtable SET justUpdated = 1 WHERE Albumindex = OLD.Albumindex;", true);
}
function create_progress_triggers() {
generic_sql_query("CREATE TRIGGER progress_update_trigger AFTER UPDATE ON Progresstable
FOR EACH ROW
BEGIN
UPDATE Albumtable SET justUpdated = 1 WHERE Albumindex = (SELECT Albumindex FROM Tracktable WHERE TTindex = NEW.TTindex);
END;", true);
generic_sql_query("CREATE TRIGGER progress_insert_trigger AFTER INSERT ON Progresstable
FOR EACH ROW
BEGIN
UPDATE Albumtable SET justUpdated = 1 WHERE Albumindex = (SELECT Albumindex FROM Tracktable WHERE TTindex = NEW.TTindex);
END;", true);
}
?>