#!/usr/bin/perl | #!/usr/bin/perl | ||||
use strict; | use strict; | ||||
use lib '/opt/autodoc/lib'; | |||||
use Autodoc; | |||||
use JSON; | use JSON; | ||||
use DBI; | use DBI; | ||||
use utf8; | use utf8; | ||||
print "Loading languages\n"; | print "Loading languages\n"; | ||||
my %langid; | my %langid; | ||||
my $q = sqlquery($dbh, "SELECT id,short FROM lang"); | |||||
my $q = sqlquery($dbh, "SELECT id,short FROM languages"); | |||||
while(my($id,$short)=$q->fetchrow_array()) { $langid{$short}=$id; } | while(my($id,$short)=$q->fetchrow_array()) { $langid{$short}=$id; } | ||||
print "Opening queue folder $queuedir\n"; | print "Opening queue folder $queuedir\n"; | ||||
my($file) = @_; | my($file) = @_; | ||||
my $txt = ''; | my $txt = ''; | ||||
open(OCR,sprintf("tesseract -l eng+deu+fra+ita %s - |", $file)); | |||||
#open(OCR,sprintf("tesseract -l eng+deu+fra+ita %s - |", $file)); | |||||
open(OCR,sprintf("tesseract -l Latin %s - |", $file)); | |||||
while(<OCR>) { | while(<OCR>) { | ||||
$txt .= $_; | $txt .= $_; | ||||
} | } | ||||
my($pageid, $lang, $words) = @_; | my($pageid, $lang, $words) = @_; | ||||
foreach my $word ( @{$words} ) { | foreach my $word ( @{$words} ) { | ||||
sqlquery($dbh, "CALL add_page_word(?,?,?)", | |||||
sqlquery($dbh, "CALL create_page_word(?,?,?)", | |||||
$pageid, $word, $langid{$lang}); | $pageid, $word, $langid{$lang}); | ||||
} | } | ||||
sub update_page_status { | sub update_page_status { | ||||
my($pageid, $status) = @_; | my($pageid, $status) = @_; | ||||
sqlquery($dbh, "CALL update_page_status(?,?)",$pageid, $status); | |||||
sqlquery($dbh, "CALL set_page_status(?,?)",$pageid, $status); | |||||
} | } | ||||
sub get_new_page { | sub get_new_page { | ||||
my $ug = Data::UUID->new; | my $ug = Data::UUID->new; | ||||
return lc($ug->create_str()); | return lc($ug->create_str()); | ||||
} | } | ||||
sub load_conf { | |||||
my($file) = @_; | |||||
my $x=''; | |||||
open(F,"$file") || die "Failed to load configuration file"; | |||||
while(<F>) { $x.=$_; } | |||||
close(F); | |||||
return from_json($x); | |||||
} | |||||
sub sqlconnect { | |||||
my($sql) = @_; | |||||
my $dsn = "DBI:mysql:database=$sql->{base};host=$sql->{host}"; | |||||
my $dbh = DBI->connect($dsn, $sql->{user}, $sql->{pass}, { mysql_enable_utf8 => 1 }) || \ | |||||
die "Failed to connect to database"; | |||||
return $dbh; | |||||
} | |||||
sub sqlquery { | |||||
my $dbh = shift; | |||||
my $query = shift; | |||||
my @args = @_; | |||||
#print STDERR "$query\n"; | |||||
my $sth = $dbh->prepare($query) || die "Failed to execute SQL query"; | |||||
$sth->execute(@args) || die "Failed to execute SQL query"; | |||||
return $sth; | |||||
} |
#!/usr/bin/perl | |||||
use strict; | |||||
use lib '/opt/autodoc/lib'; | |||||
use Autodoc; | |||||
use JSON; | |||||
use DBI; | |||||
use warnings; | |||||
my $conf = load_conf("../etc/autodoc.json"); | |||||
print "!!! STOP !!!"x4 . "\n"; | |||||
print "!!! STOP !!!"x4 . "\n"; | |||||
print "!!! STOP !!!"x4 . "\n"; | |||||
print "!!! STOP !!!"x4 . "\n"; | |||||
print "Running this script on an existing setup WILL ERASE ALL YOUR DATA!!!\n\n"; | |||||
print "Are you sure you want to continue? [N/y] "; | |||||
my $resp = <STDIN>; | |||||
chomp $resp; | |||||
if ( $resp !~ /^[yY]$/ ) { | |||||
print "Ok, bye\n"; | |||||
exit; | |||||
} | |||||
print "Creating database schema\n"; | |||||
system(sprintf("cat %s/%s | mysql -u %s -h %s --password='%s' %s 2>/dev/null", | |||||
$conf->{path}{global}, | |||||
'etc/schema.sql', | |||||
$conf->{sql}{user}, | |||||
$conf->{sql}{host}, | |||||
$conf->{sql}{pass}, | |||||
$conf->{sql}{base} | |||||
)); | |||||
print "All done\n"; |
#!/usr/bin/perl | |||||
use strict; | |||||
use lib '/opt/autodoc/lib'; | |||||
use Autodoc; | |||||
use utf8; | |||||
use warnings; | |||||
$|=1; | |||||
my $conf = load_conf("../etc/autodoc.json"); | |||||
my $dbh = sqlconnect($conf->{sql}); | |||||
my $chunk = 10000; | |||||
my %lang = ( | |||||
'fr' => [ 'french' ], | |||||
'de' => [ 'swiss', 'ngerman' ], | |||||
'en' => [ 'british-english-large', 'american-english-large' ], | |||||
'it' => [ 'italian' ], | |||||
); | |||||
foreach my $lang ( sort keys %{$conf->{dict}} ) { | |||||
print "Loading language $lang ...\n"; | |||||
foreach my $dict ( @{$conf->{dict}{$lang}} ) { | |||||
my $file = '/usr/share/dict/'.$dict; | |||||
my @words; | |||||
open(DICT, $file) || die "Failed to load $file, did you install the required dictionaries?"; | |||||
while(<DICT>) { chomp; push @words, $_; } | |||||
close(DICT); | |||||
my $len = scalar(@words); | |||||
for(my $pos = 0; $pos < $len; $pos+=$chunk) { | |||||
my @query; | |||||
my @args; | |||||
for(my $i=0; $i<$chunk && defined $words[$pos+$i]; $i++) { | |||||
push @args, $words[$pos+$i]; | |||||
push @args, $lang; | |||||
push @query, "(?,?)"; | |||||
} | |||||
my $query = "INSERT IGNORE INTO dict" . | |||||
"(word, lang) VALUES " . | |||||
join(",",@query); | |||||
sqlquery($dbh, $query, @args); | |||||
my $cnt = $pos + (scalar(@args)/2); | |||||
printf("\t%s %s/%s (%i%%) \r", | |||||
$dict, $cnt , $len, int($cnt/$len*100) ); | |||||
} | |||||
printf("\n"); | |||||
} | |||||
} |
#!/usr/bin/perl | |||||
use strict; | |||||
use JSON; | |||||
use DBI; | |||||
use utf8; | |||||
use GD::Simple; | |||||
use Data::Dumper; | |||||
use Data::UUID; | |||||
use warnings; | |||||
$|=1; | |||||
$Data::Dumper::Sortkeys = 1; | |||||
my $conf = load_conf("../etc/autodoc.json"); | |||||
my $dbh = sqlconnect($conf->{sql}); | |||||
my %lang = ( | |||||
'fr' => [ 'french' ], | |||||
'de' => [ 'swiss', 'ngerman' ], | |||||
'en' => [ 'british-english-large', 'american-english-large' ], | |||||
'it' => [ 'italian' ], | |||||
); | |||||
foreach my $lang ( sort keys %lang ) { | |||||
print "Loading language $lang ...\n"; | |||||
foreach my $dict ( @{$lang{$lang}} ) { | |||||
my $file = '/usr/share/dict/'.$dict; | |||||
my $len; | |||||
open(LEN,"wc -l $file |"); | |||||
while(<LEN>) { if ( /(\d+)/ ) { $len = $1; } } | |||||
close(LEN); | |||||
next if !defined $len; | |||||
my $cnt = 0; | |||||
my $start = time(); | |||||
open(DICT,$file); | |||||
while(<DICT>) { | |||||
chomp; | |||||
sqlquery($dbh, "INSERT IGNORE INTO dict SET word = ?, lang = ?", | |||||
$_, $lang); | |||||
$cnt++; | |||||
if ( ! ( $cnt % 777 ) || $cnt eq $len ) { | |||||
printf("\t%s %s/%s (%i%%) ETA: %ss \r", | |||||
$dict, $cnt, $len, int($cnt/$len*100), | |||||
time()-$start eq 0 ? '-' : int( ( (time()-$start)/$cnt*$len ) - ( time()-$start ) ) | |||||
); | |||||
} | |||||
} | |||||
close(DICT); | |||||
printf("\n"); | |||||
} | |||||
} | |||||
sub load_conf { | |||||
my($file) = @_; | |||||
my $x=''; | |||||
open(F,"$file") || die "Failed to load configuration file"; | |||||
while(<F>) { $x.=$_; } | |||||
close(F); | |||||
return from_json($x); | |||||
} | |||||
sub sqlconnect { | |||||
my($sql) = @_; | |||||
my $dsn = "DBI:mysql:database=$sql->{base};host=$sql->{host}"; | |||||
my $dbh = DBI->connect($dsn, $sql->{user}, $sql->{pass}, { | |||||
mysql_enable_utf8 => 1 | |||||
}) || die "Failed to connect to database"; | |||||
return $dbh; | |||||
} | |||||
sub sqlquery { | |||||
my $dbh = shift; | |||||
my $query = shift; | |||||
my @args = @_; | |||||
#print STDERR "$query\n"; | |||||
my $sth = $dbh->prepare($query) || die "Failed to execute SQL query"; | |||||
$sth->execute(@args) || die "Failed to execute SQL query"; | |||||
return $sth; | |||||
} |
#!/usr/bin/perl | |||||
use strict; | |||||
use lib '/opt/autodoc/lib'; | |||||
use Autodoc; | |||||
use warnings; | |||||
my $conf = load_conf('/opt/autodoc/etc/autodoc.json'); | |||||
my $dbh = sqlconnect($conf->{sql}); | |||||
while(1) { | |||||
print "User management\n"; | |||||
print "(l)ist, (a)dd, (d)elete, (q)uit\n"; | |||||
print "? "; | |||||
my $m = input('^[ladq]$'); | |||||
if ( !defined $m ) { | |||||
print "ERROR: Invalid input\n"; | |||||
} | |||||
elsif ( $m eq 'l' ) { | |||||
foreach my $user ( list_users() ) { | |||||
print "User: $user\n"; | |||||
} | |||||
} | |||||
elsif ( $m eq 'a' ) { | |||||
my ($user, $pass); | |||||
while(!defined $user) { | |||||
print "Username: "; | |||||
$user = input('^[0-9a-zA-Z-]+$'); | |||||
print "Invalid username\n" if !defined $user; | |||||
} | |||||
while(!defined $pass) { | |||||
print "Password: "; | |||||
$pass = input('^[0-9a-zA-Z-]+$'); | |||||
print "Invalid password\n" if !defined $pass; | |||||
} | |||||
create_user($user,$pass); | |||||
} | |||||
elsif ( $m eq 'd' ) { | |||||
print "Username to delete: "; | |||||
my $user = input('^[0-9a-zA-Z-]+$'); | |||||
delete_user($user); | |||||
} | |||||
elsif ( $m eq 'q' ) { | |||||
print "Bye\n"; | |||||
exit; | |||||
} | |||||
} | |||||
sub create_user { | |||||
my($user,$pass) = @_; | |||||
my $crypt; | |||||
open(X,"htpasswd -nbB '$user' '$pass' |"); | |||||
while(<X>) { | |||||
chomp; | |||||
(undef, $crypt)=split(/:/) if /:/; | |||||
} | |||||
close(X); | |||||
if ( defined $crypt ) { | |||||
sqlquery($dbh, "INSERT INTO users SET username = ?, passwd = ?", $user, $crypt); | |||||
} | |||||
} | |||||
sub delete_user { | |||||
my($user) = @_; | |||||
sqlquery($dbh, "DELETE FROM users WHERE username = ?", $user); | |||||
} | |||||
sub list_users { | |||||
my @users; | |||||
my $q = sqlquery($dbh, "SELECT username FROM users ORDER BY username"); | |||||
while(my ($user) = $q->fetchrow_array()) { push @users, $user; } | |||||
return @users; | |||||
} | |||||
sub input { | |||||
my($re) = @_; | |||||
my $str = <STDIN>; chomp $str; | |||||
return $str if $str =~ /$re/; | |||||
return undef; | |||||
} |
#!/usr/bin/perl | #!/usr/bin/perl | ||||
use strict; | use strict; | ||||
use lib '/opt/autodoc/lib'; | |||||
use Autodoc; | |||||
use FCGI; | use FCGI; | ||||
use JSON; | use JSON; | ||||
use DBI; | use DBI; | ||||
} | } | ||||
sub load_conf { | |||||
my($file) = @_; | |||||
my $x=''; | |||||
open(F,"$file") || fatal_api_error(500,"Failed to load configuration file"); | |||||
while(<F>) { $x.=$_; } | |||||
close(F); | |||||
return from_json($x); | |||||
} | |||||
sub process_query { | sub process_query { | ||||
my($method, $path, $qs, $post, $user) = @_; | my($method, $path, $qs, $post, $user) = @_; | ||||
return { ctype => $ct, len => $len, data => $data}; | return { ctype => $ct, len => $len, data => $data}; | ||||
} | } | ||||
sub sqlconnect { | |||||
my($sql) = @_; | |||||
my $dsn = "DBI:mysql:database=$sql->{base};host=$sql->{host}"; | |||||
my $dbh = DBI->connect($dsn, $sql->{user}, $sql->{pass}, { mysql_enable_utf8 => 1 }) || \ | |||||
fatal_api_error(500,"Failed to connect to database"); | |||||
return $dbh; | |||||
} | |||||
sub sqlquery { | |||||
my $dbh = shift; | |||||
my $query = shift; | |||||
my @args = @_; | |||||
#print STDERR "$query\n"; | |||||
my $sth = $dbh->prepare($query) || fatal_api_error(500,"Failed to execute SQL query"); | |||||
$sth->execute(@args) || fatal_api_error(500,"Failed to execute SQL query"); | |||||
return $sth; | |||||
} |
"cache": "var/cache", | "cache": "var/cache", | ||||
"error_img": "var/error_img.jpeg" | "error_img": "var/error_img.jpeg" | ||||
}, | }, | ||||
"dict": { | |||||
"en": [ "british-english-large", "amer | |||||
ican-english-large" ], | |||||
"de": [ "swiss", "ngerman" ], | |||||
"fr": [ "french" ], | |||||
"it": [ "italian" ] | |||||
}, | |||||
"sql": { | "sql": { | ||||
"host": "localhost", | "host": "localhost", | ||||
"base": "autodoc", | "base": "autodoc", |
ALTER SCHEMA `autodoc` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ; | |||||
DROP TABLE IF EXISTS `documents_tags`; | |||||
DROP TABLE IF EXISTS `documents_pages`; | |||||
DROP TABLE IF EXISTS `pages_words`; | |||||
DROP TABLE IF EXISTS `words`; | |||||
DROP TABLE IF EXISTS `dict`; | |||||
DROP TABLE IF EXISTS `languages`; | |||||
DROP TABLE IF EXISTS `pages`; | |||||
DROP TABLE IF EXISTS `tags`; | |||||
DROP TABLE IF EXISTS `users`; | |||||
DROP TABLE IF EXISTS `documents`; | |||||
DROP PROCEDURE IF EXISTS `create_page_word`; | |||||
DROP PROCEDURE IF EXISTS `create_tag`; | |||||
DROP PROCEDURE IF EXISTS `create_document`; | |||||
DROP PROCEDURE IF EXISTS `create_page`; | |||||
DROP PROCEDURE IF EXISTS `delete_tag`; | |||||
DROP PROCEDURE IF EXISTS `get_document_filter`; | |||||
DROP PROCEDURE IF EXISTS `get_primary_page`; | |||||
DROP PROCEDURE IF EXISTS `set_primary_page`; | |||||
DROP PROCEDURE IF EXISTS `set_page_status`; | |||||
DROP FUNCTION IF EXISTS `SPLIT_STR`; | |||||
CREATE TABLE `dict` ( | |||||
`word` varchar(255) NOT NULL, | |||||
`lang` char(2) NOT NULL, | |||||
PRIMARY KEY (`word`,`lang`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||||
CREATE TABLE `users` ( | |||||
`username` varchar(255) NOT NULL, | |||||
`passwd` varchar(255) DEFAULT NULL, | |||||
`groups` varchar(255) DEFAULT NULL, | |||||
PRIMARY KEY (`username`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||||
CREATE TABLE `documents` ( | |||||
`id` binary(16) NOT NULL, | |||||
`owner` varchar(45) DEFAULT NULL, | |||||
`name` varchar(128) CHARACTER SET utf8mb4 DEFAULT NULL, | |||||
`created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, | |||||
`status` enum('nodata','inprogress','deleted','ok') NOT NULL DEFAULT 'nodata', | |||||
PRIMARY KEY (`id`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||||
CREATE TABLE `languages` ( | |||||
`id` binary(16) NOT NULL, | |||||
`short` char(2) DEFAULT NULL, | |||||
`name` varchar(45) DEFAULT NULL, | |||||
PRIMARY KEY (`id`), | |||||
UNIQUE KEY `short_UNIQUE` (`short`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||||
CREATE TABLE `pages` ( | |||||
`id` binary(16) NOT NULL, | |||||
`owner` varchar(45) DEFAULT NULL, | |||||
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | |||||
`status` enum('nodata','inprogress','deleted','ok') DEFAULT 'nodata', | |||||
`isprimary` tinyint(4) DEFAULT '0', | |||||
PRIMARY KEY (`id`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||||
CREATE TABLE `tags` ( | |||||
`id` binary(16) NOT NULL, | |||||
`tag` varchar(45) DEFAULT NULL, | |||||
`color` enum('primary','secondary','success','danger','warning','info','light','dark') DEFAULT NULL, | |||||
PRIMARY KEY (`id`), | |||||
UNIQUE KEY `tag_UNIQUE` (`tag`,`color`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||||
CREATE TABLE `words` ( | |||||
`id` binary(16) NOT NULL, | |||||
`word` varchar(255) DEFAULT NULL, | |||||
`languageId` binary(16) DEFAULT NULL, | |||||
PRIMARY KEY (`id`), | |||||
UNIQUE KEY `word_UNIQUE` (`word`,`languageId`), | |||||
KEY `fk_words_langid_idx` (`languageId`), | |||||
CONSTRAINT `fk_words_languageid` FOREIGN KEY (`languageId`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||||
CREATE TABLE `documents_tags` ( | |||||
`documentId` binary(16) NOT NULL, | |||||
`tagId` binary(16) NOT NULL, | |||||
PRIMARY KEY (`documentId`,`tagId`), | |||||
KEY `fk_tags_id_idx` (`tagId`), | |||||
CONSTRAINT `fk_doctags_docid` FOREIGN KEY (`documentId`) REFERENCES `documents` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION, | |||||
CONSTRAINT `fk_doctags_tagid` FOREIGN KEY (`tagId`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||||
CREATE TABLE `pages_words` ( | |||||
`pageId` binary(16) NOT NULL, | |||||
`wordId` binary(16) NOT NULL, | |||||
`count` int(10) unsigned DEFAULT NULL, | |||||
PRIMARY KEY (`pageId`,`wordId`), | |||||
KEY `fk_pagword_wordid_idx` (`wordId`), | |||||
CONSTRAINT `fk_pagword_pageid` FOREIGN KEY (`pageId`) REFERENCES `pages` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION, | |||||
CONSTRAINT `fk_pagword_wordid` FOREIGN KEY (`wordId`) REFERENCES `words` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||||
CREATE TABLE `documents_pages` ( | |||||
`documentId` binary(16) NOT NULL, | |||||
`pageId` binary(16) NOT NULL, | |||||
PRIMARY KEY (`documentId`,`pageId`), | |||||
KEY `fk_docpage_pageid_idx` (`pageId`), | |||||
CONSTRAINT `fk_docpage_docid` FOREIGN KEY (`documentId`) REFERENCES `documents` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION, | |||||
CONSTRAINT `fk_docpage_pageid` FOREIGN KEY (`pageId`) REFERENCES `pages` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION | |||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; | |||||
DELIMITER ;; | |||||
CREATE FUNCTION `SPLIT_STR`( | |||||
x VARCHAR(255), | |||||
delim VARCHAR(12), | |||||
pos INT | |||||
) RETURNS varchar(255) CHARSET utf8mb4 | |||||
RETURN | |||||
CASE WHEN CHAR_LENGTH(SUBSTRING_INDEX(x, delim, pos - 1)) = CHAR_LENGTH(x) | |||||
THEN x | |||||
ELSE (REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), CHAR_LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), delim, '')) | |||||
END ;; | |||||
DELIMITER ; | |||||
DELIMITER ;; | |||||
CREATE PROCEDURE `create_page_word`( | |||||
IN IN_pageid CHAR(36), | |||||
IN IN_word VARCHAR(255), | |||||
IN IN_langid CHAR(36)) | |||||
BEGIN | |||||
DECLARE LOC_wordid BINARY(16) DEFAULT NULL; | |||||
INSERT IGNORE INTO words SET | |||||
id = UUID_TO_BIN(UUID()), | |||||
word = IN_word, | |||||
langId = UUID_TO_BIN(IN_langid); | |||||
SELECT BIN_TO_UUID(id) INTO LOC_wordid FROM words WHERE word = IN_word AND langId = UUID_TO_BIN(IN_langid); | |||||
INSERT INTO pages_words SET | |||||
pageId = UUID_TO_BIN(IN_pageid), | |||||
wordId = UUID_TO_BIN(LOC_wordid), | |||||
count = 1 | |||||
ON DUPLICATE KEY | |||||
UPDATE count = count + 1; | |||||
END ;; | |||||
DELIMITER ; | |||||
DELIMITER ;; | |||||
CREATE PROCEDURE `create_tag`( | |||||
IN IN_documentid BINARY(16), | |||||
IN IN_tag VARCHAR(45)) | |||||
BEGIN | |||||
DECLARE LOC_tagid BINARY(16) DEFAULT UUID(); | |||||
INSERT IGNORE INTO tags SET | |||||
id = LOC_tagid, | |||||
tag = IN_tag; | |||||
SELECT id INTO LOC_tagid FROM tags WHERE tag = IN_tag; | |||||
INSERT IGNORE INTO documents_tags SET | |||||
documentId = IN_documentid, | |||||
tagId = LOC_tagid; | |||||
END ;; | |||||
DELIMITER ; | |||||
DELIMITER ;; | |||||
CREATE PROCEDURE `create_document`( | |||||
IN IN_owner VARCHAR(45)) | |||||
BEGIN | |||||
DECLARE LOC_documentid BINARY(16) DEFAULT UUID(); | |||||
INSERT INTO documents SET | |||||
id = LOC_documentid, | |||||
owner = IN_owner, | |||||
status = 'nodata'; | |||||
SELECT LOC_documentid AS documentId; | |||||
END ;; | |||||
DELIMITER ; | |||||
DELIMITER ;; | |||||
CREATE PROCEDURE `create_page`( | |||||
IN IN_documentId BINARY(16)) | |||||
BEGIN | |||||
DECLARE LOC_pageid BINARY(16) DEFAULT UUID(); | |||||
INSERT INTO pages SET | |||||
id = LOC_pageid, | |||||
status = 'nodata'; | |||||
INSERT INTO documents_pages SET | |||||
documentId = UUID_TO_BIN(IN_documentid), | |||||
pageId = LOC_pageid; | |||||
SELECT BIN_TO_UUID(LOC_pageid) AS pageId; | |||||
END ;; | |||||
DELIMITER ; | |||||
DELIMITER ;; | |||||
CREATE PROCEDURE `delete_tag`( | |||||
IN IN_documentid BINARY(16), | |||||
IN IN_tag VARCHAR(45)) | |||||
BEGIN | |||||
DECLARE LOC_tagid BINARY(16) DEFAULT UUID(); | |||||
SELECT id INTO LOC_tagid FROM tags WHERE tag = IN_tag; | |||||
DELETE FROM documents_tags | |||||
WHERE documentId = IN_documentid | |||||
AND tagId = LOC_tagid; | |||||
END ;; | |||||
DELIMITER ; | |||||
DELIMITER ;; | |||||
CREATE PROCEDURE `get_document_filter`( | |||||
IN IN_words VARCHAR(255), | |||||
IN IN_tags VARCHAR(255), | |||||
IN IN_lim1 INT, | |||||
IN IN_lim2 INT) | |||||
BEGIN | |||||
DECLARE L_query TEXT default ""; | |||||
DECLARE L_pos INT UNSIGNED DEFAULT 0; | |||||
SELECT BIN_TO_UUID(dp.documentId) AS id, SUM(pw.count) AS wordcount | |||||
FROM documents_pages dp | |||||
JOIN pages_words pw ON dp.pageId = pw.pageId | |||||
JOIN words w ON pw.wordId = w.id | |||||
WHERE w.word REGEXP CONCAT("(", IN_words, ")") | |||||
GROUP BY dp.documentId | |||||
ORDER BY wordcount DESC | |||||
LIMIT IN_lim1, IN_lim2; | |||||
END ;; | |||||
DELIMITER ; | |||||
DELIMITER ;; | |||||
CREATE PROCEDURE `get_primary_page`( | |||||
IN IN_documentid BINARY(16)) | |||||
BEGIN | |||||
DECLARE LOC_pageid BINARY(16) DEFAULT NULL; | |||||
SELECT dp.pageId INTO LOC_pageid FROM | |||||
documents_pages dp | |||||
JOIN pages p ON dp.pageId = p.id | |||||
WHERE dp.documentId = IN_documentid | |||||
AND p.isprimary = 1; | |||||
IF LOC_pageid IS NULL | |||||
THEN | |||||
SELECT dp.pageId INTO LOC_pageid FROM | |||||
documents_pages dp | |||||
JOIN pages p ON dp.pageId = p.id | |||||
WHERE dp.documentId = IN_documentid | |||||
ORDER BY RAND() LIMIT 1; | |||||
END IF; | |||||
SELECT BIN_TO_UUID(LOC_pageid) AS pageId; | |||||
END ;; | |||||
DELIMITER ; | |||||
DELIMITER ;; | |||||
CREATE PROCEDURE `set_primary_page`( | |||||
IN IN_pageid BINARY(16)) | |||||
BEGIN | |||||
DECLARE LOC_documentid BINARY(16) DEFAULT NULL; | |||||
SELECT documentId INTO LOC_documentid FROM documents_pages WHERE pageId = IN_pageid; | |||||
UPDATE | |||||
documents_pages dp | |||||
JOIN pages p ON dp.pageId = p.id | |||||
SET p.isprimary = 0 | |||||
WHERE dp.documentId = LOC_documentid; | |||||
UPDATE | |||||
pages | |||||
SET isprimary = 1 | |||||
WHERE id = IN_pageid; | |||||
END ;; | |||||
DELIMITER ; | |||||
DELIMITER ;; | |||||
CREATE PROCEDURE `set_page_status`( | |||||
IN IN_pageid BINARY(16), | |||||
IN IN_status ENUM('nodata', 'inprogress', 'deleted', 'ok') | |||||
) | |||||
BEGIN | |||||
UPDATE pages SET status = IN_status WHERE id = UUID_TO_BIN(IN_pageid); | |||||
END ;; | |||||
DELIMITER ; |
package Autodoc; | |||||
use strict; | |||||
use JSON; | |||||
use DBI; | |||||
use warnings 'all'; | |||||
use Exporter 'import'; | |||||
our @EXPORT = qw(sqlconnect sqlquery load_conf); | |||||
sub load_conf { | |||||
my($file) = @_; | |||||
my $x=''; | |||||
die "No configuration file given" if !defined $file; | |||||
open(F,"$file") || die "Failed to load configuration file"; | |||||
while(<F>) { $x.=$_; } | |||||
close(F); | |||||
return from_json($x); | |||||
} | |||||
sub sqlconnect { | |||||
my($sql) = @_; | |||||
my $dsn = "DBI:mysql:database=$sql->{base};host=$sql->{host}"; | |||||
my $dbh = DBI->connect($dsn, $sql->{user}, $sql->{pass}, { | |||||
mysql_enable_utf8 => 1 | |||||
}) || die "Failed to connect to database"; | |||||
return $dbh; | |||||
} | |||||
sub sqlquery { | |||||
my $dbh = shift; | |||||
my $query = shift; | |||||
my @args = @_; | |||||
#print STDERR "$query\n"; | |||||
my $sth = $dbh->prepare($query) || die "Failed to execute SQL query"; | |||||
$sth->execute(@args) || die "Failed to execute SQL query"; | |||||
return $sth; | |||||
} | |||||
return 1; |
apt-get install mysql-client | |||||
apt-get install aspell-fr aspell-it aspell-de aspell-en | apt-get install aspell-fr aspell-it aspell-de aspell-en | ||||
apt-get install wfrench wbritish-large witalian wswiss wngerman wamerican-large | apt-get install wfrench wbritish-large witalian wswiss wngerman wamerican-large | ||||
apt-get install tesseract-ocr-fra tesseract-ocr-deu tesseract-ocr-ita tesseract-ocr-eng | |||||
apt-get install tesseract-ocr-fra tesseract-ocr-deu tesseract-ocr-ita tesseract-ocr-eng tesseract-ocr-script-latn | |||||
apt-get install poppler-utils | apt-get install poppler-utils | ||||
cd /opt/autodoc/www/js/ | cd /opt/autodoc/www/js/ |
<html> | |||||
<body>Nothing here</body> | |||||
</html> |