correct an error in handling <:filen foo field:>
authorTony Cook <tony@develop-help.com>
Wed, 3 Feb 2010 04:58:44 +0000 (04:58 +0000)
committertony <tony@45cb6cf1-00bc-42d2-bb5a-07f51df49f94>
Wed, 3 Feb 2010 04:58:44 +0000 (04:58 +0000)
separate metadata generated by the BSE system from that generated by
applications, so that regenning metadata in the BSE system doesn't
remove the application generated data

schema/bse.sql
site/cgi-bin/modules/BSE/FileHandler/FLV.pm
site/cgi-bin/modules/BSE/TB/ArticleFile.pm
site/cgi-bin/modules/BSE/TB/ArticleFileMeta.pm
site/data/db/sql_statements.data
site/util/mysql.str

index a907805ce014fc860de4426c3c3f682f6f874fec..80427510a68ca3b486bf2cdd7917d53422d9ae42 100644 (file)
@@ -461,6 +461,10 @@ create table bse_article_file_meta (
   content_type varchar(80) not null default 'text/plain',
   value longblob not null,
 
+  -- metadata specific to an application, not deleted when metadata is
+  -- regenerated
+  appdata integer not null default 0,
+
   unique file_name(file_id, name)
 );
 
index d7503cec2e7eb4d55975926ef132f337d16231b1..23e22fc889e6244a5357b96c5f5d52ab0dc2a747 100644 (file)
@@ -7,6 +7,8 @@ use DevHelp::HTML;
 sub process_file {
   my ($self, $file) = @_;
 
+  my $debug = $self->cfg_entry("debug", 0);
+
   my %info;
   unless 
     (eval {
@@ -20,28 +22,41 @@ sub process_file {
     die "Cannot parse as FLV: $@\n";
   }
 
-  my @missing;
-  for my $name (qw/video_width video_height duration/) {
-    $info{$name} or push @missing, $name;
+  if ($debug) {
+    print STDERR "FLV info:\n";
+    print STDERR "  $_=$info{$_}\n" for keys %info;
   }
+
+  my $height = $info{video_height} || $info{meta_height};
+  my $width = $info{video_width} || $info{meta_width};
+  my $duration = $info{duration};
+
+  my @missing;
+  $height or push @missing, "video_height/meta_height";
+  $width or push @missing, "video_width/meta_width";
+  $duration or push @missing, "duration";
   @missing
     and die "Missing required metadata @missing\n";
 
-  $file->add_meta(name => 'width', value => $info{video_width});
-  $file->add_meta(name => 'height', value => $info{video_height});
-  my $dur_secs = sprintf("%.0f", $info{duration}/1000);
-  $file->add_meta(name => 'duration', value => $dur_secs);
+  $file->add_meta(name => 'width', value => $width,
+                 appdata => 0);
+  $file->add_meta(name => 'height', value => $height,
+                 appdata => 0);
+  my $dur_secs = sprintf("%.0f", $duration/1000);
+  $file->add_meta(name => 'duration', value => $dur_secs,
+                 appdata => 0);
   my $fmt_dur = sprintf("%02d:%02d:%02d", $dur_secs / 3600, ($dur_secs / 60) % 60,
                        $dur_secs % 60);
-  $file->add_meta(name => "duration_formatted", value => $fmt_dur);
-  $file->add_meta(name => 'audio_type', value => $info{audio_type});
+  $file->add_meta(name => "duration_formatted", value => $fmt_dur,
+                 appdata => 0);
+  $file->add_meta(name => 'audio_type', value => $info{audio_type},
+                 appdata => 0);
 
   if ($self->cfg_entry("ffmpeg", 1)) {
     my $raw_frame = $self->cfg_entry("raw_frame", 1);
     my $fmt = $self->cfg_entry("frame_fmt", "jpeg");
     my $content_type = $self->cfg_entry("frame_content_type", "image/$fmt");
     my $bin = $self->cfg_entry("ffmpeg_bin", "ffmpeg");
-    my $debug = $self->cfg_entry("debug", 0);
     my @geo_names = split /,/, $self->cfg_entry("frame_thumbs", "");
     my @cvt_options = split /,/, $self->cfg_entry("ffmpeg_options", "");
     my $ss = 2+ rand(10);
@@ -69,7 +84,8 @@ sub process_file {
       or die "Cannot produce final placeholder data: ", $im->errstr, "\n";
       $file->add_meta(name => "ph_data",
                      value => $image_data,
-                     content_type => $content_type);
+                     content_type => $content_type,
+                     appdata => 0);
     }
 
     if (@geo_names) {
@@ -83,8 +99,8 @@ sub process_file {
          $thumbs->thumb_dimensions_sized
          (
           $geometry,
-          $info{video_width},
-          $info{video_height},
+          $width,
+          $height,
           undef
          );
        ($thumb_data, $content_type) = $thumbs->thumb_data
@@ -95,12 +111,15 @@ sub process_file {
          )
            or die "Cannot thumb captured frame; $error\n";
        $file->add_meta(name => "ph_${geo_name}_width",
-                       value => $twidth);
+                       value => $twidth,
+                       appdata => 0);
        $file->add_meta(name => "ph_${geo_name}_height",
-                       value => $theight);
+                       value => $theight,
+                       appdata => 0);
        $file->add_meta(name => "ph_${geo_name}_data",
                        value => $thumb_data,
-                       content_type => $content_type);
+                       content_type => $content_type,
+                       appdata => 0);
       }
     }
 
index 9ba9a37a7d1c87a212b5cafe42223fc4414d4934..721a7ab1d026c2c3f417df9595c4a514c76337c7 100644 (file)
@@ -102,6 +102,18 @@ sub clear_metadata {
   BSE::DB->run(bseClearArticleFileMetadata => $self->{id});
 }
 
+sub clear_app_metadata {
+  my ($self) = @_;
+
+  BSE::DB->run(bseClearArticleFileAppMetadata => $self->{id});
+}
+
+sub clear_sys_metadata {
+  my ($self) = @_;
+
+  BSE::DB->run(bseClearArticleFileSysMetadata => $self->{id});
+}
+
 sub set_handler {
   my ($self, $cfg) = @_;
 
@@ -110,14 +122,16 @@ sub set_handler {
   for my $handler_entry (BSE::TB::ArticleFiles->file_handlers($cfg)) {
     my ($key, $handler) = @$handler_entry;
     my $success = eval {
-      $self->clear_metadata;
+      $self->clear_sys_metadata;
       $handler->process_file($self);
       1;
     };
     if ($success) {
       # set errors from handlers that failed
       for my $key (keys %errors) {
-       $self->add_meta(name => "${key}_error", value => $errors{$key});
+       $self->add_meta(name => "${key}_error",
+                       value => $errors{$key},
+                       appdata => 0);
       }
       $self->set_file_handler($key);
 
@@ -200,11 +214,13 @@ sub inline {
     $meta->content_type eq "text/plain"
       or return "* metadata $name isn't text *";
 
-    return escape_html($meta->value);
+    require DevHelp::HTML;
+    return DevHelp::HTML::escape_html($meta->value);
   }
   elsif ($field eq "link") {
     my $url = "/cgi-bin/user.pl?download_file=1&file=$file->{id}";
-    my $eurl = escape_html($url);
+    require DevHelp::HTML;
+    my $eurl = DevHelp::HTML::escape_html($url);
     if ($field eq 'url') {
       return $eurl;
     }
index 73f5974b120ff779dc750529cf2c9edda9f893a5..4a24af1f1c168aa8e1ed1bf1f5eb587ca0b806a8 100644 (file)
@@ -7,11 +7,12 @@ sub table {
 }
 
 sub columns {
-  qw/id file_id name content_type value/;
+  qw/id file_id name content_type value appdata/;
 }
 
 sub defaults {
   content_type => "text/plain",
+  appdata => 1,
 }
 
 1;
index 9c755b91dfaa5d951f3b31653beafcad8a7aaba9..2facf9152338724229307ccff7ab527b571cee50 100644 (file)
@@ -200,3 +200,16 @@ sql_statement: <<SQL
 delete from bse_article_file_meta
 where file_id = ?
 SQL
+
+name: bseClearArticleFileAppMetadata
+sql_statement: <<SQL
+delete from bse_article_file_meta
+where file_id = ? and appdata <> 0
+SQL
+
+name: bseClearArticleFileSysMetadata
+sql_statement: <<SQL
+delete from bse_article_file_meta
+where file_id = ? and appdata = 0
+SQL
+
index 770808f76818f8b489f192224a9fa9775d106795..fed2f8d783dfe0bdd5c8cde6ef397f7d1f01f938 100644 (file)
@@ -106,6 +106,7 @@ Column file_id;int(11);NO;NULL;
 Column name;varchar(20);NO;NULL;
 Column content_type;varchar(80);NO;text/plain;
 Column value;longblob;NO;NULL;
+Column appdata;int(11);NO;0;
 Index PRIMARY;1;[id]
 Index file_name;1;[file_id;name]
 Table bse_article_groups