Esempio n. 1
0
void QQuickLocalStorage::openDatabaseSync(QQmlV8Function *args)
{
#ifndef QT_NO_SETTINGS
    QV8Engine *engine = args->engine();
    if (engine->engine()->offlineStoragePath().isEmpty())
        V8THROW_SQL_VOID(SQLEXCEPTION_DATABASE_ERR, QQmlEngine::tr("SQL: can't create database, offline storage is disabled."));

    qmlsqldatabase_initDatabasesPath(engine);

    QSqlDatabase database;

    QString dbname = engine->toString((*args)[0]);
    QString dbversion = engine->toString((*args)[1]);
    QString dbdescription = engine->toString((*args)[2]);
    int dbestimatedsize = (*args)[3]->Int32Value();
    v8::Handle<v8::Value> dbcreationCallback = (*args)[4];

    QCryptographicHash md5(QCryptographicHash::Md5);
    md5.addData(dbname.toUtf8());
    QString dbid(QLatin1String(md5.result().toHex()));

    QString basename = qmlsqldatabase_databaseFile(dbid, engine);
    bool created = false;
    QString version = dbversion;

    {
        QSettings ini(basename+QLatin1String(".ini"),QSettings::IniFormat);

        if (QSqlDatabase::connectionNames().contains(dbid)) {
            database = QSqlDatabase::database(dbid);
            version = ini.value(QLatin1String("Version")).toString();
            if (version != dbversion && !dbversion.isEmpty() && !version.isEmpty())
                V8THROW_SQL_VOID(SQLEXCEPTION_VERSION_ERR, QQmlEngine::tr("SQL: database version mismatch"));
        } else {
            created = !QFile::exists(basename+QLatin1String(".sqlite"));
            database = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), dbid);
            if (created) {
                ini.setValue(QLatin1String("Name"), dbname);
                if (dbcreationCallback->IsFunction())
                    version = QString();
                ini.setValue(QLatin1String("Version"), version);
                ini.setValue(QLatin1String("Description"), dbdescription);
                ini.setValue(QLatin1String("EstimatedSize"), dbestimatedsize);
                ini.setValue(QLatin1String("Driver"), QLatin1String("QSQLITE"));
            } else {
                if (!dbversion.isEmpty() && ini.value(QLatin1String("Version")) != dbversion) {
                    // Incompatible
                    V8THROW_SQL_VOID(SQLEXCEPTION_VERSION_ERR,QQmlEngine::tr("SQL: database version mismatch"));
                }
                version = ini.value(QLatin1String("Version")).toString();
            }
            database.setDatabaseName(basename+QLatin1String(".sqlite"));
        }
        if (!database.isOpen())
            database.open();
    }

    v8::Local<v8::Object> instance = databaseData(engine)->constructor->NewInstance();

    QV8SqlDatabaseResource *r = new QV8SqlDatabaseResource(engine);
    r->database = database;
    r->version = version;
    instance->SetExternalResource(r);

    if (created && dbcreationCallback->IsFunction()) {
        v8::TryCatch tc;
        v8::Handle<v8::Function> callback = v8::Handle<v8::Function>::Cast(dbcreationCallback);
        v8::Handle<v8::Value> args[] = { instance };
        callback->Call(engine->global(), 1, args);
        if (tc.HasCaught()) {
            tc.ReThrow();
            return;
        }
    }

    args->returnValue(instance);
#endif // QT_NO_SETTINGS
}
/*
    Currently documented in doc/src/declarative/globalobject.qdoc
*/
static QScriptValue qmlsqldatabase_open_sync(QScriptContext *context, QScriptEngine *engine)
{
    qmlsqldatabase_initDatabasesPath(engine);

    QSqlDatabase database;

    QString dbname = context->argument(0).toString();
    QString dbversion = context->argument(1).toString();
    QString dbdescription = context->argument(2).toString();
    int dbestimatedsize = context->argument(3).toNumber();
    QScriptValue dbcreationCallback = context->argument(4);

    QCryptographicHash md5(QCryptographicHash::Md5);
    md5.addData(dbname.toUtf8());
    QString dbid(QLatin1String(md5.result().toHex()));

    QString basename = qmlsqldatabase_databaseFile(dbid, engine);
    bool created = false;
    QString version = dbversion;

    {
        QSettings ini(basename+QLatin1String(".ini"),QSettings::IniFormat);

        if (QSqlDatabase::connectionNames().contains(dbid)) {
            database = QSqlDatabase::database(dbid);
            version = ini.value(QLatin1String("Version")).toString();
            if (version != dbversion && !dbversion.isEmpty() && !version.isEmpty())
                THROW_SQL(VERSION_ERR,QDeclarativeEngine::tr("SQL: database version mismatch"));
        } else {
            created = !QFile::exists(basename+QLatin1String(".sqlite"));
            database = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), dbid);
            if (created) {
                ini.setValue(QLatin1String("Name"), dbname);
                if (dbcreationCallback.isFunction())
                    version = QString();
                ini.setValue(QLatin1String("Version"), version);
                ini.setValue(QLatin1String("Description"), dbdescription);
                ini.setValue(QLatin1String("EstimatedSize"), dbestimatedsize);
                ini.setValue(QLatin1String("Driver"), QLatin1String("QSQLITE"));
            } else {
                if (!dbversion.isEmpty() && ini.value(QLatin1String("Version")) != dbversion) {
                    // Incompatible
                    THROW_SQL(VERSION_ERR,QDeclarativeEngine::tr("SQL: database version mismatch"));
                }
                version = ini.value(QLatin1String("Version")).toString();
            }
            database.setDatabaseName(basename+QLatin1String(".sqlite"));
        }
        if (!database.isOpen())
            database.open();
    }

    QScriptValue instance = engine->newObject();
    instance.setProperty(QLatin1String("transaction"), engine->newFunction(qmlsqldatabase_transaction,1));
    instance.setProperty(QLatin1String("readTransaction"), engine->newFunction(qmlsqldatabase_read_transaction,1));
    instance.setProperty(QLatin1String("version"), version, QScriptValue::ReadOnly);
    instance.setProperty(QLatin1String("changeVersion"), engine->newFunction(qmlsqldatabase_change_version,3));

    QScriptValue result = engine->newVariant(instance,qVariantFromValue(database));

    if (created && dbcreationCallback.isFunction()) {
        dbcreationCallback.call(QScriptValue(), QScriptValueList() << result);
    }

    return result;
}
Esempio n. 3
0
bool MainWindow::updateDbFromTable( int row, QString zzpid, double avgSchool, int latitude, int longitude )
{
    // Is this insert or update?
    QString dbid(safeItemText(row, COL_DBID));
    int id = -1;
    if (!dbid.isEmpty()) id = dbid.toInt();
    QSqlQuery q(m_db);
    bool success;
    if (id < 0)
    {
        success = q.prepare( "INSERT INTO zbr_property (zpid, when_checked, detail_url, lot_size, year_built, price, bedrooms, baths, sqft, "
                             "zestimate, schools, schools_avg, hoa_fee, address, city, county, state, zip, latitude, longitude) "
                             "VALUES (:zpid, :when_checked, :detail_url, :lot_size, :year_built, :price, :bedrooms, :baths, :sqft, "
                             ":zestimate, :schools, :schools_avg, :hoa_fee, :address, :city, :county, :state, :zip, :latitude, :longitude)" );
    }
    else
    {
        success = q.prepare( "UPDATE zbr_property SET zpid=:zpid, when_checked=:when_checked, detail_url=:detail_url, lot_size=:lot_size, year_built=:year_built, "
                             "price=:price, bedrooms=:bedrooms, baths=:baths, sqft=:sqft, zestimate=:zestimate, schools=:schools, schools_avg=:schools_avg, "
                             "hoa_fee=:hoa_fee, address=:address, city=:city, county=:county, state=:state, zip=:zip, latitude=:latitude, longitude=:longitude "
                             "WHERE id=:id" );
        if (success) q.bindValue(":id", id );
    }
    if (!success)
    {
        logMsg( "Prepare failed:" + q.lastError().text(), -1 );
        return false;
    }
    q.bindValue(":zpid", zzpid.toInt());
    int currentTime = QDateTime::currentDateTime().toTime_t();
    q.bindValue(":when_checked", currentTime);
    q.bindValue(":schools_avg", avgSchool);
    q.bindValue(":detail_url", safeItemText(row, COL_URL));
    q.bindValue(":lot_size", safeItemText(row, COL_LOT));
    q.bindValue(":year_built", safeItemText(row, COL_YEAR));
    q.bindValue(":price", safeItemText(row, COL_PRICE));
    q.bindValue(":bedrooms", safeItemText(row, COL_BR));
    q.bindValue(":baths", safeItemText(row, COL_BA));
    q.bindValue(":sqft", safeItemText(row, COL_SQFT));
    q.bindValue(":zestimate", safeItemText(row, COL_ZESTIMATE));
    q.bindValue(":schools", safeItemText(row, COL_SCHOOLS));
    q.bindValue(":hoa_fee", safeItemText(row, COL_HOA));
    q.bindValue(":address", safeItemText(row, COL_ADDRESS));
    q.bindValue(":city", safeItemText(row, COL_CITY));
    q.bindValue(":county", safeItemText(row, COL_COUNTY));
    q.bindValue(":state", safeItemText(row, COL_STATE));
    q.bindValue(":zip", safeItemText(row, COL_ZIP));
    q.bindValue(":latitude", latitude);
    q.bindValue(":longitude", longitude);
    if (!q.exec())
    {
        logMsg( "Query failed:" + q.lastError().text(), -1 );
        return false;
    }
    if (id < 0)
    {
        id = q.lastInsertId().toInt();
        qDebug() << "Got new db ID:" << id << "for row" << row;
        setTableCell( row, COL_DBID, QString().sprintf("%d",id) );
        m_dbidToRow[id] = row;
        m_zpidToRow[zzpid.toInt()] = row;
    }
    return true;
}