I. My Base▲
Mybase n'est pas à proprement parler une base de données, MyBase est l'appellation qui désigne l'utilisation des nouveaux composants qui permettent de simuler un comportement base de données tout en restant indépendant d'un SGBD externe. MyBase reconnaît et travaille avec des fichiers XML ou binaires. L'utilisation de MyBase permet de s'affranchir du déploiement d'un moteur de base de données. Mybase est de par nature très léger à déployer, rapide et compact. La version Windows nécessite simplement la redististribution d'une dll, « midas.dll », et « midas.so » sous Linux.
Ces caractérisques le désignent donc particulièrement pour une application monoposte légère ou une distribution sur le net. Et cerise sur le gâteau MyBase est portable Kylix/D6 ou inversement.
La conception d'une application utilisant MyBase s'articule principalement sur un composant : TClientDataSet.
Je vous propose d'aborder trois sujets concernant MyBase : la création d'une base, la comparaison de Paradox et de MyBase en termes de performances et enfin comment transporter vos bases de données vers MyBase et donc Linux.
II. Création d'une base▲
II-A. Création dans l'IDE directement▲
Clic droit ou double clic sur le TClientDataset et… une petite image valant mille mots :-)
Très simple et bien dans la lignée du TTable de Delphi, on crée les nouveaux champs, on précise leur type. Une fois la structure de la base faite, il suffit de la valider. Clic droit toujours sur le TClientDataSet et « créer un dataset ». Pour l'instant la base n'a pas encore d'existence physique, il faut au préalable, bien que cela puisse être fait par la suite, créer les index. Dans l'inspecteur d'objets, dans propriétés du TClientDataSet, cliquer sur les trois points de « IndexDefs », un nouvel éditeur toujours d'aspect familier apparait. Ici il suffit d'ajouter le nombre d'index souhaités, de les nommer et de spécifier pour chacun d'entre eux le champ (Fields) sur lequel ils portent. Éventuellement la propriété « Options » permet de spécifier certaines particularités portant sur la nature de l'index (primaire, unique, etc.).
Ici la structure la base est créée, il faut maintenant la sauvegarder physiquement. Toujours sur le TClientDataSet, clic droit et Enregister la base Mybase, XML ou CDS au choix. Remarque le format CDS assure une plus grande confidentialité de vos données et s'avère plus compact. Toutefois la compacité est relative, car en cas de transport au format ZIP, le résultat obtenu lors de la compression d'un même ensemble de données donne une taille identique, quel que soit le format de départ.
II-B. Création par code▲
Encore une fois la similitude avec Delphi est parfaite (ne pas oublier que cet article est initialement fait à partir de Kylix). Le code pourrait être celui-ci :
with
ClientDataSet1 do
begin
with
FieldDefs.AddFieldDef do
begin
Name := 'NOM_CHAMP1'
;
DataType := ftInteger;
end
;
with
FieldDefs.addFieldDef do
begin
Name := 'NOM_CHAMP2'
;
DataType := ftString;
Size := 10
;
end
;
CreateDataSet;
end
;
// Sauvegarde de la base
ClientDataSet1.SaveToFile('PATH_DE_MA_BASE'
,dfXML);
III. Utilisation d'une base▲
III-A. Comparaison avec Paradox en termes de performances▲
Très simple, maintenant que nous avons créé une base, la méthode LoadFromFile, du TClientDadaSet permet de charger le fichier à l'exécution, et la propriété Filename autorise la même chose dans l'IDE. Ensuite tout se passe comme avec une TTable, il suffit de spécifier un index pour obtenir un ordre de tri. Les méthodes classiques First, Next, Prior fonctionnent, Locate aussi, mais la méthode SetRange/ApplyRange m'a semblé donner des résultats très rapides. Comme avec un TTable, mais en plus rapide encore.
Pour confirmer cette impression, j'ai créé une table Paradox et une table MyBase de 40 000 enregistrements, avec la même structure. Les index sont identiques et utilisés à parts égales. Les résultats sont donnés en millisecondes, le chiffre de gauche indiquant le meilleur temps, celui de droite le plus long. Premier test, SetRange aléatoire, un très léger avantage à MyBase. Ce qui est un très bon résultat quand on connait la vélocité de Paradox sur ce genre d'exercice. Dans le cas de locate l'écart se creuse et devient significatif toujours à l'avantage de MyBase.
SetRange |
Locate simple |
Locate [loPartialKey] |
|||
---|---|---|---|---|---|
MyBase |
Paradox |
MyBase |
Paradox |
MyBase |
Paradox |
0 / 5 |
5 / 10 |
470 / 500 |
1345 / 1475 |
335 / 510 |
955 / 1420 |
À ces chiffres, il convient toutefois d'ajouter ceux-ci :
Open |
IndexName := 'New_Index' |
||
---|---|---|---|
MyBase |
Paradox |
MyBase |
Paradox |
3740 |
480 |
1645 |
5 |
Paradox prend ici sa revanche, l'ouverture de la table, ou le changement d'index s'avère plus lourd avec MyBase.
IV. Migration Paradox ou DBase vers MyBase▲
IV-A. Exemple de migration▲
En fait MyBase possède bien des avantages par rapport à Paradox ou DBase. Ne serait-ce que la portabilité Linux. Par ailleurs, le couple TCLientDataSet/TDataSetProvider est d'une puissance et d'une souplesse d'utilisation incroyable, on peut tout faire avec (ou presque).
Le composant TCLientDataSet est utilisable aussi bien dans des développements d'applis BD locales, deux tiers, trois tiers et multitiers, c'est le composant base de données universel par excellence. Dans cet article seul l'aspect monoposte à travers MyBase est abordé.
Un exemple concret de migration de votre base Paradox vers Linux, pas de problème si ce n'est posséder Delphi 6 et Windows :-) C'est si simple que je n'ai rien à dire, tout est là.
L'image se passe de commentaires, le TTable charge les données, le DataSetProvider les récupère et les fournit au TClientDataSet, il suffit alors de sauvegarder au format XML. Ceci offre donc la possibilité de transporter toutes les bases accessibles via le BDE vers le format XML. Bien évidemment, il n'est pas nécessaire de faire ça dans l'IDE :-) L'affichage des données, donc les « DBGrid » et les « DataSource » ne sont là que pour l'exemple. Il est tout à fait possible de créer dynamiquement les composants sans rien afficher lors du changement de format, une simple procédure ou fonction devrait suffire à la tâche.
IV-B. Une fonction de conversion▲
function
TForm1.DBF2XML(DBFFile,XMLFIle:String
):boolean
;
var
Table:TTable;
DataSetProvider:TDataSetProvider;
ClientDataSet:TClientDataSet;
begin
Result:=true
;
try
try
Table:=TTable.Create(self
);
if
FileExists(DBFFile) then
Table.TableName:=DBFFile
Table.Open;
{création de la Table et chargement du DBF}
try
DataSetProvider:=TDataSetProvider.Create(self
);
DataSetProvider.DataSet:=Table;
{creation et paramètres du DataSetProvider}
try
ClientDataSet:=TClientDataSet.Create(Self
);
ClientDataSet.SetProvider(DataSetProvider);
ClientDataSet.Open;
ClientDataset.SaveToFile(XMLFile,dfXML);
{Création paramétrage et sauvegarde du ClientDataset}
finally
ClientDataSet.Free;
end
;
finally
DataSetProvider.Free;
end
;
finally
Table.Free;
end
;
except
Result:=false
;
{une erreur s'est produite}
end
;
end
;
V. Conclusion▲
Cet article vous permettra de faire vos premiers pas avec MyBase ou du moins je l'espère vous en donnera l'envie :-)
Finalement, je pense que des formats comme DBase utilisés pour des raisons de légèreté et de compatibilité ont cette fois, trouvé un concurrent de taille. Aujourd'hui il est possible de distribuer une application sous deux plateformes différentes (Windows et Linux) en utilisant le même format de base de données et sans avoir à installer un quelconque moteur externe. Interbase et Mybase pourraient former le duo BD standard du développeur Delphi/Kylix.