/*
* 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 StaredTable {
private final ApplicationLogger logger;
private final DatabaseConnection db;
// コンストラクタ
public StaredTable(ApplicationLogger l, DatabaseConnection d) {
logger = l;
db = d;
}
// テーブル作成
public void createTable() {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
logger.log(logger.HIGH, "StaredNotesテーブルを作成しています...");
if (!query.exec("Create table StaredNotes (id integer primary key auto_increment, masterGuid varchar, staredGuid varchar)"))
logger.log(logger.HIGH, "StaredNotesテーブル作成失敗!!!");
}
// テーブルをドロップ
public void dropTable() {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
query.exec("Drop table StaredNotes");
}
// StaredNotesテーブルにアイテムを1つ追加
public void addStaredItem(String masterGuid, String staredGuid) {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
query.prepare("Insert Into StaredNotes (masterGuid, staredGuid) Values(:masterGuid, :staredGuid)");
query.bindValue(":masterGuid", masterGuid);
query.bindValue(":staredGuid", staredGuid);
if (!query.exec()) {
logger.log(logger.MEDIUM, "StaredNotesテーブルへのアイテム追加に失敗");
logger.log(logger.MEDIUM, query.lastError());
}
}
// StaredNotesテーブルからアイテムを1つ削除
public void removeStaredItem(String masterGuid, String staredGuid) {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
query.prepare("Delete from StaredNotes where (masterGuid=:masterGuid and staredGuid=:staredGuid)");
query.bindValue(":masterGuid", masterGuid);
query.bindValue(":staredGuid", staredGuid);
if (!query.exec()) {
logger.log(logger.MEDIUM, "StaredNotesテーブルからのアイテム削除に失敗");
logger.log(logger.MEDIUM, query.lastError());
}
}
// guidを含む列をStaredNotesテーブルから削除
public void expungeStaredNote(String guid) {
NSqlQuery query = new NSqlQuery(db.getBehaviorConnection());
boolean check;
query.prepare("Delete from StaredNotes where masterGuid=:masterGuid or staredGuid=:staredGuid");
query.bindValue(":masterGuid", guid);
query.bindValue(":staredGuid", guid);
check = query.exec();
if(!check){
logger.log(logger.MEDIUM, "StaredNotesテーブルからguid=" + guid + "のデータ削除に失敗");
logger.log(logger.MEDIUM, query.lastError());
}
}
// masterGuidとchildGuidをマージ
public void mergeHistoryGuid(String masterGuid, String childGuid) {
NSqlQuery staredNotesQuery = new NSqlQuery(db.getBehaviorConnection());
boolean check = false;
// マージ後に重複してしまうデータを先に削除
staredNotesQuery.prepare("Delete from StaredNotes where (masterGuid=:masterGuid1 and staredGuid=:staredGuid1) or (masterGuid=:masterGuid2 and staredGuid=:staredGuid2)");
staredNotesQuery.bindValue(":masterGuid1", masterGuid);
staredNotesQuery.bindValue(":childGuid1", childGuid);
staredNotesQuery.bindValue(":masterGuid2", childGuid);
staredNotesQuery.bindValue(":staredGuid2", masterGuid);
check = staredNotesQuery.exec();
if(!check){
logger.log(logger.MEDIUM, "staredNotesテーブルの重複削除で失敗");
logger.log(logger.MEDIUM, staredNotesQuery.lastError());
}
updateStaredNoteGuid(masterGuid, childGuid);
}
// StaredNotesテーブルのGuidを更新
public void updateStaredNoteGuid(String newGuid, String oldGuid){
NSqlQuery staredNotesQuery = new NSqlQuery(db.getBehaviorConnection());
boolean check = false;
staredNotesQuery.prepare("Update StaredNotes set masterGuid=:newGuid where masterGuid=:oldGuid");
staredNotesQuery.bindValue(":newGuid", newGuid);
staredNotesQuery.bindValue(":oldGuid", oldGuid);
check = staredNotesQuery.exec();
if (!check) {
logger.log(logger.MEDIUM, "StaredNotesテーブルのmasterGuidのところでguid更新失敗");
logger.log(logger.MEDIUM, staredNotesQuery.lastError());
}
staredNotesQuery.prepare("Update StaredNotes set staredGuid=:newGuid where staredGuid=:oldGuid");
staredNotesQuery.bindValue(":newGuid", newGuid);
staredNotesQuery.bindValue(":oldGuid", oldGuid);
check = staredNotesQuery.exec();
if (!check) {
logger.log(logger.MEDIUM, "StaredNotesテーブルのstaredGuidのところでguid更新失敗");
logger.log(logger.MEDIUM, staredNotesQuery.lastError());
}
}
// StaredNotesテーブルに引数guidのノートが存在するか
public boolean existNote(String masterGuid, String staredGuid) {
NSqlQuery staredNotesQuery = new NSqlQuery(db.getBehaviorConnection());
// 2つの引数guidを含むアイテムの存在確認
staredNotesQuery.prepare("Select * from StaredNotes where Exists(Select * from StaredNotes where (masterGuid=:masterGuid1 and staredGuid=:staredGuid1) or (masterGuid=:masterGuid2 and staredGuid=:staredGuid2))");
staredNotesQuery.bindValue(":masterGuid1", masterGuid);
staredNotesQuery.bindValue(":staredGuid1", staredGuid);
staredNotesQuery.bindValue(":masterGuid2", masterGuid);
staredNotesQuery.bindValue(":staredGuid2", staredGuid);
if (!staredNotesQuery.exec()) {
logger.log(logger.MEDIUM, "StaredNotesテーブルからmasterGuid=" + masterGuid + "かつstaredGuid=" + staredGuid + "(またはその逆)のアイテムの存在確認失敗");
logger.log(logger.MEDIUM, staredNotesQuery.lastError());
}
if (staredNotesQuery.next()) {
return true;
}
return false;
}
// oldGuidのノートの除外ノートをnewGuidのノートの除外ノートとして複製
public void duplicateStaredNotes(String newGuid, String oldGuid) {
NSqlQuery staredNotesQuery = new NSqlQuery(db.getBehaviorConnection());
// masterGuid = oldGuidのスター付きノートを取得
staredNotesQuery.prepare("Select staredGuid from StaredNotes where masterGuid=:oldGuid");
staredNotesQuery.bindValue(":oldGuid", oldGuid);
if(!staredNotesQuery.exec()){
logger.log(logger.MEDIUM, "StaredNotesテーブルからmasterGuid=" + oldGuid + "のアイテム取得失敗");
logger.log(logger.MEDIUM, staredNotesQuery.lastError());
}
// masterGuid = newGuidのスター付きノートとして複製
while(staredNotesQuery.next()){
String staredGuid = staredNotesQuery.valueString(0);
addStaredItem(newGuid, staredGuid);
}
// staredGuid = oldGuidの除外ノートを取得
staredNotesQuery.prepare("Select masterGuid from StaredNotes where staredGuid=:oldGuid");
staredNotesQuery.bindValue(":oldGuid", oldGuid);
if(!staredNotesQuery.exec()){
logger.log(logger.MEDIUM, "StaredNotesテーブルからstaredGuid=" + oldGuid + "のアイテム取得失敗");
logger.log(logger.MEDIUM, staredNotesQuery.lastError());
}
// staredGuid = newGuidの除外ノートとして複製
while(staredNotesQuery.next()){
String masterGuid = staredNotesQuery.valueString(0);
addStaredItem(masterGuid, newGuid);
}
}
}