2020-10-14 18:20:44 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/*
|
2022-01-14 19:45:30 +00:00
|
|
|
This file is a part of myTinyTodo.
|
|
|
|
|
(C) Copyright 2009-2011,2020-2022 Max Pozdeev <maxpozdeev@gmail.com>
|
|
|
|
|
Licensed under the GNU GPL version 2 or any later. See file COPYRIGHT for details.
|
2020-10-14 18:20:44 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
set_exception_handler('myExceptionHandler');
|
|
|
|
|
|
2022-01-12 18:26:50 +00:00
|
|
|
# Check old config file
|
2020-10-14 18:20:44 +00:00
|
|
|
require_once('./db/config.php');
|
2021-07-26 19:04:12 +00:00
|
|
|
if (!isset($config['db']))
|
2020-10-14 18:20:44 +00:00
|
|
|
{
|
|
|
|
|
if(isset($config['mysql'])) {
|
|
|
|
|
$config['db'] = 'mysql';
|
|
|
|
|
$config['mysql.host'] = $config['mysql'][0];
|
|
|
|
|
$config['mysql.db'] = $config['mysql'][3];
|
|
|
|
|
$config['mysql.user'] = $config['mysql'][1];
|
|
|
|
|
$config['mysql.password'] = $config['mysql'][2];
|
|
|
|
|
} else {
|
|
|
|
|
$config['db'] = 'sqlite';
|
|
|
|
|
}
|
|
|
|
|
if(isset($config['allow']) && $config['allow'] == 'read') $config['allowread'] = 1;
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-26 19:04:12 +00:00
|
|
|
if ($config['db'] != '')
|
2020-10-14 18:20:44 +00:00
|
|
|
{
|
2021-07-28 15:05:14 +00:00
|
|
|
require_once('./includes/class.config.php');
|
|
|
|
|
Config::$noDatabase = true; //will not load settings from database in init.php
|
|
|
|
|
|
2020-10-14 18:20:44 +00:00
|
|
|
require_once('./init.php');
|
|
|
|
|
if ( !is_logged() )
|
|
|
|
|
{
|
|
|
|
|
die("Access denied!<br> Disable password protection or Log in.");
|
|
|
|
|
}
|
2021-07-26 16:13:57 +00:00
|
|
|
$db = DBConnection::instance();
|
2020-10-14 18:20:44 +00:00
|
|
|
$dbtype = (strtolower(get_class($db)) == 'database_mysql') ? 'mysql' : 'sqlite';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2021-07-26 19:04:12 +00:00
|
|
|
if (!defined('MTTPATH')) define('MTTPATH', dirname(__FILE__) .'/');
|
|
|
|
|
if (!defined('MTTINC')) define('MTTINC', MTTPATH. 'includes/');
|
2020-10-14 18:20:44 +00:00
|
|
|
require_once(MTTINC. 'common.php');
|
2021-07-26 19:04:12 +00:00
|
|
|
require_once(MTTINC. 'class.dbconnection.php');
|
2021-07-25 16:20:24 +00:00
|
|
|
require_once(MTTINC. 'class.config.php');
|
2021-07-28 15:05:14 +00:00
|
|
|
Config::$noDatabase = true;
|
|
|
|
|
Config::loadDbConfig($config);
|
2020-10-14 18:20:44 +00:00
|
|
|
unset($config);
|
|
|
|
|
|
2021-07-26 16:13:57 +00:00
|
|
|
$db = null;
|
2020-10-14 18:20:44 +00:00
|
|
|
$dbtype = '';
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-28 15:05:14 +00:00
|
|
|
$lastVer = '1.7';
|
2020-10-14 18:20:44 +00:00
|
|
|
echo '<html><head><meta name="robots" content="noindex,nofollow"><title>myTinyTodo @VERSION Setup</title></head><body>';
|
|
|
|
|
echo "<big><b>myTinyTodo @VERSION Setup</b></big><br><br>";
|
|
|
|
|
|
|
|
|
|
# determine current installed version
|
2021-07-28 15:05:14 +00:00
|
|
|
$ver = $db ? get_ver($db, $dbtype) : '';
|
2020-10-14 18:20:44 +00:00
|
|
|
|
2021-07-26 19:04:12 +00:00
|
|
|
if (!$ver)
|
2020-10-14 18:20:44 +00:00
|
|
|
{
|
2022-01-12 21:08:26 +00:00
|
|
|
if (!isset($_POST['installdb']) && !isset($_POST['install']) && $db !== null)
|
2020-10-14 18:20:44 +00:00
|
|
|
{
|
2022-01-12 21:08:26 +00:00
|
|
|
# We already have settings file and need to create tables.
|
|
|
|
|
exitMessage("<form method=post>Click next to create tables in '". htmlspecialchars($dbtype). "' database.<br><br>
|
|
|
|
|
<input type=hidden name=install value=db><input type=submit value=' Next '></form>");
|
|
|
|
|
}
|
|
|
|
|
else if (!isset($_POST['installdb']) && !isset($_POST['install']))
|
|
|
|
|
{
|
2022-01-12 21:20:47 +00:00
|
|
|
# Specify database type and connection settings to save.
|
2020-10-14 18:20:44 +00:00
|
|
|
exitMessage("<form method=post>Select database type to use:<br><br>
|
|
|
|
|
<label><input type=radio name=installdb value=sqlite checked=checked onclick=\"document.getElementById('mysqlsettings').style.display='none'\">SQLite</label><br><br>
|
|
|
|
|
<label><input type=radio name=installdb value=mysql onclick=\"document.getElementById('mysqlsettings').style.display=''\">MySQL</label><br>
|
|
|
|
|
<div id='mysqlsettings' style='display:none; margin-left:30px;'><br><table><tr><td>Host:</td><td><input name=mysql_host value=localhost></td></tr>
|
|
|
|
|
<tr><td>Database:</td><td><input name=mysql_db value=mytinytodo></td></tr>
|
|
|
|
|
<tr><td>User:</td><td><input name=mysql_user value=user></td></tr>
|
|
|
|
|
<tr><td>Password:</td><td><input type=password name=mysql_password></td></tr>
|
|
|
|
|
<tr><td>Table prefix:</td><td><input name=prefix value=\"mtt_\"></td></tr>
|
|
|
|
|
</table></div><br><input type=submit value=' Next '></form>");
|
|
|
|
|
}
|
|
|
|
|
elseif(isset($_POST['installdb']))
|
|
|
|
|
{
|
|
|
|
|
# Save configuration
|
|
|
|
|
$dbtype = ($_POST['installdb'] == 'mysql') ? 'mysql' : 'sqlite';
|
|
|
|
|
Config::set('db', $dbtype);
|
|
|
|
|
if($dbtype == 'mysql') {
|
|
|
|
|
Config::set('mysql.host', _post('mysql_host'));
|
|
|
|
|
Config::set('mysql.db', _post('mysql_db'));
|
|
|
|
|
Config::set('mysql.user', _post('mysql_user'));
|
|
|
|
|
Config::set('mysql.password', _post('mysql_password'));
|
|
|
|
|
Config::set('prefix', trim(_post('prefix')));
|
|
|
|
|
}
|
|
|
|
|
if(!testConnect($error)) {
|
2021-09-20 11:30:12 +00:00
|
|
|
exitMessage("Database connection error: ". htmlspecialchars($error));
|
2020-10-14 18:20:44 +00:00
|
|
|
}
|
|
|
|
|
if(!is_writable('./db/config.php')) {
|
|
|
|
|
exitMessage("Config file ('db/config.php') is not writable.");
|
|
|
|
|
}
|
2021-07-28 15:05:14 +00:00
|
|
|
Config::saveDbConfig();
|
2020-10-14 18:20:44 +00:00
|
|
|
exitMessage("This will create myTinyTodo database <form method=post><input type=hidden name=install value=1><input type=submit value=' Install '></form>");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# install database
|
|
|
|
|
if($dbtype == 'mysql')
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}lists (
|
|
|
|
|
`id` INT UNSIGNED NOT NULL auto_increment,
|
|
|
|
|
`uuid` CHAR(36) NOT NULL default '',
|
|
|
|
|
`ow` INT NOT NULL default 0,
|
|
|
|
|
`name` VARCHAR(50) NOT NULL default '',
|
|
|
|
|
`d_created` INT UNSIGNED NOT NULL default 0,
|
|
|
|
|
`d_edited` INT UNSIGNED NOT NULL default 0,
|
|
|
|
|
`sorting` TINYINT UNSIGNED NOT NULL default 0,
|
|
|
|
|
`published` TINYINT UNSIGNED NOT NULL default 0,
|
|
|
|
|
`taskview` INT UNSIGNED NOT NULL default 0,
|
|
|
|
|
PRIMARY KEY(`id`),
|
|
|
|
|
UNIQUE KEY(`uuid`)
|
2021-07-28 15:50:23 +00:00
|
|
|
) CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci ");
|
2020-10-14 18:20:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}todolist (
|
|
|
|
|
`id` INT UNSIGNED NOT NULL auto_increment,
|
|
|
|
|
`uuid` CHAR(36) NOT NULL default '',
|
|
|
|
|
`list_id` INT UNSIGNED NOT NULL default 0,
|
|
|
|
|
`d_created` INT UNSIGNED NOT NULL default 0, /* time() timestamp */
|
|
|
|
|
`d_completed` INT UNSIGNED NOT NULL default 0, /* time() timestamp */
|
|
|
|
|
`d_edited` INT UNSIGNED NOT NULL default 0, /* time() timestamp */
|
|
|
|
|
`compl` TINYINT UNSIGNED NOT NULL default 0,
|
|
|
|
|
`title` VARCHAR(250) NOT NULL,
|
|
|
|
|
`note` TEXT,
|
|
|
|
|
`prio` TINYINT NOT NULL default 0, /* priority -,0,+ */
|
|
|
|
|
`ow` INT NOT NULL default 0, /* order weight */
|
|
|
|
|
`tags` VARCHAR(600) NOT NULL default '', /* for fast access to task tags */
|
|
|
|
|
`tags_ids` VARCHAR(250) NOT NULL default '', /* no more than 22 tags (x11 chars) */
|
|
|
|
|
`duedate` DATE default NULL,
|
|
|
|
|
PRIMARY KEY(`id`),
|
|
|
|
|
KEY(`list_id`),
|
|
|
|
|
UNIQUE KEY(`uuid`)
|
2021-07-28 15:50:23 +00:00
|
|
|
) CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci ");
|
2020-10-14 18:20:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}tags (
|
|
|
|
|
`id` INT UNSIGNED NOT NULL auto_increment,
|
|
|
|
|
`name` VARCHAR(50) NOT NULL,
|
|
|
|
|
PRIMARY KEY(`id`),
|
|
|
|
|
UNIQUE KEY `name` (`name`)
|
2021-07-28 15:50:23 +00:00
|
|
|
) CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci ");
|
2020-10-14 18:20:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}tag2task (
|
|
|
|
|
`tag_id` INT UNSIGNED NOT NULL,
|
|
|
|
|
`task_id` INT UNSIGNED NOT NULL,
|
|
|
|
|
`list_id` INT UNSIGNED NOT NULL,
|
|
|
|
|
KEY(`tag_id`),
|
|
|
|
|
KEY(`task_id`),
|
|
|
|
|
KEY(`list_id`) /* for tagcloud */
|
2021-07-28 15:50:23 +00:00
|
|
|
) CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci ");
|
2020-10-14 18:20:44 +00:00
|
|
|
|
|
|
|
|
|
2021-07-28 15:05:14 +00:00
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}settings (
|
|
|
|
|
`param_key` VARCHAR(100) NOT NULL default '',
|
|
|
|
|
`param_value` TEXT,
|
|
|
|
|
UNIQUE KEY `param_key` (`param_key`)
|
2021-07-28 15:15:29 +00:00
|
|
|
) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ");
|
2021-07-28 15:05:14 +00:00
|
|
|
|
2021-07-29 13:52:44 +00:00
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}sessions (
|
|
|
|
|
`id` VARCHAR(64) NOT NULL default '', /* upto 64 bytes for sha256 */
|
|
|
|
|
`data` TEXT,
|
|
|
|
|
`last_access` INT UNSIGNED NOT NULL default 0, /* time() timestamp */
|
|
|
|
|
`expires` INT UNSIGNED NOT NULL default 0, /* time() timestamp */
|
|
|
|
|
UNIQUE KEY `id` (`id`)
|
|
|
|
|
) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ");
|
|
|
|
|
|
|
|
|
|
|
2020-10-14 18:20:44 +00:00
|
|
|
} catch (Exception $e) {
|
|
|
|
|
exitMessage("<b>Error:</b> ". htmlarray($e->getMessage()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else #sqlite
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}lists (
|
|
|
|
|
id INTEGER PRIMARY KEY,
|
|
|
|
|
uuid CHAR(36) NOT NULL,
|
|
|
|
|
ow INTEGER NOT NULL default 0,
|
|
|
|
|
name VARCHAR(50) NOT NULL,
|
|
|
|
|
d_created INTEGER UNSIGNED NOT NULL default 0,
|
|
|
|
|
d_edited INTEGER UNSIGNED NOT NULL default 0,
|
|
|
|
|
sorting TINYINT UNSIGNED NOT NULL default 0,
|
|
|
|
|
published TINYINT UNSIGNED NOT NULL default 0,
|
|
|
|
|
taskview INTEGER UNSIGNED NOT NULL default 0
|
|
|
|
|
) ");
|
|
|
|
|
|
|
|
|
|
$db->ex("CREATE UNIQUE INDEX lists_uuid ON {$db->prefix}lists (uuid)");
|
|
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}todolist (
|
|
|
|
|
id INTEGER PRIMARY KEY,
|
|
|
|
|
uuid CHAR(36) NOT NULL,
|
|
|
|
|
list_id INTEGER UNSIGNED NOT NULL default 0,
|
|
|
|
|
d_created INTEGER UNSIGNED NOT NULL default 0,
|
|
|
|
|
d_completed INTEGER UNSIGNED NOT NULL default 0,
|
|
|
|
|
d_edited INTEGER UNSIGNED NOT NULL default 0,
|
|
|
|
|
compl TINYINT UNSIGNED NOT NULL default 0,
|
|
|
|
|
title VARCHAR(250) NOT NULL,
|
|
|
|
|
note TEXT,
|
|
|
|
|
prio TINYINT NOT NULL default 0,
|
|
|
|
|
ow INTEGER NOT NULL default 0,
|
|
|
|
|
tags VARCHAR(600) NOT NULL default '',
|
|
|
|
|
tags_ids VARCHAR(250) NOT NULL default '',
|
|
|
|
|
duedate DATE default NULL
|
|
|
|
|
) ");
|
|
|
|
|
$db->ex("CREATE INDEX todo_list_id ON {$db->prefix}todolist (list_id)");
|
|
|
|
|
$db->ex("CREATE UNIQUE INDEX todo_uuid ON {$db->prefix}todolist (uuid)");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}tags (
|
|
|
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
|
|
name VARCHAR(50) NOT NULL COLLATE NOCASE
|
|
|
|
|
) ");
|
|
|
|
|
$db->ex("CREATE UNIQUE INDEX tags_name ON {$db->prefix}tags (name COLLATE NOCASE)");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}tag2task (
|
|
|
|
|
tag_id INTEGER NOT NULL,
|
|
|
|
|
task_id INTEGER NOT NULL,
|
|
|
|
|
list_id INTEGER NOT NULL
|
|
|
|
|
) ");
|
|
|
|
|
$db->ex("CREATE INDEX tag2task_tag_id ON {$db->prefix}tag2task (tag_id)");
|
|
|
|
|
$db->ex("CREATE INDEX tag2task_task_id ON {$db->prefix}tag2task (task_id)");
|
|
|
|
|
$db->ex("CREATE INDEX tag2task_list_id ON {$db->prefix}tag2task (list_id)"); /* for tagcloud */
|
|
|
|
|
|
2021-07-28 15:05:14 +00:00
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}settings (
|
|
|
|
|
param_key VARCHAR(100) NOT NULL default '',
|
|
|
|
|
param_value TEXT
|
|
|
|
|
) ");
|
|
|
|
|
|
|
|
|
|
$db->ex("CREATE UNIQUE INDEX settings_key ON {$db->prefix}settings (param_key COLLATE NOCASE)");
|
|
|
|
|
|
2021-07-29 13:52:44 +00:00
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}sessions (
|
|
|
|
|
id VARCHAR(64) NOT NULL default '',
|
|
|
|
|
data TEXT,
|
|
|
|
|
last_access INTEGER UNSIGNED NOT NULL default 0,
|
|
|
|
|
expires INTEGER UNSIGNED NOT NULL default 0
|
|
|
|
|
) ");
|
|
|
|
|
|
|
|
|
|
$db->ex("CREATE UNIQUE INDEX sessions_id ON {$db->prefix}sessions (id COLLATE NOCASE)");
|
|
|
|
|
|
2020-10-14 18:20:44 +00:00
|
|
|
} catch (Exception $e) {
|
|
|
|
|
exitMessage("<b>Error:</b> ". htmlarray($e->getMessage()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# create default list
|
|
|
|
|
$db->ex( "INSERT INTO {$db->prefix}lists (uuid,name,d_created,taskview) VALUES (?,?,?,?)", array(generateUUID(), 'Todo', time(), 1) );
|
|
|
|
|
|
2021-07-28 15:05:14 +00:00
|
|
|
Config::save();
|
|
|
|
|
Config::saveDbConfig();
|
2020-10-14 18:20:44 +00:00
|
|
|
}
|
|
|
|
|
elseif($ver == $lastVer)
|
|
|
|
|
{
|
|
|
|
|
exitMessage("Installed version does not require database update.");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2022-01-12 18:26:50 +00:00
|
|
|
if (!in_array($ver, array('1.4'))) {
|
2021-09-20 11:30:12 +00:00
|
|
|
exitMessage(htmlspecialchars("Can not update. Unsupported database version ($ver)."));
|
2020-10-14 18:20:44 +00:00
|
|
|
}
|
2022-01-12 18:26:50 +00:00
|
|
|
if (!isset($_POST['update'])) {
|
2021-09-20 11:30:12 +00:00
|
|
|
exitMessage(htmlspecialchars("Update database v$ver to v$lastVer"). "<br><br>
|
2022-01-12 18:26:50 +00:00
|
|
|
<form name=frm method=post><input type=hidden name=update value=1><input type=submit value=' Update '></form>");
|
2020-10-14 18:20:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# update process
|
2021-07-28 15:05:14 +00:00
|
|
|
if ($ver == '1.4')
|
|
|
|
|
{
|
|
|
|
|
update_14_17($db, $dbtype);
|
|
|
|
|
}
|
2020-10-14 18:20:44 +00:00
|
|
|
}
|
|
|
|
|
echo "Done<br><br> <b>Attention!</b> Delete this file for security reasons.";
|
|
|
|
|
printFooter();
|
|
|
|
|
|
|
|
|
|
|
2021-07-26 16:13:57 +00:00
|
|
|
function get_ver(Database_Abstract $db, $dbtype)
|
2020-10-14 18:20:44 +00:00
|
|
|
{
|
2021-07-28 18:11:52 +00:00
|
|
|
if ( !$db || $dbtype == '' ) return '';
|
|
|
|
|
if ( !$db->tableExists($db->prefix.'todolist') ) return '';
|
2020-10-14 18:20:44 +00:00
|
|
|
$v = '1.0';
|
2021-07-28 18:11:52 +00:00
|
|
|
if ( !$db->tableExists($db->prefix.'tags') ) return $v;
|
2020-10-14 18:20:44 +00:00
|
|
|
$v = '1.1';
|
2021-07-28 18:11:52 +00:00
|
|
|
if ( !db_has_field($dbtype, $db, $db->prefix.'todolist', 'duedate') ) return $v;
|
2020-10-14 18:20:44 +00:00
|
|
|
$v = '1.2';
|
2021-07-28 18:11:52 +00:00
|
|
|
if ( !$db->tableExists($db->prefix.'lists') ) return $v;
|
2020-10-14 18:20:44 +00:00
|
|
|
$v = '1.3.0';
|
2021-07-28 18:11:52 +00:00
|
|
|
if ( !db_has_field($dbtype, $db, $db->prefix.'todolist', 'd_completed') ) return $v;
|
2020-10-14 18:20:44 +00:00
|
|
|
$v = '1.3.1';
|
2021-07-28 18:11:52 +00:00
|
|
|
if ( !db_has_field($dbtype, $db, $db->prefix.'todolist', 'd_edited') ) return $v;
|
2020-10-14 18:20:44 +00:00
|
|
|
$v = '1.4';
|
2021-07-28 18:11:52 +00:00
|
|
|
if ( !$db->tableExists($db->prefix.'settings') ) return $v;
|
2021-07-28 15:05:14 +00:00
|
|
|
$v = '1.7';
|
2020-10-14 18:20:44 +00:00
|
|
|
return $v;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function exitMessage($s)
|
|
|
|
|
{
|
|
|
|
|
echo $s;
|
|
|
|
|
printFooter();
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function printFooter()
|
|
|
|
|
{
|
|
|
|
|
echo "</body></html>";
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-28 18:11:52 +00:00
|
|
|
function db_has_field($dbtype, Database_Abstract $db, $table, $field)
|
|
|
|
|
{
|
|
|
|
|
if ($dbtype == 'mysql') return has_field_mysql($db, $table, $field);
|
|
|
|
|
elseif ($dbtype == 'sqlite') return has_field_sqlite($db, $table, $field);
|
|
|
|
|
else throw new Exception("Unexpected database type");
|
|
|
|
|
}
|
2020-10-14 18:20:44 +00:00
|
|
|
|
2021-07-26 16:13:57 +00:00
|
|
|
function has_field_sqlite(Database_Abstract $db, $table, $field)
|
2020-10-14 18:20:44 +00:00
|
|
|
{
|
|
|
|
|
$q = $db->dq("PRAGMA table_info(". $db->quote($table). ")");
|
2021-07-26 16:13:57 +00:00
|
|
|
while($r = $q->fetchRow()) {
|
2020-10-14 18:20:44 +00:00
|
|
|
if($r[1] == $field) return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-26 16:13:57 +00:00
|
|
|
function has_field_mysql(Database_Abstract $db, $table, $field)
|
2020-10-14 18:20:44 +00:00
|
|
|
{
|
|
|
|
|
$q = $db->dq("DESCRIBE `$table`");
|
2021-07-26 16:13:57 +00:00
|
|
|
while($r = $q->fetchRow()) {
|
2020-10-14 18:20:44 +00:00
|
|
|
if($r[0] == $field) return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function testConnect(&$error)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if(Config::get('db') == 'mysql')
|
|
|
|
|
{
|
2021-07-24 21:10:27 +00:00
|
|
|
if (defined('PDO::MYSQL_ATTR_FOUND_ROWS')) {
|
|
|
|
|
require_once(MTTINC. 'class.db.mysql.php');
|
|
|
|
|
Config::set('mysqli', 0);
|
2021-06-27 12:39:53 +00:00
|
|
|
}
|
2021-07-24 21:10:27 +00:00
|
|
|
else if (function_exists("mysqli_connect")) {
|
|
|
|
|
require_once(MTTINC. 'class.db.mysqli.php');
|
|
|
|
|
Config::set('mysqli', 1);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$text = "Required PHP extension 'PDO mysql' is not installed.";
|
|
|
|
|
throw new Exception($text);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-14 18:20:44 +00:00
|
|
|
$db = new Database_Mysql;
|
2021-07-26 16:13:57 +00:00
|
|
|
$db->connect(array(
|
|
|
|
|
'host' => Config::get('mysql.host'),
|
|
|
|
|
'user' => Config::get('mysql.user'),
|
|
|
|
|
'password' => Config::get('mysql.password'),
|
|
|
|
|
'db' => Config::get('mysql.db')
|
|
|
|
|
));
|
2021-07-24 21:10:27 +00:00
|
|
|
}
|
|
|
|
|
else
|
2020-10-14 18:20:44 +00:00
|
|
|
{
|
|
|
|
|
if(false === $f = @fopen(MTTPATH. 'db/todolist.db', 'a+')) throw new Exception("database file is not readable/writable");
|
|
|
|
|
else fclose($f);
|
|
|
|
|
|
|
|
|
|
if(!is_writable(MTTPATH. 'db/')) throw new Exception("database directory ('db') is not writable");
|
|
|
|
|
|
|
|
|
|
require_once(MTTINC. 'class.db.sqlite3.php');
|
|
|
|
|
$db = new Database_Sqlite3;
|
2021-07-26 16:13:57 +00:00
|
|
|
$db->connect( array( 'filename' => MTTPATH. 'db/todolist.db' ) );
|
2020-10-14 18:20:44 +00:00
|
|
|
}
|
|
|
|
|
} catch(Exception $e) {
|
|
|
|
|
$error = $e->getMessage();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-20 11:30:12 +00:00
|
|
|
function debugExceptionHandler($e)
|
|
|
|
|
{
|
|
|
|
|
echo '<br><b>Error:</b> \''. htmlspecialchars($e->getMessage()) .'\' in <i>'. htmlspecialchars($e->getFile() .':'. $e->getLine()). '</i>'.
|
|
|
|
|
"\n<pre>". htmlspecialchars($e->getTraceAsString()) . "</pre>\n";
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-14 18:20:44 +00:00
|
|
|
function myExceptionHandler($e)
|
|
|
|
|
{
|
2021-09-20 11:30:12 +00:00
|
|
|
echo '<br><b>Error:</b> '. htmlspecialchars($e->getMessage()) ;
|
2020-10-14 18:20:44 +00:00
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2021-07-28 15:05:14 +00:00
|
|
|
### update v1.4 to v1.7 ##########
|
|
|
|
|
function update_14_17(Database_Abstract $db, $dbtype)
|
|
|
|
|
{
|
|
|
|
|
$db->ex("BEGIN");
|
2021-07-29 13:52:44 +00:00
|
|
|
|
2021-07-28 15:05:14 +00:00
|
|
|
if($dbtype=='mysql')
|
|
|
|
|
{
|
2021-07-28 15:50:23 +00:00
|
|
|
# convert charset to utf8mb4
|
|
|
|
|
|
|
|
|
|
$db->ex("ALTER TABLE {$db->prefix}lists CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
|
|
|
|
|
$db->ex("ALTER TABLE {$db->prefix}todolist CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
|
|
|
|
|
$db->ex("ALTER TABLE {$db->prefix}tags CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
|
|
|
|
|
$db->ex("ALTER TABLE {$db->prefix}tag2task CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
|
|
|
|
|
|
|
|
|
|
# create settings table
|
|
|
|
|
|
2021-07-28 15:05:14 +00:00
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}settings (
|
|
|
|
|
`param_key` VARCHAR(100) NOT NULL default '',
|
|
|
|
|
`param_value` TEXT,
|
|
|
|
|
UNIQUE KEY `param_key` (`param_key`)
|
2021-07-28 15:15:29 +00:00
|
|
|
) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ");
|
2021-07-29 13:52:44 +00:00
|
|
|
|
|
|
|
|
# create sessions table
|
|
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}sessions (
|
|
|
|
|
`id` VARCHAR(64) NOT NULL default '',
|
|
|
|
|
`data` TEXT,
|
|
|
|
|
`last_access` INT UNSIGNED NOT NULL default 0,
|
|
|
|
|
`expires` INT UNSIGNED NOT NULL default 0,
|
|
|
|
|
UNIQUE KEY `id` (`id`)
|
|
|
|
|
) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ");
|
|
|
|
|
|
2021-07-28 15:05:14 +00:00
|
|
|
}
|
2021-07-28 15:50:23 +00:00
|
|
|
|
2021-07-28 15:05:14 +00:00
|
|
|
else #sqlite
|
|
|
|
|
{
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}settings (
|
|
|
|
|
param_key VARCHAR(100) NOT NULL default '',
|
|
|
|
|
param_value TEXT
|
|
|
|
|
) ");
|
|
|
|
|
$db->ex("CREATE UNIQUE INDEX settings_key ON {$db->prefix}settings (param_key COLLATE NOCASE)");
|
2021-07-29 13:52:44 +00:00
|
|
|
|
|
|
|
|
# sessions
|
|
|
|
|
|
|
|
|
|
$db->ex(
|
|
|
|
|
"CREATE TABLE {$db->prefix}sessions (
|
|
|
|
|
id VARCHAR(100) NOT NULL default '',
|
|
|
|
|
data TEXT,
|
|
|
|
|
last_access INTEGER UNSIGNED NOT NULL default 0,
|
|
|
|
|
expires INTEGER UNSIGNED NOT NULL default 0
|
|
|
|
|
) ");
|
|
|
|
|
|
|
|
|
|
$db->ex("CREATE UNIQUE INDEX sessions_id ON {$db->prefix}sessions (id COLLATE NOCASE)");
|
2021-07-28 15:05:14 +00:00
|
|
|
}
|
2021-07-29 13:52:44 +00:00
|
|
|
|
2021-07-28 15:05:14 +00:00
|
|
|
$db->ex("COMMIT");
|
|
|
|
|
|
|
|
|
|
Config::save();
|
|
|
|
|
Config::saveDbConfig();
|
|
|
|
|
}
|
|
|
|
|
### end of 1.7 #####
|