Gecko: mozIStorageService, SQL
Дошли руки до свежих сборок 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
Та ссылка, которую вы привели — типичный банальный и очень глупый развод на флейм. Но в целом я понял.