1#!/usr/bin/perl -w
2
3use strict;
4use DBI;
5
6my $db_file = shift;
7if (!$db_file) {
8    print "usage: copy_function_pointers.pl <db file>\n";
9    exit(0);
10}
11
12my $db = DBI->connect("dbi:SQLite:$db_file", "", "", {AutoCommit => 0});
13
14my ($select, $function, $ptr);
15
16$select = $db->prepare('SELECT DISTINCT function, ptr FROM function_ptr WHERE function LIKE "% %";');
17
18my %ptrs;
19
20$select->execute();
21while (($function, $ptr) = $select->fetchrow_array()) {
22    $ptrs{"$function"}{'ptr'} = $ptr;
23    $ptrs{"$function"}{'done'} = 0;
24}
25
26sub copy_functions($);
27sub 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
50foreach my $key (keys(%ptrs)) {
51    copy_functions($key);
52}
53
54$db->commit();
55$db->disconnect();
56