Functions/GenXdev.Data.KeyValueStore/Set-ValueByKeyInStore.ps1

################################################################################
<#
.SYNOPSIS
Inserts or updates a key-value pair in the database.
.DESCRIPTION
Uses an INSERT with ON CONFLICT to set or overwrite the value.
.PARAMETER StoreName
Store name for the key-value pair.
.PARAMETER KeyName
Name of the key to set or update.
.PARAMETER Value
Value to be stored.
.PARAMETER SynchronizationKey
Optional key to identify synchronization scope, defaults to "Local".
.EXAMPLE
Set-ValueByKeyInStore -StoreName "MyStore" -KeyName "MyKey" -Value "SomeValue"
.EXAMPLE
setvalue MyStore MyKey SomeValue
#>

function Set-ValueByKeyInStore {

    [CmdletBinding()]
    [Alias("setvalue")]

    param (
        [Parameter(Mandatory = $true, Position = 0, HelpMessage = "Store name for the key-value pair")]
        [string]$StoreName,
        [Parameter(Mandatory = $true, Position = 1, HelpMessage = "Name of the key to set or update")]
        [string]$KeyName,
        [Parameter(Mandatory = $false, Position = 2, HelpMessage = "Value to be stored")]
        [string]$Value,
        [Parameter(Mandatory = $false, Position = 3, HelpMessage = "Key to identify synchronization scope")]
        [string]$SynchronizationKey = "Local"
    )

    # Path to your SQLite database
    $DatabaseFilePath = Expand-Path "$PSScriptRoot\..\..\..\..\GenXdev.Local\KeyValueStores.sqllite.db" -CreateDirectory

    # Not found?
    if (-not (Test-Path $DatabaseFilePath)) {

        Initialize-KeyValueStores
    }

    # get current user info for lastModifiedBy
    $lastModifiedBy = "$env:COMPUTERNAME\$env:USERNAME"

    # Insert or update the key-value pair
    $sqlQuery = @"
INSERT INTO KeyValueStore (
    synchronizationKey,
    storeName,
    keyName,
    value,
    lastModified,
    lastModifiedBy,
    deletedDate
)
VALUES (
    @syncKey,
    @storeName,
    @keyName,
    @value,
    CURRENT_TIMESTAMP,
    @modifiedBy,
    NULL
)
ON CONFLICT(synchronizationKey, storeName, keyName)
DO UPDATE SET
    value = excluded.value,
    lastModified = CURRENT_TIMESTAMP,
    lastModifiedBy = excluded.lastModifiedBy,
    deletedDate = NULL;
"@


    $params = @{
        'syncKey' = $SynchronizationKey
        'storeName' = $StoreName
        'keyName' = $KeyName
        'value' = $Value
        'modifiedBy' = $lastModifiedBy
    }

    Invoke-SqlLiteQuery -DatabaseFilePath $DatabaseFilePath -Queries $sqlQuery -SqlParameters $params

    # sync if not local
    if ($SynchronizationKey -ne "Local") {

        Sync-KeyValueStore -SynchronizationKey $SynchronizationKey
    }
}