Gecko: mozIStorageService, SQL

13th April 2006 - 14:49

Дошли руки до свежих сборок Firefox. В первую очередь меня интересовала реализация работы с БД:

var logger = {
  console: Components.classes["@mozilla.org/consoleservice;1"]
                     .getService(Components.interfaces.nsIConsoleService),
  log: function(msg) {
    this.console.logStringMessage(msg);
  }
};

var file = Components.classes["@mozilla.org/file/directory_service;1"]
                     .getService(Components.interfaces.nsIProperties)
                     .get("ProfD", Components.interfaces.nsIFile);
file.append("simple.sqlite");

var sqlStorage = Components.classes["@mozilla.org/storage/service;1"]
                           .getService(Components.interfaces.mozIStorageService);
var db = sqlStorage.openDatabase(file);
if (db.connectionReady) {
  if (!db.tableExists("testTable")) {
    logger.log("create new 'testTable'");
    db.createTable("testTable", "foo INTEGER, bar STRING");
    db.executeSimpleSQL("INSERT INTO testTable VALUES (10, '1 string')");
    db.executeSimpleSQL("INSERT INTO testTable VALUES (20, '2 string')");
    db.executeSimpleSQL("INSERT INTO testTable VALUES (30, '3 string')");
  }
  
  var st = db.createStatement("SELECT count(*) FROM testTable");
  st.executeStep();
  logger.log("st.getInt32(0): " + st.getInt32(0));//3
  st.reset();
  
  st = db.createStatement("SELECT * FROM testTable");
  
  logger.log("st.columnCount: " + st.columnCount);//2
  logger.log("st.getColumnName(0): " + st.getColumnName(0));//foo
  logger.log("st.getColumnName(1): " + st.getColumnName(1));//bar
  
  while (st.executeStep()) {
    logger.log("st.getInt32(0): " + st.getInt32(0));//10 (in first while)
    logger.log("st.getString(1): " + st.getString(1));//1 string (in first while)
  }
  st.reset();
  
} else {
  logger.log("db.connectionReady == false");
}

IDL можно посмотреть на lxr: {src}/storage/public

Пара комментариев:

В ходе выполнения скрипта создаётся файл "simple.sqlite" в каталоге профиля ("ProfD") установленного расширения (представим, что это кусок кода уже установленного расширения) или происходит соединение с этим фалом (SQLite DB), если таковой уже существует. Далее, если в БД нет таблицы "testTable", то создаём её и вводим тестовые значения.

createStatement — формирование запроса, executeStep — его выполнение. Если executeStep возвращает true, то последний результат (row) ещё не достигнут.

getInt32, getString — возвращают значения, но это «в лоб», лучше, наверное, написать wrapper, в котором смотреть возврат getTypeOfIndex и применять getInt32/getString/…. Но это уже мелочи. Главное — работает.

Ждём RSS-readers, записные книжки и прочее, прочее, прочее. Ну и нормального кэша, конечно, хотелось бы.

Здесь выложил diff (3kb) по Components.classes и Components.interfaces между Gecko/20060407 Firefox/3.0a1 и Gecko/20060111 Firefox/1.5.0.1.

Categories: dHtml,Soft | comments: (3)

Комментарии

1. Vovan's 13th April 2006 - 17:41

Да, нормального кеша давно ждём :(

2. Макс Лапшин 23rd May 2006 - 15:46

Зачем браузеру ходить к базе данных??!

Mash:

Remote Application Development; XUL Templates (где источником служит БД); Places; кэш, надеюсь; прочее.

Это не браузер, это платформа. А для платформы такой вопрос просто неуместен.

3. Макс Лапшин 23rd May 2006 - 16:04

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

Комментарии временно отключены.