Mac 専用パーソナルデータベースソフト Bento 2 のバージョン 2.0.4 へのアップデータが公開されました。 iPhone / iPod Touch 版の Bento も公開され、これとのデータ同期と、Bento 2 のパフォーマンスの改善が主な改良点です。
毎度期待している AppleScript のサポート改善は、今回もありませんでした。
確認されている不具合
過去のバージョン (2.0.3 以前) には、希に iCal イベントに重複レコードが発生するというバグがありました。重複レコードが発生しているデータベースを Bento 2.0.4 に読み込ませた場合、Bento 2 を起動する度に、以下の現象が発生します。
- エラーが発生したので終了する、というダイアログが出るが、実際には終了しない。
- すべての iCal イベントが重複レコードとしてコピーされる。
起動する度に、iCal イベントが増えていくので、たまったものではありません。なお、重複レコードが発生した場合、Bento から削除することはできません。同様の現象は、アドレスブックでも発生するという報告もあるようです。
一時的な解決策
Bento 2 の新しいアップデータが出るのを待つのが最良の選択です。が、それまでの間、Bento 2 が使えないのは困るという人向けに、Bento 2 のデータベースを直接操作して、重複レコードを削除するスクリプトを公開します。
以下の点を理解し、同意いただける方のみご利用ください。
- Bento 2.0.4 専用です。
- データ破壊、データ消失の可能性がありますので、必ずバックアップを取ってから実行してください。清野は、本スクリプトを使用した結果について一切の責任を免れるものとします。
- 本スクリプトは iCal イベントの重複レコードを削除します。
- 重複レコードのうち、最も古い (最初に追加された) レコードを残します。そうでないレコードが関連レコードとして参照されている場合、データベースに不整合が発生します。
私の環境では、このスクリプトにより不具合は解消され、正常に使えるようになっています。
-- Delete duplicated events from BentoDB.
-- Use this script AT YOUR OWN RISK.
property sqlite3 : "/usr/bin/sqlite3"
property bentodb : "/Users/your-account/Library/Application Support/Bento/bento.bentodb/Contents/Resources/Database"
on run
set lastUUID to ""
repeat with e in my getEvents()
set the AppleScript's text item delimiters to "|"
set pk to item 1 of (text items of e)
set uuid to item 2 of (text items of e)
if lastUUID is uuid then
my delEvents(pk)
else
set lastUUID to uuid
end if
end repeat
end run
on getEvents()
set the AppleScript's text item delimiters to ASCII character of 13
text items of my doSQL("SELECT gnpk, gn_gnExternalUID FROM gn_lib_event ORDER BY gn_gnExternalUID ASC")
end getEvents
on delEvents(pk)
my doSQL("DELETE FROM gn_lib_event WHERE gnpk = '" & pk & "'")
end delEvents
on doSQL(sql)
do shell script sqlite3 & " '" & bentodb & "' '" & sql & "'"
end doSQL