Ну, вот, теперь я смог выделить немного времени не только улучшению дизайна моего блога, но и улучшению его содержания.

Уже довольно долго я собираю пароли такой замечательной программой, как 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(); }

Класс готов. Интерфейс пока прост. Описывать тут не стоит, так как проще посмотреть в исходниках.