default value, outline 'calendarTitle' => array('LuxCal Calendar','Calendar title displayed in the top bar'), 'calendarUrl' => array('http://'.$_SERVER['SERVER_NAME'].rtrim(dirname($_SERVER["PHP_SELF"]),'/').'/index.php','Calendar link (URL)'), 'backLinkUrl' => array('','Nav bar back link URL (blank: no link, url: link)'), 'logoPath' => array('','Path/name of optional left upper corner logo image'), 'timeZone' => array('Europe/Amsterdam','Calendar time zone'), 'notifChange' => array(0,'Send a notification when event added/edited/deleted (0:no, 1:yes)'), 'recipList' => array('','List of notification email/SMS addresses'), 'rssFeed' => array(1,'Display RSS feed links in footer and HTML head (0:no, 1:yes)'), 'logWarnings' => array(1,'Log calendar warning messages (0:no, 1:yes)'), 'logNotices' => array(0,'Log calendar notice messages (0:no, 1:yes)'), 'navButText' => array(0,'Navigation buttons with text or icons (0:icons, 1:text)'), 'contButton' => array(1,'Display Contact button on navbar (0:no, 1:yes)'), 'navToapList' => array(1,'Display Toab List button on navbar (0:no, 1:yes)'), 'navTodoList' => array(1,'Display Todo List button on navbar (0:no, 1:yes)'), 'navUpcoList' => array(1,'Display Upco List button on navbar (0:no, 1:yes)'), 'viewMenu' => array(1,'Display view menu in options panel (0:no, 1:yes)'), 'groupMenu' => array(1,'Display group filter menu in options panel (0:no, 1:yes)'), 'userMenu' => array(1,'Display user filter menu in options panel (0:no, 1:yes)'), 'catMenu' => array(1,'Display category filter menu in options panel(0:no, 1:yes)'), 'langMenu' => array(0,'Display ui-language selection menu in options panel (0:no, 1:yes)'), 'viewsPublic' => array('1,2,3,4,5,6,7,8,9,10','Calendar views available to the public users'), 'viewsLogged' => array('1,2,3,4,5,6,7,8,9,10','Calendar views available to the logged-in users'), 'viewButsPub' => array('','View buttons on the navbar (1:year, ... 9:matrix) - public user'), 'viewButsLog' => array('','View buttons on the navbar (1:year, ... 9:matrix) - logged in user'), 'defViewPub' => array(2,'Calendar view at start-up (1:year, ... 8:changes) - public user'), 'defViewLog' => array(2,'Calendar view at start-up (1:year, ... 8:changes) - logged in user'), 'language' => array('English','Default user interface language'), 'ownerTitle' => array(0,'Prepend owner to event title (0:disabled 1:enabled)'), 'privEvents' => array(1,'Private events (0:disabled 1:enabled, 2:default, 3:always)'), 'aldDefault' => array(0,'All-day event default in event window (0:no 1:yes)'), 'details4All' => array(1,'Show event details to x users (0:none, 1:all, 2:logged-in users)'), 'evtDelButton' => array(1,'Display Delete button in Event window (0:no, 1:yes, 2:manager)'), 'eventColor' => array(1,'Event colors (0:user color, 1:cat color)'), 'xField1Label' => array('','Label optional extra event field 1'), 'xField2Label' => array('','Label optional extra event field 2'), 'xField1Public' => array(1,'Extra event field 1 for all users'), 'xField2Public' => array(1,'Extra event field 2 for all users'), 'selfReg' => array(0,'Self-registration (0:no, 1:yes)'), 'selfRegGrp' => array(4,'Self-registration user group ID'), 'selfRegNot' => array(0,'User self-reg notification to admin (0:no, 1:yes)'), 'restLastSel' => array(1,'Restore last session when user revisits calendar'), 'cookieExp' => array(30,'Number of days before a Remember Me cookie expires'), 'evtTemplGen' => array('12345678','Event fields and order of fields in general views'), 'evtTemplUpc' => array('123458','Event fields and order of fields in upcoming events view'), 'evtTemplPop' => array('123458','Event fields and order of fields in hover box'), 'yearStart' => array(0,'Start month in year view (1-12 or 0, 0:current month)'), 'YvColsToShow' => array(3,'Number of months to show per row in year view'), 'YvRowsToShow' => array(4,'Number of rows to show in year view'), 'MvWeeksToShow' => array(10,'Number of weeks to show in month view'), 'workWeekDays' => array('12345','Working days (0: su - 6: sa)'), 'weekStart' => array(1,'First day of the week (0: su - 6: sa)'), 'XvWeeksToShow' => array(8,'Number of weeks to show in matrix view'), 'lookaheadDays' => array(14,'Days to look ahead in upcoming view, todo list and RSS feeds'), 'dwStartHour' => array(6,'Day/week view start hour'), 'dwEndHour' => array(18,'Day/week view end hour'), 'dwTimeSlot' => array(30,'Day/week time slot in minutes'), 'dwTsHeight' => array(20,'Day/week time slot height in pixels'), 'showUrlInMV' => array(1,'Show URL-links in month view (0:no, 1:yes)'), 'showEmlInMV' => array(1,'Show mailto-links in month view (0:no, 1:yes)'), 'showImgInMV' => array(0,'Show images in month view (0:no, 1:yes)'), 'monthInDCell' => array(0,'Show in month view month for each day (0:no, 1:yes)'), 'dateFormat' => array('d.m.y','Date format: yyyy-mm-dd (y:yyyy, m:mm, d:dd)'), 'MdFormat' => array('d M','Date format: dd month (d:dd, M:month)'), 'MdyFormat' => array('d M y','Date format: dd month yyyy (d:dd, M:month, y:yyyy)'), 'MyFormat' => array('M y','Date format: month yyyy (M:month, y:yyyy)'), 'DMdFormat' => array('WD d M','Date format: weekday dd month (WD:weekday d:dd, M:month)'), 'DMdyFormat' => array('WD d M y','Date format: weekday dd month yyyy (WD:weekday d:dd, M:month, y:yyyy)'), 'timeFormat' => array('h:m','Time format (H:hh, h:h, m:mm, a:am|pm, A:AM|PM)'), 'weekNumber' => array(1,'Week numbers on(1) or off(0)'), 'emlService' => array(1,'Mail service (0:no, 1:yes)'), 'smsService' => array(0,'SMS service (0:no, 1:yes)'), 'defRecips' => array('','Default recipients list for email and SMS notifications'), 'notSenderEml' => array(0,'Sender of notification emails (0:calendar, 1:user)'), 'calendarEmail' => array('calendar@email.com','Sender of email notifications'), 'smtpServer' => array('','SMTP mail server name'), 'smtpPort' => array(465,'SMTP port number'), 'smtpSsl' => array(1,'Use SSL (Secure Sockets Layer) (0:no, 1:yes)'), 'smtpAuth' => array(1,'Use SMTP authentication (0:no, 1:yes)'), 'smtpUser' => array('','SMTP username'), 'smtpPass' => array('','SMTP password'), 'notSenderSms' => array(0,'Sender of notification SMSes (0:calendar, 1:user)'), 'calendarPhone' => array('','Sender of SMS notifications'), 'smsCarrier' => array('','SMS carrier template (# = mob. phone number)'), 'smsCountry' => array('','SMS country code'), 'cCodePrefix' => array(1,'Country code starts with prefix + or 00 (0:no, 1:yes)'), 'smsSubject' => array(' ','Subject field template for SMS emails to the carrier'), 'maxLenSms' => array(70,'Maximum length of SMS messages (bytes)'), 'smsAddLink' => array(0,'Add event report link to SMS (0:no, 1:yes)'), 'mailServer' => array(1,'Mail server (1:PHP mail, 2:SMTP mail)'), 'adminCronSum' => array(1,'Send cron job summary to admin (0:no, 1:yes)'), 'chgEmailList' => array('','Recipient email addresses for calendar changes'), 'chgNofDays' => array(1,'Number of days to look back for calendar changes'), 'icsExport' => array(0,'Daily export of events in iCal format (0:no 1:yes)'), 'eventExp' => array(0,'Number of days after due when an event expires / can be deleted (0:never)'), 'maxNoLogin' => array(0,'Number of days not logged in, before deleting user account (0:never delete)'), 'popFieldsSbar' => array('12345','Event fields in sidebar hover box (none: no box)'), 'showLinkInSB' => array(1,'Show URL-links in sidebar (0:no, 1:yes)'), 'sideBarDays' => array(14,'Days to look ahead in sidebar') ); //default styles & settings //B: background, C; color, E: border, F" font family, P: fontsize px, M; font size em $defSaS = array( //name => default value '000' => 'THEME TITLE', 'THEME' => '', //theme title '010' => 'GENERAL', '011' => 'BACKGROUND COLORS', 'BXXXX' => '#E0E0E0', //calendar general 'BTBAR' => '#FDFDFD', //calendar top bar 'BBHAR' => '#AAAAFF', //bar, headers & rulers 'BBUTS' => '#FFFFFF', //buttons 'BDROP' => '#FFFFFF', //drop down menus 'BXWIN' => '#FFFFEE', //event/help window 'BINBX' => '#FFFFEE', //insert boxes 'BOVBX' => '#FEFEFE', //overlay boxes 'BFFLD' => '#FFFFFF', //form fields 'BCONF' => '#A0D070', //confirmation msg 'BWARN' => '#FFF0A0', //warning msg 'BERRO' => '#F0A070', //error msg 'BHLIT' => '#FF2222', //text highlight '012' => 'TEXT COLORS', 'CXXXX' => '#2B3856', //normal text 'CTBAR' => '#2B3856', //calendar top bar 'CBHAR' => '#2B3856', //bars, headers & rulers 'CBUTS' => '#2B3856', //buttons 'CDROP' => '#2B3856', //drop down menus 'CXWIN' => '#2B3856', //event/help window 'CINBX' => '#2B3856', //insert boxes 'COVBX' => '#2B3856', //overlay boxes 'CFFLD' => '#2B3856', //form fields 'CCONF' => '#2B3856', //confirmation msg 'CWARN' => '#2B3856', //warning msg 'CERRO' => '#2B3856', //error msg 'CHLIT' => '#2B3856', //text highlight '013' => 'BORDER COLORS', 'EXXXX' => '#808080', //general borders 'EOVBX' => '#AAAAFF', //overlay borders 'EBUTS' => '#0080FE', //buttons on hover borders '014' => 'FONT FAMILY/SIZES', 'FFXXX' => 'arial,sans-serif', //base font family 'PSXXX' => '12', //base font size 'PTBAR' => '13', //top bar text 'PPGTL' => '14', //page headers 'PTHDL' => '13', //table headers L 'MTHDM' => '1.0', //table headers M 'MDTHD' => '1.0', //date headers 'MSNHD' => '1.0', //section headers 'MOVBX' => '1.0', //side bar, options panel 'MFFLD' => '1.0', //form fields 'MBUTS' => '0.9', //buttons 'MPWIN' => '1.1', //popup window 'MSMAL' => '0.8', //small text '015' => 'MISCELLANEOUS', 'sTbSw' => 1, //top bar shadow (0:no 1:yes) 'sCtOf' => 0, //content top in pixels '020' => 'GRID / VIEWS', '021' => 'BACKGROUND COLORS', 'BGCTH' => '#F2F2F2', //day cell top - hover 'BGTFD' => '#AAAAFF', //first day of month 'BGWTC' => '#FFFFBB', //grid - weeknr/time column 'BGWD1' => '#FFFFEE', //grid - weekday month 1 'BGWD2' => '#FFFFDD', //grid - weekday month 2 'BGWE1' => '#FFFFCC', //grid - weekend month 1 'BGWE2' => '#FFFFBB', //grid - weekend month 2 'BGOUT' => '#FEFEFE', //grid - outside month 'BGTOD' => '#EEEEFF', //grid - day cell today 'BGSEL' => '#FFEEEE', //grid - day cell selected day 'BCHBX' => '#FFFFDD', //todo check box '022' => 'TEXT COLORS', 'CGWTC' => '#666666', //cell head, times, week numbers 'CGTFD' => '#2B3856', //1st day of month 'CGWD1' => '#2B3856', //grid - weekday month 1 'CGWD2' => '#2B3856', //grid - weekday month 2 'CGWE1' => '#2B3856', //grid - weekend month 1 'CGWE2' => '#2B3856', //grid - weekend month 2 'CGOUT' => '#2B3856', //grid - outside month 'CGTOD' => '#2B3856', //grid - day cell today 'CGSEL' => '#2B3856', //grid - day cell selected day 'CCHBX' => '#FF0000', //todo check box '023' => 'BORDER COLORS', 'EGTOD' => '#0000FF', //grid - day cell today 'EGSEL' => '#FF0000', //grid - day cell selected day '024' => 'FONT SIZES', 'MEVTI' => '1.0', //event title in views '030' => 'HOVER BOXES', '031' => 'BACKGROUND COLORS', 'BHNOR' => '#FFFFE0', //normal event 'BHPRI' => '#CCFFCC', //private event 'BHREP' => '#FFFFE0', //repeating event '032' => 'TEXT COLORS', 'CHNOR' => '#2B3856', //hover popup box 'CHPRI' => '#2B3856', //hover popup box 'CHREP' => '#2B3856', //hover popup box '033' => 'BORDER COLORS', 'EHNOR' => '#808080', //normal event 'EHPRI' => '#808080', //private event 'EHREP' => '#E00060', //repeating event '034' => 'FONT SIZES', 'MPOPU' => '1.0' //hover popup box ); //database table SQL definitions $sqlTableDefs = array( "events" => "`ID` INTEGER PRIMARY KEY ".($dbType == 'SQLite' ? 'AUTOINCREMENT' : 'AUTO_INCREMENT').", `type` TINYINT NOT NULL DEFAULT 0, `private` TINYINT NOT NULL DEFAULT 0, `title` VARCHAR(255) DEFAULT NULL, `venue` VARCHAR(128) DEFAULT NULL, `text1` TEXT DEFAULT NULL, `text2` VARCHAR(255) DEFAULT NULL, `text3` VARCHAR(255) DEFAULT NULL, `attach` TEXT DEFAULT NULL, `catID` MEDIUMINT NOT NULL DEFAULT 1, `scatID` TINYINT NOT NULL DEFAULT 0, `userID` MEDIUMINT DEFAULT NULL, `editor` VARCHAR(48) NOT NULL DEFAULT '', `approved` TINYINT NOT NULL DEFAULT 0, `checked` TEXT DEFAULT NULL, `notEml` TINYINT NOT NULL DEFAULT -1, `notSms` TINYINT NOT NULL DEFAULT -1, `notRecip` VARCHAR(255) DEFAULT NULL, `sDate` VARCHAR(10) DEFAULT NULL, `eDate` VARCHAR(10) NOT NULL DEFAULT '9999-00-00', `xDates` TEXT DEFAULT NULL, `sTime` VARCHAR(5) DEFAULT NULL, `eTime` VARCHAR(5) NOT NULL DEFAULT '99:00', `rType` TINYINT NOT NULL DEFAULT 0, `rInterval` TINYINT NOT NULL DEFAULT 0, `rPeriod` TINYINT NOT NULL DEFAULT 0, `rMonth` TINYINT NOT NULL DEFAULT 0, `rUntil` VARCHAR(10) NOT NULL DEFAULT '9999-00-00', `aDateTime` VARCHAR(16) NOT NULL DEFAULT '9999-00-00 00:00', `mDateTime` VARCHAR(16) NOT NULL DEFAULT '9999-00-00 00:00', `status` BOOLEAN NOT NULL DEFAULT 0", "categories" => "`ID` INTEGER PRIMARY KEY ".($dbType == 'SQLite' ? 'AUTOINCREMENT' : 'AUTO_INCREMENT').", `name` VARCHAR(48) NOT NULL DEFAULT '', `symbol` VARCHAR(8) NOT NULL DEFAULT '', `sequence` TINYINT NOT NULL DEFAULT 1, `repeat` TINYINT NOT NULL DEFAULT 0, `noverlap` TINYINT NOT NULL DEFAULT 0, `olErrMsg` VARCHAR(56) NOT NULL DEFAULT '', `defSlot` TINYINT NOT NULL DEFAULT 0, `approve` TINYINT NOT NULL DEFAULT 0, `dayColor` TINYINT NOT NULL DEFAULT 0, `color` VARCHAR(8) DEFAULT NULL, `bgColor` VARCHAR(8) DEFAULT NULL, `checkBx` TINYINT NOT NULL DEFAULT 0, `checkLb` VARCHAR(16) NOT NULL DEFAULT 'approved', `checkMk` VARCHAR(8) NOT NULL DEFAULT '✓', `subName1` VARCHAR(20) NOT NULL DEFAULT '', `subColor1` VARCHAR(8) DEFAULT NULL, `subBgrnd1` VARCHAR(8) DEFAULT NULL, `subName2` VARCHAR(20) NOT NULL DEFAULT '', `subColor2` VARCHAR(8) DEFAULT NULL, `subBgrnd2` VARCHAR(8) DEFAULT NULL, `subName3` VARCHAR(20) NOT NULL DEFAULT '', `subColor3` VARCHAR(8) DEFAULT NULL, `subBgrnd3` VARCHAR(8) DEFAULT NULL, `subName4` VARCHAR(20) NOT NULL DEFAULT '', `subColor4` VARCHAR(8) DEFAULT NULL, `subBgrnd4` VARCHAR(8) DEFAULT NULL, `urlLink` VARCHAR(120) NOT NULL DEFAULT '', `status` BOOLEAN NOT NULL DEFAULT 0", "users" => "`ID` INTEGER PRIMARY KEY ".($dbType == 'SQLite' ? 'AUTOINCREMENT' : 'AUTO_INCREMENT').", `name` VARCHAR(48) NOT NULL DEFAULT '', `password` VARCHAR(32) NOT NULL DEFAULT '', `tPassword` VARCHAR(32) DEFAULT NULL, `email` VARCHAR(255) NOT NULL DEFAULT '', `phone` VARCHAR(32) NOT NULL DEFAULT '', `number` VARCHAR(32) NOT NULL DEFAULT '', `groupID` MEDIUMINT NOT NULL DEFAULT 3, `language` VARCHAR(24) DEFAULT 'english', `login0` VARCHAR(10) NOT NULL DEFAULT '9999-00-00', `login1` VARCHAR(10) NOT NULL DEFAULT '9999-00-00', `loginCnt` MEDIUMINT NOT NULL DEFAULT 0, `status` BOOLEAN NOT NULL DEFAULT 0", "groups" => "`ID` INTEGER PRIMARY KEY ".($dbType == 'SQLite' ? 'AUTOINCREMENT' : 'AUTO_INCREMENT').", `name` VARCHAR(255) NOT NULL DEFAULT '', `privs` TINYINT NOT NULL DEFAULT 0, `vCatIDs` VARCHAR(128) NOT NULL DEFAULT '0', `eCatIDs` VARCHAR(128) NOT NULL DEFAULT '0', `rEvents` TINYINT NOT NULL DEFAULT 1, `mEvents` TINYINT NOT NULL DEFAULT 1, `pEvents` TINYINT NOT NULL DEFAULT 1, `upload` TINYINT NOT NULL DEFAULT 0, `sendSms` TINYINT NOT NULL DEFAULT 0, `color` VARCHAR(8) DEFAULT NULL, `status` BOOLEAN NOT NULL DEFAULT 0", "settings" => "`name` VARCHAR(16) NOT NULL DEFAULT '', `value` VARCHAR(255) DEFAULT NULL, `outline` VARCHAR(128) DEFAULT NULL", "styles" => "`name` VARCHAR(8) NOT NULL DEFAULT '', `value` VARCHAR(255) DEFAULT NULL" ); function createDbTable($name,$drop = 0) { //create database table global $sqlTableDefs, $dbType; if ($drop) { dbQuery("DROP TABLE IF EXISTS `{$name}`"); } if ($dbType == 'SQLite') { //SQLite dbQuery("CREATE TABLE IF NOT EXISTS `{$name}` (\n{$sqlTableDefs[rtrim($name,'X')]})"); } else { //MySQL dbQuery("CREATE TABLE IF NOT EXISTS `{$name}` (\n{$sqlTableDefs[rtrim($name,'X')]}) ENGINE=InnoDB DEFAULT CHARSET=utf8 "); } } function initCats() { //init categories table $stH = stPrep("REPLACE INTO `categories` (`ID`,`name`,`sequence`) VALUES (?,?,?)"); stExec($stH,array(1,'no cat',1)); } function initUsers($adName,$adMail,$adPwMd5) { //init users table $users = array(array(1,'Public Access','','',3),array(2,$adName,$adMail,$adPwMd5,2)); //public user + admin user dbTransaction('begin'); $stH = stPrep("REPLACE INTO `users` (`ID`,`name`,`email`,`password`,`groupID`) VALUES (?,?,?,?,?)"); foreach($users as $user) { stExec($stH,$user); } dbTransaction('commit'); } function initGroups() { //init groups table $groups = array(array(1,'No access',0,'0',0,0),array(2,'Admin',9,'0',1,1),array(3,'Read access',1,'0',0,0),array(4,'Post Own',2,'0',0,0),array(5,'Post All',3,'0',0,0),array(6,'Manager',4,'0',1,1)); dbTransaction('begin'); $stH = stPrep("REPLACE INTO `groups` (`ID`,`name`,`privs`,`vCatIDs`,`upload`,`sendSms`) VALUES (?,?,?,?,?,?)"); foreach($groups as $group) { stExec($stH,$group); } dbTransaction('commit'); } function initStyles() { //init styles table global $defSaS, $set; dbTransaction('begin'); $stH = stPrep("INSERT INTO `styles` (`name`,`value`) VALUES (?,?)"); foreach($defSaS as $key => $value) { $dbValue = $key != 'THEME' ? $value : $set['calendarTitle']; if ($key[0] != '0') { //skip titles stExec($stH,array($key,$dbValue)); } } dbTransaction('commit'); } function checkSettings(&$dbSet) { //check & complete calendar settings global $defSet; foreach($defSet as $key => $value) { if (!isset($dbSet[$key])) { //set not-set settings to default value $dbSet[$key] = $value[0]; } } foreach($dbSet as $key => $value) { if (!isset($defSet[$key])) { //delete redundant settings unset($dbSet[$key]); } } } function saveSettings(&$dbSet) { //save settings to calendar global $defSet; dbTransaction('begin'); $stH = stPrep("DELETE FROM `settings`"); // empty table stExec($stH,null); $stH = stPrep("REPLACE INTO `settings` VALUES (?,?,?)"); //save settings foreach($dbSet as $key => $value) { stExec($stH,array($key,$value,$defSet[$key][1])); } dbTransaction('commit'); } function saveConfig() { //Save LuxCal version and db data to lcconfig.php global $lcV, $dbType, $dbDef, $dbSel, $crHost, $crIpAd; $config = ''; return file_put_contents('./lcconfig.php',$config); } function backupDatabase($tables,$echo) { //Create a backup file of the database tables global $ax, $calID, $set, $lcV; //make file header $sqlFile = "--\n"; $sqlFile .= "-- SQL DUMP ".date('Y.m.d @ H:i')."\n"; $sqlFile .= "-- Calendar: {$set['calendarTitle']}\n"; $sqlFile .= "-- Calendar ID: {$calID}\n"; $sqlFile .= "--\n"; $sqlFile .= "-- LuxCal version: {$lcV}\n"; $sqlFile .= "-- http://www.luxsoft.eu\n"; $sqlFile .= "--\n\n"; //backup tables foreach ($tables as $table) { if ($echo) { echo "{$ax['mdb_backup_table']} '{$table}' - "; } $sqlFile .= "\n-- ".str_repeat("=", 56)."\n\n--\n-- Table {$table}\n--\n\n"; $sqlFile .= "DROP TABLE IF EXISTS `{$table}`;\n\n"; $sqlFile .= getTableSql($table).";\n\n"; //get SQL code to create table $stH = dbQuery("SELECT * FROM `{$table}`"); $counter = 0; while($row = $stH->fetch(PDO::FETCH_NUM)) { $sqlFile .= "INSERT INTO `{$table}` VALUES ("; foreach($row as $value) { $sqlFile .= isset($value) ? "'".str_replace("'","''",$value)."'," : "'',"; } $sqlFile = substr($sqlFile,0,-1).");\n"; $counter++; } $stH = null; //release statement handle! $sqlFile .="\n"; if ($echo) { echo "{$ax['mdb_backup_done']} ({$counter} {$ax['mdb_records']})
\n"; } } return $sqlFile; } function importSqlFile(&$sqlArray) { //Import a database backup file global $dbType; //init $query = ''; $matches = array(); $busy = false; $curTab = ''; $count = array('cat' => 0, 'eve' => 0, 'use' => 0, 'gro' => 0, 'set' => 0, 'sty' => 0); //init table counters //preprocess SQL queries $patTable = '~\s+["`]?(?:\w{1,20})?_?(events|categories|users|groups|settings|styles)["`]?(\s*[(;V])~'; //strip calID_ and replace " by ` around table names $repTable = ' `$1`$2'; $patLine = array('~\\\\+["\']~'); //modify escaped quotes $repLine = array("''"); if ($dbType == 'SQLite') { //SQLite - solve MySQL incompatibilities $patLine[] = '~\).*ENGINE.*;~'; $repLine[] = ');'; $patLine[] = '~\sunsigned~'; $repLine[] = ''; $patLine[] = '~\sAUTO_?INCREMENT~'; $repLine[] = ''; $patLine[] = '~\s?COLLATE\s[\w]+~'; $repLine[] = ''; $patLine[] = '~\sclass=[^\s>]+~'; $repLine[] = ''; } else { //MySQL - solve SQLite incompatibilities $patLine[] = '~\sAUTOINCREMENT~'; $repLine[] = ' AUTO_INCREMENT'; } //restore dbTransaction('begin'); foreach ($sqlArray as $qLine) { $qLine = trim($qLine); $qLine6 = substr($qLine,0,6); if ($qLine6 != 'INSERT' and $qLine6 != 'CREATE' and !$busy) { continue; } //skip line if (!$busy) { //begin INSERT or CREATE $busy = true; $qLine = preg_replace($patTable,$repTable,$qLine,1); //1 replacement preg_match('~`(events|categories|users|groups|settings|styles)`~',$qLine,$matches); //find table name if ($qLine6 == 'CREATE') { //begin CREATE $stH = dbQuery("DROP TABLE IF EXISTS `{$matches[1]}`;\n"); //drop table before creating } else { //begin INSERT $curTab = substr($matches[1],0,3); //current table $qLine = str_replace('"','`',strstr($qLine,'VALUES',true)).strstr($qLine,'VALUES'); //replace "' by ` around possible column names if (substr($qLine,-1) == ';') { $count[$curTab]++; } } } if ($qLine6 != 'INSERT' and $curTab) { $count[$curTab]++; } //increment INSERT counter $qLine = preg_replace($patLine,$repLine,$qLine); //do it $query .= $qLine."\n"; if (substr($qLine,-1) == ';') { //execute sql query $stH = dbQuery($query); $busy = false; $query = $curTab = ''; } } dbTransaction('commit'); return $count; } // //Upgrade the current ($calID) database from 2.7.2+ to the latest version // function upgradeDb() { //upgrade $calID database from 2.7.2+ global $dbType; /* === tables pre-processing === */ //if users.sedit: set privs to 9 for admin accounts (sedit == 1) $stH = dbQuery("SELECT `sedit` FROM `users` LIMIT 1",0); if ($stH) { //column 'sedit' present (V2.7.2) $stH = null; dbQuery("UPDATE `users` SET `privs` = 9 WHERE `sedit` = 1"); } //if table groups not existing - create and populate $stH = dbQuery("SELECT * FROM `groups` LIMIT 1",0); if ($stH === false) { //table not present $stH = null; createDbTable("groups"); initGroups(); } //if table styles not existing - create and populate $stH = dbQuery("SELECT * FROM `styles` LIMIT 1",0); if ($stH === false) { //table not present $stH = null; createDbTable("styles"); initStyles(); } else { //table present, if empty - initialize $stH = dbQuery("SELECT COUNT(*) FROM `styles` LIMIT 1",0); $result = $stH->fetch(PDO::FETCH_NUM); if ($result[0] == 0) { //empty initStyles(); } } //create temporary tables with new schema createDbTable("usersX"); createDbTable("groupsX"); createDbTable("categoriesX"); createDbTable("eventsX"); createDbTable("settingsX"); createDbTable("stylesX"); /* === tables version-processing === */ dbTransaction('begin'); do { //test if version < 3.1 $stH = dbQuery("SELECT `approve` FROM `categories` LIMIT 1",0); if (!$stH) { //column 'approve' not present - version 2.7 $lcVUpg = '2.7'; dbQuery("INSERT INTO `eventsX` (`ID`,`private`,`title`,`venue`,`text1`,`catID`,`userID`,`editor`,`checked`,`notEml`,`notRecip`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status`) SELECT `event_id`,`private`,`title`,`venue`,`description`,`category_id`,`user_id`,`editor`,`checked`,`notify`,`not_mail`,`s_date`,`e_date`,`x_dates`,SUBSTRING(`s_time`,1,5),SUBSTRING(`e_time`,1,5) ,`r_type`,`r_interval`,`r_period`,`r_month`,`r_until`,`a_date`,`m_date`,`status` FROM `events`"); //copy content events table dbQuery("INSERT INTO `usersX` (`ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status`) SELECT `user_id`,`user_name`,`password`,`temp_password`,`email`,`privs`,`language`,`login_0`,`login_1`,`login_cnt`,`status` FROM `users`"); //copy content users table dbQuery("INSERT INTO `groupsX` SELECT * FROM `groups`"); //new table, no change dbQuery("INSERT INTO `categoriesX` (`ID`,`name`,`sequence`,`repeat`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status`) SELECT `category_id`,`name`,`sequence`,`rpeat`,`color`,`background`,`check2`,`label2`,`mark2`,`status` FROM `categories`"); //copy content categories table dbQuery("INSERT INTO `settingsX` (`name`,`value`,`outline`) SELECT `name`,`value`,`description` FROM `settings`"); //copy content settings table dbQuery("INSERT INTO `stylesX` SELECT * FROM `styles`"); //new table, no change break; //done } //test if version = 3.1 $stH = dbQuery("SELECT `a_date` FROM `events` LIMIT 1",0); if ($stH !== false) { //column 'a_date' present - version 3.1 $lcVUpg = '3.1'; dbQuery("INSERT INTO `eventsX` (`ID`,`private`,`title`,`venue`,`text1`,`catID`,`userID`,`editor`,`approved`,`checked`,`notEml`,`notRecip`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status`) SELECT `event_id`,`private`,`title`,`venue`,`description`,`category_id`,`user_id`,`editor`,`approved`,`checked`,`notify`,`not_mail`,`s_date`,`e_date`,`x_dates`,SUBSTRING(`s_time`,1,5),SUBSTRING(`e_time`,1,5),`r_type`,`r_interval`,`r_period`,`r_month`,`r_until`,`a_date`,`m_date`,`status` FROM `events`"); //copy content events table dbQuery("INSERT INTO `usersX` (`ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status`) SELECT `user_id`,`user_name`,`password`,`temp_password`,`email`,`privs`,`language`,`login_0`,`login_1`,`login_cnt`,`status` FROM `users`"); //copy content users table dbQuery("INSERT INTO `groupsX` SELECT * FROM `groups`"); //new table, no change dbQuery("INSERT INTO `categoriesX` (`ID`,`name`,`sequence`,`repeat`,`approve`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status`) SELECT `category_id`,`name`,`sequence`,`rpeat`,`approve`,`color`,`background`,`chbox`,`chlabel`,`chmark`,`status` FROM `categories`"); //copy content categories table dbQuery("INSERT INTO `settingsX` (`name`,`value`,`outline`) SELECT `name`,`value`,`description` FROM `settings`"); //copy content settings table dbQuery("INSERT INTO `stylesX` SELECT * FROM `styles`"); //new table, no change break; //done } //test if version = 3.2 $stH = dbQuery("SELECT `ID` FROM `events` LIMIT 1",0); if (!$stH) { //column 'ID' not present - version 3.2 $lcVUpg = '3.2'; dbQuery("INSERT INTO `eventsX` (`ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`catID`,`userID`,`editor`,`approved`,`checked`,`notEml`,`notRecip`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status`) SELECT `event_id`,`private`,`title`,`venue`,`description`,`xfield1`,`xfield2`,`category_id`,`user_id`,`editor`,`approved`,`checked`,`notify`,`not_mail`,`s_date`,`e_date`,`x_dates`,SUBSTRING(`s_time`,1,5),SUBSTRING(`e_time`,1,5),`r_type`,`r_interval`,`r_period`,`r_month`,`r_until`,`a_datetime`,`m_datetime`,`status` FROM `events`"); //copy content events table dbQuery("INSERT INTO `usersX` (`ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status`) SELECT `user_id`,`user_name`,`password`,`temp_password`,`email`,`privs`,`language`,`login_0`,`login_1`,`login_cnt`,`status` FROM `users`"); //copy content users table dbQuery("INSERT INTO `groupsX` SELECT * FROM `groups`"); //new table, no change dbQuery("INSERT INTO `categoriesX` (`ID`,`name`,`sequence`,`repeat`,`approve`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status`) SELECT `category_id`,`name`,`sequence`,`rpeat`,`approve`,`color`,`background`,`chbox`,`chlabel`,`chmark`,`status` FROM `categories`"); //copy content categories table dbQuery("INSERT INTO `settingsX` (`name`,`value`,`outline`) SELECT `name`,`value`,`description` FROM `settings`"); //copy content settings table dbQuery("INSERT INTO `stylesX` SELECT * FROM `styles`"); //new table, no change break; //done } //test if version = 4.1 $stH = dbQuery("SELECT `dayColor` FROM `categories` LIMIT 1",0); if (!$stH) { //column 'dayColor' not present - version 4.1 $lcVUpg = '4.1'; dbQuery("INSERT INTO `eventsX` (`ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`catID`,`userID`,`editor`,`approved`,`checked`,`notEml`,`notRecip`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status`) SELECT `ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`catID`,`userID`,`editor`,`approved`,`checked`,`notify`,`notMail`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status` FROM `events`"); //copy content events table dbQuery("INSERT INTO `usersX` (`ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status`) SELECT `ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status` FROM `users`"); //copy content users table dbQuery("INSERT INTO `groupsX` (`ID`,`name`,`privs`,`vCatIDs`,`color`,`status`) SELECT `ID`,`name`,`privs`,`catIDs`,`color`,`status` FROM `groups`"); //copy content groups table dbQuery("INSERT INTO `categoriesX` (`ID`,`name`,`sequence`,`repeat`,`approve`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status`) SELECT `ID`,`name`,`sequence`,`repeat`,`approve`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status` FROM `categories`"); //copy content categories table dbQuery("INSERT INTO `settingsX` SELECT * FROM `settings`"); //copy content settings table dbQuery("INSERT INTO `stylesX` SELECT * FROM `styles`"); //new table, no change break; //done } //test if version = 4.2 $stH = dbQuery("SELECT `noverlap` FROM `categories` LIMIT 1",0); if (!$stH) { //column 'overlay' not present - version 4.2 $lcVUpg = '4.2'; dbQuery("INSERT INTO `eventsX` (`ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`catID`,`userID`,`editor`,`approved`,`checked`,`notEml`,`notRecip`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status`) SELECT `ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`catID`,`userID`,`editor`,`approved`,`checked`,`notify`,`notMail`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status` FROM `events`"); //copy content events table dbQuery("INSERT INTO `usersX` (`ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status`) SELECT `ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status` FROM `users`"); //copy content users table dbQuery("INSERT INTO `groupsX` (`ID`,`name`,`privs`,`vCatIDs`,`color`,`status`) SELECT `ID`,`name`,`privs`,`catIDs`,`color`,`status` FROM `groups`"); //copy content groups table dbQuery("INSERT INTO `categoriesX` (`ID`,`name`,`sequence`,`repeat`,`approve`,`dayColor`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status`) SELECT `ID`,`name`,`sequence`,`repeat`,`approve`,`dayColor`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status` FROM `categories`"); //copy content categories table dbQuery("INSERT INTO `settingsX` SELECT * FROM `settings`"); //copy content settings table dbQuery("INSERT INTO `stylesX` SELECT * FROM `styles`"); //new table, no change break; //done } //test if version = 4.3 $stH = dbQuery("SELECT `attach` FROM `events` LIMIT 1",0); if (!$stH) { //column 'attach' not present - version 4.3 $lcVUpg = '4.3'; dbQuery("INSERT INTO `eventsX` (`ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`catID`,`userID`,`editor`,`approved`,`checked`,`notEml`,`notRecip`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status`) SELECT `ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`catID`,`userID`,`editor`,`approved`,`checked`,`notify`,`notMail`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status` FROM `events`"); //copy content events table dbQuery("INSERT INTO `usersX` (`ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status`) SELECT `ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status` FROM `users`"); //copy content users table dbQuery("INSERT INTO `groupsX` (`ID`,`name`,`privs`,`vCatIDs`,`rEvents`,`mEvents`,`pEvents`,`color`,`status`) SELECT `ID`,`name`,`privs`,`catIDs`,`rEvents`,`mEvents`,`pEvents`,`color`,`status` FROM `groups`"); //copy content groups table dbQuery("INSERT INTO `categoriesX` (`ID`,`name`,`sequence`,`repeat`,`noverlap`,`olErrMsg`,`defSlot`,`approve`,`dayColor`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status`) SELECT `ID`,`name`,`sequence`,`repeat`,`noverlap`,`olErrMsg`,`defSlot`,`approve`,`dayColor`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status` FROM `categories`"); //copy content categories table dbQuery("INSERT INTO `settingsX` SELECT * FROM `settings`"); //copy content settings table dbQuery("INSERT INTO `stylesX` SELECT * FROM `styles`"); //new table, no change break; //done } //test if version = 4.4 $stH = dbQuery("SELECT `vCatIDs` FROM `groups` LIMIT 1",0); if (!$stH) { //column 'vCatIDs' not present - version 4.4 $lcVUpg = '4.4'; dbQuery("INSERT INTO `eventsX` (`ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`attach`,`catID`,`userID`,`editor`,`approved`,`checked`,`notEml`,`notRecip`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status`) SELECT `ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`attach`,`catID`,`userID`,`editor`,`approved`,`checked`,`notify`,`notMail`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status` FROM `events`"); //copy content events table dbQuery("INSERT INTO `usersX` (`ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status`) SELECT `ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status` FROM `users`"); //copy content users table dbQuery("INSERT INTO `groupsX` (`ID`,`name`,`privs`,`vCatIDs`,`rEvents`,`mEvents`,`pEvents`,`upload`,`color`,`status`) SELECT `ID`,`name`,`privs`,`catIDs`,`rEvents`,`mEvents`,`pEvents`,`upload`,`color`,`status` FROM `groups`"); //copy content groups table dbQuery("INSERT INTO `categoriesX` (`ID`,`name`,`sequence`,`repeat`,`noverlap`,`olErrMsg`,`defSlot`,`approve`,`dayColor`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status`) SELECT `ID`,`name`,`sequence`,`repeat`,`noverlap`,`olErrMsg`,`defSlot`,`approve`,`dayColor`,`color`,`bgColor`,`checkBx`,`checkLb`,`checkMk`,`status` FROM `categories`"); //copy content categories table dbQuery("INSERT INTO `settingsX` SELECT * FROM `settings`"); //copy content settings table dbQuery("INSERT INTO `stylesX` SELECT * FROM `styles`"); //new table, no change break; //done } //test if version = 4.5 $stH = dbQuery("SELECT `notRecip` FROM `events` LIMIT 1",0); if (!$stH) { //column 'notRecip' not present - version 4.5 $lcVUpg = '4.5'; dbQuery("INSERT INTO `eventsX` (`ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`attach`,`catID`,`userID`,`editor`,`approved`,`checked`,`notEml`,`notRecip`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status`) SELECT `ID`,`private`,`title`,`venue`,`text1`,`text2`,`text3`,`attach`,`catID`,`userID`,`editor`,`approved`,`checked`,`notify`,`notMail`,`sDate`,`eDate`,`xDates`,`sTime`,`eTime`,`rType`,`rInterval`,`rPeriod`,`rMonth`,`rUntil`,`aDateTime`,`mDateTime`,`status` FROM `events`"); //copy content events table dbQuery("INSERT INTO `usersX` (`ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status`) SELECT `ID`,`name`,`password`,`tPassword`,`email`,`groupID`,`language`,`login0`,`login1`,`loginCnt`,`status` FROM `users`"); //copy content users table dbQuery("INSERT INTO `groupsX` (`ID`,`name`,`privs`,`vCatIDs`,`eCatIDs`,`rEvents`,`mEvents`,`pEvents`,`upload`,`color`,`status`) SELECT `ID`,`name`,`privs`,`vcatIDs`,`ecatIDs`,`rEvents`,`mEvents`,`pEvents`,`upload`,`color`,`status` FROM `groups`"); //copy content groups table dbQuery("INSERT INTO `categoriesX` SELECT * FROM `categories`"); //no change dbQuery("INSERT INTO `settingsX` SELECT * FROM `settings`"); //no change dbQuery("INSERT INTO `stylesX` SELECT * FROM `styles`"); //no change break; //done } //version = current version (no changes) $lcVUpg = '4.6'; dbQuery("INSERT INTO `eventsX` SELECT * FROM `events`"); dbQuery("INSERT INTO `usersX` SELECT * FROM `users`"); dbQuery("INSERT INTO `groupsX` SELECT * FROM `groups`"); dbQuery("INSERT INTO `categoriesX` SELECT * FROM `categories`"); dbQuery("INSERT INTO `settingsX` SELECT * FROM `settings`"); dbQuery("INSERT INTO `stylesX` SELECT * FROM `styles`"); } while (0); //end of: process calendar $calID /* === tables post-processing === */ $stH = dbQuery("SELECT `privs` FROM `users` LIMIT 1",0); if ($stH !== false) { //privs found, table groups is new $stH = null; //convert users.groupID (old privs) to new groupID $groups = array(0 => 1, 9 => 2, 1 => 3, 2 => 4, 3 => 5, 4 => 6); $stH = dbQuery("SELECT `ID`,`groupID` FROM `usersX`"); //get groupID (old privs) while ($row = $stH->fetch(PDO::FETCH_ASSOC)) { dbQuery("UPDATE `usersX` SET `groupID` = {$groups[$row['groupID']]} WHERE `ID` = {$row['ID']}"); } } //groups.ID and users.groupID: renumber ID starting from 1 $stH = dbQuery("SELECT * FROM `groupsX` WHERE `ID` = 0"); if ($row = $stH->fetch(PDO::FETCH_NUM)) { //column 'ID' = 0 exists - renumber $stH = dbQuery("SELECT `ID` FROM `groupsX` ORDER BY `ID` DESC"); while ($row = $stH->fetch(PDO::FETCH_ASSOC)) { dbQuery("UPDATE `groupsX` SET `ID` = `ID` + 1 WHERE `ID` = {$row['ID']}"); //must be done in reverse order } dbQuery("UPDATE `usersX` SET `groupID` = `groupID` + 1"); } //correct groupIDs admin (3 -> 2) and read-access (2 -> 3) $stH = dbQuery("SELECT `ID`,`groupID` FROM `usersX` WHERE `ID` = 2 and `groupID` = 3",0); //admin in group 3 if ($row = $stH->fetch(PDO::FETCH_NUM)) { dbQuery("UPDATE `groupsX` SET `ID` = 100 WHERE `ID` = 2"); //park read-only dbQuery("UPDATE `usersX` SET `groupID` = 100 WHERE `groupID` = 2"); //idem dbQuery("UPDATE `groupsX` SET `ID` = 2 WHERE `ID` = 3"); //set admin to 2 dbQuery("UPDATE `usersX` SET `groupID` = 2 WHERE `groupID` = 3"); //idem dbQuery("UPDATE `groupsX` SET `ID` = 3 WHERE `ID` = 100"); //set parked to 3 dbQuery("UPDATE `usersX` SET `groupID` = 3 WHERE `groupID` = 100"); //idem } //events.checked: ;dd-mm-yyyya -> ;dd-mm-yyyy and drop ;dd-mm-yyyyb $stH = dbQuery("SELECT `ID`,`checked` FROM `eventsX` WHERE `checked` LIKE '%a%'"); while ($row = $stH->fetch(PDO::FETCH_ASSOC)) { $chBoxed = preg_replace(array('~;\d\d\d\d-\d\d-\d\db~','~(;\d\d\d\d-\d\d-\d\d)a~'),array('','$1'),$row['checked']); //drop ;dd-mm-yyyyb and trim a in ;dd-mm-yyyya dbQuery("UPDATE `eventsX` SET `checked`='{$chBoxed}' WHERE `ID` = {$row['ID']}"); } //events.sTime/eTime: truncate time to 00:00 $stH = dbQuery("SELECT `sTime` FROM `eventsX` LIMIT 1"); if ($row = $stH->fetch(PDO::FETCH_NUM)) { //column 'sTime' exists if (strlen($row[0]) > 5) { //truncate times dbQuery("UPDATE `eventsX` SET `sTime` = substr(`sTime`,1,5),`eTime` = substr(`eTime`,1,5)"); } } //events.aDateTime/mDateTime: truncate time to 00:00 $stH = dbQuery("SELECT `aDateTime` FROM `eventsX` LIMIT 1"); if ($row = $stH->fetch(PDO::FETCH_NUM)) { //column 'aDateTime' exists if (strlen($row[0]) > 16) { //truncate time dbQuery("UPDATE `eventsX` SET `aDateTime` = substr(`aDateTime`,1,16),`mDateTime` = substr(`mDateTime`,1,16)"); } if (strlen($row[0]) < 16) { //pad to yyyy-mm-dd 00:00 if ($dbType == 'SQLite') { //SQLite - solve MySQL incompatibilities dbQuery("UPDATE `eventsX` SET `aDateTime` = substr(`aDateTime`,1,10)||' 00:00',`mDateTime` = substr(`mDateTime`,1,10)||' 00:00'"); } else { dbQuery("UPDATE `eventsX` SET `aDateTime` = CONCAT(substr(`aDateTime`,1,10),' 00:00'),`mDateTime` = CONCAT(substr(`mDateTime`,1,10),' 00:00')"); } } } $stH = null; //release statement handle //drop original tables and rename new upgraded tables dbQuery("DROP TABLE `users`"); dbQuery("ALTER TABLE `usersX` RENAME TO `users`"); dbQuery("DROP TABLE `groups`"); dbQuery("ALTER TABLE `groupsX` RENAME TO `groups`"); dbQuery("DROP TABLE `categories`"); dbQuery("ALTER TABLE `categoriesX` RENAME TO `categories`"); dbQuery("DROP TABLE `events`"); dbQuery("ALTER TABLE `eventsX` RENAME TO `events`"); dbQuery("DROP TABLE `settings`"); dbQuery("ALTER TABLE `settingsX` RENAME TO `settings`"); dbQuery("DROP TABLE `styles`"); dbQuery("ALTER TABLE `stylesX` RENAME TO `styles`"); dbTransaction('commit'); return $lcVUpg; } ?>