xmlBDD : Emulation de SGBD / sauvegarde de fichiers XML

Avatar du membre
ViPHP
xTG
ViPHP | 7331 Messages

22 févr. 2011, 21:10

Un projet que j'ai lancé alors que je m'ennuyais (ouais c'est souvent mauvais...), il consiste en une émulation "partielle" d'un sgbd basé sur des fichiers XML.

Je ne prétends aucunement obtenir un résultat comparable à MySQL ou autre, loin de là même (bien que je n'ai pas encore testé de gros flots de données ou même exécuté un seul test de performance), ce projet était avant tout un moyen de voir comment on pouvait reproduire le fonctionnement d'une base de donnée.

Pour le moment xmlBDD est assez basique, il faudra voir si à terme je développe plus et l'améliore.

Un exemple d'utilisation :
// ouverture de la BDD magasin
		$bdd = new xmlBDD("bdd/magasin");

		//##########################################################################################################################
		//##########################################################################################################################
		// Création de la table jouet
		$bdd->create("jouet",array(
					'idJouet' => array('auto-increment' => true, 'primary' => true, 'type' => "integer", 'taille' => 10),
					'nomJouet' => array('type' => "text", 'taille' => 15),
					'descriptionJouet' => array('type' => "text", 'taille' => 300),
					'dateCreationJouet' => array('type' => "datetime")
				));

		//##########################################################################################################################
		//##########################################################################################################################
                // insertion d'un jeu de données
		$bdd->insert(array(	'idJouet' => 1,
							'nomJouet' => "Peluche",
							'descriptionJouet' => "Une peluche toute douce.",
							'dateCreationJouet' => date("d/m/Y H:i:s")
					),
		"jouet");
		$bdd->insert(array(	'idJouet' => 2,
							'nomJouet' => "Casse-tête",
							'descriptionJouet' => "C'est un casse-tête en bois.",
							'dateCreationJouet' => date("d/m/Y")
					),
		"jouet");
		$bdd->insert(array(	'idJouet' => 3,
							'nomJouet' => "Ballon",
							'descriptionJouet' => "Un ballon rouge gonflable.",
							'dateCreationJouet' => time()
					),
		"jouet");
                // SELECT * FROM `jouet` WHERE `idJouet` = 1;
		$data = $bdd->select('*',"jouet",array('idJouet' => 1));
		// SELECT `nomJouet`, `descriptionJouet` FROM `jouet` WHERE `descriptionJouet` LIKE "Un%";
		$data = $bdd->select(array("nomJouet", "descriptionJouet"),"jouet",array('descriptionJouet' => array('op' => "like", 'val' => "Un%")));
		// SELECT `idJouet`, `nomJouet` FROM `jouet` WHERE `idJouet` > 2;
		$data = $bdd->select(array("idJouet", "nomJouet"),"jouet",array('idJouet' => array('op' => ">", 'val' => 2)));
La classe permet toutes les opérations basiques (create, insert, select, update, delete) avec les opérateurs de base (=, !=, >, >=, <, <= et like) pour trois types de données (text, integer, datetime).

Le projet est disponible en téléchargement (et consultation, ainsi qu'un fichier de demo) sur github : https://github.com/xTG/xmlBDD

Je suis ouvert à toute remarque sur le code (le but de ce projet étant en grande partie de m'améliorer). :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

22 févr. 2011, 23:19

Yop,

premier essai j'ai bien deux répertoire qui se créer et pas de message d'erreur c'est bien :)

par contre va falloir gérer la "zone de temps" parce que bon
Image

simplement : date_default_timezone_set('Europe/Paris'); par exemple, a moins de vouloir gérer la chose :)

j'ai regardé en biais, c'est une bonne idée, par contre c'est assez abrupte à l'utilisation, trop de tableau :) (select('*') ou select ('champ1,champ2 etc) est plus parlant que select (array()) ..) enfin c'est mon avis :)


@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 5462 Messages

23 févr. 2011, 10:44

t'utilises pas Xpath pour les requêtes ?

moogli > l'erreur vient de ton php.ini :wink:

Avatar du membre
ViPHP
xTG
ViPHP | 7331 Messages

23 févr. 2011, 11:14

Bien la première fois que je vois une erreur pareille Moogli. O_o
Ton php.ini est-il correctement configuré ?

Pour les arguments je comptais par la suite m'orienter vers différents entrées.
Par exemple une chaîne de caractères de type requête : "SELECT champs1, champs2, ...."
Ou bien toujours en décomposant tel que tu me l'as suggéré.

Concernant Xpath, je ne connais pas, je vais de ce pas me renseigner dessus. :)
Edit: ouep c'est pas mal, je croyais au début que cela ne m'apporterai rien mais un billet m'a mis sur la voie : http://www.php.net/manual/fr/simplexmle ... .php#84196

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13235 Messages

23 févr. 2011, 15:01

Cette erreur, c'est que la directive "date.timezone" de ton php.ini n'est pas configurée.
Ce n'est pas un soucis applicatif, mais de configuration du serveur PHP.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 3609 Messages

23 févr. 2011, 15:32

ça me rappel un truc que j'avais fait il y a bien longtemps :p
vos-contributions/classe-gestion-donnee ... 27524.html (4 ans déjà :) )

Avatar du membre
ViPHP
xTG
ViPHP | 7331 Messages

23 févr. 2011, 15:37

Intéressant. :D

Je me pose une question en ayant parcouru ton code. Qu'est ce qui t'as poussé à ouvrir et fermer le fichier à chaque instruction (insert par exemple) ?
Y-a-t-il une raison particulière ? Ou bien est-ce venu ainsi ?

Je me pose la question car pour ma part je ne fais la mise à jour du fichier que lors de la destruction de l'objet (d'ailleurs j'ai l'impression que ça bug dur si on oublie de le faire manuellement avec un unset()...).

ViPHP
ViPHP | 3609 Messages

23 févr. 2011, 15:43

Arf je pense pas qu'il y ai eu beaucoup de raisons sinon mon inexpérience ;)
Effectivement à te lire je me rend compte que ta solution doit économiser pas mal d'accès disque!

Après je ne vois pas de fonction __destruct() dans ton code pour écrire dans le fichier en fin de code?

Du coup où c'est que ça se passe ça:
je ne fais la mise à jour du fichier que lors de la destruction de l'objet
?

ViPHP
ViPHP | 5462 Messages

23 févr. 2011, 15:44

moi je comprend pourquoi t'utilises pas simplexml pour créer ton XML au lieu de le creer en texte, asXML te permet ca :wink:
(ps : pour le XML c'est UTF-8 pas UTF8)

Avatar du membre
ViPHP
xTG
ViPHP | 7331 Messages

23 févr. 2011, 16:32

C'est à venir, j'ai eu des soucis avec SimpleXml et ça m'a barbé donc j'ai remis à plus tard. :/

Sinon le __destruct() est dans la class xmlBDTable, car c'est chaque table que je met à jour (s'il y a besoin).
Mais peut être qu'il serait plus propre de rajouter un destructeur aussi dans xmlBDD qui appellerai les autres destructeurs.

ViPHP
ViPHP | 5462 Messages

23 févr. 2011, 16:34

je ferais plutôt une sauvegarde, lors d'un insert/update
EDIT : tu peux utiliser addChild pour la création
Modifié en dernier par stealth35 le 23 févr. 2011, 16:39, modifié 1 fois.

Avatar du membre
ViPHP
xTG
ViPHP | 7331 Messages

23 févr. 2011, 16:38

A voir si on a besoin d'un script qui est constamment utilisé (multi-utilisateur au même moment) et si le script est long (en temps d'exécution).
Dans ce cas oui il serait plus intéressant de faire la mise à jour à chaque modification car sinon les autres utilisateurs ont un retard de données de quelques ms.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

24 févr. 2011, 02:16

t'utilises pas Xpath pour les requêtes ?

moogli > l'erreur vient de ton php.ini :wink:
wé, mais c'est la conf par défaut que ce paramètre ne soit pas configuré, même si cela indique pas qu'il ne le sera pas ^^

par contre coté test (sur un mutu) pb de droit à la création des répertoires, le mkdir prend un int en 2nd paramètre pas une chaine. donc on se retrouve pas avec un 777
ligne 115 de xmlBSS.class.php => $retour = mkdir($bdd,0777);

j'ai pas testé plus ^^

@+
Il en faut peu pour être heureux ......

Avatar du membre
ViPHP
xTG
ViPHP | 7331 Messages

24 févr. 2011, 10:57

Va falloir que je regarde ça de plus prêt...
Car j'avais mis 0777 au début, mais sous windaube pas moyen d'avoir les droits après...

En fait Stealth35, j'avais un fichier à peu prêt potable en terme d'utilisation avec les fonctions de création de SimpleXML.
Mais j'avais un fichier XML sur une ligne... -_-
Et moi j'en veux pas de ça ! C'est une horreur numérique ! Pourquoi pas encoder les fichiers, ça serait encore plus marrant non ?

ViPHP
ViPHP | 5462 Messages

24 févr. 2011, 11:31

DOMDocument format les fichiers avec l'indentation qui va avec, tu peux facilement switcher entre simplexml et domdocument
sinon ouai tu peux encoder des fichier ta le wrapper mcrypt qui est sympa :wink: