Gestion du delete(key)

This commit is contained in:
xdrm-brackets 2016-05-17 15:24:14 +02:00
parent e661bf99dd
commit 2cf98451e2
4 changed files with 290 additions and 251 deletions

View File

@ -89,7 +89,7 @@
// Lancement du téléchargement // Lancement du téléchargement
// $req = new ModuleRequest('download/phone', array('subjects'=>[200])); // $req = new ModuleRequest('download/phone', array('subjects'=>[200]));
// $res = $req->dispatch(); // $res = $req->download();
@ -99,31 +99,26 @@
// RUN database // RUN database
$db = new lightdb('testdb1'); $db = new lightdb('testdb1');
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$a = microtime_float(); var_dump('INSERTING key0 to key99');
/* [1] INSERTION DE 1000*1000 éléments
=========================================================*/
$data = array();
for( $i = 0 ; $i < 1000 ; $i++ )
$data['key'.$i] = 'valeur'.$i;
$average = 0; for( $i = 0 ; $i < 100 ; $i++ )
for( $i = 0 ; $i < 100 ; $i++ ){ echo $db->insert('key'.$i, array('data0_'.$i, 'data1_'.$i)) ? 'o' : '_';
$a = microtime_float();
$db->fetch('data'.$i);
$average += microtime_float()-$a;
}
var_dump('1000 * '.strlen(json_encode($data)) );
var_dump('INSERT avg. : '.($average/100) );
/* [2] RECUPERATION DE 1000*1000 ELEMENTS var_dump('FETCHING key0 : '); var_dump( $db->fetch('key0') );
=========================================================*/ var_dump('FETCHING key1 : '); var_dump( $db->fetch('key1') );
var_dump('FETCHING key2 : '); var_dump( $db->fetch('key2') );
var_dump('FETCHING key3 : '); var_dump( $db->fetch('key3') );
var_dump('DELETING key0 : '. $db->delete('key0') );
var_dump('DELETING key1 : '. $db->delete('key1') );
var_dump('DELETING key2 : '. $db->delete('key2') );
var_dump('DELETING key3 : '. $db->delete('key3') );
var_dump('FETCHING key0 : '); var_dump( $db->fetch('key0') );
var_dump('FETCHING key1 : '); var_dump( $db->fetch('key1') );
var_dump('FETCHING key2 : '); var_dump( $db->fetch('key2') );
var_dump('FETCHING key3 : '); var_dump( $db->fetch('key3') );
$db->close(); $db->close();

View File

