Class ::xo::db::CrItem (public)

 ::xo::db::CrClass ::xo::db::CrItem[i]

Defined in

Testcases:
No testcase defined.
Source code:
namespace eval ::xo::db {}
::nsf::object::alloc ::xo::db::CrClass ::xo::db::CrItem {set :__default_metaclass ::xotcl::Class
   set :__default_superclass ::xotcl::Object
   set :abstract_p f
   set :auto_save false
   array set :db_constraints {nls_language {{default en_US}} mime_type {{references cr_mime_types} {default text/plain}} item_id {{references {cr_items on delete cascade}}}}
   array set :db_slot {creation_date ::xo::db::Object::slot::creation_date creation_user ::xo::db::Object::slot::creation_user object_id ::xo::db::Object::slot::object_id description ::xo::db::CrItem::slot::description creation_ip ::xo::db::Object::slot::creation_ip text ::xo::db::CrItem::slot::text nls_language ::xo::db::CrItem::slot::nls_language object_title ::xo::db::Object::slot::object_title package_id ::xo::db::Object::slot::package_id name ::xo::db::CrItem::slot::name security_inherit_p ::xo::db::Object::slot::security_inherit_p context_id ::xo::db::Object::slot::context_id mime_type ::xo::db::CrItem::slot::mime_type title ::xo::db::CrItem::slot::title revision_id ::xo::db::CrItem::slot::revision_id item_id ::xo::db::CrItem::slot::item_id last_modified ::xo::db::Object::slot::last_modified publish_date ::xo::db::CrItem::slot::publish_date modifying_user ::xo::db::Object::slot::modifying_user modifying_ip ::xo::db::Object::slot::modifying_ip}
   set :folder_id -100
   set :id_column revision_id
   set :mime_type text/plain
   set :name_method {}
   set :non_cached_instance_var_patterns __*
   set :object_type content_revision
   set :object_type_key 0000000000001111
   set :pretty_name CrItem
   set :pretty_plural CrItem
   set :security_inherit_p t
   set :sql_package_name ::xo::db::CrItem
   set :storage_type text
   set :supertype content_revision
   set :table_name cr_revisions
   set :with_table true}
::xo::db::CrItem instproc rename {-old_name:required -new_name:required} {
    set item_id ${:item_id}
    ::xo::dc dml update_rename  "update cr_items set name = :new_name where item_id = :item_id"
    set :name $new_name
    :update_item_index
  }
::xo::db::CrItem instproc save_new {-package_id -creation_user -creation_ip -context_id {-live_p:boolean true} {-use_given_publish_date:boolean false}} {

    set __class [:info class]

    if {![info exists package_id] && [info exists :package_id]} {
      set package_id ${:package_id}
    }
    if {![info exists context_id]} {
      set context_id [expr {[info exists :context_id] ? ${:context_id} : ""}]
    }
    [self class] get_context package_id creation_user creation_ip
    set :creation_user $creation_user
    set __atts  [list creation_user]
    set __vars $__atts

    # :log "db_slots for $__class: [$__class array get db_slot]"
    foreach {__slot_name __slot} [$__class array get db_slot] {
      # :log "--slot = $__slot"
      if {
          [$__slot domain] eq "::xo::db::Object"
          || $__slot in {
            "::xo::db::CrItem::slot::name"
            "::xo::db::CrItem::slot::publish_date"
          }
        } continue
      :instvar $__slot_name
      if {![info exists $__slot_name]} {set $__slot_name ""}
      lappend __atts [$__slot column_name]
      lappend __vars $__slot_name
    }

    if {$use_given_publish_date} {
      if {"publish_date" ni $__atts} {
        set publish_date ${:publish_date}
        lappend __atts publish_date
        lappend __vars publish_date
      }
      set publish_date_flag [list -publish_date $publish_date]
    } else {
      set publish_date_flag ""
    }

    ::xo::dc transaction {
      $__class instvar storage_type object_type
      [self class] lock acs_objects "SHARE ROW EXCLUSIVE"
      set revision_id [xo::dc nextval acs_object_id_seq]
      set :revision_id $revision_id

      if {![info exists :name] || ${:name} eq ""} {
        # we have an autonamed item, use a unique value for the name
        set :name [expr {[info exists :__autoname_prefix] ?
                         "${:__autoname_prefix}$revision_id" : $revision_id}]
      }
      if {$title eq ""} {
        set title [expr {[info exists :__title_prefix] ?
                         "${:__title_prefix} (${:name})" : ${:name}}]
      }

      if {$storage_type eq "file"} {
        #
        # Get the mime_type from the file, eventually creating a new
        # one if it's unrecognized.
        #
        set mime_type [cr_check_mime_type  -mime_type $mime_type  -filename  ${:name}  -file      ${:import_file}]
      }

      set :item_id [::acs::dc call content_item new  -name            ${:name}  -parent_id       ${:parent_id}  -creation_user   $creation_user  -creation_ip     $creation_ip  -context_id      $context_id  -item_subtype    "content_item"  -content_type    $object_type  -description     $description  -mime_type       $mime_type  -nls_language    $nls_language  -is_live         f  -storage_type    $storage_type  -package_id      $package_id  -with_child_rels f]

      if {$storage_type eq "file"} {
        set text [cr_create_content_file ${:item_id} $revision_id ${:import_file}]
      }

      ::xo::dc [::xo::dc insert-view-operation] revision_add  [[:info class] insert_statement $__atts $__vars]
      :fix_content $revision_id $text

      if {$live_p} {
        #
        # Update the life revision with the publish status and
        # optionally the publish_date
        #
        ::acs::dc call content_item set_live_revision  -revision_id $revision_id  -publish_status ${:publish_status}  -is_latest true  {*}$publish_date_flag
        :update_item_index
      }
    }

    :db_1row [:qn get_dates] {
      select creation_date, last_modified
      from acs_objects where object_id = :revision_id
    }
    set :object_id ${:item_id}
    return ${:item_id}
  }
::xo::db::CrItem instproc is_cached_object {} {
    return [info exists :__cached_object]
  }
::xo::db::CrItem instproc update_revision {{-quoted false} revision_id attribute value} {
    #
    # This method can be use to update arbitrary fields of
    # a revision.
    #
    if {$quoted} {set val $value} {set val :value}
    ::xo::dc dml update_content "update cr_revisions set $attribute = $val  where revision_id = :revision_id"
  }
::xo::db::CrItem instproc delete {} {
    # delegate deletion to the class
    [:info class] delete -item_id ${:item_id}
  }
::xo::db::CrItem instproc privilege=creator {{-login true} user_id package_id method} {
    set allowed 0
    # :log "--checking privilege [self args]"
    if {[info exists :creation_user]} {
      if {${:creation_user} == $user_id} {
        set allowed 1
      } else {
        # allow the package admin always access
        set allowed [::xo::cc permission  -object_id $package_id  -party_id $user_id  -privilege admin]
      }
    }
    return $allowed
  }
::xo::db::CrItem instproc changed_redirect_url {} {
    return ""
  }
::xo::db::CrItem instproc is_package_root_folder {} {
    # e.g. the -100 folder has no package_id
    # if {$package_id eq ""} {return false}
    if {![info exists :item_id]} {
      return false
    }
    #::xo::Package require ${:package_id}
    return [expr {${:item_id} eq [::${:package_id} folder_id]} ? true : false]
  }
::xo::db::CrItem instproc update_content {revision_id content} {
      #
      # This method can be use to update the content field (only this) of
      # a content item without creating a new revision. This works
      # currently only for storage_type == "text".
      #
      [:info class] instvar storage_type
      if {$storage_type eq "file"} {
        :log "--update_content not implemented for type file"
      } else {
        ::xo::dc dml update_content "update cr_revisions set content = :content  where revision_id = :revision_id"
      }
    }
::xo::db::CrItem instproc save {-modifying_user {-live_p:boolean true} {-use_given_publish_date:boolean false}} {
    set __atts [list creation_user]
    set __vars $__atts
    if {[ns_conn isconnected]} {
      lappend __atts creation_ip
      set peeraddr [ad_conn peeraddr]
      lappend __vars peeraddr
    }

    #
    # The modifying_user is not maintained by the CR (bug?).
    # xotcl-core handles this by having the modifying user as
    # creation_user of the revision.
    #
    # Caveat: the creation_user fetched can be different if we fetch
    # via item_id (the creation_user is the creator of the item) or if
    # we fetch via revision_id (the creation_user is the creator of
    # the revision).

    set creation_user [expr {[info exists modifying_user] ?
                             $modifying_user :
                             [:current_user_id]}]
    #set old_revision_id ${:revision_id}

    foreach {__slot_name __slot} [[:info class] array get db_slot] {
      if {
          [$__slot domain] eq "::xo::db::Object"
          || $__slot in {
            "::xo::db::CrItem::slot::name"
            "::xo::db::CrItem::slot::publish_date"
          }
        } continue
      #ns_log notice "REMAINING SLOT: [$__slot serialize]"
      set $__slot_name [set :$__slot_name]
      lappend __atts [$__slot column_name]
      lappend __vars $__slot_name
    }

    if {$use_given_publish_date} {
      if {"publish_date" ni $__atts} {
        set publish_date ${:publish_date}
        lappend __atts publish_date
        lappend __vars publish_date
      }
      set publish_date_flag [list -publish_date $publish_date]
    } else {
      set publish_date_flag ""
    }

    ::xo::dc transaction {
      #
      # Provide a row-lock to protect against deadlocks during
      # concurrent updates on the same item in different threads.
      #
      ::xo::dc row_lock -for "no key update" -prepare integer item_lock {
        select item_id from cr_items where item_id = :item_id
      }

      [:info class] instvar storage_type
      set revision_id [xo::dc nextval acs_object_id_seq]
      if {$storage_type eq "file"} {
        #
        # Get the mime_type from the file, eventually creating a new
        # one if it's unrecognized.
        #
        set :mime_type [cr_check_mime_type  -mime_type ${:mime_type}  -filename  ${:name}  -file      ${:import_file}]
        set :text [cr_create_content_file $item_id $revision_id ${:import_file}]
        set text ${:text}
        set mime_type ${:mime_type}
      }
      ::xo::dc [::xo::dc insert-view-operation] revision_add  [[:info class] insert_statement $__atts $__vars]

      :fix_content $revision_id $text

      if {$live_p} {
        #
        # Update the life revision with the publish status and
        # optionally the "publish_date".
        #
        ::acs::dc call content_item set_live_revision  -revision_id $revision_id  -publish_status ${:publish_status}  -is_latest true  {*}$publish_date_flag
        set :revision_id $revision_id
        :update_item_index
      } else {
        #
        # If we do not make the revision live, use the old
        # revision_id, and let CrCache save it ......
        #
      }

      #
      # Update instance variables "modifying_user" and "last_modified"
      # from potentially changed DB values.
      #
      set :modifying_user $creation_user
      ::xo::dc 1row -prepare integer get_metadata {
        select last_modified
        from acs_objects where object_id = :revision_id
      }
      set :last_modified $last_modified

      #
      # In case the context_id has in the DB is different as in the
      # instance variable, push the value from the instance variable
      # to the DB as well.
      #
      if {[info exists :context_id]} {
        set context_id ${:context_id}

        ::xo::dc dml update_context {
          UPDATE acs_objects
          SET context_id = :context_id
          WHERE object_id = :item_id
          AND   context_id != :context_id
        }
      }
    }
    return $item_id
  }
::xo::db::CrItem instproc update_item_index {} {
    next
  }
::xo::db::CrItem instproc initialize_loaded_object {} {
    # empty body, to be refined
  }
