{
$self->create();
}
-
+ $self->enable_foreign_keys();
return $self;
}
}
}
+sub enable_foreign_keys
+{
+ my $self=shift;
+ $self->cmd("PRAGMA foreign_keys = ON");
+}
+
sub last_update
{
my($self, $newval)=@_;
my $main_sql_end=")\n\tGROUP BY t2.name;";
while(my $constraint=shift @constraints)
{
- print "CONSTRAINT: $constraint->{name}\n";
my $cid=$constraint->{id};
push(@ids, $cid);
}
- @ids = map( { "\"$_\""; } @ids) unless($self->{postgres});
+ @ids = map( { "\"$_\""; } grep { defined; } @ids) unless($self->{postgres});
my $tagstr=join(", ", @ids);
my $sql = ($main_sql_start . $tagstr .
$main_sql_mid . $tagstr .
"\n\tGROUP BY artists.name;");
while(my $constraint=shift @constraints)
{
- print "CONSTRAINT: $constraint->{name}\n";
my $cid=$constraint->{id};
push(@ids, $cid);
}
- @ids = map( { "\"$_\""; } @ids) unless($self->{postgres});
+ @ids = map( { "\"$_\""; } grep { defined; } @ids) unless($self->{postgres});
my $tagstr=join(", ", @ids);
my $sql = ($main_sql_start . $tagstr .
$main_sql_end);
"\n\tGROUP BY albums.name;");
while(my $constraint=shift @constraints)
{
- print "CONSTRAINT: $constraint->{name}\n";
my $cid=$constraint->{id};
push(@ids, $cid);
}
- @ids = map( { "\"$_\""; } @ids) unless($self->{postgres});
+ @ids = map( { "\"$_\""; } grep { defined; } @ids) unless($self->{postgres});
my $str=join(", ", @ids);
my $sql = ($main_sql_start . $str .
$main_sql_end);
- print "SQL: $sql\n";
my $result=$self->cmd_rows($sql);
my @names=map { $_->[0]; } @$result;
print "ALBUMS: ", join(', ', @names), "\n";
print "ARTIST_TRACKS SQL: $sql\n";
my $result=$self->cmd_rows($sql, $artist_id);
my @names=map { $_->[0]; } @$result;
- @names = map { s/.*\///; $_; } @names;
print "ARTISTTRACKS: ", join(', ', @names), "\n";
return(@names);
}
print "ALBUM_TRACKS SQL($artist_id, $album_id): $sql\n";
my $result=$self->cmd_rows($sql, $artist_id, $album_id);
my @names=map { $_->[0]; } @$result;
- @names = map { s/.*\///; $_;} @names;
print "TRACKS: ", join(', ', @names), "\n";
return(@names);
}
my @ids;
while(my $constraint=shift @constraints)
{
- print "CONSTRAINT: $constraint->{name}\n";
my $cid=$constraint->{id};
push(@ids, $cid);
}
- @ids = map( { "\"$_\""; } @ids) unless($self->{postgres});
+ @ids = map( { "\"$_\""; } grep { defined; } @ids) unless($self->{postgres});
my $str=join(", ", @ids);
my $sql = ($main_sql_start . $str .
$main_sql_end);
print "SQL: $sql\n";
my $result=$self->cmd_rows($sql);
my @names=map { $_->[0]; } @$result;
- @names = map { s/.*\///; $_; } @names;
print "TRACKS: ", join(', ', @names), "\n";
return(@names);
}
die("DB::filename: unhandled case\n"); #FIXME
}
+sub bare_tags
+{
+ my($self)=@_;
+ my $sql=("SELECT tags.name FROM tags\n" .
+ "LEFT JOIN tags_x_tagvals ON tags.id=tags_x_tagvals.tags_id\n" .
+ "WHERE tags_x_tagvals.tags_id IS NULL\n" .
+ "GROUP BY tags.name\n");
+ my $result=$self->cmd_rows($sql);
+ my @names=map { $_->[0]; } @$result;
+ return (@names);
+}
+
+sub tags_with_values
+{
+ my($self)=@_;
+ my $sql=("SELECT tags.name, tagvals.name FROM tags\n" .
+ "INNER JOIN tags_x_tagvals ON tags.id=tags_x_tagvals.tags_id\n" .
+ "INNER JOIN tagvals ON tagvals.id=tags_x_tagvals.tagvals_id\n" .
+ "GROUP BY tags.name, tagvals.name\n");
+ my $result=$self->cmd_rows($sql);
+ my $tags={};
+ for my $pair (@$result)
+ {
+ push(@{$tags->{$pair->[0]}}, $pair->[1]);
+ }
+ return $tags;
+}
+
sub id
{
my($self, $type, $val)=@_;
- print "ID: $type $val\n";
my $sql="SELECT id FROM $type WHERE name=?";
my ($id)=$self->cmd_onerow($sql, $val);
return($id);
last_update
);
-CREATE TABLE files (
- id INTEGER PRIMARY KEY,
- artists_id,
- albums_id,
- paths_id,
- name text
-);
-
CREATE TABLE paths (
id INTEGER PRIMARY KEY,
name text
name text
);
+CREATE TABLE files (
+ id INTEGER PRIMARY KEY,
+ name text,
+ artists_id,
+ albums_id,
+ paths_id,
+ FOREIGN KEY(artists_id) REFERENCES artists(id) ON DELETE CASCADE ON UPDATE CASCADE,
+ FOREIGN KEY(albums_id) REFERENCES albums(id) ON DELETE CASCADE ON UPDATE CASCADE,
+ FOREIGN KEY(paths_id) REFERENCES paths(id) ON DELETE CASCADE ON UPDATE CASCADE
+);
+
CREATE TABLE tags (
id INTEGER PRIMARY KEY,
name text
CREATE TABLE files_x_tags (
files_id INTEGER,
- tags_id INTEGER
+ tags_id INTEGER,
+ FOREIGN KEY(files_id) REFERENCES files(id) ON DELETE CASCADE ON UPDATE CASCADE,
+ FOREIGN KEY(tags_id) REFERENCES tags(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE tags_x_tagvals (
tags_id INTEGER,
- tagvals_id INTEGER
+ tagvals_id INTEGER,
+ FOREIGN KEY(tags_id) REFERENCES tags(id) ON DELETE CASCADE ON UPDATE CASCADE,
+ FOREIGN KEY(tagvals_id) REFERENCES tagvals(id) ON DELETE CASCADE ON UPDATE CASCADE
);