Class ::nsmcp::LogTool (public)

 ::nx::Class ::nsmcp::LogTool[i]

Defined in /usr/local/ns/tcl/nsmcp/lib/log-tools.tcl

Testcases:
No testcase defined.
Source code:
    :property service:required
    :property operation:required
    :method arguments {arguments} {
        set result {}
        foreach {key type value} [lindex $arguments 2] {dict set result $key $value}
        return $result
    }
    :public method validate {arguments} {
        if {[lindex $arguments 1] ne "object"} {
            return -code error -errorcode {NSMCP RPC -32602} "Expected arguments object"
        }
        set allowed [dict get [dict create errors {} requestContext {identifier} results {jobHandle resultHandle cursor limit includePeerAddresses}] ${:operation}]
        foreach {key type value} [lindex $arguments 2] {
            if {$key ni $allowed} {return -code error -errorcode {NSMCP RPC -32602} "Unknown log argument"}
            set expected string
            if {$key eq "limit"} {set expected number}
            if {$key eq "includePeerAddresses"} {set expected boolean}
            if {$type ne $expected} {return -code error -errorcode {NSMCP RPC -32602} "Invalid log argument type"}
            if {$key in {jobHandle resultHandle} && ![regexp {^[0-9a-f]{64}$} $value]} {
                return -code error -errorcode {NSMCP RPC -32602} "Invalid log handle"
            }
            if {$key eq "limit" && (![string is integer -strict $value] || $value < 1 || $value > 100)} {
                return -code error -errorcode {NSMCP RPC -32602} "Limit must be between 1 and 100"
            }
            if {$key eq "cursor" && (![string is entier -strict $value] || $value < 0)} {
                return -code error -errorcode {NSMCP RPC -32602} "Invalid cursor"
            }
        }
        set values [:arguments $arguments]
        if {${:operation} eq "requestContext" && (![dict exists $values identifier] ||
            ![::nsmcp::logRecordParser validRequestIdentifier [dict get $values identifier]])} {
            return -code error -errorcode {NSMCP RPC -32602} "Expected a dash-delimited log-thread identifier"
        }
        if {${:operation} eq "results"} {
            if {[dict exists $values jobHandle] == [dict exists $values resultHandle]} {
                return -code error -errorcode {NSMCP RPC -32602} "Supply exactly one of jobHandle (poll a job) or resultHandle (read a page)"
            }
            if {[dict exists $values jobHandle] && [dict size $values]!=1} {
                return -code error -errorcode {NSMCP RPC -32602} "Poll with jobHandle alone. Paging and includePeerAddresses apply to resultHandle pages; for access summaries set includePeerAddresses on access_summary"
            }
        }
    }
    :public method execute {context arguments} {
        set values [:arguments $arguments]
        switch ${:operation} {
            errors {return [${:service} start $context errors]}
            requestContext {return [${:service} start $context requestContext [dict get $values identifier]]}
            results {
                if {[dict exists $values jobHandle]} {return [${:service} poll $context [dict get $values jobHandle]]}
                set values [dict merge {cursor 0 limit 20 includePeerAddresses false} $values]
                return [${:service} results $context [dict get $values resultHandle] [dict get $values cursor]  [dict get $values limit] [dict get $values includePeerAddresses]]
            }
        }
    }
XQL Not present:
Generic, PostgreSQL, Oracle
[ hide source ] | [ make this the default ]
Show another procedure: