# アーキテクチャ構成図

## 全体アーキテクチャ図

```mermaid
graph TB
    subgraph "ユーザー層"
        User[PowerShellユーザー]
        Console[PowerShellコンソール]
        Scripts[自動化スクリプト]
    end

    subgraph "dbatools モジュール"
        subgraph "Public Layer"
            PublicCmds[公開コマンド<br/>約700コマンド]
        end

        subgraph "Private Layer"
            PrivateFuncs[内部関数<br/>約125関数]
            DynamicParams[動的パラメータ]
        end

        subgraph "Configuration Layer"
            ConfigSystem[設定システム]
            Settings[設定ファイル]
            Validation[バリデーション]
        end

        subgraph "Background Services"
            TEPP[TEPP<br/>タブ補完]
            Logging[ロギング<br/>Runspace]
            Maintenance[メンテナンス]
        end

        subgraph "Resources"
            TypesXml[Types.ps1xml]
            FormatXml[Format.ps1xml]
            Templates[テンプレート]
        end
    end

    subgraph "dbatools.library"
        DLL[dbatools.dll]
        Types[型定義<br/>Dataplat.Dbatools.*]
        Utils[ユーティリティ]
    end

    subgraph "SQL Server 接続"
        SMO[SMO<br/>SQL Server Management Objects]
        ADO[ADO.NET<br/>Microsoft.Data.SqlClient]
    end

    subgraph "SQL Server"
        OnPrem[オンプレミス<br/>SQL Server 2000-2025]
        Azure[Azure SQL<br/>Database / MI]
        Container[コンテナ<br/>Docker / K8s]
    end

    User --> Console
    Console --> PublicCmds
    Scripts --> PublicCmds

    PublicCmds --> PrivateFuncs
    PublicCmds --> DynamicParams
    PrivateFuncs --> ConfigSystem
    ConfigSystem --> Settings
    ConfigSystem --> Validation

    PublicCmds --> TEPP
    PrivateFuncs --> Logging
    PrivateFuncs --> Maintenance

    PublicCmds --> TypesXml
    PublicCmds --> FormatXml
    PublicCmds --> Templates

    PrivateFuncs --> DLL
    DLL --> Types
    DLL --> Utils

    PrivateFuncs --> SMO
    PrivateFuncs --> ADO
    SMO --> OnPrem
    SMO --> Azure
    SMO --> Container
    ADO --> OnPrem
    ADO --> Azure
    ADO --> Container
```

## モジュールローディングフロー

```mermaid
sequenceDiagram
    participant User as ユーザー
    participant PS as PowerShell
    participant PSD as dbatools.psd1
    participant PSM as dbatools.psm1
    participant Lib as dbatools.library
    participant Config as Configuration
    participant Scripts as Background Scripts

    User->>PS: Import-Module dbatools
    PS->>PSD: マニフェスト読み込み
    PSD->>PSM: RootModule読み込み

    rect rgb(200, 220, 240)
        Note over PSM: 初期化フェーズ
        PSM->>PSM: TEMP環境変数チェック
        PSM->>Lib: dbatools.library インポート
        Lib-->>PSM: DLLロード完了
        PSM->>PSM: 型エイリアス登録
    end

    rect rgb(220, 240, 200)
        Note over PSM: 関数ロードフェーズ
        PSM->>PSM: private/functions/* ドットソース
        PSM->>PSM: private/testing/* ドットソース
        PSM->>PSM: public/* ドットソース
    end

    rect rgb(240, 220, 200)
        Note over PSM: 設定フェーズ
        PSM->>Config: configuration.ps1 実行
        Config->>Config: パス設定
        Config->>Config: 永続化設定読み込み
        Config-->>PSM: 設定初期化完了
    end

    rect rgb(220, 200, 240)
        Note over PSM: バックグラウンド開始
        PSM->>Scripts: TEPP Runspace開始
        PSM->>Scripts: Logging Runspace開始
        PSM->>Scripts: Maintenance処理開始
    end

    PSM->>PSM: エイリアス登録
    PSM->>PS: Export-ModuleMember
    PS-->>User: モジュールロード完了
```

## コマンド実行フロー

```mermaid
sequenceDiagram
    participant User as ユーザー
    participant Cmd as Public Command
    participant Helper as Private Function
    participant Connect as Connect-DbaInstance
    participant SMO as SMO Object
    participant SQL as SQL Server
    participant Output as Pipeline Output

    User->>Cmd: Get-DbaDatabase -SqlInstance sql01

    rect rgb(200, 220, 240)
        Note over Cmd: BEGIN ブロック
        Cmd->>Cmd: パラメータ検証
        Cmd->>Helper: Test-Bound 呼び出し
    end

    rect rgb(220, 240, 200)
        Note over Cmd: PROCESS ブロック
        Cmd->>Connect: 接続取得
        Connect->>Connect: キャッシュ確認
        alt キャッシュヒット
            Connect-->>Cmd: キャッシュ済み接続
        else キャッシュミス
            Connect->>SMO: 新規接続作成
            SMO->>SQL: 接続確立
            SQL-->>SMO: 接続成功
            SMO-->>Connect: SMO Server Object
            Connect->>Connect: キャッシュに保存
            Connect-->>Cmd: 新規接続
        end

        Cmd->>SMO: server.Databases取得
        SMO->>SQL: メタデータクエリ
        SQL-->>SMO: データベース一覧
        SMO-->>Cmd: Database Collection

        loop 各データベース
            Cmd->>Cmd: PSCustomObject構築
            Cmd->>Output: パイプライン出力
        end
    end

    rect rgb(240, 220, 200)
        Note over Cmd: END ブロック
        Cmd->>Cmd: クリーンアップ
    end

    Output-->>User: 結果表示
```

## 設定システムアーキテクチャ

```mermaid
graph TB
    subgraph "設定層"
        direction TB
        UserConfig[ユーザー設定<br/>最優先]
        DefaultConfig[デフォルト設定<br/>モジュール定義]
    end

    subgraph "永続化層"
        direction TB
        subgraph "Windows"
            HKCU[HKCU レジストリ<br/>ユーザー設定]
            HKLM[HKLM レジストリ<br/>マシン設定]
        end
        subgraph "Linux/macOS"
            UserJSON[~/.config/PowerShell/dbatools/<br/>ユーザー設定]
            SystemJSON[/etc/xdg/PowerShell/dbatools/<br/>システム設定]
        end
    end

    subgraph "設定API"
        GetConfig[Get-DbatoolsConfig]
        SetConfig[Set-DbatoolsConfig]
        RegConfig[Register-DbatoolsConfig]
        GetValue[Get-DbatoolsConfigValue]
    end

    subgraph "設定ストア"
        MemoryStore[メモリストア<br/>ConfigurationHost]
    end

    GetConfig --> MemoryStore
    SetConfig --> MemoryStore
    GetValue --> MemoryStore
    RegConfig --> MemoryStore
    RegConfig --> HKCU
    RegConfig --> HKLM
    RegConfig --> UserJSON
    RegConfig --> SystemJSON

    MemoryStore --> UserConfig
    MemoryStore --> DefaultConfig

    HKCU -.->|起動時読み込み| MemoryStore
    HKLM -.->|起動時読み込み| MemoryStore
    UserJSON -.->|起動時読み込み| MemoryStore
    SystemJSON -.->|起動時読み込み| MemoryStore
```

## パッケージ構造図

```mermaid
graph TB
    subgraph "dbatools Module Root"
        PSD[dbatools.psd1<br/>マニフェスト]
        PSM[dbatools.psm1<br/>ローダー]

        subgraph "public/"
            P1[Add-*.ps1]
            P2[Backup-*.ps1]
            P3[Connect-*.ps1]
            P4[Copy-*.ps1]
            P5[Get-*.ps1]
            P6[Invoke-*.ps1]
            P7[New-*.ps1]
            P8[Remove-*.ps1]
            P9[Set-*.ps1]
            P10[Test-*.ps1]
            P11[...約700コマンド]
        end

        subgraph "private/"
            subgraph "functions/"
                F1[Connect-*.ps1]
                F2[Convert-*.ps1]
                F3[Get-*.ps1]
                F4[Test-*.ps1]
                F5[...約125関数]
            end
            subgraph "configurations/"
                C1[configuration.ps1]
                subgraph "settings/"
                    S1[設定ファイル群]
                end
                subgraph "validation/"
                    V1[バリデーション定義]
                end
            end
            subgraph "scripts/"
                SC1[insertTepp.ps1]
                SC2[logfilescript.ps1]
                SC3[updateTeppAsync.ps1]
                SC4[dbatools-maintenance.ps1]
            end
            DP[dynamicparams/]
            TT[testing/]
            MT[maintenance/]
        end

        subgraph "bin/"
            TA[typealiases.ps1]
            XE[XEtemplates/]
            DQ[diagnosticquery/]
            MS[maintenancesolution/]
            DM[datamasking/]
            PM[perfmontemplates/]
        end

        subgraph "xml/"
            Types[dbatools.Types.ps1xml]
            Format[dbatools.Format.ps1xml]
        end

        subgraph "opt/"
            O1[PowerShell v5未満用<br/>オプショナル機能]
        end

        subgraph "en-us/"
            Help[ヘルプファイル]
        end

        subgraph "tests/"
            Tests[Pesterテスト<br/>約730ファイル]
        end
    end

    PSD --> PSM
    PSM --> P1
    PSM --> F1
    PSM --> C1
    PSM --> SC1
    PSM --> TA
    PSM --> Types
```

## 接続管理フロー

```mermaid
stateDiagram-v2
    [*] --> パラメータ解析

    パラメータ解析 --> 接続タイプ判定

    state 接続タイプ判定 {
        [*] --> SMOServer: Server Object
        [*] --> 文字列: String
        [*] --> SqlConnection: SqlConnection
        [*] --> RegServer: Registered Server
    }

    SMOServer --> キャッシュ確認
    文字列 --> 接続文字列構築
    SqlConnection --> SMO変換
    RegServer --> 接続情報展開

    接続文字列構築 --> キャッシュ確認
    SMO変換 --> キャッシュ確認
    接続情報展開 --> キャッシュ確認

    state キャッシュ確認 {
        [*] --> ヒット: キャッシュあり
        [*] --> ミス: キャッシュなし
    }

    ヒット --> 接続検証
    ミス --> 新規接続作成

    state 新規接続作成 {
        [*] --> 認証方式選択
        認証方式選択 --> Windows統合認証: 資格情報なし
        認証方式選択 --> SQL認証: SqlCredential
        認証方式選択 --> AzureAD認証: Tenant指定
        認証方式選択 --> トークン認証: AccessToken

        Windows統合認証 --> SMO接続
        SQL認証 --> SMO接続
        AzureAD認証 --> SMO接続
        トークン認証 --> SMO接続
    }

    SMO接続 --> 接続成功
    SMO接続 --> 接続失敗

    接続成功 --> キャッシュ登録
    接続失敗 --> エラー処理

    キャッシュ登録 --> 接続オブジェクト返却
    接続検証 --> 接続オブジェクト返却

    接続オブジェクト返却 --> [*]
    エラー処理 --> [*]
```

## エラーハンドリングフロー

```mermaid
flowchart TB
    Start[処理開始] --> TryCatch{try/catch}

    TryCatch -->|正常| Process[処理実行]
    TryCatch -->|例外発生| CatchBlock[catch ブロック]

    Process --> Success[成功]
    Success --> Output[パイプライン出力]

    CatchBlock --> CheckEnable{EnableException?}

    CheckEnable -->|$true| ThrowError[例外スロー<br/>Stop-Function]
    CheckEnable -->|$false| WriteWarning[警告出力<br/>Write-Message]

    ThrowError --> Terminate[処理終了]
    WriteWarning --> Continue[処理継続]

    Continue --> NextItem{次のアイテム?}
    NextItem -->|あり| TryCatch
    NextItem -->|なし| End[正常終了]

    Output --> NextItem

    subgraph "Stop-Function 動作"
        SF[Stop-Function呼び出し]
        SF --> LogError[エラーログ記録]
        LogError --> CheckEnableEx{EnableException?}
        CheckEnableEx -->|$true| ThrowEx[例外スロー]
        CheckEnableEx -->|$false| ReturnFalse[return false]
    end
```

## プラットフォーム対応図

```mermaid
graph TB
    subgraph "Windows"
        WinPS5[Windows PowerShell 5.1<br/>.NET Framework 4.6.2+]
        WinCore[PowerShell 7.4+<br/>.NET 6/7/8]

        WinPS5 --> AllCmds[全コマンド対応<br/>700コマンド]
        WinCore --> AllCmds

        AllCmds --> WMI[WMI/CIM コマンド]
        AllCmds --> Registry[レジストリ操作]
        AllCmds --> SMO[SMO完全サポート]
        AllCmds --> RMO[RMO レプリケーション]
    end

    subgraph "Linux / macOS"
        LinuxCore[PowerShell Core 7.4+<br/>.NET 6/7/8]

        LinuxCore --> XPlatCmds[クロスプラット対応<br/>約550コマンド]

        XPlatCmds --> XSMO[SMO 基本機能]
        XPlatCmds --> XSQL[T-SQL実行]
        XPlatCmds -.->|非対応| XWMI[WMI/CIM]
        XPlatCmds -.->|非対応| XReg[レジストリ]
        XPlatCmds -.->|一部非対応| XRMO[RMO]
    end

    subgraph "Azure"
        AzureVM[Azure VM]
        AzureSQL[Azure SQL Database]
        AzureMI[Azure SQL MI]

        AzureVM --> AllCmds
        AzureSQL --> LimitedCmds[制限付きコマンド<br/>約280コマンド]
        AzureMI --> MICmds[MI対応コマンド<br/>約420コマンド]
    end
```
