mardi 2 janvier 2018

PowerShell et LiteDB v3

Dans cet article, nous allons voir l'utilisation de la base de données LiteDB dans un environnement Windows PowerShell. Nous allons créer la base et ses collections. Nous verrons ensuite l'utilisation des instructions Insert, Update, Delete, Find, les requêtes [LiteDB.Query], et le stockage de fichiers.

Référence


Toujours à la recherche d'une base de données légère pour mes scriptes PowerShell, j'ai découvert LiteDB. Cette base de données "sans serveur" de type NoSQL se présente sous la forme d'une simple Dll de moins de 300Ko. Elle ne nécessite ni installation, ni droit administrateur. LiteDB est donc facilement portable pour peu que le FrameWork 3.5 (ou compatible) soit installé sur le système.

Site de référence : http://www.litedb.org

Exemple


Dans l'exemple ci-dessous, j'utilise la version 3.1.4 car la version 4.1.0 refusait de se charger sous certain environnement vieillissant (mais encore utilisé en entreprise).

 
################################################################
#
#               Base de données : LiteBD v3.1.4
#                     Powershell.sekki.fr
#
# 1 - Créer un dossier ldb à côté du script.
# 2 - Télécharger et copier LiteDB.dll+xml dans le dossier ldb.
#
################################################################

#Chemin courant.
$curpath = ""
if ($psISE) { $curpath = split-path -parent $psISE.CurrentFile.Fullpath }
else        { $curpath = Split-Path $MyInvocation.MyCommand.Path  }

#Charge les fonctions LiteDB.
Try   { [void][Reflection.Assembly]::LoadFile($curpath+"\ldb\LiteDB.dll") }
Catch { write-host "LiteDB.dll manquant.";Return 2 }

#Efface l'écran.
cls

###Fonctions personnalisées.
#Renvoi un nombre entre 0 et 100.
function GR() { Get-Random -minimum 0 -maximum 100 }

###Fonctions personnalisées.
#Converti le résultat de la query pour l'afficher.
function BsonToObj($bsn)
 {
   #Conversion.
   $obj = New-Object System.Object
   $obj | Add-Member -type NoteProperty -name id    -Value ([string]$bsn["_id"])
   $obj | Add-Member -type NoteProperty -name date  -Value ([string]$bsn["date"])
   $obj | Add-Member -type NoteProperty -name info1 -Value ([string]$bsn["Nom"])
   $obj | Add-Member -type NoteProperty -name info2 -Value ([string]$bsn["Prix"])
   $obj | Add-Member -type NoteProperty -name info3 -Value ([string]$bsn["Cat"])
   $obj
 }

#Ouvrir/Créer une Base de Données.
$db = New-Object LiteDB.LiteDatabase(($curpath+"\ldb\LiteDB.db"),$null)

#Ouvrir/Créer une Collection.
$coll = $db.GetCollection("Info")

#Créer un document Bson.
$bson = New-Object LiteDB.BsonDocument

#Créer 10 enregistrements.
for($i=0;$i -le 10;$i++)
 {
   $x = GR   #Nombre aléatoire entre 0 et 100.
   if ($x -le 50) { $nom = "Sekki";   $prix = $x; $cat = "Z" }
   else           { $nom = "Jumbor";  $prix = $x; $cat = "B" }
  
   #Ajouter un enregistrement dans la base de données.
   $bson["_id"]    = [LiteDB.ObjectId]::NewObjectId()
   $bson["date"]  = date
   $bson["Nom"] = $nom
   $bson["Prix"]  = $prix
   $bson["Cat"]   = $cat
   [void]$coll.Insert($bson)   #Insére le document dans la collection.
 }

#Modifier un enregistrement.
$query = $coll.Find([LiteDB.Query]::eq("Nom","Sekki"))
foreach ($q in $query)
 {
   $q["Cat"] = "A"
   [void]$coll.Update($q)
 }

#Supprimer un enregistrement : Méthode 1.
#$query = $coll.Find([LiteDB.Query]::eq("Nom","Sekki"))
#foreach ($q in $query)
# {
#   $coll.Delete($q["_id"])
# }

#Supprimer un enregistrement : Méthode 2.
#$nb = $coll.Delete([LiteDB.Query]::eq("Nom","Jumbor"))

###Les requétes.
#Renvoi les articles dont le nom exact est :
$query = $coll.Find([LiteDB.Query]::eq("Nom","Sekki"))
#Renvoi les articles dont le prix est plus grand que :
$query = $coll.Find([LiteDB.Query]::gt("Prix",30))
#Renvoi les articles dont le prix est plus petit que :
$query = $coll.Find([LiteDB.Query]::lt("Prix",30))
#Renvoi les articles dont le nom commence par :
$query = $coll.Find([LiteDB.Query]::startswith("Nom","S"))
#Renvoi tout les enregistrements :
$query = $coll.Find([LiteDB.Query]::all())

#Afficher une requête.
$query = $coll.Find([LiteDB.Query]::all())
$query | %{BsonToObj $_} | Out-GridView

###Charger des fichiers dans la base de données.
#Insérer/remplacer un fichier dans la base de données :
#$db.FileStorage.Upload("$/Fichiers/file1.jpg", $curpath+"\file1.jpg")
#Lire un fichier dans la base de données et l'enregistrer sur le disque local :
#[LiteDB.LiteFileInfo] $file = $db.FileStorage.FindById("$/Fichiers/file1.jpg")
#$file.SaveAs($curpath+"\file1.jpg")
#Lire un fichier dans la base de données et le charger dans une variable :
#[LiteDB.LiteFileInfo] $file = $db.FileStorage.FindById("$/Fichiers/file1.jpg")
#$image = [System.Drawing.Image]::FromStream($file.OpenRead())

#Pause
if (!$psISE) { Write-Host -NoNewLine "Press any key to continue..."
               $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") }

#Compresser la base de données.
[void]$db.Shrink()

#Fermer la base de données.
$db.Dispose()

#Fin.