• Publicity: Public Only All

msg-type-procs.tcl

Support library for acs service contracts.

Location:
packages/acs-service-contract/tcl/msg-type-procs.tcl
Created:
2003-01-14
Author:
Lars Pind <lars@collaboraid.biz>
CVS Identification:
$Id: msg-type-procs.tcl,v 1.5.2.1 2021/02/18 14:49:14 gustafn Exp $

Procedures in this file

Detailed information

acs_sc::msg_type::element::new (public)

 acs_sc::msg_type::element::new -msg_type_name msg_type_name \
    -element_name element_name \
    -element_msg_type_name element_msg_type_name \
    -element_msg_type_isset_p element_msg_type_isset_p \
    -element_pos element_pos

Insert a new msg_type element

Switches:
-msg_type_name
(required)
-element_name
(required)
-element_msg_type_name
(required)
-element_msg_type_isset_p
(required)
-element_pos
(required)

Partial Call Graph (max 5 caller/called nodes):
%3 test_acs_sc_impl_new_from_spec acs_sc_impl_new_from_spec (test acs-service-contract) acs_sc::msg_type::element::new acs_sc::msg_type::element::new test_acs_sc_impl_new_from_spec->acs_sc::msg_type::element::new db_exec_plsql db_exec_plsql (public) acs_sc::msg_type::element::new->db_exec_plsql acs_sc::msg_type::parse_spec acs_sc::msg_type::parse_spec (private) acs_sc::msg_type::parse_spec->acs_sc::msg_type::element::new auth::after_upgrade auth::after_upgrade (private) auth::after_upgrade->acs_sc::msg_type::element::new

Testcases:
acs_sc_impl_new_from_spec

acs_sc::msg_type::new (public)

 acs_sc::msg_type::new -name name [ -specification specification ]
Switches:
-name
(required)
-specification
(optional)
Msg type specification in the format required by the SQL proc, namely 'foo:integer,bar:[string]'

Partial Call Graph (max 5 caller/called nodes):
%3 test_acs_sc_impl_new_from_spec acs_sc_impl_new_from_spec (test acs-service-contract) acs_sc::msg_type::new acs_sc::msg_type::new test_acs_sc_impl_new_from_spec->acs_sc::msg_type::new db_exec_plsql db_exec_plsql (public) acs_sc::msg_type::new->db_exec_plsql acs_sc::msg_type::parse_spec acs_sc::msg_type::parse_spec (private) acs_sc::msg_type::parse_spec->acs_sc::msg_type::new

Testcases:
acs_sc_impl_new_from_spec
[ hide source ] | [ make this the default ]

Content File Source

ad_library {
    Support library for acs service contracts.
    
    @author Lars Pind (lars@collaboraid.biz)
    @creation-date 2003-01-14
    @cvs-id $Id: msg-type-procs.tcl,v 1.5.2.1 2021/02/18 14:49:14 gustafn Exp $
}

namespace eval acs_sc::msg_type {}
namespace eval acs_sc::msg_type::element {}

d_proc -public acs_sc::msg_type::new {
    {-name:required}
    {-specification ""} 
} {
    @param specification Msg type specification in the format required by the SQL proc, namely
    'foo:integer,bar:[string]'
} {
    db_exec_plsql insert_msg_type {}
}

d_proc -private acs_sc::msg_type::delete {
    {-msg_type_id ""}
    {-name ""}
} {
    Delete a message type. Supply either ID or name.

    @param msg_type_id The ID of the msg_type to delete.
    @param name Name of the service contract to delete
} {
    if { $msg_type_id eq "" && $name eq "" } {
        error "You must supply either name or msg_type_id"
    }

    # LARS:
    # It seems like delete by ID doesn't work, because our PG bind thing turns all integers into strings
    # by wrapping them in single quotes, causing PG to invoke the function for deleting by name

    if { $name eq "" } {
        # get msg_type name
        db_1row select_name {        
        select msg_type_name as name
        from   acs_sc_msg_types 
        where  msg_type_id = :msg_type_id
    }
    }

    db_exec_plsql delete_by_name {}
}

d_proc -private acs_sc::msg_type::parse_spec {
    {-name:required}
    {-spec:required}
} {
    #The specification for the message type could be like this!
    #case_id:integer
    #foobar:string,multiple

    @param name Name of new msg_type
    @param spec Spec in ad_page_contract style format, namely { foo:integer bar:string,multiple }
} {
    db_transaction { 

        # First, create the msg_type
        acs_sc::msg_type::new -name $name
    
        set nargs 0 
    
        # Then create the elements
        foreach element $spec {
            incr nargs
    
            # element:flag,flag
            set elementv [split $element :]
            set flagsv [split [lindex $elementv 1] ","]
    
            set element_name [string trim [lindex $elementv 0]]
    
            if { [llength $flagsv] > 1 } {
                set idx [lsearch $flagsv "multiple"]
    
                if { [llength $flagsv] > 2 || $idx == -1 } {
                    error "Only one modified flag allowed, and that's multiple as in foo:integer,multiple"
                }
    
                # Remove the 'multiple' flag
                set flagsv [lreplace $flagsv $idx $idx]
                set element_type "[lindex $flagsv 0]"
                set isset_p "t"
            } else {
                set element_type [lindex $flagsv 0]
                set isset_p "f"
            }
    
            acs_sc::msg_type::element::new \
                    -msg_type_name $name \
                    -element_name $element_name \
                    -element_msg_type_name $element_type \
                    -element_msg_type_isset_p $isset_p \
                    -element_pos $nargs
        }
    }

    return $nargs
}

#####
#
# Msg_type Element
#
#####

d_proc -public acs_sc::msg_type::element::new {
    {-msg_type_name:required}
    {-element_name:required} 
    {-element_msg_type_name:required} 
    {-element_msg_type_isset_p:required} 
    {-element_pos:required} 
} {
    Insert a new msg_type element
} {
    db_exec_plsql insert_msg_type_element {}
}


# Local variables:
#    mode: tcl
#    tcl-indent-level: 4
#    indent-tabs-mode: nil
# End: