<FAT> Removed lightdb + database
This commit is contained in:
parent
3485e74805
commit
bd0ed3df23
|
@ -3,6 +3,10 @@
|
||||||
use \service\Updater;
|
use \service\Updater;
|
||||||
debug();
|
debug();
|
||||||
|
|
||||||
|
if( !isset($argv[1]) )
|
||||||
|
die("Missing argument (server url)\n");
|
||||||
|
|
||||||
|
$_SERVER = [ 'SERVER_NAME' => $argv[1] ];
|
||||||
$upd = new Updater();
|
$upd = new Updater();
|
||||||
|
|
||||||
$upd->update();
|
$upd->update();
|
||||||
|
|
|
@ -0,0 +1,180 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace database\core;
|
||||||
|
use \error\core\Error;
|
||||||
|
use \error\core\Err;
|
||||||
|
|
||||||
|
|
||||||
|
class DatabaseDriver{
|
||||||
|
|
||||||
|
/* STATIC ATTRIBUTES */
|
||||||
|
private static function conf(){
|
||||||
|
// YOUR CONFIGURATION BEHIND
|
||||||
|
$path = __CONFIG__.'/database-driver.json';
|
||||||
|
|
||||||
|
/* (1) Checks the file */
|
||||||
|
if( !is_file($path) )
|
||||||
|
return [];
|
||||||
|
|
||||||
|
/* (2) Checks json */
|
||||||
|
$parsed = json_decode( file_get_contents($path), true );
|
||||||
|
|
||||||
|
if( !is_array($parsed) )
|
||||||
|
return [];
|
||||||
|
|
||||||
|
/* (3) Returns configuration */
|
||||||
|
return $parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static $path; // Databases configurations files
|
||||||
|
private static $config; // PDO configurations
|
||||||
|
private static $instance = []; // Database driver instance list
|
||||||
|
|
||||||
|
public $error;
|
||||||
|
|
||||||
|
/* ATTRIBUTES */
|
||||||
|
private $host;
|
||||||
|
private $dbname;
|
||||||
|
private $username;
|
||||||
|
private $password;
|
||||||
|
private $pdo;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* CONSTRUCTOR OF A DATABASE DRIVER
|
||||||
|
*
|
||||||
|
* @host<String> Database Server's host
|
||||||
|
* @dbname<String> Database name
|
||||||
|
* @username<String> Database username
|
||||||
|
* @password<String> Database password
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private function __construct($host, $dbname, $username, $password){
|
||||||
|
/* (2) Stores configuration */
|
||||||
|
$this->host = $host;
|
||||||
|
$this->dbname = $dbname;
|
||||||
|
$this->username = $username;
|
||||||
|
$this->password = $password;
|
||||||
|
|
||||||
|
try{
|
||||||
|
|
||||||
|
$this->pdo = new \PDO('mysql:host='.$this->host.';dbname='.$this->dbname, $this->username, $this->password);
|
||||||
|
$this->pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
// On signale que tout s'est bien passe
|
||||||
|
$this->error = new Error(Err::Success);
|
||||||
|
|
||||||
|
}catch(Exception $e){
|
||||||
|
// On signale qu'il y a une erreur
|
||||||
|
$this->error = new Error(Err::PDOConnection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************
|
||||||
|
**** Multiton Management (static) ****
|
||||||
|
************************************************/
|
||||||
|
|
||||||
|
/* ADDS A NEW CONNECTION
|
||||||
|
*
|
||||||
|
* @label<String> [optional] Database Label
|
||||||
|
*
|
||||||
|
* @return status<Boolean> If added successfully
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static function add($label=null){
|
||||||
|
$conf = self::conf();
|
||||||
|
|
||||||
|
/* [1] Default values
|
||||||
|
=========================================================*/
|
||||||
|
/* (1) If label isn't given */
|
||||||
|
is_null($label) && ($label = 'default');
|
||||||
|
|
||||||
|
/* (2) If label and no path */
|
||||||
|
if( $label !== 'default' && !isset($conf[$label]) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
|
||||||
|
/* [3] Instanciates the driver
|
||||||
|
=========================================================*/
|
||||||
|
try{
|
||||||
|
|
||||||
|
/* (1) If local -> instanciates with local configuration */
|
||||||
|
if( !checkdnsrr($_SERVER['SERVER_NAME'], 'NS') )
|
||||||
|
self::$instance[$label] = new DatabaseDriver($conf[$label]['local']['host'], $conf[$label]['local']['dbname'], $conf[$label]['local']['user'], $conf[$label]['local']['password']);
|
||||||
|
/* (2) If Remote -> instanciates with Remote configuration */
|
||||||
|
else
|
||||||
|
self::$instance[$label] = new DatabaseDriver($conf[$label]['remote']['host'], $conf[$label]['remote']['dbname'], $conf[$label]['remote']['user'], $conf[$label]['remote']['password']);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}catch(\Exception $e){
|
||||||
|
|
||||||
|
/* (3) If fails */
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* GET A DATABASE DRIVER INSTANCE
|
||||||
|
*
|
||||||
|
* @label<String> [optional] Driver's label
|
||||||
|
*
|
||||||
|
* @return driver<Database> Multiton
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function get($label=null){
|
||||||
|
$conf = self::conf();
|
||||||
|
|
||||||
|
/* [1] Checks arguments
|
||||||
|
=========================================================*/
|
||||||
|
/* (1) Label default value */
|
||||||
|
is_null($label) && ($label = 'default');
|
||||||
|
|
||||||
|
/* (2) If no label, or unknown label */
|
||||||
|
if( is_null($label) || !isset(self::$instance[$label]) ){
|
||||||
|
|
||||||
|
/* (2.1) Try to add the configuration if exists */
|
||||||
|
if( isset($conf[$label]) ){
|
||||||
|
self::add($label);
|
||||||
|
return self::get($label);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
throw new \Exception('Database @label is incorrect.');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* [2] Returns instance
|
||||||
|
=========================================================*/
|
||||||
|
return self::$instance[$label];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** retourne la connection statique
|
||||||
|
* @param null $label
|
||||||
|
* @return \PDO
|
||||||
|
*/
|
||||||
|
public static function getPDO($label=null){
|
||||||
|
$instance = self::get($label);
|
||||||
|
|
||||||
|
return $instance->pdo;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getConfig(){
|
||||||
|
return [
|
||||||
|
'host' => $this->host,
|
||||||
|
'dbname' => $this->dbname,
|
||||||
|
'username' => $this->username
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
|
@ -0,0 +1,109 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
namespace error\core;
|
||||||
|
|
||||||
|
|
||||||
|
class Err{
|
||||||
|
/* [1] Success
|
||||||
|
=========================================================*/
|
||||||
|
const Success = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/* [2] Fichiers / Ressources
|
||||||
|
=========================================================*/
|
||||||
|
/* (1) Parsage json/xml */
|
||||||
|
const ParsingFailed = 1;
|
||||||
|
/* (2) Fichier inexistant */
|
||||||
|
const UnreachableResource = 2;
|
||||||
|
/* (3) Erreur d'upload */
|
||||||
|
const UploadError = 3;
|
||||||
|
/* (4) Mauvais format de fichier */
|
||||||
|
const FormatError = 4;
|
||||||
|
|
||||||
|
|
||||||
|
/* [3] Permissions
|
||||||
|
=========================================================*/
|
||||||
|
/* (1) Token inexistant ou incorrect */
|
||||||
|
const TokenError = 5;
|
||||||
|
/* (2) Permission non autorisée */
|
||||||
|
const PermissionError = 6;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* [4] API
|
||||||
|
=========================================================*/
|
||||||
|
/* (1) Le module n'est pas activé */
|
||||||
|
const DisabledModule = 7;
|
||||||
|
|
||||||
|
/* (2) Le @path n'est pas renseigne */
|
||||||
|
const MissingPath = 8;
|
||||||
|
/* (3) Verification de la coherence du chemin (existe dans la conf) */
|
||||||
|
const WrongPathModule = 9;
|
||||||
|
|
||||||
|
/* (4) Module non specifie dans la conf */
|
||||||
|
const UnknownModule = 10;
|
||||||
|
/* (5) Methode non specifie pour ce Module dans la conf */
|
||||||
|
const UnknownMethod = 11;
|
||||||
|
|
||||||
|
/* (6) Module non amorcable */
|
||||||
|
const UncallableModule = 12;
|
||||||
|
/* (7) Methode non amorcable */
|
||||||
|
const UncallableMethod = 13;
|
||||||
|
|
||||||
|
/* (8) Erreur méthode HTTP */
|
||||||
|
const UnknownHttpMethod = 14;
|
||||||
|
|
||||||
|
/* (9) Erreur de configuration */
|
||||||
|
const ConfigError = 15;
|
||||||
|
/* (10) Paramètre manquant */
|
||||||
|
const MissingParam = 16;
|
||||||
|
/* (11) Paramètre incorrect */
|
||||||
|
const WrongParam = 17;
|
||||||
|
/* (12) Erreur dans le traitement */
|
||||||
|
const ModuleError = 18;
|
||||||
|
|
||||||
|
|
||||||
|
/* [5] Database
|
||||||
|
=========================================================*/
|
||||||
|
/* (1) Base de données
|
||||||
|
---------------------------------------------------------*/
|
||||||
|
/* (1) Erreur lors de la creation d'un objet PDO (connection) */
|
||||||
|
const PDOConnection = 19;
|
||||||
|
|
||||||
|
/* (2) Repositories
|
||||||
|
---------------------------------------------------------*/
|
||||||
|
/* (1) Verification de la coherence du chemin (existe dans la conf) */
|
||||||
|
const WrongPathRepo = 20;
|
||||||
|
|
||||||
|
/* (2) Module non specifie dans la conf */
|
||||||
|
const UnknownRepo = 21;
|
||||||
|
|
||||||
|
/* (3) Erreur dans le traitement */
|
||||||
|
const RepoError = 22;
|
||||||
|
|
||||||
|
/* (3) ORM
|
||||||
|
---------------------------------------------------------*/
|
||||||
|
/* (1) Table n'existe pas */
|
||||||
|
const UnknownTable = 23;
|
||||||
|
/* (2) Pas permissions de lire le schéma */
|
||||||
|
const NotAllowedSchema = 24;
|
||||||
|
|
||||||
|
|
||||||
|
/* [6] Erreurs diverses
|
||||||
|
=========================================================*/
|
||||||
|
/* (1) Aucune donnée trouvée */
|
||||||
|
const NoMatchFound = 25;
|
||||||
|
|
||||||
|
/* (2) Mauvais chemin de template */
|
||||||
|
const UnknownTemplate = 26;
|
||||||
|
|
||||||
|
/* (3) géolocalisation échouée */
|
||||||
|
const UnknownAddress = 27;
|
||||||
|
|
||||||
|
/* (4) Erreur inconnue */
|
||||||
|
const UnknownError = 28;
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1,191 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
namespace error\core;
|
||||||
|
|
||||||
|
use \error\core\Err;
|
||||||
|
|
||||||
|
class Error{
|
||||||
|
|
||||||
|
private $error = null;
|
||||||
|
private $arguments = [];
|
||||||
|
|
||||||
|
/* ERROR CONSTRUCTOR
|
||||||
|
*
|
||||||
|
* @error<const> Const error
|
||||||
|
* @arg1<String> [OPT] Argument 1
|
||||||
|
* @arg2<String> [OPT] Argument 2
|
||||||
|
* @arg...<String> [OPT] Argument ...
|
||||||
|
*
|
||||||
|
* @return instance<Error> Error instance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function __construct($const){
|
||||||
|
call_user_func_array([$this, 'set'], func_get_args());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ERROR GETTER
|
||||||
|
*
|
||||||
|
* @return Err<Err::Constant> Error
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function get(){ return $this->error; }
|
||||||
|
|
||||||
|
/* ERROR SETTER
|
||||||
|
*
|
||||||
|
* @error<const> Const error
|
||||||
|
* @arg1<String> [OPT] Argument 1
|
||||||
|
* @arg2<String> [OPT] Argument 2
|
||||||
|
* @arg...<String> [OPT] Argument ...
|
||||||
|
*
|
||||||
|
* @return instance<Error> Error instance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function set($const){
|
||||||
|
/* [1] On découpe les arguments
|
||||||
|
=========================================================*/
|
||||||
|
/* (1) On récupère l'erreur */
|
||||||
|
$this->error = !is_numeric($const) ? Err::UnknownError : $const;
|
||||||
|
|
||||||
|
/* (2) On récupère les arguments */
|
||||||
|
$this->arguments = array_slice(func_get_args(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* EXPLICITE UN CODE D'ERREUR
|
||||||
|
*
|
||||||
|
* @return explicit<String> Description explicite du code d'erreur
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function explicit(){
|
||||||
|
switch($this->error){
|
||||||
|
case Err::Success: return $this->Success(); break;
|
||||||
|
case Err::ParsingFailed: return $this->ParsingFailed(); break;
|
||||||
|
case Err::UnreachableResource: return $this->UnreachableResource(); break;
|
||||||
|
case Err::UploadError: return $this->UploadError(); break;
|
||||||
|
case Err::FormatError: return $this->FormatError(); break;
|
||||||
|
case Err::TokenError: return $this->TokenError(); break;
|
||||||
|
case Err::PermissionError: return $this->PermissionError(); break;
|
||||||
|
case Err::DisabledModule: return $this->DisabledModule(); break;
|
||||||
|
case Err::MissingPath: return $this->MissingPath(); break;
|
||||||
|
case Err::WrongPathModule: return $this->WrongPathModule(); break;
|
||||||
|
case Err::UnknownModule: return $this->UnknownModule(); break;
|
||||||
|
case Err::UnknownMethod: return $this->UnknownMethod(); break;
|
||||||
|
case Err::UncallableModule: return $this->UncallableModule(); break;
|
||||||
|
case Err::UncallableMethod: return $this->UncallableMethod(); break;
|
||||||
|
case Err::UnknownHttpMethod: return $this->UnknownHttpMethod(); break;
|
||||||
|
case Err::ConfigError: return $this->ConfigError(); break;
|
||||||
|
case Err::MissingParam: return $this->MissingParam(); break;
|
||||||
|
case Err::WrongParam: return $this->WrongParam(); break;
|
||||||
|
case Err::ModuleError: return $this->ModuleError(); break;
|
||||||
|
case Err::PDOConnection: return $this->PDOConnection(); break;
|
||||||
|
case Err::WrongPathRepo: return $this->WrongPathRepo(); break;
|
||||||
|
case Err::UnknownRepo: return $this->UnknownRepo(); break;
|
||||||
|
case Err::RepoError: return $this->RepoError(); break;
|
||||||
|
case Err::UnknownTable: return $this->UnknownTable(); break;
|
||||||
|
case Err::NotAllowedSchema: return $this->NotAllowedSchema(); break;
|
||||||
|
case Err::NoMatchFound: return $this->NoMatchFound(); break;
|
||||||
|
case Err::UnknownTemplate: return $this->UnknownTemplate(); break;
|
||||||
|
case Err::UnknownAddress: return $this->UnknownAddress(); break;
|
||||||
|
case Err::UnknownError: return $this->UnknownError(); break;
|
||||||
|
|
||||||
|
default: return $this->UnknownDebugError(); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function Success(){
|
||||||
|
return 'all right';
|
||||||
|
}private function ParsingFailed(){
|
||||||
|
if( count($this->arguments) > 0 )
|
||||||
|
return $this->arguments[0].' parsing failed';
|
||||||
|
else
|
||||||
|
return 'parsing failed';
|
||||||
|
}private function UnreachableResource(){
|
||||||
|
return 'unreachable resource';
|
||||||
|
}private function UploadError(){
|
||||||
|
return 'upload error';
|
||||||
|
}private function FormatError(){
|
||||||
|
return 'format error';
|
||||||
|
}private function TokenError(){
|
||||||
|
return 'bad or expired token';
|
||||||
|
}private function PermissionError(){
|
||||||
|
return 'permission error';
|
||||||
|
}private function DisabledModule(){
|
||||||
|
return 'disabled module';
|
||||||
|
}private function MissingPath(){
|
||||||
|
return 'missing path';
|
||||||
|
}private function WrongPathModule(){
|
||||||
|
return 'wrong module\'s path';
|
||||||
|
}private function UnknownModule(){
|
||||||
|
if( count($this->arguments) > 0 )
|
||||||
|
return 'unknown module \''.$this->arguments[0].'\'';
|
||||||
|
else
|
||||||
|
return 'unknown module';
|
||||||
|
}private function UnknownMethod(){
|
||||||
|
if( count($this->arguments) > 0 )
|
||||||
|
return 'unknown method \''.$this->arguments[0].'\'';
|
||||||
|
else
|
||||||
|
return 'unknown method';
|
||||||
|
}private function UncallableModule(){
|
||||||
|
if( count($this->arguments) > 0 )
|
||||||
|
return 'uncallable module \''.$this->arguments[0].'\'';
|
||||||
|
else
|
||||||
|
return 'uncallable module';
|
||||||
|
}private function UncallableMethod(){
|
||||||
|
if( count($this->arguments) > 0 )
|
||||||
|
return 'uncallable method \''.$this->arguments[0].'\'';
|
||||||
|
else
|
||||||
|
return 'uncallable method';
|
||||||
|
}private function UnknownHttpMethod(){
|
||||||
|
return 'unknown HTTP method';
|
||||||
|
}private function ConfigError(){
|
||||||
|
return 'configuration error';
|
||||||
|
}private function MissingParam(){
|
||||||
|
if( count($this->arguments) > 0 )
|
||||||
|
return 'missing param \''.$this->arguments[0].'\'';
|
||||||
|
else
|
||||||
|
return 'missing param';
|
||||||
|
}private function WrongParam(){
|
||||||
|
if( count($this->arguments) > 0 )
|
||||||
|
if( count($this->arguments) > 1 )
|
||||||
|
return 'wrong param \''.$this->arguments[0].'\' expected to be of type \''.$this->arguments[1].'\'';
|
||||||
|
else
|
||||||
|
return 'wrong param \''.$this->arguments[0].'\'';
|
||||||
|
else
|
||||||
|
return 'wrong param';
|
||||||
|
}private function ModuleError(){
|
||||||
|
return 'module error';
|
||||||
|
}private function PDOConnection(){
|
||||||
|
return 'database error';
|
||||||
|
}private function WrongPathRepo(){
|
||||||
|
return 'wrong repository\'s path';
|
||||||
|
}private function UnknownRepo(){
|
||||||
|
return 'unknown repository';
|
||||||
|
}private function RepoError(){
|
||||||
|
return 'repository error';
|
||||||
|
}private function UnknownTable(){
|
||||||
|
return 'unknown table';
|
||||||
|
}private function NotAllowedSchema(){
|
||||||
|
return 'schema browsing not allowed';
|
||||||
|
}private function NoMatchFound(){
|
||||||
|
return 'no match found';
|
||||||
|
}private function UnknownTemplate(){
|
||||||
|
return 'unknown template';
|
||||||
|
}private function UnknownAddress(){
|
||||||
|
return 'unknown';
|
||||||
|
}private function UnknownError(){
|
||||||
|
return 'unknown error';
|
||||||
|
}private function UnknownDebugError(){
|
||||||
|
return 'unknown debug error';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function setHttpCode(){
|
||||||
|
http_response_code( $this->error == Err::Success ? 200 : 417 );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
|
@ -1,467 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace lightdb\core;
|
|
||||||
|
|
||||||
|
|
||||||
class lightdb{
|
|
||||||
|
|
||||||
// REPERTOIRE RACINE DE TOUTES LES BDD
|
|
||||||
public static function default_root(){ return __BUILD__.'/lightdb/storage'; }
|
|
||||||
|
|
||||||
// ATTRIBUTS
|
|
||||||
private $root;
|
|
||||||
private $dbname;
|
|
||||||
private $dir;
|
|
||||||
private $index;
|
|
||||||
private $driver;
|
|
||||||
private $line;
|
|
||||||
|
|
||||||
private $tmp;
|
|
||||||
|
|
||||||
/* CONSTRUCTEUR -> CREER LES FICHIERS S'ILS N'EXISTENT PAS SINON, RECUPERE LES DONNES
|
|
||||||
*
|
|
||||||
* @dbname<String> Nom de la base de données
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function __construct($dbname, $root=null){
|
|
||||||
/* [0] On récupère les attributs
|
|
||||||
=========================================================*/
|
|
||||||
$this->root = is_null($root) ? self::default_root().'/' : $root;
|
|
||||||
$this->dbname = $dbname;
|
|
||||||
$this->dir = $this->root.$dbname.'/';
|
|
||||||
|
|
||||||
|
|
||||||
/* [1] Création du répertoire s'il n'existe pas
|
|
||||||
=========================================================*/
|
|
||||||
if( !is_dir($this->dir) ){
|
|
||||||
mkdir($this->dir);
|
|
||||||
\chmod($this->dir, 0775);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [2] Création du fichier d'index ou récupération
|
|
||||||
=========================================================*/
|
|
||||||
/* (1) Si le fichier n'existe pas, on le crée */
|
|
||||||
if( !file_exists($this->dir.'index') ){
|
|
||||||
$fIndex = new \SplFileObject($this->dir.'index', 'w');
|
|
||||||
$fIndex->fwrite('[]');
|
|
||||||
$fIndex = null;
|
|
||||||
\chmod($this->dir.'index', 0775);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* (2) On récupère le contenu du fichier */
|
|
||||||
$fIndex = new \SplFileObject($this->dir.'index');
|
|
||||||
$fIndex->seek(0);
|
|
||||||
|
|
||||||
$index = json_decode( $fIndex->fgets(), true );
|
|
||||||
|
|
||||||
// Si erreur de parsage, on retourne une erreur
|
|
||||||
if( is_null($index) )
|
|
||||||
throw new \Exception("Cannot parse index");
|
|
||||||
|
|
||||||
$this->index = $index;
|
|
||||||
|
|
||||||
/* [3] Initialisation du gestionnaire d'acces (SplFileObject)
|
|
||||||
=========================================================*/
|
|
||||||
/* (1) Si le fichier n'existe pas, on le crée */
|
|
||||||
if( !file_exists($this->dir.'data') ){
|
|
||||||
file_put_contents($this->dir.'data', '' );
|
|
||||||
\chmod($this->dir.'data', 0775);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (2) On place un 'driver' sur le fichier */
|
|
||||||
$this->driver = new \SplFileObject($this->dir.'data', 'r+');
|
|
||||||
// $this->driver->setFlags( \SplFileObject::SKIP_EMPTY );
|
|
||||||
|
|
||||||
/* (3) On récupère le nombre de lignes */
|
|
||||||
$this->line = -1;
|
|
||||||
while( !$this->driver->eof() ){
|
|
||||||
$this->line++;
|
|
||||||
$this->driver->fgetcsv();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function close(){ $this->driver = null; }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* [x] Flush the database
|
|
||||||
*
|
|
||||||
=========================================================*/
|
|
||||||
public function flush(){
|
|
||||||
file_put_contents($this->dir.'index', '[]' );
|
|
||||||
file_put_contents($this->dir.'data', '' );
|
|
||||||
|
|
||||||
\chmod($this->dir.'index', 0775);
|
|
||||||
\chmod($this->dir.'data', 0775);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* RETOURNE LA LISTE DES INDEX
|
|
||||||
*
|
|
||||||
* @i<String> Index pour lequel on veut la ligne et le hash
|
|
||||||
*
|
|
||||||
* @return Index<Array> Tableau associatif contenant le hash et la ligne
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function index($i=null){
|
|
||||||
if( is_null($i) )
|
|
||||||
return $this->index;
|
|
||||||
|
|
||||||
return isset($this->index[$i]) ? $this->index[$i] : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* INSERTION D'UNE ENTREE DANS LA BASE DE DONNEES
|
|
||||||
*
|
|
||||||
* @key<String> Clé qui permettra l'accès direct
|
|
||||||
* @data<mixed*> Objet qui sera enregistré dans la base
|
|
||||||
*
|
|
||||||
* @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function insert($key, $data){
|
|
||||||
/* (1) On vérifie que la clé est unique */
|
|
||||||
if( array_key_exists($key, $this->index) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
$key = (string) $key;
|
|
||||||
|
|
||||||
/* (2) On ajoute les données aux fichier */
|
|
||||||
$json_data = json_encode($data);
|
|
||||||
$this->driver->seek($this->line);
|
|
||||||
$this->line++;
|
|
||||||
$written = $this->driver->fwrite( $json_data.PHP_EOL );
|
|
||||||
|
|
||||||
// Si erreur d'écriture, on retourne FALSE
|
|
||||||
if( is_null($written) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* (3) On enregistre l'index */
|
|
||||||
$this->index[$key] = [
|
|
||||||
'line' => $this->line - 1,
|
|
||||||
'hash' => sha1($json_data)
|
|
||||||
];
|
|
||||||
|
|
||||||
/* (4) On enregistre le fichier index */
|
|
||||||
$fIndex = new \SplFileObject($this->dir.'index', 'w');
|
|
||||||
$fIndex->fwrite( json_encode($this->index) );
|
|
||||||
$fIndex = null;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* INSERTION D'UNE ENTREE DANS LA BASE DE DONNEES
|
|
||||||
*
|
|
||||||
* @dataset<Array> Tableau de 'clés'->'valeurs' à insérer
|
|
||||||
* @data<mixed*> Objet qui sera enregistré dans la base
|
|
||||||
*
|
|
||||||
* @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function insertAll($dataset){
|
|
||||||
/* (1) On vérifie que la clé est unique */
|
|
||||||
foreach($dataset as $key=>$data)
|
|
||||||
if( array_key_exists($key, $this->index) )
|
|
||||||
unset($dataset[$key]);
|
|
||||||
|
|
||||||
|
|
||||||
/* (2) On ajoute les données aux fichier */
|
|
||||||
$this->driver->seek($this->line);
|
|
||||||
foreach($dataset as $key=>$data){
|
|
||||||
$json_data = json_encode($data);
|
|
||||||
$this->line++;
|
|
||||||
$written = $this->driver->fwrite( $json_data.PHP_EOL );
|
|
||||||
|
|
||||||
|
|
||||||
/* (3) On enregistre les index */
|
|
||||||
$this->index[$key] = [
|
|
||||||
'line' => $this->line - 1,
|
|
||||||
'hash' => sha1($json_data)
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* (4) On enregistre le fichier index */
|
|
||||||
$fIndex = new \SplFileObject($this->dir.'index', 'w');
|
|
||||||
$fIndex->fwrite( json_encode($this->index) );
|
|
||||||
$fIndex = null;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* RENVOIE LES DONNEES ASSOCIEES A UNE CLE DONNEE
|
|
||||||
*
|
|
||||||
* @key<String> Clé associée à la valeur à récupérer
|
|
||||||
*
|
|
||||||
* @return data<mixed*> Renvoie la valeur associée à la clé, FALSE si erreur
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function fetch($key){
|
|
||||||
/* (1) On vérifie que la clé existe bien */
|
|
||||||
if( !array_key_exists($key, $this->index) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* (2) On récupère la ligne */
|
|
||||||
$line = $this->index[$key]['line'];
|
|
||||||
|
|
||||||
/* (3) On récupère le contenu */
|
|
||||||
$this->driver->seek($line);
|
|
||||||
$json = json_decode( $this->driver->current(), true );
|
|
||||||
|
|
||||||
// Si erreur de parsage
|
|
||||||
if( is_null($json) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return $json;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* RENVOIE LES DONNEES ASSOCIEES AUX CLES DONNEES
|
|
||||||
*
|
|
||||||
* @keys<Array> Clés associées aux valeurs à récupérer
|
|
||||||
*
|
|
||||||
* @return data<mixed*> Renvoie les valeurs associées aux clé, ou un tableau vide si erreur
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function fetchAll($keys){
|
|
||||||
$data = [];
|
|
||||||
|
|
||||||
/* (0) Pour chaque clé */
|
|
||||||
foreach($keys as $i=>$key){
|
|
||||||
|
|
||||||
/* (1) On ne prend pas en compte les clés qui n'existent pas */
|
|
||||||
if( !array_key_exists($key, $this->index) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* (2) On récupère la ligne */
|
|
||||||
$line = $this->index[$key]['line'];
|
|
||||||
|
|
||||||
/* (3) On récupère le contenu */
|
|
||||||
$this->driver->seek($line);
|
|
||||||
$json = json_decode( $this->driver->current(), true );
|
|
||||||
|
|
||||||
/* (4) Si pas d'erreur de parsage, On enregistre */
|
|
||||||
if( !is_null($json) )
|
|
||||||
$data[$key] = $json;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* SUPPRIME UNE ENTREE DE CLE DONNEE DE LA BASE DE DONNEES
|
|
||||||
*
|
|
||||||
* @key<String> Clé de l'entrée à supprimer
|
|
||||||
*
|
|
||||||
* @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function delete($key){
|
|
||||||
/* (1) On vérifie l'existence de la clé */
|
|
||||||
if( !array_key_exists($key, $this->index) )
|
|
||||||
return true; // On considère que l'action souhaitée est effectuée
|
|
||||||
|
|
||||||
$line = $this->index[$key]['line'];
|
|
||||||
|
|
||||||
/* (2) On réarrange la bd pour supprimer la ligne */
|
|
||||||
$tmpfilename = __ROOT__.'/tmp/'.uniqid().'.dat';
|
|
||||||
$tmpfile = new \SplFileObject($tmpfilename, 'w');
|
|
||||||
\chmod($tmpfilename, 0775);
|
|
||||||
$this->driver->seek(0);
|
|
||||||
|
|
||||||
// On recopie toutes les lignes sauf celle à supprimer dans un fichier temporaire
|
|
||||||
while( $this->driver->key() < $this->line ){
|
|
||||||
|
|
||||||
if( $this->driver->key() != $line )
|
|
||||||
$tmpfile->fwrite( $this->driver->current() );
|
|
||||||
|
|
||||||
$this->driver->next();
|
|
||||||
}
|
|
||||||
|
|
||||||
// On décrémente le nb de lignes
|
|
||||||
$this->line--;
|
|
||||||
|
|
||||||
$tmpfile = null;
|
|
||||||
|
|
||||||
/* (3) On remplace le fichier original par le fichier temporaire */
|
|
||||||
$this->driver = null;
|
|
||||||
rename($tmpfilename, $this->dir.'data');
|
|
||||||
\chmod($this->dir.'data', 0775);
|
|
||||||
$this->driver = new \SplFileObject($this->dir.'data', 'r+');
|
|
||||||
|
|
||||||
/* (3) On supprime la ligne de l'index */
|
|
||||||
unset( $this->index[$key] );
|
|
||||||
|
|
||||||
/* (4) On met à jour les index des lignes déplacées */
|
|
||||||
foreach($this->index as $i=>$indexData)
|
|
||||||
if( $indexData['line'] > $line )
|
|
||||||
$this->index[$i]['line']--; // on décrémente les lignes au dessus de la ligne supprimée
|
|
||||||
|
|
||||||
|
|
||||||
/* (5) On enregistre le fichier index */
|
|
||||||
$fIndex = new \SplFileObject($this->dir.'index', 'w');
|
|
||||||
$fIndex->fwrite( json_encode($this->index) );
|
|
||||||
$fIndex = null;
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* SUPPRIME PLUSIEURS ENTREES DE CLES DONNEES DE LA BASE DE DONNEES
|
|
||||||
*
|
|
||||||
* @keys<Array> Clés des entrées à supprimer
|
|
||||||
*
|
|
||||||
* @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function deleteAll($keys){
|
|
||||||
$keyLines = [];
|
|
||||||
|
|
||||||
/* [1] On récupère la ligne associée à chaque clé
|
|
||||||
=========================================================*/
|
|
||||||
foreach($keys as $k=>$key){
|
|
||||||
/* (1) Si la clé n'existe pas, on passe à la suivante */
|
|
||||||
if( !array_key_exists($key, $this->index) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* (2) On récupère la ligne de la clé */
|
|
||||||
$keyLines[$key] = $this->index[$key]['line'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [2] On trie les clés en fonction de leur ligne
|
|
||||||
=========================================================*/
|
|
||||||
$sorted = [];
|
|
||||||
|
|
||||||
// Tant que toute les clés ne sont pas triées
|
|
||||||
while( count($keyLines) > 0 ){
|
|
||||||
// Contiendra la clé de la plus petite valeur
|
|
||||||
$min = null;
|
|
||||||
|
|
||||||
// On cherche la ligne la plus petite
|
|
||||||
foreach($keyLines as $key=>$line)
|
|
||||||
if( is_null($min) || $line < $keyLines[$min] ) // Si valeur inf à min
|
|
||||||
$min = $key;
|
|
||||||
|
|
||||||
// On ajoute la plus petite clé trouvée a la liste
|
|
||||||
$sorted[$min] = $keyLines[$min];
|
|
||||||
|
|
||||||
// On la supprime du tableau à trier
|
|
||||||
unset($keyLines[$min]);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* [3] On supprime les lignes à supprimer
|
|
||||||
=========================================================*/
|
|
||||||
/* (1) On réarrange la bd pour supprimer la ligne */
|
|
||||||
$tmpfilename = __ROOT__.'/tmp/'.uniqid().'.dat';
|
|
||||||
$tmpfile = new \SplFileObject($tmpfilename, 'w');
|
|
||||||
\chmod($tmpfilename, 0775);
|
|
||||||
$this->driver->seek(0);
|
|
||||||
|
|
||||||
/* (2) On recopie toutes les lignes sauf celles à supprimer dans un fichier temporaire */
|
|
||||||
while( $this->driver->key() < $this->line ){
|
|
||||||
|
|
||||||
// Si la ligne en cours n'est pas dans la liste des lignes à supprimer
|
|
||||||
if( !in_array($this->driver->key(), $sorted) )
|
|
||||||
$tmpfile->fwrite( $this->driver->current() ); // On l'écrit dans le nouveau fichier
|
|
||||||
|
|
||||||
$this->driver->next();
|
|
||||||
}
|
|
||||||
|
|
||||||
$tmpfile = null;
|
|
||||||
|
|
||||||
/* (3) On remplace le fichier original par le fichier temporaire */
|
|
||||||
$this->driver = null;
|
|
||||||
rename($tmpfilename, $this->dir.'data');
|
|
||||||
\chmod($this->dir.'data', 0775);
|
|
||||||
$this->driver = new \SplFileObject($this->dir.'data', 'r+');
|
|
||||||
|
|
||||||
|
|
||||||
/* [4] On met à jour les index
|
|
||||||
=========================================================*/
|
|
||||||
$step = 0;
|
|
||||||
foreach($sorted as $key=>$line){
|
|
||||||
|
|
||||||
/* (1) On décrémente le nb de lignes */
|
|
||||||
$this->line--;
|
|
||||||
|
|
||||||
/* (2) On supprime la ligne de l'index */
|
|
||||||
unset( $this->index[$key] );
|
|
||||||
|
|
||||||
/* (3) On met à jour les index des lignes déplacées du nombre d'index qu'on a supprimé */
|
|
||||||
foreach($this->index as $i=>$indexData)
|
|
||||||
if( $indexData['line'] > $line-$step )
|
|
||||||
$this->index[$i]['line']--; // on décrémente les lignes au dessus de la ligne supprimée
|
|
||||||
|
|
||||||
$step++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (4) On enregistre le fichier index */
|
|
||||||
$fIndex = new \SplFileObject($this->dir.'index', 'w');
|
|
||||||
$fIndex->fwrite( json_encode($this->index) );
|
|
||||||
$fIndex = null;
|
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* RENVOIE LES DONNEES ASSOCIEES A UN CHAMP DE RECHERCHE
|
|
||||||
*
|
|
||||||
* @nomParam<typeParam> Description du param
|
|
||||||
*
|
|
||||||
* @return nomRetour<typeRetour> Description du retour
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function filter($data){
|
|
||||||
/* (1) Si @data est un tableau associatif */
|
|
||||||
if( is_array($data) ){
|
|
||||||
|
|
||||||
$filtered = [];
|
|
||||||
foreach($this->index as $i=>$indexData){
|
|
||||||
$this->driver->seek( $indexData['line'] );
|
|
||||||
$dbData = json_decode( $this->driver->fgets(), true );
|
|
||||||
|
|
||||||
foreach($data as $key=>$value)
|
|
||||||
if( isset($dbData[$key]) && preg_match("#$value#", $dbData[$key]) ){
|
|
||||||
$filtered[$i] = $dbData;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $filtered;
|
|
||||||
|
|
||||||
|
|
||||||
/* (2) Sinon on compare @data en tant que valeur simple */
|
|
||||||
}else{
|
|
||||||
|
|
||||||
$this->tmp = sha1( json_encode($data) );
|
|
||||||
return array_filter($this->index, [$this, 'simpleFilter']);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
protected function simpleFilter($e){ return $e['hash'] == $this->tmp; }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
namespace router\controller;
|
namespace router\controller;
|
||||||
|
|
||||||
use \lightdb\core\lightdb;
|
use \database\core\DatabaseDriver;
|
||||||
|
|
||||||
|
|
||||||
class ics{
|
class ics{
|
||||||
|
@ -52,31 +52,60 @@
|
||||||
|
|
||||||
public function info(){
|
public function info(){
|
||||||
|
|
||||||
/* [1] Get database colors
|
/* [1] Get database data
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
/* (1) Open instance */
|
/* (1) Get the list of available events */
|
||||||
try{
|
$sqlr = DatabaseDriver::getPDO()->prepare("SELECT * FROM event WHERE id_diplome = :idd");
|
||||||
$ldb = new lightdb('config');
|
$sqlr->execute([ ':idd' => $this->diplome_id ]);
|
||||||
}catch(\Exception $e){
|
$d_cols = $sqlr->fetchAll();
|
||||||
die("An error occured. Please contact the developers.\n");
|
|
||||||
|
/* (2) Manage error */
|
||||||
|
if( !$d_cols )
|
||||||
|
die("Correction not available for this diplome");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
echo "<form method='POST' action='/correct/".$this->diplome_id."'>";
|
||||||
|
|
||||||
|
foreach($d_cols as $data){
|
||||||
|
|
||||||
|
$id = $data['id_event'];
|
||||||
|
$basename = $data['basename'];
|
||||||
|
$color = $data['color'];
|
||||||
|
$name = $data['name'];
|
||||||
|
|
||||||
|
echo "$basename <input type='text' style='display: inline-block; margin: 1em .2em; padding: .2em; border: none; background-color: $color;' name='name[$id]' value='$name'><br>";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (2) Fetch diplome data */
|
echo "<input type='submit' value='SAVE'>";
|
||||||
$d_cols = $ldb->fetch($this->diplome_id);
|
echo "</form>";
|
||||||
|
|
||||||
/* (3) Error */
|
}
|
||||||
if( $d_cols == false )
|
|
||||||
die("No color found for this diplome");
|
|
||||||
|
|
||||||
|
|
||||||
foreach($d_cols as $col=>$name){
|
|
||||||
|
|
||||||
echo "<span style='background-color: #".str_pad(substr($col,1), 6, "0", STR_PAD_LEFT).";'>PLANNING COLOR</span> => ";
|
public function correct(){
|
||||||
|
|
||||||
if( $col == $name )
|
|
||||||
echo "no name<br>";
|
/* [1] Update data
|
||||||
else
|
=========================================================*/ {
|
||||||
echo "$name<br>";
|
|
||||||
|
/* (1) Check $_POST['name'] */
|
||||||
|
if( !isset($_POST['name']) || !is_array($_POST['name']) )
|
||||||
|
die("No data received");
|
||||||
|
|
||||||
|
/* (2) Store corrections */
|
||||||
|
foreach($_POST['name'] as $id=>$correct){
|
||||||
|
|
||||||
|
if( !empty(trim($correct)) ){
|
||||||
|
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("UPDATE event SET name = :name WHERE id_event = :ide");
|
||||||
|
$sqlr->execute([ ':name' => $correct, ':ide' => $id ]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,21 +41,25 @@
|
||||||
|
|
||||||
/* [2] Display the links
|
/* [2] Display the links
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
echo "<table><thead><tr><td>Diplome</td><td>Config</td><td>Link</td></tr></thead><tbody>";
|
echo "<table><thead><tr><td>Diplome</td><td>Config</td><td>Link</td><td>Last Update</td></tr></thead><tbody>";
|
||||||
|
|
||||||
foreach($diplomes as $id=>$name){
|
foreach($diplomes as $id=>$data){
|
||||||
|
|
||||||
|
$name = $data[0];
|
||||||
|
$upda = $data[1];
|
||||||
|
|
||||||
echo "<tr><td>$name</td>";
|
echo "<tr><td>$name</td>";
|
||||||
|
|
||||||
$URI = $_SERVER['REQUEST_URI'];
|
$URI = $_SERVER['REQUEST_URI'];
|
||||||
$link = $_SERVER['HTTP_HOST']."{$URI}ics/$id.ics";
|
$url = $_SERVER['HTTP_HOST'].$URI."ics/$id.ics";
|
||||||
echo "<td><a href='${URI}info/$id'>Set colors</a></td>";
|
$link = __ROOT__."/tmp/$id.ics";
|
||||||
|
echo "<td><a href='/info/$id'>Correct</a></td>";
|
||||||
echo "<td><a";
|
echo "<td><a";
|
||||||
if( file_exists(__ROOT__."/tmp/$id.ics") )
|
if( file_exists($link) )
|
||||||
echo " href='${URI}ics/$id.ics'";
|
echo " href='/ics/$id.ics'";
|
||||||
|
|
||||||
echo ">https://$link</a></td>";
|
echo ">https://$url</a></td>";
|
||||||
|
echo "<td>$upda</td>";
|
||||||
echo "</tr>";
|
echo "</tr>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
namespace service;
|
namespace service;
|
||||||
|
|
||||||
use \lightdb\core\lightdb;
|
use \database\core\DatabaseDriver;
|
||||||
use \service\Tesseract;
|
use \service\Tesseract;
|
||||||
|
|
||||||
|
|
||||||
|
@ -109,28 +109,6 @@
|
||||||
'h' => $img_siz[1]
|
'h' => $img_siz[1]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
/* (2) Light database
|
|
||||||
---------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* (1) Create/Open database */
|
|
||||||
try{
|
|
||||||
$ldb = new lightdb('config');
|
|
||||||
|
|
||||||
/* (2) Manage error */
|
|
||||||
}catch(\Exception $e){
|
|
||||||
throw new \Exception("Cannot access database");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (3) Fetch diplome data */
|
|
||||||
$d_db = $ldb->fetch($this->d_uid);
|
|
||||||
|
|
||||||
/* (4) Manage error */
|
|
||||||
if( $d_db == false )
|
|
||||||
$d_db = [];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -173,7 +151,7 @@
|
||||||
/* (3) Get current color + next */
|
/* (3) Get current color + next */
|
||||||
$p = $this->getColor($col_x, $y);
|
$p = $this->getColor($col_x, $y);
|
||||||
$p1 = $this->getColor($col_x, $y+1);
|
$p1 = $this->getColor($col_x, $y+1);
|
||||||
$p1e = '#'.dechex($p1);
|
$color = '#'.str_pad(dechex($p1), 6, '0', STR_PAD_LEFT);
|
||||||
|
|
||||||
/* (4) If on black pixel and next not white */
|
/* (4) If on black pixel and next not white */
|
||||||
if( $p == 0 && $p1 != 0xffffff ){
|
if( $p == 0 && $p1 != 0xffffff ){
|
||||||
|
@ -201,7 +179,19 @@
|
||||||
$ev = $this->extractEvent("$time-$uid", [$col_x, $start_y+1], [$col_ind[$day_n+1]-1, $y]);
|
$ev = $this->extractEvent("$time-$uid", [$col_x, $start_y+1], [$col_ind[$day_n+1]-1, $y]);
|
||||||
$this->event[$uid][$time][1] = $ev[0];
|
$this->event[$uid][$time][1] = $ev[0];
|
||||||
$this->event[$uid][$time][2] = $ev[1];
|
$this->event[$uid][$time][2] = $ev[1];
|
||||||
|
$this->event[$uid][$time][3] = $color;
|
||||||
|
|
||||||
|
// {7} Check if already exists //
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("SELECT basename, color, id_diplome FROM event WHERE basename = :bd AND color = :c AND id_diplome = :idd");
|
||||||
|
$sqlr->execute([ ':bd' => $ev[0], ':c' => $color, ':idd' => $this->d_uid ]);
|
||||||
|
|
||||||
|
// {7.1} If does not -> insert //
|
||||||
|
if( !$sqlr->fetch() ){
|
||||||
|
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("INSERT INTO event(id_event,basename,color,id_diplome,name) VALUES(DEFAULT,:bd,:c,:idd,:n)");
|
||||||
|
$sqlr->execute([ ':bd' => $ev[0], ':c' => $color, ':idd' => $this->d_uid, ':n' => $ev[0] ]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,16 +205,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* [4] Save db changes
|
|
||||||
=========================================================*/
|
|
||||||
/* (1) Update data */
|
|
||||||
$ldb->delete($this->d_uid);
|
|
||||||
$ldb->insert($this->d_uid, $d_db);
|
|
||||||
|
|
||||||
/* (2) Close connection */
|
|
||||||
$ldb->close();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -266,7 +246,7 @@
|
||||||
|
|
||||||
/* (2) Manage copy error */
|
/* (2) Manage copy error */
|
||||||
if( !$copied )
|
if( !$copied )
|
||||||
return [ null, null ];
|
return [ '?', null ];
|
||||||
|
|
||||||
/* (3) Save to jpeg */
|
/* (3) Save to jpeg */
|
||||||
\imagesavealpha($clip, true);
|
\imagesavealpha($clip, true);
|
||||||
|
@ -292,7 +272,7 @@
|
||||||
/* (2) Manage error */
|
/* (2) Manage error */
|
||||||
}catch(\Exception $e){
|
}catch(\Exception $e){
|
||||||
|
|
||||||
$read = [ null, null ];
|
$read = [ '?', null ];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,42 +378,29 @@
|
||||||
$RAW = "";
|
$RAW = "";
|
||||||
|
|
||||||
|
|
||||||
|
/* [1] For each event
|
||||||
/* [1] Get light-database
|
|
||||||
=========================================================*/
|
|
||||||
/* (1) Create/Open database */
|
|
||||||
try{
|
|
||||||
$ldb = new lightdb('config');
|
|
||||||
|
|
||||||
/* (2) Manage error */
|
|
||||||
}catch(\Exception $e){
|
|
||||||
throw new \Exception("Cannot access database");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (3) Get color association if available */
|
|
||||||
$col_assoc = [];
|
|
||||||
if( !is_null($ldb->index($this->d_uid)) )
|
|
||||||
$col_assoc = $ldb->fetch($this->d_uid);
|
|
||||||
|
|
||||||
// var_dump($col_assoc);
|
|
||||||
// die(1);
|
|
||||||
|
|
||||||
/* [2] For each event
|
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
foreach($this->event as $event_col=>$events){
|
foreach($this->event as $event_col=>$events){
|
||||||
|
|
||||||
/* (2) For each event of each type
|
/* (2) For each event of each type
|
||||||
---------------------------------------------------------*/
|
---------------------------------------------------------*/
|
||||||
foreach($events as $start_t=>$data){
|
foreach($events as $start_t=>$data){
|
||||||
|
|
||||||
|
/* (1) Search if there is a correction in the database */
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("SELECT name FROM event WHERE basename = :bn AND id_diplome = :idd AND color = :col");
|
||||||
|
$sqlr->execute([ ':bn' => $data[1], ':idd' => $this->d_uid, ':col' => $data[3] ]);
|
||||||
|
|
||||||
|
/* (2) If there's a traduction */
|
||||||
|
if( ($fetched=$sqlr->fetch()) )
|
||||||
|
$data[1] = $fetched['name'];
|
||||||
|
|
||||||
|
/* (3) Build ICS event */
|
||||||
$RAW .= "BEGIN:VEVENT\n";
|
$RAW .= "BEGIN:VEVENT\n";
|
||||||
$RAW .= "DTSTAMP:".gmdate("Ymd\THis\Z", time())."\n"; // required
|
$RAW .= "DTSTAMP:".gmdate("Ymd\THis\Z", time())."\n"; // required
|
||||||
$RAW .= "DTSTART:${start_t}\n";
|
$RAW .= "DTSTART:${start_t}\n";
|
||||||
$RAW .= "DTEND:${data[0]}\n";
|
$RAW .= "DTEND:${data[0]}\n";
|
||||||
$RAW .= "UID:$start_t-univ-pau-ics\n"; // required
|
$RAW .= "UID:$start_t\n"; // required
|
||||||
if( !is_null($data[1]) )
|
|
||||||
$RAW .= "SUMMARY:${data[1]}\n";
|
$RAW .= "SUMMARY:${data[1]}\n";
|
||||||
else
|
|
||||||
$RAW .= "SUMMARY:?\n";
|
|
||||||
if( !is_null($data[2]) ){
|
if( !is_null($data[2]) ){
|
||||||
$RAW .= "LOCATION:${data[2]}\n";
|
$RAW .= "LOCATION:${data[2]}\n";
|
||||||
$RAW .= "DESCRIPTION:${data[2]}\n";
|
$RAW .= "DESCRIPTION:${data[2]}\n";
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
namespace service;
|
namespace service;
|
||||||
|
|
||||||
use \lightdb\core\lightdb;
|
use \database\core\DatabaseDriver;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -179,22 +179,59 @@
|
||||||
/* [4] Cache into light-database
|
/* [4] Cache into light-database
|
||||||
=========================================================*/ {
|
=========================================================*/ {
|
||||||
|
|
||||||
/* (1) Open/Create light-database */
|
/* (1) Get diplome ids */
|
||||||
try{
|
$sqlr = DatabaseDriver::getPDO()->query("SELECT id_diplome from diplome");
|
||||||
$ldb = new lightdb("config");
|
$db_ids_raw = $sqlr->fetchAll();
|
||||||
$ldb->flush();
|
|
||||||
|
/* (2) Format data */
|
||||||
|
$db_ids = [];
|
||||||
|
foreach($db_ids_raw as $data)
|
||||||
|
$db_ids[$data['id_diplome']] = null;
|
||||||
|
|
||||||
|
|
||||||
|
/* (3) For each diplome */
|
||||||
|
foreach($d_list as $id=>$name){
|
||||||
|
|
||||||
|
// {1} Add if not in db //
|
||||||
|
if( !isset($db_ids[$id]) ){
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("INSERT INTO `diplome`(`id_diplome`, `name`, `updated_at`) VALUES(:id, :name, DEFAULT)");
|
||||||
|
$sqlr->execute([ ':id' => $id, ':name' => $name ]);
|
||||||
|
|
||||||
|
// {2} If update //
|
||||||
|
}else{
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("UPDATE diplome SET name = :name, updated_at = :upd WHERE id_diplome = :id");
|
||||||
|
$sqlr->execute([ ':id' => $id, ':name' => $name, 'upd' => gmmktime() ]);
|
||||||
|
|
||||||
/* (2) Manage error */
|
|
||||||
}catch(\Exception $e){
|
|
||||||
throw new \Exception("Cannot open light-database");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (3) Update data */
|
}
|
||||||
$ldb->insert('diplomes', $d_list);
|
|
||||||
$ldb->insert('periods', $p_list);
|
|
||||||
|
|
||||||
/* (4) Close the database */
|
/* (4) Get period ids */
|
||||||
$ldb->close();
|
$sqlr = DatabaseDriver::getPDO()->query("SELECT id_period from period");
|
||||||
|
$db_ids_raw = $sqlr->fetchAll();
|
||||||
|
|
||||||
|
/* (5) Format data */
|
||||||
|
$db_ids = [];
|
||||||
|
foreach($db_ids_raw as $data)
|
||||||
|
$db_ids[$data['id_period']] = null;
|
||||||
|
|
||||||
|
|
||||||
|
/* (6) For each period */
|
||||||
|
foreach($p_list as $id=>$monday){
|
||||||
|
|
||||||
|
// {1} Add if not in db //
|
||||||
|
if( !isset($db_ids[$id]) ){
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("INSERT INTO `period`(`id_period`, `monday`) VALUES(:id, :monday)");
|
||||||
|
$sqlr->execute([ ':id' => $id, ':monday' => $monday ]);
|
||||||
|
|
||||||
|
// {2} If update //
|
||||||
|
}else{
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("UPDATE period SET monday = :monday WHERE id_period = :id");
|
||||||
|
$sqlr->execute([ ':id' => $id, ':monday' => $monday ]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,25 +255,26 @@
|
||||||
/* [1] Load cache
|
/* [1] Load cache
|
||||||
=========================================================*/ {
|
=========================================================*/ {
|
||||||
|
|
||||||
/* (1) Open/Create light-database */
|
/* (1) Get diplome list */
|
||||||
try{
|
$d_list_raw = DatabaseDriver::getPDO()->query("SELECT * FROM diplome")->fetchAll();
|
||||||
$ldb = new lightdb("config");
|
|
||||||
|
|
||||||
/* (2) Manage error */
|
/* (2) Format data */
|
||||||
}catch(\Exception $e){
|
$d_list = [];
|
||||||
throw new \Exception("Cannot open light-database");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (3) Fetch data */
|
foreach($d_list_raw as $data)
|
||||||
$d_list = $ldb->fetch('diplomes');
|
$d_list[$data['id_diplome']] = [ $data['name'], $data['updated_at'] ];
|
||||||
$p_list = $ldb->fetch('periods');
|
|
||||||
|
|
||||||
|
/* (1) Get diplome list */
|
||||||
|
$p_list_raw = DatabaseDriver::getPDO()->query("SELECT * FROM period")->fetchAll();
|
||||||
|
|
||||||
|
/* (2) Format data */
|
||||||
|
$p_list = [];
|
||||||
|
|
||||||
|
foreach($p_list_raw as $data)
|
||||||
|
$p_list[$data['id_period']] = $data['monday'];
|
||||||
|
|
||||||
/* (4) Check error */
|
|
||||||
if( $d_list == false || $p_list == false )
|
|
||||||
throw new \Exception("Cannot read data");
|
|
||||||
|
|
||||||
/* (5) Close the database */
|
|
||||||
$ldb->close();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,10 @@
|
||||||
|
|
||||||
namespace service;
|
namespace service;
|
||||||
|
|
||||||
|
use \database\core\DatabaseDriver;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Updater{
|
class Updater{
|
||||||
|
|
||||||
/* [1] Attributes
|
/* [1] Attributes
|
||||||
|
@ -65,6 +69,12 @@
|
||||||
|
|
||||||
file_put_contents(__ROOT__."/tmp/$d_id.ics", "END:VCALENDAR", FILE_APPEND);
|
file_put_contents(__ROOT__."/tmp/$d_id.ics", "END:VCALENDAR", FILE_APPEND);
|
||||||
|
|
||||||
|
/* (2) Register update
|
||||||
|
---------------------------------------------------------*/
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("UPDATE diplome SET updated_at = CURRENT_TIMESTAMP WHERE id_diplome = :idd");
|
||||||
|
$sqlr->execute([ ':idd' => $d_id ]);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"default": {
|
||||||
|
"local": {
|
||||||
|
"host" : "localhost",
|
||||||
|
"dbname" : "univ-pau-ics",
|
||||||
|
"user" : "univ-pau-ics",
|
||||||
|
"password" : "nxBn1Cn5JgaHYW8n"
|
||||||
|
},
|
||||||
|
"remote": {
|
||||||
|
"host" : "localhost",
|
||||||
|
"dbname" : "univ-pau-ics",
|
||||||
|
"user" : "univ-pau-ics",
|
||||||
|
"password" : "nxBn1Cn5JgaHYW8n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
|
|
||||||
"methods": [ "GET" ],
|
"methods": [ "GET", "POST" ],
|
||||||
|
|
||||||
|
|
||||||
"routes": {
|
"routes": {
|
||||||
|
@ -28,6 +28,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"/correct/{diplome_id}": {
|
||||||
|
"methods": ["POST"],
|
||||||
|
"controller": "ics:correct",
|
||||||
|
"arguments": {
|
||||||
|
"diplome_id": "T\\d+"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
"/{any}": {
|
"/{any}": {
|
||||||
"methods": ["GET"],
|
"methods": ["GET"],
|
||||||
"controller": "redirect:homepage",
|
"controller": "redirect:homepage",
|
||||||
|
|
Loading…
Reference in New Issue