Как организовать SQL-код WebOS, который зависит от предыдущих результатов? - PullRequest
1 голос
/ 17 мая 2011

Я хочу создать простое приложение WebOS Mojo, которое добавляет даты в базу данных, но перед этим ему нужно проверить несколько условий путем опроса базы данных.Учитывая асинхронный режим доступа к базе данных в WebOS, мне интересно, каков наиболее эффективный и короткий способ написания такого кода.

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

Это было бы легко сделать синхронным способом доступа к БД, но мне не очень нравится идея написания частей кода.в нескольких успешных обработчиках различных SQL-операторов.Есть ли более элегантное решение?

1 Ответ

1 голос
/ 28 июня 2011

Вы можете использовать встроенные обратные вызовы для функций реляционной базы данных HTML 5:

function createProject(project, onSuccess) { 
if (project.projectId)
    throw new StorageError("project already exists");
if (project.path)
    throw new StorageError("project already has a path");

project.projectId = ++Tracker.maxLocalId * 4096;
project.path = calcNextProjectPath();
project.normalize();

Tracker.db.transaction(
    function (transaction) {
        transaction.executeSql(
            "INSERT OR ROLLBACK INTO item (dbId, path, hasChildren, kind, summaryText, place, work, responsible, responsibleClass) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
            [project.projectId, project.path, project.hasChildren, project.kind, project.title, project.place, project.work, project.responsible, project.responsibleClass],

            function (transaction, resultSet) {
                Mojo.Log.info("DB: inserted new project item", resultSet.insertId, project.title);

                transaction.executeSql(
                    "INSERT OR ROLLBACK INTO project (projectId, accountId, title, backendKind, backendStatus, backendLastChanged, lastSuccessfulDown) \
                            VALUES (?, ?, ?, ?, ?, ?, ?)",
                    [project.projectId, project.accountId, project.title, project.backendKind, project.backendStatus, project.backendLastChanged, project.lastSuccessfulDown],

                    function (transaction, resultSet) {
                        Warn.logInfo("created new project", "projectId=" + resultSet.insertId, project.title);
                        if (onSuccess)
                            onSuccess();
                    },

                    function (transaction, sqlError) {
                        Warn.bannerError("create", $L("Quit and reset your phone."), "project row insertion failed: ", sqlError.message, sqlError.code, project);
                        return true;   // abort whole transaction
                    }
                );
            },

            function (transaction, sqlError) {   // failure of insert project item
                if (sqlError.code === 1 && sqlError.message === "constraint failed" && Mojo.appInfo.id !== "com.outlinetracker.outlinetracker") {
                    upgradeAlert(true);
                } else {
                    Warn.bannerError("create", $L("Quit and reset your phone."), "project item insertion failed: ", sqlError.message, sqlError.code);
                }
                return true;   // abort whole transaction
            }
        );                   
     },   // end transaction function

    function (sqlError) {   // seems to only be called for exceptions in callbacks
        Warn.logError($L("Quit and reset your phone."), "transaction 'insert project' failed", sqlError.message, sqlError.code);
    }
);   // end transaction call

}

...