apm_register_package { -callback apm_dummy_callback } pathWhat it does:
Registers a new package and/or version in the database, returning the version_id. If $callback is provided, periodically invokes this procedure with a single argument containing a human-readable (English) status message.Defined in: /web/philip/packages/acs-core/apm-procs.tclThis routine throws an error if the specification file is nonexistent or invalid.
Source code:
arg_parser_for_apm_register_package $args
# Note: We use the Tcl proc "#" as a dummy do-nothing callback proc.
apm_callback_and_log $callback "Reading the configuration file at $path..."
array set version [apm_read_package_info_file $path]
db_transaction {
set package_key $version(package.key)
# If the package doesn't already exist in apm_packages, insert a new row.
if { ![db_0or1row "select package_id from apm_packages where package_url = '[db_quote $version(package.url)]'"] } {
set package_id [db_nextval "apm_package_id_seq"]
db_dml "
insert into apm_packages(package_id, package_key, package_url)
values($package_id, '[db_quote $package_key]', '[db_quote $version(package.url)]')
"
}
# Prepare a list of column names and values.
set columns [list [list package_id $package_id] [list package_name "'[db_quote $version(package-name)]'"] [list version_name "'[db_quote $version(name)]'"] [list summary "'[db_quote $version(summary)]'"] [list description_format "'[db_quote $version(description.format)]'"] [list description "'[db_quote $version(description)]'"] [list release_date "'[db_quote $version(release-date)]'"] [list vendor "'[db_quote $version(vendor)]'"] [list vendor_url "'[db_quote $version(vendor.url)]'"] [list package_group "'[db_quote $version(group)]'"]]
# If the version already exists in apm_package_versions, update it;
# otherwise, insert a new version.
if { [db_0or1row "select version_id from apm_package_versions where version_url = '[db_quote $version(url)]'"] } {
db_dml -type update -where "version_id = $version_id" apm_package_versions $columns
} else {
set version_id [db_nextval "apm_package_version_id_seq"]
lappend columns [list version_id $version_id]
lappend columns [list version_url "'[db_quote $version(url)]'"]
lappend columns [list enabled_p "'f'"]
lappend columns [list installed_p "'f'"]
db_dml -type insert apm_package_versions $columns
}
# Note that we do a bunch of delete/inserts below - this is acceptable because
# nothing ever references apm_package_(dependencies|owners|files|includes) -
# the numeric primary keys exist solely for the use of the administration
# interface.
# Delete and reinsert dependencies.
db_dml "delete from apm_package_dependencies where version_id = $version_id"
foreach dependency_type { provides requires } {
foreach item $version($dependency_type) {
db_dml "
insert into apm_package_dependencies(dependency_id, version_id, dependency_type, service_url, service_version)
values(apm_package_dependency_id_seq.nextval, $version_id, '$dependency_type', '[db_quote [lindex $item 0]]', '[db_quote [lindex $item 1]]')
"
}
}
# Delete and reinsert owners (in sorted order, to preserve package
# developers' fragile egos).
set counter 0
db_dml "delete from apm_package_owners where version_id = $version_id"
foreach item $version(owners) {
incr counter
db_dml "
insert into apm_package_owners(version_id, owner_url, owner_name, sort_key)
values($version_id, '[db_quote [lindex $item 0]]', '[db_quote [lindex $item 1]]', $counter)
"
}
# Delete and reinsert files.
db_dml "delete from apm_package_files where version_id = $version_id"
foreach item $version(files) {
db_dml "
insert into apm_package_files(file_id, version_id, path, file_type)
values(apm_package_file_id_seq.nextval, $version_id, '[db_quote [lindex $item 0]]', '[db_quote [lindex $item 1]]')
"
}
# Delete and reinsert includes.
db_dml "delete from apm_package_includes where version_id = $version_id"
foreach item $version(includes) {
db_dml "
insert into apm_package_includes(include_id, version_id, version_url)
values(apm_package_include_id_seq.nextval, $version_id, '[db_quote $item]')
"
}
apm_callback_and_log $callback "Registered $version(package-name), version $version(name)."
}
return $version_id