Commit 8758d809 authored by Frank Bergmann's avatar Frank Bergmann

- Added the list of versions per file

parent bef79b00
...@@ -55,30 +55,28 @@ set top_level [db_string top_level "select tree_level(tree_sortkey) from cr_item ...@@ -55,30 +55,28 @@ set top_level [db_string top_level "select tree_level(tree_sortkey) from cr_item
set sql " set sql "
select select
ci.item_id as file_id, ci.item_id as file_id,
ci.live_revision as live_version_id,
ci.parent_id,
cr.revision_id, -- CR revision (OpenACS and PO files)
fv.version_id, -- CR revision (only PO files)
ci.name as file_name, ci.name as file_name,
cr.revision_id as version_id,
tree_level(ci.tree_sortkey) - :top_level as level, tree_level(ci.tree_sortkey) - :top_level as level,
fv.version_sha1 as sha1,
fv.version_creation_date as creation_date,
fv.version_modification_date as modification_date,
(select count(*) from cr_items child where child.parent_id = ci.item_id) as num_children, (select count(*) from cr_items child where child.parent_id = ci.item_id) as num_children,
ci.*, CASE WHEN ci.content_type::text = 'content_folder' THEN 'folder'
cr.*,
CASE WHEN bts.open_p = 'o' THEN 'true' ELSE 'false' END as expanded,
CASE
WHEN ci.content_type::text = 'content_folder' THEN 'folder'
WHEN ci.content_type::text = 'content_extlink' THEN 'url' WHEN ci.content_type::text = 'content_extlink' THEN 'url'
WHEN ci.content_type::text = 'content_symlink' THEN 'symlink' WHEN ci.content_type::text = 'content_symlink' THEN 'symlink'
WHEN ci.content_type::text = 'file_storage_object' THEN 'file' WHEN ci.content_type::text = 'file_storage_object' THEN 'file'
ELSE ci.content_type ELSE ci.content_type
END AS type END AS type,
from cr_items parent_ci, CASE WHEN bts.open_p = 'o' THEN 'true' ELSE 'false' END as expanded,
ci.*,
cr.*,
fv.*
from
cr_items parent_ci,
cr_items ci cr_items ci
LEFT JOIN cr_extlinks ce ON ci.item_id = ce.extlink_id LEFT JOIN cr_extlinks ce ON ci.item_id = ce.extlink_id
LEFT JOIN cr_folders cf ON ci.item_id = cf.folder_id LEFT JOIN cr_folders cf ON ci.item_id = cf.folder_id
LEFT JOIN cr_revisions cr ON ci.live_revision = cr.revision_id
LEFT OUTER JOIN im_file_versions fv ON (cr.revision_id = fv.version_id)
LEFT JOIN cr_mime_types cm ON cr.mime_type = cm.mime_type
JOIN acs_objects o ON ci.item_id = o.object_id JOIN acs_objects o ON ci.item_id = o.object_id
LEFT OUTER JOIN im_biz_object_tree_status bts ON ( LEFT OUTER JOIN im_biz_object_tree_status bts ON (
ci.item_id = bts.object_id and ci.item_id = bts.object_id and
...@@ -86,28 +84,69 @@ set sql " ...@@ -86,28 +84,69 @@ set sql "
bts.user_id = :current_user_id bts.user_id = :current_user_id
) )
LEFT OUTER JOIN im_files f ON (ci.item_id = f.file_id) LEFT OUTER JOIN im_files f ON (ci.item_id = f.file_id)
-- add cr_revisions = file_versions using OUTER JOIN
LEFT OUTER JOIN cr_revisions cr ON (cr.item_id = ci.item_id)
LEFT OUTER JOIN im_file_versions fv ON (cr.revision_id = fv.version_id)
where where
parent_ci.item_id = :folder_id and parent_ci.item_id = :folder_id and
ci.tree_sortkey between parent_ci.tree_sortkey and tree_right(parent_ci.tree_sortkey) ci.tree_sortkey between parent_ci.tree_sortkey and tree_right(parent_ci.tree_sortkey)
and tree_level(ci.tree_sortkey) > :top_level and tree_level(ci.tree_sortkey) > :top_level
order by order by
ci.tree_sortkey ci.tree_sortkey,
cr.revision_id
" "
# ad_return_complaint 1 [im_ad_hoc_query -subtotals_p 0 -format html $sql] # ad_return_complaint 1 [im_ad_hoc_query -subtotals_p 0 -format html $sql]
# Read the query into a Multirow, so that we can order # Write the list of files to a multirow,
# it according to sort_order within the individual sub-levels. # while storing the versions in a hash
db_multirow file_multirow file_list $sql { multirow create file_multirow file_id parent_id revision_id version_id file_name level num_children type expanded
# By default open the top-level file-storage set file_id ""
if {0 eq $level} { set expanded "true" } set old_file_id ""
db_foreach files $sql {
# Collect file versions in a hash
if {"" eq $version_status_id} { set version_status_id [im_file_status_active] }
if {"" eq $version_type_id} { set version_type_id [im_file_type_default] }
if {"" eq $revision_id} { set revision_id 0 }
if {"" eq $content_length} { set content_length 0 }
set version_list [list]
if {[info exists version_hash($file_id)]} { set version_list $version_hash($file_id) }
lappend version_list "
{
\"version_id\": $revision_id,
\"content_length\": $content_length,
\"mime_type\": \"$mime_type\",
\"title\": \"[im_quotejson $title]\",
\"description\": \"[im_quotejson $description]\",
\"status_id\": $version_status_id,
\"type_id\": $version_type_id,
\"creation_date\": \"$version_creation_date\",
\"modification_date\": \"$version_modification_date\",
\"sha1\": \"$version_sha1\",
\"upload_comment\": \"[im_quotejson $version_upload_comment]\"
}"
set version_hash($file_id) $version_list
# write out the multirow entry for the file
if {$old_file_id ne $file_id} {
multirow append file_multirow $file_id $parent_id $revision_id $version_id $file_name $level $num_children $type $expanded
set old_file_id $file_id
}
}
# Write out the last file multirow
if {"" ne $file_id} {
multirow append file_multirow $file_id $parent_id $revision_id $version_id $file_name $level $num_children $type $expanded
} }
#ad_return_complaint 1 [array get version_hash]
# -------------------------------------------- # --------------------------------------------
# Get all the extra variables for a file ci_item: # Get all the extra variables for a file ci_item:
# fraber 2018-08-22: No meta-variables yet... # fraber 2018-08-22: No meta-variables yet...
set valid_vars [list level version_id type publish_date mime_type content_length sha1 title creation_date modification_date description] set valid_vars [list level type]
set valid_vars [lsort -unique $valid_vars] set valid_vars [lsort -unique $valid_vars]
# needed to calculate sha1 # needed to calculate sha1
...@@ -121,89 +160,86 @@ set old_level 0 ...@@ -121,89 +160,86 @@ set old_level 0
set indent "" set indent ""
template::multirow foreach file_multirow { template::multirow foreach file_multirow {
ns_log Notice "file-tree.json.tcl: file_id=$file_id, file_id=$file_id, version_id=$version_id, name($file_name)" ns_log Notice "file-tree.json.tcl: file_id=$file_id, file_id=$file_id, version_id=$version_id, name($file_name)"
if {$debug_p} { append file_json "\n// finish: ctr=$ctr, level=$level, old_level=$old_level\n" } if {$debug_p} { append file_json "\n// finish: ctr=$ctr, level=$level, old_level=$old_level\n" }
# ----------------------------------------- # -----------------------------------------
# Close off the previous entry # Close off the previous entry
# ----------------------------------------- # -----------------------------------------
# This is the first child of the previous item # This is the first child of the previous item
# Increasing the level always happens in steps of 1 # Increasing the level always happens in steps of 1
if {$level > $old_level} { if {$level > $old_level} {
append file_json ",\n${indent}\t\"children\":\[\n" append file_json ",\n${indent}\t\"children\":\[\n"
} }
# A group of children needs to be closed. # A group of children needs to be closed.
# Please note that this can cascade down to several levels. # Please note that this can cascade down to several levels.
while {$level < $old_level} { while {$level < $old_level} {
append file_json "\n${indent}\}\]\n" append file_json "\n${indent}\}\]\n"
incr old_level -1 incr old_level -1
set indent "" set indent ""
for {set i 0} {$i < $old_level} {incr i} { append indent "\t" } for {set i 0} {$i < $old_level} {incr i} { append indent "\t" }
} }
# The current file is on the same level as the previous. # The current file is on the same level as the previous.
# This is also executed after reducing the old_level in the previous while loop # This is also executed after reducing the old_level in the previous while loop
if {$level == $old_level} { if {$level == $old_level} {
if {0 != $ctr} { if {0 != $ctr} {
append file_json "${indent}\n${indent}\},\n" append file_json "${indent}\n${indent}\},\n"
}
} }
}
if {$debug_p} { append file_json "\n// $file_name: ctr=$ctr, level=$level, old_level=$old_level\n" }
if {$debug_p} { append file_json "\n// $file_name: ctr=$ctr, level=$level, old_level=$old_level\n" }
set indent ""
for {set i 0} {$i < $level} {incr i} { append indent "\t" } set indent ""
for {set i 0} {$i < $level} {incr i} { append indent "\t" }
if {0 == $num_children} { set leaf_json "true" } else { set leaf_json "false" }
if {"folder" == $type} { set leaf_json "false" } if {0 == $num_children} { set leaf_json "true" } else { set leaf_json "false" }
if {"folder" == $type} { set leaf_json "false" }
set quoted_char_map {"\n" "\\n" "\r" "\\r" "\"" "\\\"" "\\" "\\\\"}
set quoted_file_name [string map $quoted_char_map $file_name] set quoted_char_map {"\n" "\\n" "\r" "\\r" "\"" "\\\"" "\\" "\\\\"}
set quoted_file_name [string map $quoted_char_map $file_name]
append file_json "${indent}\{
# Get the list of versions from hash
set version_list {}
if {[info exists version_hash($file_id)]} { set version_list $version_hash($file_id) }
append file_json "${indent}\{
${indent}\t\"id\":$file_id, ${indent}\t\"id\":$file_id,
${indent}\t\"live_version_id\":$live_version_id,
${indent}\t\"name\":\"$quoted_file_name\", ${indent}\t\"name\":\"$quoted_file_name\",
${indent}\t\"iconCls\":\"icon-$type\", ${indent}\t\"iconCls\":\"icon-$type\",
${indent}\t\"expanded\":$expanded, ${indent}\t\"expanded\":$expanded,
${indent}\t\"versions\":\[[join $version_list ", "]
${indent}\t\],
" "
if {"folder" == $type && 0 == $num_children} { if {"folder" == $type && 0 == $num_children} {
append file_json "${indent}\t\"children\":\[\],\n" append file_json "${indent}\t\"children\":\[\],\n"
} }
foreach var $valid_vars {
# Skip xml_* variables (only used by MS-File)
if {[regexp {^xml_} $var match]} { continue }
# version_id is empty for directories # Append the value to the JSON output
if {"" eq $version_id} { set value [set $var]
set sha1 "" set quoted_value [string map $quoted_char_map $value]
} else { append file_json "${indent}\t\"$var\":\"$quoted_value\",\n"
if {"" eq $sha1} { }
set filename [db_string filename "select :storage_area_path || content from cr_revisions where revision_id = :version_id"] append file_json "${indent}\t\"leaf\":$leaf_json"
set sha1 [string range [exec /usr/bin/sha1sum "$filename"] 0 39]
} incr ctr
} set old_level $level
foreach var $valid_vars {
# Skip xml_* variables (only used by MS-File)
if {[regexp {^xml_} $var match]} { continue }
# Append the value to the JSON output
set value [set $var]
set quoted_value [string map $quoted_char_map $value]
append file_json "${indent}\t\"$var\":\"$quoted_value\",\n"
}
append file_json "${indent}\t\"leaf\":$leaf_json"
incr ctr
set old_level $level
} }
set level 0 set level 0
while {$level < $old_level} { while {$level < $old_level} {
# A group of children needs to be closed. # A group of children needs to be closed.
# Please note that this can cascade down to several levels. # Please note that this can cascade down to several levels.
append file_json "\n${indent}\}\]\n" append file_json "\n${indent}\}\]\n"
incr old_level -1 incr old_level -1
set indent "" set indent ""
for {set i 0} {$i < $old_level} {incr i} { append indent "\t" } for {set i 0} {$i < $old_level} {incr i} { append indent "\t" }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment