summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--lib/Multi/API.pm15
-rw-r--r--lib/Multi/RG.pm4
-rw-r--r--lib/VNDB/DB/ULists.pm2
-rw-r--r--lib/VNDB/DB/VN.pm6
-rw-r--r--lib/VNDB/Util/BrowseHTML.pm2
-rw-r--r--util/sql/all.sql1
-rw-r--r--util/sql/func.sql4
-rw-r--r--util/sql/schema.sql6
-rw-r--r--util/updates/update_2.11.sql13
10 files changed, 34 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 6de2ee79..89760d0a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,6 +14,7 @@ git - ?
- Removed the ?l10n= paremeter
- Remove sessions that haven't been used for more than a month
- Properly copy over search string on switching with the searchtabs
+ - Converted language columns in SQL to an ENUM type
2.10 - 2010-01-10
- VN score on tag pages use plain averages instead of bayesian rating
diff --git a/lib/Multi/API.pm b/lib/Multi/API.pm
index b6100dfa..be1191c6 100644
--- a/lib/Multi/API.pm
+++ b/lib/Multi/API.pm
@@ -108,7 +108,7 @@ sub filtertosql {
# get the type that matches
$t = (grep +(
# wrong operator? don't even look further!
- !$_->[2]{$op} ? 0
+ !defined($_->[2]{$op}) ? 0
# undef
: !defined($_->[0]) ? !defined($value)
# int
@@ -423,7 +423,7 @@ sub get_vn {
for (grep !/^(basic|details|anime|relations)$/, @{$get->{info}});
my $select = 'v.id, v.latest';
- $select .= ', vr.title, vr.original, v.c_released, v.c_languages, v.c_platforms' if grep /basic/, @{$get->{info}};
+ $select .= ', vr.title, vr.original, v.c_released, v.c_languages::text[], v.c_platforms' if grep /basic/, @{$get->{info}};
$select .= ', vr.alias AS aliases, vr.length, vr.desc AS description, vr.l_wp, vr.l_encubed, vr.l_renai' if grep /details/, @{$get->{info}};
my @placeholders;
@@ -446,11 +446,10 @@ sub get_vn {
[ str => 'v.c_platforms :op: :value:', {'=' => 'LIKE', '!=' => 'NOT LIKE'}, process => \'like' ],
[ stra => '(:value:)', {'=', 1}, join => ' OR ', serialize => 'v.c_platforms LIKE :value:', \'like' ],
[ stra => '(:value:)', {'!=',1}, join => ' AND ', serialize => 'v.c_platforms NOT LIKE :value:', \'like' ],
- ], [ 'languages', # rather similar to platforms
- [ undef, "v.c_languages :op: ''", {qw|= = != <>|} ],
- [ str => 'v.c_languages :op: :value:', {'=' => 'LIKE', '!=' => 'NOT LIKE'}, process => \'like' ],
- [ stra => '(:value:)', {'=', 1}, join => ' OR ', serialize => 'v.c_languages LIKE :value:', process => \'like' ],
- [ stra => '(:value:)', {'!=',1}, join => ' AND ', serialize => 'v.c_languages NOT LIKE :value:', process => \'like' ],
+ ], [ 'languages',
+ [ undef, "v.c_languages :op: '{}'", {qw|= = != <>|} ],
+ [ str => ':op: (v.c_languages && ARRAY[:value:]::language[])', {'=' => '', '!=' => 'NOT'} ],
+ [ stra => ':op: (v.c_languages && ARRAY[:value:]::language[])', {'=' => '', '!=' => 'NOT'}, join => ',' ],
], [ 'search',
[ str => '(vr.title ILIKE :value: OR vr.alias ILIKE :value: OR v.id IN(
SELECT rv.vid FROM releases r JOIN releases_rev rr ON rr.id = r.latest JOIN releases_vn rv ON rv.rid = rr.id
@@ -484,7 +483,7 @@ sub get_vn_res {
if(grep /basic/, @{$get->{info}}) {
$_->{original} ||= undef;
$_->{platforms} = [ split /\//, delete $_->{c_platforms} ];
- $_->{languages} = [ split /\//, delete $_->{c_languages} ];
+ $_->{languages} = delete $_->{c_languages};
$_->{released} = formatdate delete $_->{c_released};
}
if(grep /details/, @{$get->{info}}) {
diff --git a/lib/Multi/RG.pm b/lib/Multi/RG.pm
index 76408d92..d72bb516 100644
--- a/lib/Multi/RG.pm
+++ b/lib/Multi/RG.pm
@@ -97,7 +97,7 @@ sub getrel { # num, res, id
if(!grep !$_, values %{$_[HEAP]{nodes}}) {
my $ids = join(', ', map '?', keys %{$_[HEAP]{nodes}});
$_[KERNEL]->post(pg => query => $_[HEAP]{type} eq 'v'
- ? "SELECT v.id, vr.title, v.c_released AS date, v.c_languages AS lang FROM vn v JOIN vn_rev vr ON vr.id = v.latest WHERE v.id IN($ids) ORDER BY v.c_released"
+ ? "SELECT v.id, vr.title, v.c_released AS date, v.c_languages::text[] AS lang FROM vn v JOIN vn_rev vr ON vr.id = v.latest WHERE v.id IN($ids) ORDER BY v.c_released"
: "SELECT p.id, pr.name, pr.lang, pr.type FROM producers p JOIN producers_rev pr ON pr.id = p.latest WHERE p.id IN($ids) ORDER BY pr.name",
[ keys %{$_[HEAP]{nodes}} ], 'builddot');
}
@@ -252,7 +252,7 @@ sub _vnnode {
q|<TR><TD COLSPAN="2" ALIGN="CENTER" CELLPADDING="2"><FONT POINT-SIZE="%d"> %s </FONT></TD></TR>|.
q|<TR><TD> %s </TD><TD> %s </TD></TR>|.
qq|</TABLE>> ]\n|,
- $_->{id}, encode_utf8($tooltip), $heap->{fsize}[2], encode_utf8($title), $date, $n->{lang}||'N/A';
+ $_->{id}, encode_utf8($tooltip), $heap->{fsize}[2], encode_utf8($title), $date, join('/', @{$n->{lang}})||'N/A';
}
diff --git a/lib/VNDB/DB/ULists.pm b/lib/VNDB/DB/ULists.pm
index 28c4d572..19831593 100644
--- a/lib/VNDB/DB/ULists.pm
+++ b/lib/VNDB/DB/ULists.pm
@@ -65,7 +65,7 @@ sub dbVNListList {
# execute query
my($r, $np) = $self->dbPage(\%o, qq|
- SELECT vr.vid, vr.title, vr.original, v.c_released, v.c_languages, v.c_platforms, COALESCE(vo.vote, 0) AS vote
+ SELECT vr.vid, vr.title, vr.original, COALESCE(vo.vote, 0) AS vote
FROM vn v
JOIN vn_rev vr ON vr.id = v.latest
!s JOIN votes vo ON vo.vid = v.id AND vo.uid = ?
diff --git a/lib/VNDB/DB/VN.pm b/lib/VNDB/DB/VN.pm
index 166f4bbe..a29870a1 100644
--- a/lib/VNDB/DB/VN.pm
+++ b/lib/VNDB/DB/VN.pm
@@ -29,7 +29,7 @@ sub dbVNGet {
defined $o{char} && !$o{char} ? (
'(ASCII(vr.title) < 97 OR ASCII(vr.title) > 122) AND (ASCII(vr.title) < 65 OR ASCII(vr.title) > 90)' => 1 ) : (),
$o{lang} && @{$o{lang}} ? (
- '('.join(' OR ', map "v.c_languages ILIKE '%%$_%%'", @{$o{lang}}).')' => 1 ) : (),
+ 'v.c_languages && ARRAY[!l]::language[]' => [ $o{lang} ]) : (),
$o{platform} && @{$o{platform}} ? (
'('.join(' OR ', map "v.c_platforms ILIKE '%%$_%%'", @{$o{platform}}).')' => 1 ) : (),
$o{tags_include} && @{$o{tags_include}} ? (
@@ -81,8 +81,8 @@ sub dbVNGet {
);
my $tag_ids = $o{tags_include} && join ',', @{$o{tags_include}[1]};
- my @select = (
- qw|v.id v.locked v.hidden v.c_released v.c_languages v.c_platforms vr.title vr.original v.rgraph|, 'vr.id AS cid',
+ my @select = ( # see https://rt.cpan.org/Ticket/Display.html?id=54224 for the cast on c_languages
+ qw|v.id v.locked v.hidden v.c_released v.c_languages::text[] v.c_platforms vr.title vr.original v.rgraph|, 'vr.id AS cid',
$o{what} =~ /extended/ ? (
qw|vr.alias vr.image vr.img_nsfw vr.length vr.desc vr.l_wp vr.l_encubed vr.l_renai vr.l_vnn| ) : (),
$o{what} =~ /changes/ ? (
diff --git a/lib/VNDB/Util/BrowseHTML.pm b/lib/VNDB/Util/BrowseHTML.pm
index e9812f36..cc296cc7 100644
--- a/lib/VNDB/Util/BrowseHTML.pm
+++ b/lib/VNDB/Util/BrowseHTML.pm
@@ -184,7 +184,7 @@ sub htmlBrowseVN {
end;
td class => 'tc3';
cssicon "lang $_", mt "_lang_$_"
- for (reverse sort split /\//, $l->{c_languages});
+ for (reverse sort @{$l->{c_languages}});
end;
td class => 'tc4';
lit $self->{l10n}->datestr($l->{c_released});
diff --git a/util/sql/all.sql b/util/sql/all.sql
index e4f66d91..c012eba2 100644
--- a/util/sql/all.sql
+++ b/util/sql/all.sql
@@ -9,6 +9,7 @@ CREATE LANGUAGE plpgsql;
CREATE TYPE anime_type AS ENUM ('tv', 'ova', 'mov', 'oth', 'web', 'spe', 'mv');
CREATE TYPE dbentry_type AS ENUM ('v', 'r', 'p');
CREATE TYPE edit_rettype AS (iid integer, cid integer, rev integer);
+CREATE TYPE language AS ENUM('cs', 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja', 'ko', 'nl', 'no', 'pl', 'pt', 'ru', 'sk', 'sv', 'tr', 'vi', 'zh');
CREATE TYPE medium AS ENUM ('cd', 'dvd', 'gdr', 'blr', 'flp', 'mrt', 'mem', 'umd', 'nod', 'in', 'otc');
CREATE TYPE notification_ntype AS ENUM ('pm');
CREATE TYPE notification_ltype AS ENUM ('t');
diff --git a/util/sql/func.sql b/util/sql/func.sql
index a0fe2c2f..2c5c12b2 100644
--- a/util/sql/func.sql
+++ b/util/sql/func.sql
@@ -26,7 +26,7 @@ CREATE OR REPLACE FUNCTION update_vncache(integer) RETURNS void AS $$
AND rr1.released <> 0
GROUP BY rv1.vid
), 0),
- c_languages = COALESCE(ARRAY_TO_STRING(ARRAY(
+ c_languages = ARRAY(
SELECT rl2.lang
FROM releases_rev rr2
JOIN releases_lang rl2 ON rl2.rid = rr2.id
@@ -38,7 +38,7 @@ CREATE OR REPLACE FUNCTION update_vncache(integer) RETURNS void AS $$
AND r2.hidden = FALSE
GROUP BY rl2.lang
ORDER BY rl2.lang
- ), '/'), ''),
+ ),
c_platforms = COALESCE(ARRAY_TO_STRING(ARRAY(
SELECT rp3.platform
FROM releases_platforms rp3
diff --git a/util/sql/schema.sql b/util/sql/schema.sql
index c496e01d..d5766073 100644
--- a/util/sql/schema.sql
+++ b/util/sql/schema.sql
@@ -64,7 +64,7 @@ CREATE TABLE producers_rev (
name varchar(200) NOT NULL DEFAULT '',
original varchar(200) NOT NULL DEFAULT '',
website varchar(250) NOT NULL DEFAULT '',
- lang varchar NOT NULL DEFAULT 'ja',
+ lang language NOT NULL DEFAULT 'ja',
"desc" text NOT NULL DEFAULT '',
alias varchar(500) NOT NULL DEFAULT '',
l_wp varchar(150)
@@ -88,7 +88,7 @@ CREATE TABLE releases (
-- releases_lang
CREATE TABLE releases_lang (
rid integer NOT NULL,
- lang varchar NOT NULL,
+ lang language NOT NULL,
PRIMARY KEY(rid, lang)
);
@@ -286,7 +286,7 @@ CREATE TABLE vn (
hidden boolean NOT NULL DEFAULT FALSE,
rgraph integer,
c_released integer NOT NULL DEFAULT 0,
- c_languages varchar(32) NOT NULL DEFAULT '',
+ c_languages language[] NOT NULL DEFAULT '{}',
c_platforms varchar(32) NOT NULL DEFAULT '',
c_popularity real,
c_rating real,
diff --git a/util/updates/update_2.11.sql b/util/updates/update_2.11.sql
index 27b90c8f..f9601ce7 100644
--- a/util/updates/update_2.11.sql
+++ b/util/updates/update_2.11.sql
@@ -29,6 +29,19 @@ ALTER TABLE threads_boards DROP COLUMN lastread;
+-- languages -> ENUM
+CREATE TYPE language AS ENUM('cs', 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja', 'ko', 'nl', 'no', 'pl', 'pt', 'ru', 'sk', 'sv', 'tr', 'vi', 'zh');
+ALTER TABLE producers_rev ALTER COLUMN lang DROP DEFAULT;
+ALTER TABLE producers_rev ALTER COLUMN lang TYPE language USING lang::language;
+ALTER TABLE producers_rev ALTER COLUMN lang SET DEFAULT 'ja';
+ALTER TABLE releases_lang ALTER COLUMN lang TYPE language USING lang::language;
+-- c_languages is an now array of languages, rather than a serialized string
+ALTER TABLE vn ALTER COLUMN c_languages DROP DEFAULT;
+ALTER TABLE vn ALTER COLUMN c_languages TYPE language[] USING coalesce(string_to_array(c_languages, '/')::language[], '{}');
+ALTER TABLE vn ALTER COLUMN c_languages SET DEFAULT '{}';
+
+
+
ALTER TABLE changes ADD COLUMN ihid boolean NOT NULL DEFAULT FALSE;
ALTER TABLE changes ADD COLUMN ilock boolean NOT NULL DEFAULT FALSE;