::xo::db::CrItem instproc fix_content {revision_id content} {
      [:info class] instvar storage_type
      # ::msg "--long_text_slots: [[:info class] array get long_text_slots]"
      # foreach {slot_name slot} [[:info class] array get long_text_slots] {
      #   set cls [$slot domain]
      #   set content [set :$slot_name]
      #   :msg "$slot_name [$cls table_name] [$cls id_column] length=[string length $content]"
      # }
      if {![info exists :storage_type] || $storage_type ne ${:storage_type}} {
        ad_log warning "we cannot get rid of the instvar storage_type yet"  "(exists [info exists :storage_type], instvar '$storage_type',"  "value '[expr {[info exists :storage_type] ? ${:storage_type} : {UNKNOWN}}]')"
      }
      if {$storage_type eq "file"} {
        ::xo::dc dml fix_content_length "update cr_revisions  set content_length = [ad_file size ${:import_file}]  where revision_id = :revision_id"
      }
    }
::xo::db::CrItem instproc set_live_revision {-revision_id:required {-publish_status "ready"} {-is_latest:boolean false}} {
    ::acs::dc call content_item set_live_revision  -revision_id $revision_id  -publish_status $publish_status  -is_latest $is_latest
    ::xo::xotcl_object_cache flush ${:item_id}
    ::xo::xotcl_object_cache flush $revision_id
  }
::xo::db::CrItem instproc update_attribute_from_slot {-revision_id slot:object value} {
      set :[$slot name] $value
      if {![info exists revision_id]} {
        set revision_id ${:revision_id}
      }
      set domain [$slot domain]
      #set sql "update [$domain table_name]  #          set [$slot column_name] = '$value'  #  where [$domain id_column] = $revision_id"
      #ns_log notice UPDATE-$sql
      ::xo::dc dml update_attribute_from_slot [subst {
        update [$domain table_name]
        set [$slot column_name] = :value
        where [$domain id_column] = :revision_id
      }]
      #
      # Probably we should call here update_last_modified, but for
      # that we would need the modifying_user and the modifying IP
      # address.
      #
      # ::acs::dc call acs_object update_last_modified  #      -object_id $revision_id  #      -modifying_user ${:publish_status}  #      -modifying_ip ...

      ::xo::dc dml update_attribute_from_slot_last_modified {
        update acs_objects set last_modified = CURRENT_TIMESTAMP
        where object_id = :revision_id
      }
    }
::xo::db::CrItem instproc update {} {
      ::xo::dc transaction {
        next
        :instvar object_id publish_date nls_language description name mime_type text title item_id
        ::xo::dc dml update_cr_revisions {update cr_revisions
          set publish_date = :publish_date,nls_language = :nls_language,description = :description,name = :name,mime_type = :mime_type,text = :text,title = :title,item_id = :item_id where revision_id = :object_id
        }
      }
    }
