aboutsummaryrefslogtreecommitdiff
path: root/bin/sbodb.pl
blob: bfd997e9b6ef19da2ba27399773c056962b92bdc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/perl -w

# create SBo.sqlite3 database for SBo limnoria plugin.
# requires SLACKBUILDS.txt and TAGS.txt from the SBo repo.
# https://slackware.uk/slackbuilds.org/14.2/SLACKBUILDS.TXT
# https://slackware.uk/slackbuilds.org/14.2/TAGS.txt

print <<EOF;
pragma journal_mode = memory;
begin transaction;

create table categories (
	id integer primary key not null,
	name varchar not null);

create table builds (
	id integer primary key not null,
	name varchar not null,
	descrip varchar not null,
	category integer not null,
	version varchar not null,
	foreign key (category) references categories);

create table deps (
	build_id integer not null,
	depends_on integer not null,
	foreign key (build_id) references categories,
	foreign key (depends_on) references categories);

create table tags (
	build_id integer not null,
	tag varchar not null,
	foreign key (build_id) references builds);

create unique index t_idx on tags(build_id, tag);

EOF

$lastcat = 0;
sub get_cat_id {
	my $catname = shift;
	if(!$catids{$catname}) {
		$lastcat++;
		print "insert into categories values($lastcat, '$catname');\n";
		$catids{$catname} = $lastcat;
	}
	return $catids{$catname};
}

open $sbtxt, "<" . ($ARGV[0] || "SLACKBUILDS.TXT") or die $!;
{
	local $/ = '';
	while(<$sbtxt>) {
		my ($name, $cat, $ver, $deps, $desc,);
		$deps = "";
		chomp;
		/^SLACKBUILD NAME:\s+(\S+)$/m and $name = $1;
		/^SLACKBUILD LOCATION:\s+\.\/([^\/]*)\//m and $cat = $1;
		/^SLACKBUILD VERSION:\s+(\S+)$/m and $ver = $1;
		/^SLACKBUILD REQUIRES:\s+(\S.+)\n/m and $deps = $1;
		/^SLACKBUILD SHORT DESCRIPTION:\s+(.+)$/m and $desc = $1;

		if($desc =~ /^$name \((.+)\)$/) {
			$desc = $1;
		}

		$desc =~ s/'/''/g;
		$catid = get_cat_id($cat);
		$buildcat{$name} = $catid;
		$buildver{$name} = $ver;
		$builddeps{$name} = $deps;
		$builddesc{$name} = $desc;
		push @builds, $name;
	}
}
close $sbtxt;

print "\n";

$buildid = 0;
for(@builds) {
	$buildid++;
	$buildids{$_} = $buildid;
	print <<EOF;
insert into builds values(
	$buildid,
	'$_',
	'$builddesc{$_}',
	$buildcat{$_},
	'$buildver{$_}');

EOF
}

for(keys %builddeps) {
	my $bid = $buildids{$_};
	my @d = split /\s+/, $builddeps{$_};
	#warn "build $_ id $b, deps " . join(",", @d) . "\n";
	for(@d) {
		next if /%README%/;
		print <<EOF;
insert into deps values($bid, $buildids{$_});
EOF
	}
}

open $tagstxt, "<" . ($ARGV[1] || "TAGS.txt") or die $!;
while(<$tagstxt>) {
	my ($build, $t, @tags);
	chomp;
	next if /: No tags found for/;
	($build, $t) = /^([^:]*):\s+(.*)$/;
	@tags = split /,/, $t;
	for(@tags) {
		next if /^\s*$/;
		s/'/''/g;
		print <<EOF;
insert into tags values($buildids{$build}, '$_');
EOF
	}
}

print "commit;\n";