diff --git a/ajax/dict_substring_search.php b/ajax/dict_substring_search.php index ec2ae07a..39331952 100644 --- a/ajax/dict_substring_search.php +++ b/ajax/dict_substring_search.php @@ -2,7 +2,7 @@ require_once('../lib/header_ajax.php'); header('Content-type: text/html; charset=utf-8'); -$res = sql_pe("SELECT DISTINCT dl.lemma_id, dl.lemma_text, SUBSTR(grammems, 7, 4) AS gr FROM form2lemma fl LEFT JOIN dict_lemmata dl ON (fl.lemma_id=dl.lemma_id) WHERE fl.form_text like ? order by dl.lemma_text limit 10", array($_GET['q'] . '%')); +$res = sql_pe("SELECT DISTINCT dl.lemma_id, dl.lemma_text, SUBSTR(grammems, 7, 4) AS gr FROM form2lemma fl LEFT JOIN dict_lemmata dl ON (fl.lemma_id=dl.lemma_id) WHERE dl.deleted=0 AND fl.form_text like ? order by dl.lemma_text limit 10", array($_GET['q'] . '%')); foreach ($res as $line) { echo $line['lemma_text'] . '|' . $line['gr'] . '|' . $line['lemma_id'] ."\n"; } diff --git a/ajax/lemma_search.php b/ajax/lemma_search.php index 961f82a1..20d3d8b8 100644 --- a/ajax/lemma_search.php +++ b/ajax/lemma_search.php @@ -2,7 +2,7 @@ require_once('../lib/header_ajax.php'); require_once('../lib/lib_dict.php'); echo ''; -$res = sql_pe("SELECT lemma_id FROM dict_lemmata WHERE lemma_text=?", array($_GET['q'])); +$res = sql_pe("SELECT lemma_id FROM dict_lemmata WHERE lemma_text=? AND deleted=0", array($_GET['q'])); foreach ($res as $r) { echo ''; } diff --git a/lib/lib_dict.php b/lib/lib_dict.php index ec934304..18c9bf3c 100644 --- a/lib/lib_dict.php +++ b/lib/lib_dict.php @@ -8,7 +8,7 @@ function get_dict_stats() { $out = array(); $r = sql_fetch_array(sql_query("SELECT COUNT(*) AS cnt_g FROM `gram`")); $out['cnt_g'] = $r['cnt_g']; - $r = sql_fetch_array(sql_query("SELECT COUNT(*) AS cnt_l FROM `dict_lemmata`")); + $r = sql_fetch_array(sql_query("SELECT COUNT(*) AS cnt_l FROM `dict_lemmata` WHERE deleted=0")); $out['cnt_l'] = $r['cnt_l']; $r = sql_fetch_array(sql_query("SELECT COUNT(*) AS cnt_f FROM `form2lemma`")); $out['cnt_f'] = $r['cnt_f']; @@ -22,7 +22,7 @@ function get_dict_search_results($get) { $out = array(); $find_pos = sql_prepare("SELECT SUBSTR(grammems, 7, 4) AS gr FROM form2lemma WHERE lemma_id = ? LIMIT 1"); if (isset($get['search_lemma'])) { - $res = sql_pe("SELECT lemma_id FROM `dict_lemmata` WHERE `lemma_text`= ?", array($get['search_lemma'])); + $res = sql_pe("SELECT lemma_id FROM `dict_lemmata` WHERE deleted=0 AND `lemma_text`= ?", array($get['search_lemma'])); $count = sizeof($res); $out['lemma']['count'] = $count; if ($count == 0) @@ -34,7 +34,7 @@ function get_dict_search_results($get) { } } elseif (isset($get['search_form'])) { - $res = sql_pe("SELECT DISTINCT dl.lemma_id, dl.lemma_text FROM `form2lemma` fl LEFT JOIN `dict_lemmata` dl ON (fl.lemma_id=dl.lemma_id) WHERE fl.`form_text`= ?", array($get['search_form'])); + $res = sql_pe("SELECT DISTINCT dl.lemma_id, dl.lemma_text FROM `form2lemma` fl LEFT JOIN `dict_lemmata` dl ON (fl.lemma_id=dl.lemma_id) WHERE deleted=0 AND fl.`form_text`= ?", array($get['search_form'])); $count = sizeof($res); $out['form']['count'] = $count; if ($count == 0) @@ -184,7 +184,7 @@ function parse_dict_rev($text) { return $parsed; } function get_word_paradigm($lemma) { - $res = sql_pe("SELECT rev_text FROM dict_revisions LEFT JOIN dict_lemmata USING (lemma_id) WHERE lemma_text=? ORDER BY rev_id DESC LIMIT 1", array($lemma)); + $res = sql_pe("SELECT rev_text FROM dict_revisions LEFT JOIN dict_lemmata USING (lemma_id) WHERE deleted=0 AND lemma_text=? ORDER BY rev_id DESC LIMIT 1", array($lemma)); if (sizeof($res) == 0) return false; $r = $res[0]; @@ -404,9 +404,18 @@ function get_top_absent_words() { function get_lemma_editor($id) { $out = array('lemma' => array('id' => $id), 'errata' => array()); if ($id == -1) return $out; - $res = sql_pe("SELECT l.`lemma_text`, d.`rev_id`, d.`rev_text` FROM `dict_lemmata` l LEFT JOIN `dict_revisions` d ON (l.lemma_id = d.lemma_id) WHERE l.`lemma_id`=? ORDER BY d.rev_id DESC LIMIT 1", array($id)); + $res = sql_pe(" + SELECT l.`lemma_text`, l.deleted, d.`rev_id`, d.`rev_text` + FROM `dict_lemmata` l + LEFT JOIN `dict_revisions` d + ON (l.lemma_id = d.lemma_id) + WHERE l.`lemma_id`=? + ORDER BY d.rev_id DESC + LIMIT 1 + ", array($id)); $arr = parse_dict_rev($res[0]['rev_text']); - $out['lemma']['text'] = $arr['lemma']['text']; + $out['deleted'] = $res[0]['deleted']; + $out['lemma']['text'] = $res[0]['lemma_text']; $out['lemma']['grms'] = implode(', ', $arr['lemma']['grm']); foreach ($arr['forms'] as $farr) { $out['forms'][] = array('text' => $farr['text'], 'grms' => implode(', ', $farr['grm'])); @@ -472,7 +481,7 @@ function dict_add_lemma($array) { } sql_begin(); //new lemma in dict_lemmata - sql_pe("INSERT INTO dict_lemmata VALUES(NULL, ?)", array(mb_strtolower($lemma_text))); + sql_pe("INSERT INTO dict_lemmata VALUES(NULL, ?, 0)", array(mb_strtolower($lemma_text))); $lemma_id = sql_insert_id(); //array -> xml $new_xml = make_dict_xml($lemma_text, $lemma_gram_new, $new_paradigm); @@ -522,6 +531,12 @@ function dict_save($array) { if ($array['lemma_id'] == -1) { return dict_add_lemma($array); } + + // lemma might have been deleted, it is not editable then + $r = sql_fetch_array(sql_query("SELECT deleted FROM dict_lemmata WHERE lemma_id = ".$array['lemma_id']." LIMIT 1")); + if ($r['deleted']) + throw new Exception("This lemma is not editable"); + $lemma_text = trim($array['lemma_text']); if (!$lemma_text) throw new UnexpectedValueException(); @@ -637,8 +652,7 @@ function del_lemma($id) { //delete forms from form2lemma sql_pe("DELETE FROM `form2lemma` WHERE lemma_id=?", array($id)); //delete lemma - sql_pe("INSERT INTO dict_lemmata_deleted (SELECT * FROM dict_lemmata WHERE lemma_id=? LIMIT 1)", array($id)); - sql_pe("DELETE FROM dict_lemmata WHERE lemma_id=? LIMIT 1", array($id)); + sql_pe("UPDATE dict_lemmata SET deleted=1 WHERE lemma_id=? LIMIT 1", array($id)); sql_commit(); } function del_link($link_id, $revset_id=0) { diff --git a/lib/lib_history.php b/lib/lib_history.php index dc67e095..280a18ec 100644 --- a/lib/lib_history.php +++ b/lib/lib_history.php @@ -94,7 +94,8 @@ function dict_history($lemma_id, $skip = 0) { 'lemma_text' => $r['lemma_text'], 'lemma2_id' => $r['lemma2_id'], 'lemma2_text' => $r['lemma2_text'], - 'is_link' => $r['is_link'] + 'is_link' => $r['is_link'], + 'is_lemma_deleted' => $r['deleted'] ); } return $out; diff --git a/migrations/20150216164636_undelete_lemmata.php b/migrations/20150216164636_undelete_lemmata.php new file mode 100644 index 00000000..50d0992e --- /dev/null +++ b/migrations/20150216164636_undelete_lemmata.php @@ -0,0 +1,52 @@ +execute(" + ALTER TABLE dict_lemmata + ADD COLUMN `deleted` tinyint(3) unsigned not null; + "); + $this->execute(" + ALTER TABLE dict_lemmata + ADD INDEX(`deleted`) + "); + $this->execute(" + INSERT INTO dict_lemmata ( + SELECT lemma_id, lemma_text, 1 + FROM dict_lemmata_deleted + ) + "); + $this->dropTable('dict_lemmata_deleted'); + } + + /** + * Migrate Down. + */ + public function down() + { + $this->table('dict_lemmata_deleted', array('id' => false)) + ->addColumn('lemma_id', 'integer') + ->addColumn('lemma_text', 'string', array('limit' => 50)) + ->save(); + $this->execute(" + INSERT INTO dict_lemmata_deleted ( + SELECT lemma_id, lemma_text + FROM dict_lemmata + WHERE deleted=1 + ) + "); + $this->execute(" + DELETE FROM dict_lemmata + WHERE deleted=1 + "); + $this->table('dict_lemmata')->removeIndex(array('deleted')); + $this->table('dict_lemmata')->removeColumn('deleted'); + } +} diff --git a/scripts/stats/update_stats.pl b/scripts/stats/update_stats.pl index e1f0e613..822c26a9 100755 --- a/scripts/stats/update_stats.pl +++ b/scripts/stats/update_stats.pl @@ -163,7 +163,7 @@ sub words_in_file { return $sc->fetchrow_hashref()->{'cnt'}; }; $func->{'total_lemmata'} = sub { - my $sc = $dbh->prepare("SELECT COUNT(*) AS cnt FROM dict_lemmata"); + my $sc = $dbh->prepare("SELECT COUNT(*) AS cnt FROM dict_lemmata WHERE deleted=0"); $sc->execute(); return $sc->fetchrow_hashref()->{'cnt'}; }; diff --git a/templates/dict/history.tpl b/templates/dict/history.tpl index 9dc7ed44..161e86ab 100644 --- a/templates/dict/history.tpl +++ b/templates/dict/history.tpl @@ -19,7 +19,7 @@ {if $h.is_link && isset($smarty.get.lemma_id) && $smarty.get.lemma_id != $h.lemma_id} {$h.lemma2_text} {else} - {$h.lemma_text} + {$h.lemma_text} {/if} diff --git a/templates/dict/lemma_edit.tpl b/templates/dict/lemma_edit.tpl index 738f52a3..68018959 100644 --- a/templates/dict/lemma_edit.tpl +++ b/templates/dict/lemma_edit.tpl @@ -36,7 +36,11 @@ {/if} << к поиску + {if $editor.deleted} +

Лемма «{$editor.lemma.text|htmlspecialchars}» удалена

+ {else}

Лемма «{$editor.lemma.text|htmlspecialchars}»

+ {/if}