::xo::db::CrItem instproc www-revisions {} {

    set isAdmin [acs_user::site_wide_admin_p]

    ::TableWidget create t1 -volatile  -columns {
          Field version_number -label "" -html {align right}
          AnchorField create view -CSSclass view-item-button -label ""
          AnchorField diff -label ""
          AnchorField plain_diff -label ""
          AnchorField author -label [_ acs-content-repository.Creation_User]
          Field content_size -label [_ acs-content-repository.Size] -html {align right}
          Field last_modified_ansi -label [_ acs-content-repository.Last_Modified]
          Field description -label [_ acs-content-repository.Description]
          if {[acs_user::site_wide_admin_p]} {AnchorField show -label ""}
          ImageAnchorField live_revision -label [_ xotcl-core.live_revision]  -src /resources/acs-subsite/radio.gif  -width 16 -height 16 -border 0 -html {align center}
          AnchorField create version_delete -CSSclass delete-item-button -label ""
        }

    set user_id [:current_user_id]
    set page_id ${:item_id}
    set live_revision_id [::acs::dc call content_item get_live_revision -item_id $page_id]
    set package_id ${:package_id}
    set base [::$package_id url]
    set sql [::xo::dc select  -map_function_names true  -vars "ci.name, r.revision_id as version_id, person__name(o.creation_user) as author,  o.creation_user as author_id,  to_char(o.last_modified,'YYYY-MM-DD HH24:MI:SS') as last_modified_ansi, r.description, acs_permission.permission_p(r.revision_id,:user_id,'admin') as admin_p, acs_permission.permission_p(r.revision_id,:user_id,'delete') as delete_p, r.content_length, content_revision__get_number(r.revision_id) as version_number "  -from  "cr_items ci, cr_revisions r, acs_objects o"  -where "ci.item_id = :page_id and r.item_id = ci.item_id and o.object_id = r.revision_id
                         and acs_permission.permission_p(r.revision_id, :user_id, 'read') = 't'"  -orderby "r.revision_id desc"]

    ::xo::dc foreach revisions_select $sql {
      set content_size_pretty [lc_content_size_pretty -size $content_length]

      set last_modified_ansi [lc_time_system_to_conn $last_modified_ansi]

      if {$version_id != $live_revision_id} {
        set live_revision "Make this Revision Current"
        set live_revision_icon /resources/acs-subsite/radio.gif
      } else {
        set live_revision "Current Live Revision"
        set live_revision_icon /resources/acs-subsite/radiochecked.gif
      }

      set live_revision_link [export_vars -base $base {
        {m make-live-revision} {revision_id $version_id}
      }]

      t1 add  -version_number $version_number:  -view ""  -view.href [export_vars -base $base {{revision_id $version_id}}]  -author $author  -content_size $content_size_pretty  -last_modified_ansi [lc_time_fmt $last_modified_ansi "%x %X"]  -description $description  -live_revision.src $live_revision_icon  -live_revision.title $live_revision  -live_revision.href $live_revision_link  -version_delete.href [export_vars -base $base  {{m delete-revision} {revision_id $version_id}}]  -version_delete ""  -version_delete.title [_ acs-content-repository.Delete_Revision]

      [t1 last_child] set payload(revision_id) $version_id

      if {$isAdmin} {
        set show_revision_link [export_vars -base $base  {{m show-object} {revision_id $version_id}}]
        [t1 last_child] set show show
        [t1 last_child] set show.href $show_revision_link
      }

    }

    # providing diff links to the prevision versions. This can't be done in
    # the first loop, since we have not yet the revision id of entry in the next line.
    set lines [t1 children]
    for {set i 0} {$i < [llength $lines]-1} {incr i} {
      set e [lindex $lines $i]
      set n [lindex $lines $i+1]
      set revision_id [$e set payload(revision_id)]
      set compare_revision_id [$n set payload(revision_id)]
      $e set diff.href [export_vars -base $base {{m diff} compare_revision_id revision_id}]
      $e set diff "diff"
      $e set plain_diff.href [export_vars -base $base {{m diff} {plain_text_diff 1} compare_revision_id revision_id}]
      $e set plain_diff "plain"
    }
    set e [lindex $lines end]
    if {$e ne ""} {
      $e set diff.href ""
      $e set diff ""
      $e set plain_diff.href ""
      $e set plain_diff ""
    }

    return [t1 asHTML]
  }
::xo::db::CrItem instproc current_user_id {} {
    if {[nsf::is object ::xo::cc]} {return [::xo::cc user_id]}
    if {[ns_conn isconnected]}  {return [ad_conn user_id]}
    return ""
  }
::xo::db::CrItem instparametercmd description
::xo::db::CrItem instparametercmd text
::xo::db::CrItem instparametercmd storage_type
::xo::db::CrItem instparametercmd nls_language
::xo::db::CrItem instparametercmd package_id
::xo::db::CrItem instparametercmd mime_type
::xo::db::CrItem instparametercmd name
::xo::db::CrItem instparametercmd title
::xo::db::CrItem instparametercmd publish_status
::xo::db::CrItem instparametercmd item_id
::xo::db::CrItem instparametercmd revision_id
::xo::db::CrItem instparametercmd publish_date
::xo::db::CrItem instparametercmd parent_id
::nsf::relation::set ::xo::db::CrItem superclass ::xo::db::Object
::nsf::relation::set ::xo::db::CrItem class-mixin ::xo::db::CrCache::Item

::nx::slotObj -container slot ::xo::db::CrItem
::xo::db::CrItem::slot eval {set :__parameter {
        package_id
        {parent_id -100}
        {publish_status ready}
        {storage_type text}
      }}

::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrItem::slot::mime_type {set :accessor public
   set :column_name mime_type
   set :configurable true
   set :convert false
   set :create_acs_attribute true
   set :create_table_attribute true
   set :datatype text
   set :default text/plain
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental false
   set :manager ::xo::db::CrItem::slot::mime_type
   set :max_n_values 1
   set :methodname mime_type
   set :min_n_values 1
   set :multiplicity 1..1
   set :name mime_type
   set :per-object false
   set :position 0
   set :pretty_name {Mime Type}
   set :pretty_plural {Mime Types}
   set :references cr_mime_types
   set :required false
   set :sqltype varchar(200)
   set :substdefault 0b111
   set :trace none
   : init}

::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrItem::slot::title {set :accessor public
   set :column_name title
   set :configurable true
   set :convert false
   set :create_acs_attribute true
   set :create_table_attribute true
   set :datatype text
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental false
   set :manager ::xo::db::CrItem::slot::title
   set :max_n_values 1
   set :methodname title
   set :min_n_values 1
   set :multiplicity 1..1
   set :name title
   set :per-object false
   set :position 0
   set :pretty_name #xotcl-core.title#
   set :pretty_plural #xotcl-core.titles#
   set :references {}
   set :required false
   set :sqltype varchar(1000)
   set :trace none
   : init}

::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrItem::slot::item_id {set :accessor public
   set :column_name item_id
   set :configurable true
   set :convert false
   set :create_acs_attribute true
   set :create_table_attribute true
   set :datatype integer
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental false
   set :manager ::xo::db::CrItem::slot::item_id
   set :max_n_values 1
   set :methodname item_id
   set :min_n_values 1
   set :multiplicity 1..1
   set :name item_id
   set :parameterSpec -item_id
   set :per-object false
   set :position 0
   set :pretty_name {Item ID}
   set :pretty_plural {Item IDs}
   set :references {cr_items on delete cascade}
   set :required false
   set :sqltype integer
   set :trace none
   : init}

::nsf::object::alloc ::xo::db::Attribute ::xo::db::CrItem::slot::revision_id {set :accessor public
   set :column_name revision_id
   set :configurable true
   set :convert false
   set :create_acs_attribute false
   set :create_table_attribute true
   set :datatype integer
   set :default 0
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental false
   set :manager ::xo::db::CrItem::slot::revision_id
   set :max_n_values 1
   set :methodname revision_id
   set :min_n_values 1
   set :multiplicity 1..1
   set :name revision_id
   set :parameterSpec {-revision_id 0}
   set :per-object false
   set :position 0
   set :pretty_name ID
   set :pretty_plural {}
   set :references {}
   set :required false
   set :sqltype integer
   set :substdefault 0b111
   set :trace none
   : init}

::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrItem::slot::text {set :accessor public
   set :column_name text
   set :configurable true
   set :convert false
   set :create_acs_attribute false
   set :create_table_attribute false
   set :datatype text
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental false
   set :manager ::xo::db::CrItem::slot::text
   set :max_n_values 1
   set :methodname text
   set :min_n_values 1
   set :multiplicity 1..1
   set :name text
   set :per-object false
   set :position 0
   set :pretty_name Text
   set :pretty_plural {}
   set :references {}
   set :required false
   set :sqltype text
   set :trace none
   : init}

::nsf::object::alloc ::xotcl::Attribute ::xo::db::CrItem::slot::parent_id {set :accessor public
   set :configurable true
   set :convert false
   set :default -100
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental 0
   set :manager ::xo::db::CrItem::slot::parent_id
   set :methodname parent_id
   set :multiplicity 1..1
   set :name parent_id
   set :parameterSpec {-parent_id:substdefault -100}
   set :per-object false
   set :position 0
   set :required false
   set :substdefault 0b111
   set :trace none
   : init}

::nsf::object::alloc ::xotcl::Attribute ::xo::db::CrItem::slot::storage_type {set :accessor public
   set :configurable true
   set :convert false
   set :default text
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental 0
   set :manager ::xo::db::CrItem::slot::storage_type
   set :methodname storage_type
   set :multiplicity 1..1
   set :name storage_type
   set :parameterSpec {-storage_type:substdefault text}
   set :per-object false
   set :position 0
   set :required false
   set :substdefault 0b111
   set :trace none
   : init}

::nsf::object::alloc ::xotcl::Attribute ::xo::db::CrItem::slot::package_id {set :accessor public
   set :configurable true
   set :convert false
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental 0
   set :manager ::xo::db::CrItem::slot::package_id
   set :methodname package_id
   set :multiplicity 1..1
   set :name package_id
   set :parameterSpec -package_id
   set :per-object false
   set :position 0
   set :required false
   set :trace none
   : init}

::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrItem::slot::nls_language {set :accessor public
   set :column_name nls_language
   set :configurable true
   set :convert false
   set :create_acs_attribute true
   set :create_table_attribute true
   set :datatype text
   set :default en_US
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental false
   set :manager ::xo::db::CrItem::slot::nls_language
   set :max_n_values 1
   set :methodname nls_language
   set :min_n_values 1
   set :multiplicity 1..1
   set :name nls_language
   set :per-object false
   set :position 0
   set :pretty_name #xotcl-core.language#
   set :pretty_plural #xotcl-core.languages#
   set :references {}
   set :required false
   set :sqltype varchar(50)
   set :substdefault 0b111
   set :trace none
   : init}

::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrItem::slot::name {set :accessor public
   set :column_name name
   set :configurable true
   set :convert false
   set :create_acs_attribute false
   set :create_table_attribute false
   set :datatype text
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental false
   set :manager ::xo::db::CrItem::slot::name
   set :max_n_values 1
   set :methodname name
   set :min_n_values 1
   set :multiplicity 1..1
   set :name name
   set :per-object false
   set :position 0
   set :pretty_name Name
   set :pretty_plural {}
   set :references {}
   set :required false
   set :sqltype text
   set :trace none
   : init}

::nsf::object::alloc ::xotcl::Attribute ::xo::db::CrItem::slot::publish_status {set :accessor public
   set :configurable true
   set :convert false
   set :default ready
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental 0
   set :manager ::xo::db::CrItem::slot::publish_status
   set :methodname publish_status
   set :multiplicity 1..1
   set :name publish_status
   set :parameterSpec {-publish_status:substdefault ready}
   set :per-object false
   set :position 0
   set :required false
   set :substdefault 0b111
   set :trace none
   : init}

::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrItem::slot::publish_date {set :accessor public
   set :column_name publish_date
   set :configurable true
   set :convert false
   set :create_acs_attribute true
   set :create_table_attribute true
   set :datatype date
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental false
   set :manager ::xo::db::CrItem::slot::publish_date
   set :max_n_values 1
   set :methodname publish_date
   set :min_n_values 1
   set :multiplicity 1..1
   set :name publish_date
   set :per-object false
   set :position 0
   set :pretty_name #xo.CrItem-publish_date#
   set :pretty_plural {}
   set :references {}
   set :required false
   set :sqltype date
   set :trace none
   : init}

::nsf::object::alloc ::xo::db::CrAttribute ::xo::db::CrItem::slot::description {set :accessor public
   set :column_name description
   set :configurable true
   set :convert false
   set :create_acs_attribute true
   set :create_table_attribute true
   set :datatype text
   set :defaultmethods {}
   set :disposition alias
   set :domain ::xo::db::CrItem
   set :incremental false
   set :manager ::xo::db::CrItem::slot::description
   set :max_n_values 1
   set :methodname description
   set :min_n_values 1
   set :multiplicity 1..1
   set :name description
   set :per-object false
   set :position 0
   set :pretty_name #xotcl-core.description#
   set :pretty_plural #xotcl-core.descriptions#
   set :references {}
   set :required false
   set :sqltype text
   set :trace none
   : init}
XQL Not present:
Generic, PostgreSQL, Oracle
[ hide source ] | [ make this the default ]
Show another procedure: