Class ::xo::parameter

::xo::parameter[i] create ...

Class Relations

  • class: ::xotcl::Class[i]
  • superclass: ::xotcl::Object[i]
  • instmixinof: ::xo::db::apm_parameter[i]
::xotcl::Class create ::xo::parameter \
     -superclass ::xotcl::Object

Methods (to be applied on the object)

  • get (scripted)

    if {![info exists package_id]} {
      #
      # Try to get the package id; if everything fails, use kernel_id
      # (to be compatible with traditional parameter::get)
      #
      set package_id [expr {[nsf::is object ::xo::cc] ?
                            [::xo::cc package_id] :
                            [ns_conn isconnected] ? [ad_conn package_id] : $::acs::kernel_id}]
    }
    ad_log_deprecated proc "xo::parameter get -parameter $parameter" parameter::get
    return [::parameter::get -parameter $parameter -package_id $package_id  {*}[expr {[info exists default] ? [list -default $default] : ""}]]
    
    set parameter_obj [:get_parameter_object  -parameter_name $parameter  -package_id $package_id  -retry $retry]
    if {$parameter_obj ne ""} {
      set value [$parameter_obj get -package_id $package_id]
      if {$value eq "" && [$parameter_obj set __success] == 0} {
        return $default
      }
      return $value
    } else {
      return $default
    }
  • get_from_package_key (scripted)

    set parameter_obj [:get_parameter_object  -package_key $package_key  -parameter_name $parameter]
    if {$parameter_obj eq ""} {
      if {[info exists default]} {return $default}
      error "No parameter '$parameter' for package_key '$package_key' defined"
    }
    set package_id [:get_package_id_from_package_key -package_key $package_key]
    set value [$parameter_obj get -package_id $package_id]
    if {$value eq "" && [$parameter_obj set __success] == 0 && [info exists default]} {
      return $default
    } else {
      return $value
    }
  • get_package_id_from_package_key (scripted)

    return [ns_cache eval xotcl_package_cache package_id-$package_key {
      ::xo::dc get_value get_package_id {
        select package_id
        from apm_packages
        where package_key = :package_key
        fetch first 1 rows only
      }
    }]
  • get_package_key_from_id (scripted)

    return [apm_package_key_from_id $package_id]
  • get_parameter_object (scripted)

    #::xo::PackageMgr instvar package_class
    if {![info exists package_key]} {
      set package_key [:get_package_key_from_id -package_id $package_id]
    }
    while {$package_key ne ""} {
      set key Parameter_id($package_key,$parameter_name)
      if {[info exists :$key]} {
        return [set :$key]
      }
      #
      # We did not find the parameter object for the current package
      # key. Loop up the parameter class (TODO: should be done from
      # object_type of package_id, but first, we have to store it
      # there).  We simply iterate here of the classes of packages
      # (only a few exist).
      #
      #:log "--p looking for $parameter_name in superclass of package_key=$package_key"
      set success 0
      set pkg_class [::xo::PackageMgr get_package_class_from_package_key $package_key]
      if {$pkg_class ne ""} {
        set sc [$pkg_class info superclass]
        if {[$sc exists package_key]} {
          set package_key [$sc package_key]
          set success 1
        }
      }
      if {!$success} break
    }
    if {$retry} {
      #
      # The parameter object was not found. Maybe this is a new
      # parameter, not known in this thread. We try to load it
      #
      set r [::xo::db::apm_parameter instantiate_objects  -sql [::xo::db::apm_parameter instance_select_query  -where_clause {
                             and parameter_name = :parameter_name
                             and package_key = :package_key
                           }]  -object_class ::xo::db::apm_parameter  -ignore_missing_package_ids true  -as_ordered_composite false -named_objects true -destroy_on_cleanup false]
      #
      # Check for "retry" to avoid potential recursive loops
      #
      if {$r ne ""} {
        #
        # seems as if this parameter was newly defined
        #
        if {![info exists package_id]} {
          set package_id ""
        }
        return [:get_parameter_object  -retry false  -parameter_name $parameter_name  -package_id $package_id  -package_key $package_key]
      }
    }
    #
    # If everything fails, return empty.
    #
    return ""
  • initialize_parameters (scripted)

    #
    # Get those parameter values, which are different from the default
    # and remember these per package_id. For site-wide parameters -
    # which we do not handle here - the package_id is NULL, so we skip
    # it.
    #
    xo::dc foreach get_non_default_values {
      select p.parameter_id, p.package_key, v.package_id, p.parameter_name,
      p.default_value, v.attr_value
      from apm_parameters p, apm_parameter_values v
      where p.parameter_id = v.parameter_id
      and coalesce(attr_value,'') <> coalesce(p.default_value,'')
      and package_id is not null
    } {
      # ns_log notice "--p $parameter_id $package_key $package_id $parameter_name <$attr_value>"
      $parameter_id set_per_package_instance_value $package_id $attr_value
    }
  • set_value (scripted)

    
    if {![info exists package_id]} {
      #
      # Try to get the package id; if everything fails, use kernel_id
      # (to be compatible with traditional parameter::get)
      #
      set package_id [expr {[nsf::is object ::xo::cc] ?
                            [::xo::cc package_id] :
                            [ns_conn isconnected] ? [ad_conn package_id] : $::acs::kernel_id}]
    }
    
    ad_log_deprecated proc "xo::parameter set_value -parameter $parameter" parameter::set_value    
    return [::parameter::set_value -package_id $package_id -parameter $parameter -value $value]
    
    set parameter_obj [:get_parameter_object -parameter_name $parameter -package_id $package_id]
    if {$parameter_obj ne ""} {
      $parameter_obj set_per_package_instance_value $package_id $value
    } else {
      error "could not create parameter object"
    }

Methods (to be applied on instances)

  • clear_per_package_instance_value (scripted)

    set array [:per_package_id_name $package_id]
    if {[nsv_dict exists $array $package_id ${:parameter_name}]} {
      nsv_dict unset $array $package_id ${:parameter_name}
    }
  • get (scripted)

    set array [:per_package_id_name $package_id]
    #
    # Try to get the variable from the nsv. On success,
    #
    if {[nsv_dict get -varname result $array $package_id ${:parameter_name}]} {
      #:log "--parameter get <${:parameter_name}> for $package_id -> '$result'"
      set :__success 1
      return $result
    }
    # We could as well store per-package-key values,
    # but most probably, this is not needed if we use
    # the parameter default (which is per package-key).
    # With additional  per-package-key values, we could implement
    # a very simple "reset to default" for package-key values.
    #
    #     foreach cls $package_class_hierarchy {
    #       set nsv_array_name [:per_package_class_name $cls]
    #       if {[nsv_exists $nsv_array_name $key]} {
    #         #:log "--parameter get <$key> from $nsv_array_name --> '[nsv_get $nsv_array_name $key]'"
    #         return [nsv_get $nsv_array_name $key]
    #       }
    #     }
    #
    #:log "--parameter get <$key> from default of [:package_key] --> '[:default_value]'"
    set :__success 0
    return ${:default_value}
  • initialize_loaded_object (scripted)

    [self class] set Parameter_id(${:package_key},${:parameter_name}) [self]
  • per_package_id_name (scripted)

    xo::show_stack
    return CFG-[expr {$package_id % 2}]
  • set_per_package_instance_value (scripted)

    set array [:per_package_id_name $package_id]
    ns_log notice "[list nsv_dict set $array $package_id ${:parameter_name} $value]"
    xo::show_stack
    nsv_dict set $array $package_id ${:parameter_name} $value