Ну, вот, теперь я смог выделить немного времени не только улучшению дизайна моего блога, но и улучшению его содержания.
Уже довольно долго я собираю пароли такой замечательной программой, как KeePass, но в голове всегда крутилась злобная мыслишка накатать свой проект с теми же свойствами. На чем писать – вопрос не стоял. Оставалось выбрать немного времени и приступить.
Выбрал и приступил. Естественно в одну запись в блоге это все не поместится. Разделим нашу программу на несколько частей (каких пока сам не знаю) и начнем.
Что самое главное в программе, которая хранит некоторый набор данных? Естественно база данных. Так что вполне логично начать не с интерфейса, а с нее.
Для мелких проектов я давно использую JavaDB, но в данном случае – было выбрано лучшее портативное решение – H2. Почему портативное? Глупый вопрос если вы хотите запускать программу с флешки. Скачав дистрибутив и, потратив час на мануал, все стало ясно – отличное и крайне удобное решение.
Создаем класс H2Connector, который будет выполнять все необходимые функции при работе с бд, и начинаем. В этом классе нам понадобятся 3 переменные:
// Сессия с БД
var connector : Connection;
// Отвечает за выполнение статических запросов
var statement : Statement;
// Имя базы данных (пока считается что она всегда лежит в папке с jar)
public-init var baseName : String;
Создаем функцию соединения с H2:
function dbConnect(dbName : String) {
// Папка с jar
var str : String;
str = __DIR__.substring(0, __DIR__.lastIndexOf("!"));
str = str.substring(0, str.lastIndexOf("/", str.length()) + 1);
str = str.substring(4, str.length());
// Подключаем драйвер H2
try {
Class.forName("org.h2.Driver");
} catch (e : ClassNotFoundException) {
println("dbConnect. Unable to load Driver Class");
FX.exit();
};
// Соединяемся с БД
try {
connector = DriverManager.getConnection("jdbc:h2:{str}{dbName}", "sa", "");
statement = connector.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
} catch (e : SQLException) {
println("dbConnect. SQLException: {e.toString()}");
FX.exit();
}
}
При выключении программы отсоединяемcя:
public function dbDisconnect(){
try {
statement.close();
connector.close();
} catch (e : SQLException) {
println("dbDisconnect. SQLException: {e.toString()}");
FX.exit();
}
}
А вот и две функции, отвечающие за выполнение запросов:
// На SELECT ...
public function dbExecute(query : String) : ResultSet{
var rs : ResultSet;
try {
rs = statement.executeQuery(query);
} catch (e : SQLException) {
println("dbExecute. SQLException: {e.toString()}");
}
return rs;
}
// ... и на UPDATE
public function dbUpdate(query : String) : Integer{
var res : Integer;
try {
res = statement.executeUpdate(query);
} catch (e : SQLException) {
println("dbUpdate. SQLException: {e.toString()}");
}
return res;
}
Почти готово. Осталось создать главную таблицу нашей базы:
function dbCreateTables() {
try {
dbUpdate("CREATE TABLE IF NOT EXISTS PASS(ID INT AUTO_INCREMENT "
"PRIMARY KEY, RESOURCE VARCHAR(255), USER VARCHAR(255), PASSWORD "
"LONGVARCHAR(1024), TYPE VARCHAR(255), FOLDER VARCHAR(255), "
"COMMENT LONGVARCHAR(1024), PICTURE VARCHAR(255));");
} catch (e : SQLException) {
println("dbCreateTables. SQLException: {e.toString()}");
FX.exit();
}
}
Все. Добавляем init:
init { dbConnect(baseName); dbCreateTables(); }
Класс готов. Интерфейс пока прост. Описывать тут не стоит, так как проще посмотреть в исходниках.