/*
* This file is part of NeighborNote
* Copyright 2013 Yuki Takahashi
*
* This file may be licensed under the terms of of the
* GNU General Public License Version 2 (the ``GPL'').
*
* Software distributed under the License is distributed
* on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the GPL for the specific language
* governing rights and limitations.
*
* You should have received a copy of the GPL along with this
* program. If not, go to http://www.gnu.org/licenses/gpl.html
* or write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package cx.fbn.nevernote.sql;
import cx.fbn.nevernote.sql.driver.NSqlQuery;
import cx.fbn.nevernote.utilities.ApplicationLogger;
public class ExcludedTable {
private final ApplicationLogger logger;
private final DatabaseConnection db;
// コンストラクタ
public ExcludedTable(ApplicationLogger l, DatabaseConnection d) {
logger = l;
db = d;
}
// テーブル作成
public void createTable() {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
logger.log(logger.HIGH, "ExcludedNotesテーブルを作成しています...");
if (!query.exec("Create table ExcludedNotes (id integer primary key auto_increment, guid1 varchar, guid2 varchar)"))
logger.log(logger.HIGH, "ExcludedNotesテーブル作成失敗!!!");
}
// テーブルをドロップ
public void dropTable() {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
query.exec("Drop table ExcludedNotes");
}
// ExcludedNotesテーブルにアイテムを1つ追加
public void addExclusion(String guid1, String guid2) {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
query.prepare("Insert Into ExcludedNotes (guid1, guid2) Values(:guid1, :guid2)");
query.bindValue(":guid1", guid1);
query.bindValue(":guid2", guid2);
if (!query.exec()) {
logger.log(logger.MEDIUM, "ExcludedNotesテーブルへのアイテム追加に失敗");
logger.log(logger.MEDIUM, query.lastError());
}
}
// masterGuidとchildGuidをマージ
public void mergeHistoryGuid(String masterGuid, String childGuid) {
NSqlQuery excludedNotesQuery = new NSqlQuery(db.getBehaviorConnection());
boolean check = false;
// マージ後に重複してしまうデータを先に削除
excludedNotesQuery.prepare("Delete from ExcludedNotes where (guid1=:oldGuid1 and guid2=:newGuid1) or (guid1=:newGuid2 and guid2=:oldGuid2)");
excludedNotesQuery.bindValue(":oldGuid1", masterGuid);
excludedNotesQuery.bindValue(":newGuid1", childGuid);
excludedNotesQuery.bindValue(":oldGuid2", masterGuid);
excludedNotesQuery.bindValue(":newGuid2", childGuid);
check = excludedNotesQuery.exec();
if(!check){
logger.log(logger.MEDIUM, "excludedNotesテーブルの重複削除で失敗");
logger.log(logger.MEDIUM, excludedNotesQuery.lastError());
}
updateExcludedNoteGuid(masterGuid, childGuid);
}
// ExcludedNotesテーブルのGuidを更新
public void updateExcludedNoteGuid(String newGuid, String oldGuid){
NSqlQuery excludedNotesQuery = new NSqlQuery(db.getBehaviorConnection());
boolean check = false;
excludedNotesQuery.prepare("Update ExcludedNotes set guid1=:newGuid where guid1=:oldGuid");
excludedNotesQuery.bindValue(":newGuid", newGuid);
excludedNotesQuery.bindValue(":oldGuid", oldGuid);
check = excludedNotesQuery.exec();
if (!check) {
logger.log(logger.MEDIUM, "ExcludedNotesテーブルのguid1のところでguid更新失敗");
logger.log(logger.MEDIUM, excludedNotesQuery.lastError());
}
excludedNotesQuery.prepare("Update ExcludedNotes set guid2=:newGuid where guid2=:oldGuid");
excludedNotesQuery.bindValue(":newGuid", newGuid);
excludedNotesQuery.bindValue(":oldGuid", oldGuid);
check = excludedNotesQuery.exec();
if (!check) {
logger.log(logger.MEDIUM, "ExcludedNotesテーブルのguid2のところでguid更新失敗");
logger.log(logger.MEDIUM, excludedNotesQuery.lastError());
}
}
// ExcludedNotesテーブルに引数guidのノートが存在するか
public boolean existNote(String guid1, String guid2) {
NSqlQuery excludedNotesQuery = new NSqlQuery(db.getBehaviorConnection());
// 2つの引数guidを含むアイテムの存在確認
excludedNotesQuery.prepare("Select * from ExcludedNotes where Exists(Select * from ExcludedNotes where (guid1=:guid1_1 and guid2=:guid2_1) or (guid1=:guid2_2 and guid2=:guid1_2))");
excludedNotesQuery.bindValue(":guid1_1", guid1);
excludedNotesQuery.bindValue(":guid2_1", guid2);
excludedNotesQuery.bindValue(":guid1_2", guid1);
excludedNotesQuery.bindValue(":guid2_2", guid2);
if (!excludedNotesQuery.exec()) {
logger.log(logger.MEDIUM, "ExcludedNotesテーブルからguid1=" + guid1 + "かつguid2=" + guid2 + "(またはその逆)のアイテムの存在確認失敗");
logger.log(logger.MEDIUM, excludedNotesQuery.lastError());
}
if (excludedNotesQuery.next()) {
return true;
}
return false;
}
// oldGuidのノートの除外ノートをnewGuidのノートの除外ノートとして複製
public void duplicateExcludedNotes(String newGuid, String oldGuid) {
NSqlQuery excludedNotesQuery = new NSqlQuery(db.getBehaviorConnection());
// guid1 = oldGuidの除外ノートを取得
excludedNotesQuery.prepare("Select guid2 from ExcludedNotes where guid1=:oldGuid");
excludedNotesQuery.bindValue(":oldGuid", oldGuid);
if(!excludedNotesQuery.exec()){
logger.log(logger.MEDIUM, "ExcludedNotesテーブルからguid1=" + oldGuid + "のアイテム取得失敗");
logger.log(logger.MEDIUM, excludedNotesQuery.lastError());
}
// guid1 = newGuidの除外ノートとして複製
while(excludedNotesQuery.next()){
String guid2 = excludedNotesQuery.valueString(0);
addExclusion(newGuid, guid2);
}
// guid2 = oldGuidの除外ノートを取得
excludedNotesQuery.prepare("Select guid1 from ExcludedNotes where guid2=:oldGuid");
excludedNotesQuery.bindValue(":oldGuid", oldGuid);
if(!excludedNotesQuery.exec()){
logger.log(logger.MEDIUM, "ExcludedNotesテーブルからguid2=" + oldGuid + "のアイテム取得失敗");
logger.log(logger.MEDIUM, excludedNotesQuery.lastError());
}
// guid2 = newGuidの除外ノートとして複製
while(excludedNotesQuery.next()){
String guid1 = excludedNotesQuery.valueString(0);
addExclusion(guid1, newGuid);
}
}
// guidを含む列をExcludedNotesテーブルから削除
public void expungeExcludedNote(String guid) {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
boolean check;
query.prepare("Delete from ExcludedNotes where guid1=:guid1 or guid2=:guid2");
query.bindValue(":guid1", guid);
query.bindValue(":guid2", guid);
check = query.exec();
if(!check){
logger.log(logger.MEDIUM, "ExcludedNotesテーブルからguid=" + guid + "のデータ削除に失敗");
logger.log(logger.MEDIUM, query.lastError());
}
}
}