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; }
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; }