Changeset 23399

Show
Ignore:
Timestamp:
07.12.2010 16:55:10 (9 years ago)
Author:
max
Message:

Added (for GDBM and Sqlite) set_infodb_entry to directly change one value in the database. Print statements added to other versions of function, alterting that they are not implemented.

Also added read_infodb_rawentry. Plus, more efficient way of accessing a single record from Sqlite.

Location:
main/trunk/greenstone2/perllib
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/perllib/dbutil.pm

    r22485 r23399  
    221221  my $infodb_key = shift(@_); 
    222222 
     223   
     224  if ($infodb_type eq "sqlite") 
     225  { 
     226    require dbutil::sqlite; 
     227    return &dbutil::sqlite::read_infodb_entry($infodb_file_path, $infodb_key, @_); 
     228  } 
     229#  elsif ($infodb_type eq "gdbm-txtgz") 
     230#  { 
     231#    require dbutil::gdbmtxtgz; 
     232#    return &dbutil::gdbmtxtgz::read_infodb_entry($infodb_file_path, $infodb_key, @_); 
     233#  } 
     234#  elsif ($infodb_type eq "jdbm") 
     235#  { 
     236#    require dbutil::jdbm; 
     237#    return &dbutil::jdbm::read_infodb_entry($infodb_file_path, $infodb_key, @_); 
     238#  } 
     239#  elsif ($infodb_type eq "mssql") 
     240#  { 
     241#    require dbutil::mssql; 
     242#    return &dbutil::mssql::read_infodb_entry($infodb_file_path, $infodb_key, @_); 
     243#  } 
     244   
     245#  # Use GDBM if the infodb type is empty or not one of the values above 
     246#  require dbutil::gdbm; 
     247#  return &dbutil::gdbm::read_infodb_entry($infodb_file_path, $infodb_key, @_); 
     248   
     249   
     250   
    223251  # !! TEMPORARY: Slow and naive implementation that just reads the entire file and picks out the one value 
    224252  # !! This will soon be replaced with database-specific versions that will use dbget etc. 
     
    294322  require dbutil::gdbm; 
    295323  return &dbutil::gdbm::write_infodb_rawentry($infodb_handle, $infodb_key, $infodb_val, @_); 
     324} 
     325 
     326 
     327sub set_infodb_entry 
     328{ 
     329  my $infodb_type = shift(@_); 
     330  my $infodb_file_path = shift(@_); 
     331  my $infodb_key = shift(@_); 
     332  my $infodb_map = shift(@_); 
     333 
     334  if ($infodb_type eq "sqlite") 
     335  { 
     336    require dbutil::sqlite; 
     337    return &dbutil::sqlite::set_infodb_entry($infodb_file_path, $infodb_key, $infodb_map, @_); 
     338  } 
     339  elsif ($infodb_type eq "gdbm-txtgz") 
     340  { 
     341    require dbutil::gdbmtxtgz; 
     342    return &dbutil::gdbmtxtgz::set_infodb_entry($infodb_file_path, $infodb_key, $infodb_map, @_); 
     343  } 
     344  elsif ($infodb_type eq "jdbm") 
     345  { 
     346    require dbutil::jdbm; 
     347    return &dbutil::jdbm::set_infodb_entry($infodb_file_path, $infodb_key, $infodb_map, @_); 
     348  } 
     349  elsif ($infodb_type eq "mssql") 
     350  { 
     351    require dbutil::mssql; 
     352    return &dbutil::mssql::set_infodb_entry($infodb_file_path, $infodb_key, $infodb_map, @_); 
     353  } 
     354 
     355  # Use GDBM if the infodb type is empty or not one of the values above 
     356  require dbutil::gdbm; 
     357  return &dbutil::gdbm::set_infodb_entry($infodb_file_path, $infodb_key, $infodb_map, @_); 
    296358} 
    297359 
  • main/trunk/greenstone2/perllib/dbutil/gdbm.pm

    r23102 r23399  
    158158 
    159159 
     160sub set_infodb_entry 
     161{ 
     162    my $infodb_file_path = shift(@_); 
     163    my $infodb_key = shift(@_); 
     164    my $infodb_map = shift(@_); 
     165   
     166    # Protect metadtaa values that go inside quotes for gdbmset 
     167    foreach my $k (keys %$infodb_map) { 
     168      my @escaped_v = (); 
     169      foreach my $v (@{$infodb_map->{$k}}) { 
     170        if ($k eq "contains") { 
     171          # protect quotes in ".2;".3 etc 
     172          $v =~ s/\"/\\\"/g; 
     173          push(@escaped_v, $v); 
     174        } 
     175        else { 
     176          my $ev = &ghtml::unescape_html($v); 
     177          $ev =~ s/\"/\\\"/g; 
     178          push(@escaped_v, $ev); 
     179        } 
     180      } 
     181      $infodb_map->{$k} = \@escaped_v; 
     182    } 
     183     
     184    # Generate the record string 
     185    my $serialized_infodb_map = &dbutil::convert_infodb_hash_to_string($infodb_map); 
     186    ## print STDERR "**** ser dr\n$serialized_infodb_map\n\n\n"; 
     187 
     188    # Store it into GDBM 
     189    my $cmd = "gdbmset \"$infodb_file_path\" \"$infodb_key\" \"$serialized_infodb_map\""; 
     190    my $status = system($cmd); 
     191   
     192    return $status; 
     193   
     194} 
     195 
     196 
    160197sub delete_infodb_entry 
    161198{ 
  • main/trunk/greenstone2/perllib/dbutil/gdbmtxtgz.pm

    r23169 r23399  
    184184} 
    185185 
     186 sub set_infodb_entry 
     187{ 
     188  my $infodb_file_path = shift(@_); 
     189  my $infodb_key = shift(@_); 
     190  my $infodb_map = shift(@_); 
     191   
     192  print STDERR "***** gdbmtxtgz::set_infodb_entry() not implemented yet!\n"; 
     193} 
     194 
    186195 
    187196 
  • main/trunk/greenstone2/perllib/dbutil/jdbm.pm

    r23166 r23399  
    199199 
    200200 
     201sub set_infodb_entry 
     202{ 
     203  my $infodb_file_path = shift(@_); 
     204  my $infodb_key = shift(@_); 
     205  my $infodb_map = shift(@_); 
     206   
     207  print STDERR "***** jdbm::set_infodb_entry() not implemented yet!\n"; 
     208} 
     209 
     210 
    201211sub delete_infodb_entry 
    202212{ 
  • main/trunk/greenstone2/perllib/dbutil/mssql.pm

    r22485 r23399  
    222222} 
    223223 
     224 
     225 sub set_infodb_entry 
     226{ 
     227  my $infodb_file_path = shift(@_); 
     228  my $infodb_key = shift(@_); 
     229  my $infodb_map = shift(@_); 
     230   
     231  print STDERR "***** mssql::set_infodb_entry() not implemented yet!\n"; 
     232} 
     233 
    224234sub delete_infodb_entry 
    225235{ 
  • main/trunk/greenstone2/perllib/dbutil/sqlite.pm

    r23166 r23399  
    3737{ 
    3838  my $infodb_file_path = shift(@_); 
    39  
     39  my $opt_append = shift(@_); 
     40  
    4041  my $sqlite3_exe = &util::filename_cat($ENV{'GSDLHOME'},"bin",$ENV{'GSDLOS'}, "sqlite3" . &util::get_os_exe()); 
    4142  my $infodb_handle = undef; 
     
    5657  binmode($infodb_handle,":utf8"); 
    5758 
     59  if (!(defined $opt_append) || ($opt_append ne "append")) { 
     60    print $infodb_handle "DROP TABLE IF EXISTS data;\n"; 
     61    print $infodb_handle "DROP TABLE IF EXISTS document_metadata;\n"; 
     62  } 
     63    
    5864  print $infodb_handle "CREATE TABLE IF NOT EXISTS data (key TEXT PRIMARY KEY, value TEXT);\n"; 
    5965  print $infodb_handle "CREATE TABLE IF NOT EXISTS document_metadata (id INTEGER PRIMARY KEY, docOID TEXT, element TEXT, value TEXT);\n"; 
     
    161167      $infodb_map->{$key} = 1; 
    162168  } 
     169} 
     170 
     171sub read_infodb_rawentry 
     172{ 
     173  my $infodb_file_path = shift(@_); 
     174  my $infodb_key = shift(@_); 
     175 
     176   
     177  my $key_safe = &sqlite_safe($infodb_key); 
     178  my $select_val_cmd = "SELECT value FROM data WHERE key='$key_safe';"; 
     179 
     180  my $val_str = read_infodb_cmd($infodb_file_path,$select_val_cmd); 
     181 
     182  return $val_str 
     183} 
     184 
     185sub read_infodb_entry 
     186{ 
     187  my $infodb_file_path = shift(@_); 
     188  my $infodb_key = shift(@_); 
     189 
     190  my $val_str = read_infodb_rawentry($infodb_file_path,$infodb_key); 
     191   
     192  my $rec_hash = &dbutil::convert_infodb_string_to_hash($val_str); 
     193 
     194  return $rec_hash; 
    163195} 
    164196 
     
    216248} 
    217249 
    218  
    219  
    220250sub write_infodb_rawentry 
    221251{ 
     
    227257  print $infodb_handle "INSERT OR REPLACE INTO data (key, value) VALUES ('" . $safe_infodb_key . "', '" . &sqlite_safe($infodb_val) . "');\n"; 
    228258} 
     259 
     260 
     261sub set_infodb_entry 
     262{ 
     263    my $infodb_file_path = shift(@_); 
     264    my $infodb_key = shift(@_); 
     265    my $infodb_map = shift(@_); 
     266     
     267  my $sqlite3_exe = &util::filename_cat($ENV{'GSDLHOME'},"bin",$ENV{'GSDLOS'}, "sqlite3" . &util::get_os_exe()); 
     268  my $infodb_handle = undef; 
     269  my $cmd = "\"$sqlite3_exe\" \"$infodb_file_path\""; 
     270 
     271  if (!-e "$sqlite3_exe" || !open($infodb_handle, "|$cmd")) 
     272  { 
     273      print STDERR "Unable to execute: $cmd\n"; 
     274      print STDERR "$!\n"; 
     275      return -1; 
     276  } 
     277  else { 
     278 
     279      binmode($infodb_handle, ":utf8"); 
     280      write_infodb_entry($infodb_handle,$infodb_key,$infodb_map); 
     281      close($infodb_handle); 
     282  } 
     283 
     284  # Not currently checking for errors on write to DB 
     285  return 0; 
     286   
     287   
     288    } 
     289     
    229290 
    230291