📖

PowerShellでLiteDB使うよ

2024/09/30に公開
litedb.psm1
Add-Type -Path .\LiteDB.dll

function New-LiteDBConnection {
    <#
.SYNOPSIS
    LiteDBファイルへの新しい接続を作成します。

.DESCRIPTION
    New-LiteDBConnection 関数は、指定されたファイルパスに基づいてLiteDBデータベースへの新しい接続を作成します。
    オプションでパスワードと読み取り専用モードを指定することができます。

.PARAMETER FilePath
    接続するLiteDBファイルのパス。ファイルが存在しない場合は、新しく作成されます。

.PARAMETER Password
    LiteDBファイルのパスワード。パスワードを設定することで、データベースの暗号化が行われます。

.PARAMETER ReadOnly
    このスイッチを使用すると、データベースを読み取り専用モードで開きます。

.EXAMPLE
    $db = New-LiteDBConnection -FilePath "C:\data\mydb.db"
    この例では、`mydb.db` というLiteDBデータベースに接続します。

.EXAMPLE
    $db = New-LiteDBConnection -FilePath "C:\data\mydb.db" -Password "mypassword"
    この例では、パスワードを指定して、暗号化されたLiteDBデータベースに接続します。

.EXAMPLE
    $db = New-LiteDBConnection -FilePath "C:\data\mydb.db" -ReadOnly
    この例では、データベースを読み取り専用モードで開きます。

.NOTES
    LiteDBバージョンに依存する場合があります。

.LINK
    https://github.com/mbdavid/LiteDB
#>
    [OutputType([LiteDB.LiteDatabase])]
    param (
        [Parameter(Mandatory = $true)]
        [string]$FilePath,
        [Parameter(Mandatory = $false)]
        [string]$Password,
        [Parameter(Mandatory = $false)]
        [switch]$ReadOnly
        
    )
    $cs = [LiteDB.ConnectionString]::new()
    $cs.Filename = $FilePath
    if ($Password -ne "") { $cs.Password = $Password } 
    if ($ReadOnly) { $cs.ReadOnly = $true } 

    try {
        return , ([LiteDB.LiteDatabase]::new($cs))
    }
    catch {
        Write-Error "LiteDBデータベースへの接続中に失敗しました。: " + $_
    }
}

function Get-LiteDBCollection {
    <#
    .SYNOPSIS
        LiteDBデータベースから特定のコレクションを取得します。
    
    .DESCRIPTION
        Get-LiteDBCollection 関数は、指定されたLiteDBオブジェクトから指定された名前のコレクションを取得します。
        コレクションが存在しない場合は、新しく作成されます。
    
    .PARAMETER LiteDB
        LiteDBデータベースオブジェクト。New-LiteDBConnection関数などを使用して作成されたデータベース接続です。
    
    .PARAMETER CollectionName
        取得するコレクションの名前。コレクションが存在しない場合は自動的に作成されます。
    
    .EXAMPLE
        $db = New-LiteDBConnection -FilePath "C:\data\mydb.db"
        $collection = Get-LiteDBCollection -LiteDB $db -CollectionName "Users"
        この例では、`Users`という名前のコレクションを取得します。
    
    .EXAMPLE
        $db = New-LiteDBConnection -FilePath "C:\data\mydb.db"
        $collection = Get-LiteDBCollection -LiteDB $db -CollectionName "Products"
        この例では、`Products`コレクションを取得し、データを操作します。
    
    .NOTES
        LiteDBバージョンに依存する場合があります。
    
    .LINK
        https://github.com/mbdavid/LiteDB
    #>
    
    [OutputType([LiteDB.LiteCollection`1])]
    param (
        [Parameter(Mandatory = $true)]
        [LiteDB.LiteDatabase]$LiteDB,
    
        [Parameter(Mandatory = $true)]
        [string]$CollectionName
    )
        
    try {
        return , ($LiteDB.GetCollection($CollectionName))
    }
    catch {
        Write-Error "コレクション '$CollectionName' をLiteDBから取得できませんでした:" + $_
    }
}

function Remove-LiteDBCollection {
    param (
        [Parameter(Mandatory = $true)]
        $Collection 
    )
    $Collection
}

function Get-LiteDBCollectionNames {
    <#
    .SYNOPSIS
        LiteDBデータベースからすべてのコレクション名を取得します。
    
    .DESCRIPTION
        Get-LiteDBCollectionNames 関数は、指定されたLiteDBデータベースからすべてのコレクション名を取得して返します。
        データベースに存在するコレクション名が文字列配列として返されます。
    
    .PARAMETER LiteDB
        LiteDBデータベースオブジェクト。New-LiteDBConnection関数などで作成されたデータベース接続オブジェクトを指定します。
    
    .EXAMPLE
        $db = New-LiteDBConnection -FilePath "C:\data\mydb.db"
        $collections = Get-LiteDBCollectionNames -LiteDB $db
        この例では、`mydb.db` からすべてのコレクション名を取得し、変数 `$collections` に保存します。
    
    .NOTES
        LiteDBのバージョンに依存する場合があります。
    
    .LINK
        https://github.com/mbdavid/LiteDB
    #>
    
        [OutputType([String[]], $null)]
        param (
            [Parameter(Mandatory = $true)]
            [LiteDB.LiteDatabase]$LiteDB
        )
        
        try {
            return $LiteDB.GetCollectionNames()
        }
        catch {
            Write-Error "LiteDBデータベースからコレクション名を取得できませんでした: $_"
        }
    }

function Get-LiteDBDocuments {
<#
.SYNOPSIS
    LiteDBコレクションからすべてのドキュメントを取得します。

.DESCRIPTION
    Get-LiteDBDocuments 関数は、指定されたLiteDBコレクションからすべてのドキュメントを取得し、それらをPowerShellの
    PSCustomObject として返します。各ドキュメントはPSCustomObjectとして処理されるため、PowerShellスクリプト内で扱いやすくなります。

.PARAMETER Collection
    LiteDBのコレクションオブジェクト。Get-LiteDBCollection関数などで取得したコレクションを指定します。

.EXAMPLE
    $db = New-LiteDBConnection -FilePath "C:\data\mydb.db"
    $collection = Get-LiteDBCollection -LiteDB $db -CollectionName "Users"
    $documents = Get-LiteDBDocuments -Collection $collection
    この例では、`Users`コレクションからすべてのドキュメントを取得します。

.NOTES
    LiteDBのバージョンに依存する場合があります。

.LINK
    https://github.com/mbdavid/LiteDB
#>

    [OutputType([pscustomobject], $null)]
    param (
        [Parameter(Mandatory = $true)]
        $Collection
    )
    
    $res = @()
    
    try {
        $Collection.FindAll() | ForEach-Object {
            $row = [PSCustomObject]@{}
            $_ | ForEach-Object {
                $row | Add-Member -NotePropertyName $_.Key -NotePropertyValue $_.Value
            }
            $res += $row
        }
        return $res
    }
    catch {
        Write-Error "ドキュメントの取得中にエラーが発生しました: $_"
    }
}

function Add-LiteDBDocument {
    <#
    .SYNOPSIS
        PSCustomObject データを LiteDB コレクションに挿入します。
    
    .DESCRIPTION
        Add-LiteDBDocument 関数は、指定された LiteDB コレクションに対して、PowerShellの PSCustomObject をドキュメントとして挿入します。
        データは BSON 形式に変換されて LiteDB に保存されます。
    
    .PARAMETER Collection
        LiteDB コレクションオブジェクト。Get-LiteDBCollection 関数などで取得したコレクションを指定します。
    
    .PARAMETER Data
        挿入するデータを PSCustomObject 形式で指定します。このデータは BSON 形式に変換され、LiteDB に挿入されます。
    
    .EXAMPLE
        $db = New-LiteDBConnection -FilePath "C:\data\mydb.db"
        $collection = Get-LiteDBCollection -LiteDB $db -CollectionName "Users"
        $user = [PSCustomObject]@{ Name = "John Doe"; Age = 30 }
        Add-LiteDBDocument -Collection $collection -Data $user
        この例では、`Users` コレクションに `Name` と `Age` を持つドキュメントを挿入します。
    
    .NOTES
        LiteDBのバージョンに依存する場合があります。
    
    .LINK
        https://github.com/mbdavid/LiteDB
    #>
    
        param (
            [Parameter(Mandatory = $true)]
            $Collection,
    
            [Parameter(Mandatory = $true)]
            [pscustomobject]$Data 
        )
    
        try {
            # BSONMapper を使用して PSCustomObject を BSON ドキュメントに変換し、コレクションに挿入
            $BSONMapper = [LiteDB.BSONMapper]::new()
            $Collection.Insert($BSONMapper.ToDocument($Data)) | Out-Null
        }
        catch {
            # エラー発生時にエラーメッセージを表示
            Write-Error "ドキュメントの挿入中にエラーが発生しました: $_"
        }
    }


function Remove-LiteDBDocument {
    param (
        [Parameter(Mandatory = $true)]
        $Collection,
        [Parameter(Mandatory = $true)]
        [LiteDB.BsonValue]$ID 
    )
    $Collection.Delete($ID)
}

function Clear-LiteDBCollection {
    param (
        [Parameter(Mandatory = $true)]
        $Collection
    )
    $Collection.DeleteAll()
}

Export-ModuleMember -Function *

Discussion