@ -3,31 +3,33 @@
namespace manager; namespace manager;
class lightdb{ class lightdb{
// REPERTOIRE RACINE DE TOUTES LES BDD // REPERTOIRE RACINE DE TOUTES LES BDD
public static $root = __ROOT__.'/tmp/'; public static $root = __ROOT__.'/tmp/';
// ATTRIBUTS // ATTRIBUTS
private $dbname; private $dbname;
private $dir; private $dir;
private $index; private $index;
private $driver; private $driver;
private $line; private $line;
/* CONSTRUCTEUR -> CREER LES FICHIERS S'ILS N'EXISTENT PAS SINON, RECUPERE LES DONNES private $tmp;
*
* @dbname<String> Nom de la base de données /* 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){ public function __construct($dbname){
/* [0] On récupère les attributs /* [0] On récupère les attributs
=========================================================*/ =========================================================*/
$this->dbname = $dbname; $this->dbname = $dbname;
$this->dir = self::$root.$dbname.'/'; $this->dir = self::$root.$dbname.'/';
/* [1] Création du répertoire s'il n'existe pas /* [1] Création du répertoire s'il n'existe pas
=========================================================*/ =========================================================*/
if( !is_dir($this->dir) ) if( !is_dir($this->dir) )
mkdir($this->dir); mkdir($this->dir);
@ -35,162 +37,204 @@
=========================================================*/ =========================================================*/
/* (1) Si le fichier n'existe pas, on le crée */ /* (1) Si le fichier n'existe pas, on le crée */
if( !file_exists($this->dir.'index') ) if( !file_exists($this->dir.'index') )
file_put_contents($this->dir.'index', json_encode(array()) ); file_put_contents($this->dir.'index', json_encode(array()) );
/* (2) On récupère le contenu du fichier */ /* (2) On récupère le contenu du fichier */
$fIndex = new \SplFileObject($this->dir.'index'); $fIndex = new \SplFileObject($this->dir.'index');
$fIndex->seek(0); $fIndex->seek(0);
$index = json_decode( $fIndex->current(), true ); $index = json_decode( $fIndex->fgets(), true );
// Si erreur de parsage, on retourne une erreur // Si erreur de parsage, on retourne une erreur
if( is_null($index) ) return; if( is_null($index) ) return;
$this->index = $index; $this->index = $index;
/* [3] Initialisation du gestionnaire d'acces (SplFileObject) /* [3] Initialisation du gestionnaire d'acces (SplFileObject)
=========================================================*/ =========================================================*/
/* (1) Si le fichier n'existe pas, on le crée */ /* (1) Si le fichier n'existe pas, on le crée */
if( !file_exists($this->dir.'data') ) if( !file_exists($this->dir.'data') )
file_put_contents($this->dir.'data', '' ); file_put_contents($this->dir.'data', '' );
/* (2) On place un 'driver' sur le fichier */ /* (2) On place un 'driver' sur le fichier */
$this->driver = new \SplFileObject($this->dir.'data', 'r+'); $this->driver = new \SplFileObject($this->dir.'data', 'r+');
// $this->driver->setFlags( \SplFileObject::SKIP_EMPTY );
/* (3) On récupère le nombre de lignes */ /* (3) On récupère le nombre de lignes */
$this->line = -1; $this->line = -1;
while( !$this->driver->eof() ){ while( !$this->driver->eof() ){
$this->line++; $this->line++;
$this->driver->fgetcsv(); $this->driver->fgetcsv();
} }
} }
public function close(){ $this->driver = null; } public function close(){ $this->driver = null; }
/* RETOURNE LA LISTE DES INDEX /* RETOURNE LA LISTE DES INDEX
* *
* @i<String> Index pour lequel on veut la ligne et le hash * @i<String> Index pour lequel on veut la ligne et le hash
* *
* @return Index<Array> Tableau associatif contenant le hash et la ligne * @return Index<Array> Tableau associatif contenant le hash et la ligne
* *
*/ */
public function index($i=null){ public function index($i=null){
return is_numeric($i) ? $this->index : $this->index; return is_numeric($i) ? $this->index : $this->index;
} }
/* INSERTION D'UNE ENTREE DANS LA BASE DE DONNEES /* INSERTION D'UNE ENTREE DANS LA BASE DE DONNEES
* *
* @key<String> Clé qui permettra l'accès direct * @key<String> Clé qui permettra l'accès direct
* @data<mixed*> Objet qui sera enregistré dans la base * @data<mixed*> Objet qui sera enregistré dans la base
* *
* @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE * @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE
* *
*/ */
public function insert($key, $data){ public function insert($key, $data){
/* (1) On vérifie que la clé est unique */ /* (1) On vérifie que la clé est unique */
if( array_key_exists($key, $this->index) ) if( array_key_exists($key, $this->index) )
return false; return false;
/* (2) On ajoute les données aux fichier */ /* (2) On ajoute les données aux fichier */
$json_data = json_encode($data); $json_data = json_encode($data);
$this->driver->seek($this->line); $this->driver->seek($this->line);
$this->line++; $this->line++;
$written = $this->driver->fwrite( $json_data.PHP_EOL ); $written = $this->driver->fwrite( $json_data.PHP_EOL );
// Si erreur d'écriture, on retourne FALSE // Si erreur d'écriture, on retourne FALSE
if( is_null($written) ) if( is_null($written) )
return false; return false;
/* (3) On enregistre l'index */ /* (3) On enregistre l'index */
$this->index[$key] = array( $this->index[$key] = array(
'line' => $this->line - 1, 'line' => $this->line - 1,
'hash' => sha1($json_data) 'hash' => sha1($json_data)
); );
/* (4) On enregistre le fichier index */ /* (4) On enregistre le fichier index */
$fIndex = new \SplFileObject($this->dir.'index', 'w'); $fIndex = new \SplFileObject($this->dir.'index', 'w');
$fIndex->fwrite( json_encode($this->index) ); $fIndex->fwrite( json_encode($this->index) );
$fIndex = null; $fIndex = null;
return true; return true;
} }
/* MODIFICATION D'UNE ENTREE DE CLE DONNEE /* MODIFICATION D'UNE ENTREE DE CLE DONNEE
* *
* @key<String> Clé associée à la valeur à modifier * @key<String> Clé associée à la valeur à modifier
* @data<mixed*> Nouvelle valeur, si tableau associatif, remplacera uniquement les valeurs données * @data<mixed*> Nouvelle valeur, si tableau associatif, remplacera uniquement les valeurs données
* *
* @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE * @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE
* *
*/ */
public function update($key, $data){} public function update($key, $data){}
/* RENVOIE LES DONNEES ASSOCIEES A UNE CLE DONNEE /* RENVOIE LES DONNEES ASSOCIEES A UNE CLE DONNEE
* *
* @key<String> Clé associée à la valeur à récupérer * @key<String> Clé associée à la valeur à récupérer
* *
* @return data<mixed*> Renvoie la valeur associée à la clé, FALSE si erreur * @return data<mixed*> Renvoie la valeur associée à la clé, FALSE si erreur
* *
*/ */
public function fetch($key){ public function fetch($key){
/* (1) On vérifie que la clé existe bien */ /* (1) On vérifie que la clé existe bien */
if( !array_key_exists($key, $this->index) ) if( !array_key_exists($key, $this->index) )
return false; return false;
/* (2) On récupère la ligne */ /* (2) On récupère la ligne */
$line = $this->index[$key]['line']; $line = $this->index[$key]['line'];
/* (3) On récupère le contenu */ /* (3) On récupère le contenu */
$this->driver->seek($line); $this->driver->seek($line);
$json = json_decode( $this->driver->current(), true ); $json = json_decode( $this->driver->fgets(), true );
// Si erreur de parsage // Si erreur de parsage
if( is_null($json) ) if( is_null($json) )
return false; return false;
return $json; return $json;
} }
/* RENVOIE LES DONNEES ASSOCIEES AUX CLES DONNEES /* RENVOIE LES DONNEES ASSOCIEES AUX CLES DONNEES
* *
* @keys<Array> Liste des clés associées aux valeurs à récupérer * @keys<Array> Liste des clés associées aux valeurs à récupérer
* *
* @return data<Array> Renvoie un tableau des valeurs valeur associées aux clés (clé1->valeur1), FALSE si erreur * @return data<Array> Renvoie un tableau des valeurs valeur associées aux clés (clé1->valeur1), FALSE si erreur
* *
*/ */
public function fetchAll($keys){ public function fetchAll($keys){
/* (1) On récupère fetch() pour toutes les clés */ /* (1) On récupère fetch() pour toutes les clés */
$wrapper = array(); $wrapper = array();
foreach($keys as $key){ foreach($keys as $key){
$data = $this->fetch($key); $data = $this->fetch($key);
// Si aucune erreur, on ajoute l'entree au 'wrapper' // Si aucune erreur, on ajoute l'entree au 'wrapper'
if( $data !== false ) if( $data !== false )
$wrapper[$key] = $data; $wrapper[$key] = $data;
} }
/* (2) On retourne le résultat */ /* (2) On retourne le résultat */
return $wrapper; return $wrapper;
} }
/* RENVOIE LES DONNEES ASSOCIEES A UN CHAMP DE RECHERCHE /* SUPPRIME UNE ENTREE DE CLE DONNEE DE LA BASE DE DONNEES
* *
* @nomParam<typeParam> Description du param * @key<String> Clé de l'entrée à supprimer
* *
* @return nomRetour<typeRetour> Description du retour * @return status<Boolean> Retourne TRUE si tout s'est bien passé, sinon FALSE
* *
*/ */
public function filter($data){} // select() en comparant $data public function delete($key){
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
/* (2) On supprime la ligne de l'index */
unset( $this->index[$key] );
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) ){
/* (2) Sinon on compare @data en tant que valeur simple */
}else{
$this->tmp = sha1( json_encode($data) );
return array_filter($this->index, array($this, 'callbackFilter'));
}
}
protected function callbackFilter($e){ return $e['hash'] == $this->tmp; }
}

200
tmp/testdb1/data Normal file → Executable file

File diff suppressed because one or more lines are too long

2
tmp/testdb1/index Normal file → Executable file

File diff suppressed because one or more lines are too long