lychee/php/modules/Database.php

270 lines
6.8 KiB
PHP
Raw Normal View History

2014-04-04 19:59:39 +00:00
<?php
###
# @name Database Module
# @author Tobias Reich
# @copyright 2014 by Tobias Reich
###
if (!defined('LYCHEE')) exit('Error: Direct access is not allowed!');
class Database extends Module {
static function connect($host = 'localhost', $user, $password, $name = 'lychee') {
# Check dependencies
Module::dependencies(isset($host, $user, $password, $name));
2014-04-04 19:59:39 +00:00
$database = new mysqli($host, $user, $password);
# Check connection
if ($database->connect_errno) exit('Error: ' . $database->connect_error);
# Avoid sql injection on older MySQL versions by using GBK
2014-04-04 19:59:39 +00:00
if ($database->server_version<50500) $database->set_charset('GBK');
else $database->set_charset("utf8");
2014-04-04 19:59:39 +00:00
# Check database
if (!$database->select_db($name))
if (!Database::createDatabase($database, $name)) exit('Error: Could not create database!');
# Check tables
$query = Database::prepare($database, 'SELECT * FROM ?, ?, ?, ? LIMIT 0', array(LYCHEE_TABLE_PHOTOS, LYCHEE_TABLE_ALBUMS, LYCHEE_TABLE_SETTINGS, LYCHEE_TABLE_LOG));
if (!$database->query($query))
2014-04-04 19:59:39 +00:00
if (!Database::createTables($database)) exit('Error: Could not create tables!');
return $database;
}
static function update($database, $dbName, $version = 0) {
2014-04-04 19:59:39 +00:00
# Check dependencies
Module::dependencies(isset($database, $dbName));
2014-04-05 16:30:24 +00:00
# List of updates
$updates = array(
'020100', #2.1
'020101', #2.1.1
'020200', #2.2
'020500', #2.5
'020505', #2.5.5
'020601', #2.6.1
'020602' #2.6.2
2014-04-05 16:30:24 +00:00
);
# For each update
foreach ($updates as $update) {
if (isset($version)&&$update<=$version) continue;
# Load update
2014-04-09 18:26:25 +00:00
include(__DIR__ . '/../database/update_' . $update . '.php');
2014-04-05 16:30:24 +00:00
}
return true;
}
static function createConfig($host = 'localhost', $user, $password, $name = 'lychee', $prefix = '') {
2014-04-05 16:30:24 +00:00
# Check dependencies
Module::dependencies(isset($host, $user, $password, $name));
2014-04-04 19:59:39 +00:00
$database = new mysqli($host, $user, $password);
if ($database->connect_errno) return 'Warning: Connection failed!';
# Check if database exists
if (!$database->select_db($name)) {
# Database doesn't exist
# Check if user can create a database
$result = $database->query('CREATE DATABASE lychee_dbcheck');
if (!$result) return 'Warning: Creation failed!';
else $database->query('DROP DATABASE lychee_dbcheck');
}
# Escape data
$host = mysqli_real_escape_string($database, $host);
$user = mysqli_real_escape_string($database, $user);
$password = mysqli_real_escape_string($database, $password);
$name = mysqli_real_escape_string($database, $name);
$prefix = mysqli_real_escape_string($database, $prefix);
# Save config.php
2014-04-04 19:59:39 +00:00
$config = "<?php
###
# @name Configuration
2014-04-04 19:59:39 +00:00
# @author Tobias Reich
# @copyright 2014 Tobias Reich
###
if(!defined('LYCHEE')) exit('Error: Direct access is not allowed!');
# Database configuration
\$dbHost = '$host'; # Host of the database
\$dbUser = '$user'; # Username of the database
\$dbPassword = '$password'; # Password of the database
\$dbName = '$name'; # Database name
\$dbTablePrefix = '$prefix'; # Table prefix
2014-04-04 19:59:39 +00:00
?>";
# Save file
if (file_put_contents(LYCHEE_CONFIG_FILE, $config)===false) return 'Warning: Could not create file!';
2014-04-04 19:59:39 +00:00
return true;
2014-04-04 19:59:39 +00:00
}
static function createDatabase($database, $name = 'lychee') {
# Check dependencies
Module::dependencies(isset($database, $name));
2014-04-04 19:59:39 +00:00
2014-04-05 16:30:24 +00:00
# Create database
2014-04-04 19:59:39 +00:00
$result = $database->query("CREATE DATABASE IF NOT EXISTS $name;");
$database->select_db($name);
if (!$database->select_db($name)||!$result) return false;
return true;
}
static function createTables($database) {
# Check dependencies
Module::dependencies(isset($database));
2014-04-04 19:59:39 +00:00
2014-05-06 19:22:56 +00:00
# Create log
$exist = Database::prepare($database, 'SELECT * FROM ? LIMIT 0', array(LYCHEE_TABLE_LOG));
if (!$database->query($exist)) {
2014-05-06 19:22:56 +00:00
# Read file
$file = __DIR__ . '/../database/log_table.sql';
$query = @file_get_contents($file);
if (!isset($query)||$query===false) return false;
# Create table
$query = Database::prepare($database, $query, array(LYCHEE_TABLE_LOG));
2014-05-06 19:22:56 +00:00
if (!$database->query($query)) return false;
}
2014-04-04 19:59:39 +00:00
# Create settings
$exist = Database::prepare($database, 'SELECT * FROM ? LIMIT 0', array(LYCHEE_TABLE_SETTINGS));
if (!$database->query($exist)) {
2014-04-04 19:59:39 +00:00
2014-04-05 16:30:24 +00:00
# Read file
2014-04-09 18:26:25 +00:00
$file = __DIR__ . '/../database/settings_table.sql';
$query = @file_get_contents($file);
2014-04-04 19:59:39 +00:00
2014-05-30 14:54:34 +00:00
if (!isset($query)||$query===false) {
Log::error($database, __METHOD__, __LINE__, 'Could not load query for lychee_settings');
return false;
}
# Create table
$query = Database::prepare($database, $query, array(LYCHEE_TABLE_SETTINGS));
2014-05-30 14:54:34 +00:00
if (!$database->query($query)) {
Log::error($database, __METHOD__, __LINE__, $database->error);
return false;
}
2014-04-04 19:59:39 +00:00
2014-04-05 16:30:24 +00:00
# Read file
2014-04-09 18:26:25 +00:00
$file = __DIR__ . '/../database/settings_content.sql';
$query = @file_get_contents($file);
2014-04-04 19:59:39 +00:00
2014-05-30 14:54:34 +00:00
if (!isset($query)||$query===false) {
Log::error($database, __METHOD__, __LINE__, 'Could not load content-query for lychee_settings');
return false;
}
# Add content
$query = Database::prepare($database, $query, array(LYCHEE_TABLE_SETTINGS));
2014-05-30 14:54:34 +00:00
if (!$database->query($query)) {
Log::error($database, __METHOD__, __LINE__, $database->error);
return false;
}
2014-04-04 19:59:39 +00:00
}
# Create albums
$exist = Database::prepare($database, 'SELECT * FROM ? LIMIT 0', array(LYCHEE_TABLE_ALBUMS));
if (!$database->query($exist)) {
2014-04-04 19:59:39 +00:00
2014-04-05 16:30:24 +00:00
# Read file
2014-04-09 18:26:25 +00:00
$file = __DIR__ . '/../database/albums_table.sql';
$query = @file_get_contents($file);
2014-04-04 19:59:39 +00:00
2014-05-30 14:54:34 +00:00
if (!isset($query)||$query===false) {
Log::error($database, __METHOD__, __LINE__, 'Could not load query for lychee_albums');
return false;
}
# Create table
$query = Database::prepare($database, $query, array(LYCHEE_TABLE_ALBUMS));
2014-05-30 14:54:34 +00:00
if (!$database->query($query)) {
Log::error($database, __METHOD__, __LINE__, $database->error);
return false;
}
2014-04-04 19:59:39 +00:00
}
# Create photos
$exist = Database::prepare($database, 'SELECT * FROM ? LIMIT 0', array(LYCHEE_TABLE_PHOTOS));
if (!$database->query($exist)) {
2014-04-04 19:59:39 +00:00
2014-04-05 16:30:24 +00:00
# Read file
2014-04-09 18:26:25 +00:00
$file = __DIR__ . '/../database/photos_table.sql';
$query = @file_get_contents($file);
2014-04-04 19:59:39 +00:00
2014-05-30 14:54:34 +00:00
if (!isset($query)||$query===false) {
Log::error($database, __METHOD__, __LINE__, 'Could not load query for lychee_photos');
return false;
}
# Create table
$query = Database::prepare($database, $query, array(LYCHEE_TABLE_PHOTOS));
2014-05-30 14:54:34 +00:00
if (!$database->query($query)) {
Log::error($database, __METHOD__, __LINE__, $database->error);
return false;
}
2014-04-04 19:59:39 +00:00
}
return true;
}
2014-08-29 17:12:35 +00:00
static function prepare($database, $query, $data) {
# Check dependencies
Module::dependencies(isset($database, $query, $data));
foreach ($data as $value) {
# Escape
$value = mysqli_real_escape_string($database, $value);
# Replace
$query = preg_replace('/\?/', $value, $query, 1);
}
# Add semicolon at the end
$query .= ';';
return $query;
}
2014-04-04 19:59:39 +00:00
}
?>