1 #!/usr/bin/perl -w
   2 
   3 use strict;
   4 use DBI;
   5 
   6 my $db_file = shift;
   7 if (!$db_file) {
   8     print "usage: copy_function_pointers.pl <db file>\n";
   9     exit(0);
  10 }
  11 
  12 my $db = DBI->connect("dbi:SQLite:$db_file", "", "", {AutoCommit => 0});
  13 
  14 my ($select, $function, $ptr);
  15 
  16 $select = $db->prepare('SELECT DISTINCT function, ptr FROM function_ptr WHERE function LIKE "% %";');
  17 
  18 my %ptrs;
  19 
  20 $select->execute();
  21 while (($function, $ptr) = $select->fetchrow_array()) {
  22     $ptrs{"$function"}{'ptr'} = $ptr;
  23     $ptrs{"$function"}{'done'} = 0;
  24 }
  25 
  26 sub copy_functions($);
  27 sub copy_functions($)
  28 {
  29     my $src = shift;
  30 
  31     if ($ptrs{"$src"}{'done'}) {
  32         return;
  33     }
  34     $ptrs{"$src"}{'done'} = 1;
  35 
  36     my $select = $db->prepare('SELECT distinct file, function FROM function_ptr WHERE ptr = ?;');
  37     my $insert = $db->prepare('INSERT OR IGNORE INTO function_ptr VALUES (?, ?, ?, 1);');
  38 
  39     $select->execute($src);
  40     while (my ($file, $function) = $select->fetchrow_array()) {
  41         if ($function =~ / /) {
  42             copy_functions($function);
  43             next;
  44         }
  45 
  46         $insert->execute($file, $function, $ptrs{"$src"}{'ptr'});
  47     }
  48 }
  49 
  50 foreach my $key (keys(%ptrs)) {
  51     copy_functions($key);
  52 }
  53 
  54 $db->commit();
  55 $db->disconnect();