nsmcp::AccessAnalytics method peerSchema (protected)

 <instance of nsmcp::AccessAnalytics[i]> peerSchema db

Defined in /usr/local/ns/tcl/nsmcp/access-analytics.tcl

Additive migration also works after definition reload on a live object.

Parameters:
db (required)

Testcases:
No testcase defined.
Source code:
set found 0
set authFound 0
set agentFound 0
$db execute -arrayName row -script {
    if {$row(name) eq "peer"} {
        set found 1
    }
    if {$row(name) eq "authenticationState"} {
        set authFound 1
    }
    if {$row(name) eq "userAgent"} {
        set agentFound 1
    }
} {SELECT name FROM pragma_table_info('nsmcp_access_requests')}
if {!$found} {
    $db execute {ALTER TABLE nsmcp_access_requests ADD COLUMN peer TEXT NOT NULL DEFAULT ''}
}
if {!$authFound} {
    $db execute {ALTER TABLE nsmcp_access_requests ADD COLUMN authenticationState TEXT NOT NULL DEFAULT 'unknown'}
}
if {!$agentFound} {
    $db execute {ALTER TABLE nsmcp_access_requests ADD COLUMN userAgent TEXT NOT NULL DEFAULT ''}
}
if {[$db scalar {SELECT value FROM nsmcp_access_metadata WHERE key='driverIdentityVersion'}] ne "1"} {
    # All callers hold a transaction. Fetch bounded batches before
    # updating, because one nsdb handle cannot nest active row cursors.
    set cursor 0
    while {1} {
        set rows [$db execute {SELECT rowid AS id,request_id FROM nsmcp_access_requests WHERE rowid>:cursor AND request_id LIKE '-driver:%' ORDER BY rowid LIMIT 256}]
        if {$rows eq {}} {
            break
        }
        foreach repairEntry $rows {
            set cursor [dict get $repairEntry id]
            set identity [::nsmcp::accessRecordIdentity [dict get $repairEntry request_id]]
            if {[dict get $identity recordSource] eq "driver"} {
                set pool [dict get $identity pool]
                $db execute {UPDATE nsmcp_access_requests SET pool=:pool,authenticationState='unknown',accept=NULL,queue=NULL,filter=NULL,run=NULL WHERE rowid=:cursor}
            }
        }
    }
    $db execute {INSERT OR REPLACE INTO nsmcp_access_metadata VALUES('driverIdentityVersion','1')}
}
$db execute {
    CREATE INDEX IF NOT EXISTS nsmcp_access_requests_peer_time ON nsmcp_access_requests(peer,start);
    INSERT OR REPLACE INTO nsmcp_access_metadata VALUES('schemaVersion','5');
}
XQL Not present:
Generic, PostgreSQL, Oracle
[ hide source ] | [ make this the default ]
Show another procedure: