Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmllocalstorage.cpp
Go to the documentation of this file.
1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <QtQml/private/qqmlengine_p.h>
7#include <QtQml/private/qv4global_p.h>
8#include <QtQml/private/qv4scopedvalue_p.h>
9#include <QtQml/private/qv4object_p.h>
10#include <QtQml/private/qv4sqlerrors_p.h>
11#include <QtQml/private/qv4jscall_p.h>
12#include <QtQml/private/qv4objectiterator_p.h>
13
14#include <QtCore/qfileinfo.h>
15#include <QtCore/qdir.h>
16
17#include <QtSql/qsqldatabase.h>
18#include <QtSql/qsqlquery.h>
19#include <QtSql/qsqlrecord.h>
20#include <QtSql/qsqlerror.h>
21
22#if QT_CONFIG(settings)
23#include <QtCore/qsettings.h>
24#endif
25
27
28#define V4THROW_SQL(error, desc) { \
29 QV4::ScopedString v(scope, scope.engine->newString(desc)); \
30 QV4::ScopedObject ex(scope, scope.engine->newErrorObject(v)); \
31 ex->put(QV4::ScopedString(scope, scope.engine->newIdentifier(QStringLiteral("code"))).getPointer(), QV4::ScopedValue(scope, Value::fromInt32(error))); \
32 scope.engine->throwError(ex); \
33 RETURN_UNDEFINED(); \
34}
35
36#define V4THROW_SQL2(error, desc) { \
37 QV4::ScopedString v(scope, scope.engine->newString(desc)); \
38 QV4::ScopedObject ex(scope, scope.engine->newErrorObject(v)); \
39 ex->put(QV4::ScopedString(scope, scope.engine->newIdentifier(QStringLiteral("code"))).getPointer(), QV4::ScopedValue(scope, Value::fromInt32(error))); \
40 args->setReturnValue(scope.engine->throwError(ex)); \
41 return; \
42}
43
44#define V4THROW_REFERENCE(string) { \
45 QV4::ScopedString v(scope, scope.engine->newString(QLatin1String(string))); \
46 scope.engine->throwReferenceError(v); \
47 RETURN_UNDEFINED(); \
48}
49
50
61
63
64namespace QV4 {
65
66namespace Heap {
68 enum Type { Database, Query, Rows };
69 void init()
70 {
71 Object::init();
72 type = Database;
74 version = new QString;
75 sqlQuery = new QSqlQuery;
76 }
77
78 void destroy() {
79 delete database;
80 delete version;
81 delete sqlQuery;
82 Object::destroy();
83 }
84
87
88 QString *version; // type == Database
89
90 bool inTransaction; // type == Query
91 bool readonly; // type == Query
92
93 QSqlQuery *sqlQuery; // type == Rows
94 bool forwardOnly; // type == Rows
95 };
96}
97
114
115}
116
117using namespace QV4;
118
120
121
122
123static ReturnedValue qmlsqldatabase_version(const FunctionObject *b, const Value *thisObject, const QV4::Value *, int)
124{
125 Scope scope(b);
127 if (!r || r->d()->type != Heap::QQmlSqlDatabaseWrapper::Database)
128 V4THROW_REFERENCE("Not a SQLDatabase object");
129
130 RETURN_RESULT(Encode(scope.engine->newString(*r->d()->version)));
131}
132
133static ReturnedValue qmlsqldatabase_rows_length(const FunctionObject *b, const Value *thisObject, const QV4::Value *, int)
134{
135 Scope scope(b);
137 if (!r || r->d()->type != Heap::QQmlSqlDatabaseWrapper::Rows)
138 V4THROW_REFERENCE("Not a SQLDatabase::Rows object");
139
140 int s = r->d()->sqlQuery->size();
141 if (s < 0) {
142 // Inefficient
143 if (r->d()->sqlQuery->last()) {
144 s = r->d()->sqlQuery->at() + 1;
145 } else {
146 s = 0;
147 }
148 }
150}
151
152static ReturnedValue qmlsqldatabase_rows_forwardOnly(const FunctionObject *b, const Value *thisObject, const QV4::Value *, int)
153{
154 Scope scope(b);
156 if (!r || r->d()->type != Heap::QQmlSqlDatabaseWrapper::Rows)
157 V4THROW_REFERENCE("Not a SQLDatabase::Rows object");
158 RETURN_RESULT(Encode(r->d()->sqlQuery->isForwardOnly()));
159}
160
161static ReturnedValue qmlsqldatabase_rows_setForwardOnly(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc)
162{
163 Scope scope(b);
165 if (!r || r->d()->type != Heap::QQmlSqlDatabaseWrapper::Rows)
166 V4THROW_REFERENCE("Not a SQLDatabase::Rows object");
167 if (argc < 1)
169
170 r->d()->sqlQuery->setForwardOnly(argv[0].toBoolean());
172}
173
177
179{
180 Scope scope(v4);
181
182 if (r->d()->sqlQuery->at() == (int)index || r->d()->sqlQuery->seek(index)) {
183 QSqlRecord record = r->d()->sqlQuery->record();
184 // XXX optimize
185 ScopedObject row(scope, v4->newObject());
186 for (int ii = 0; ii < record.count(); ++ii) {
187 QVariant v = record.value(ii);
188 ScopedString s(scope, v4->newIdentifier(record.fieldName(ii)));
189 ScopedValue val(scope, v.isNull() ? Encode::null() : v4->fromVariant(v));
190 row->put(s.getPointer(), val);
191 }
192 if (hasProperty)
193 *hasProperty = true;
194 return row.asReturnedValue();
195 } else {
196 if (hasProperty)
197 *hasProperty = false;
198 return Encode::undefined();
199 }
200}
201
202ReturnedValue QQmlSqlDatabaseWrapper::virtualGet(const Managed *m, PropertyKey id, const Value *receiver, bool *hasProperty)
203{
204 if (!id.isArrayIndex())
205 return Object::virtualGet(m, id, receiver, hasProperty);
206
207 uint index = id.asArrayIndex();
209 const QQmlSqlDatabaseWrapper *r = static_cast<const QQmlSqlDatabaseWrapper *>(m);
210 if (!r || r->d()->type != Heap::QQmlSqlDatabaseWrapper::Rows)
211 return Object::virtualGet(m, id, receiver, hasProperty);
212
213 return qmlsqldatabase_rows_index(r, r->engine(), index, hasProperty);
214}
215
216static ReturnedValue qmlsqldatabase_rows_item(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc)
217{
218 Scope scope(b);
220 if (!r || r->d()->type != Heap::QQmlSqlDatabaseWrapper::Rows)
221 V4THROW_REFERENCE("Not a SQLDatabase::Rows object");
222
223 RETURN_RESULT(qmlsqldatabase_rows_index(r, scope.engine, argc ? argv[0].toUInt32() : 0));
224}
225
227{
228 // toVariant() maps a null JS value to QVariant(VoidStar), but the SQL module
229 // expects a null variant. (this is because of QTBUG-40880)
230 if (value->isNull())
231 return QVariant();
232 return QV4::ExecutionEngine::toVariant(value, /*typehint*/ QMetaType {});
233}
234
235static ReturnedValue qmlsqldatabase_executeSql(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc)
236{
237 Scope scope(b);
239 if (!r || r->d()->type != Heap::QQmlSqlDatabaseWrapper::Query)
240 V4THROW_REFERENCE("Not a SQLDatabase::Query object");
241
242 if (!r->d()->inTransaction)
243 V4THROW_SQL(SQLEXCEPTION_DATABASE_ERR,QQmlEngine::tr("executeSql called outside transaction()"));
244
245 QSqlDatabase db = *r->d()->database;
246
247 QString sql = argc ? argv[0].toQString() : QString();
248
249 if (r->d()->readonly && !sql.startsWith(QLatin1String("SELECT"),Qt::CaseInsensitive)) {
250 V4THROW_SQL(SQLEXCEPTION_SYNTAX_ERR, QQmlEngine::tr("Read-only Transaction"));
251 }
252
254 bool err = false;
255
257
258 if (query.prepare(sql)) {
259 if (argc > 1) {
260 ScopedValue values(scope, argv[1]);
261 if (values->as<ArrayObject>()) {
263 quint32 size = array->getLength();
264 QV4::ScopedValue v(scope);
265 for (quint32 ii = 0; ii < size; ++ii) {
266 query.bindValue(ii, toSqlVariant((v = array->get(ii))));
267 }
268 } else if (values->as<Object>()) {
269 ScopedObject object(scope, values);
271 ScopedValue key(scope);
272 QV4::ScopedValue val(scope);
273 while (1) {
274 key = it.nextPropertyName(val);
275 if (key->isNull())
276 break;
278 if (key->isString()) {
279 query.bindValue(key->stringValue()->toQString(), v);
280 } else {
281 Q_ASSERT(key->isInteger());
282 query.bindValue(key->integerValue(), v);
283 }
284 }
285 } else {
286 query.bindValue(0, toSqlVariant(values));
287 }
288 }
289 if (query.exec()) {
291 QV4::ScopedObject p(scope, databaseData(scope.engine)->rowsProto.value());
292 rows->setPrototypeUnchecked(p.getPointer());
293 rows->d()->type = Heap::QQmlSqlDatabaseWrapper::Rows;
294 *rows->d()->database = db;
295 *rows->d()->sqlQuery = std::move(query);
296 QSqlQuery *queryPtr = rows->d()->sqlQuery;
297
298 ScopedObject resultObject(scope, scope.engine->newObject());
299 result = resultObject.asReturnedValue();
300 // XXX optimize
301 ScopedString s(scope);
302 ScopedValue v(scope);
303 resultObject->put((s = scope.engine->newIdentifier(QLatin1String("rowsAffected"))).getPointer(),
304 (v = Value::fromInt32(queryPtr->numRowsAffected())));
305 resultObject->put((s = scope.engine->newIdentifier(QLatin1String("insertId"))).getPointer(),
306 (v = scope.engine->newString(queryPtr->lastInsertId().toString())));
307 resultObject->put((s = scope.engine->newIdentifier(QLatin1String("rows"))).getPointer(),
308 rows);
309 } else {
310 err = true;
311 }
312 } else {
313 err = true;
314 }
315 if (err)
316 V4THROW_SQL(SQLEXCEPTION_DATABASE_ERR,query.lastError().text());
317
318 RETURN_RESULT(result->asReturnedValue());
319}
320
324
325 TransactionRollback(QSqlDatabase *database, bool *transactionFlag)
326 : db(database)
327 , inTransactionFlag(transactionFlag)
328 {
329 if (inTransactionFlag)
330 *inTransactionFlag = true;
331 }
332
334 {
335 if (inTransactionFlag)
336 *inTransactionFlag = false;
337 if (db)
338 db->rollback();
339 }
340
341 void clear() {
342 db = nullptr;
343 if (inTransactionFlag)
344 *inTransactionFlag = false;
345 inTransactionFlag = nullptr;
346 }
347};
348
349
350static ReturnedValue qmlsqldatabase_changeVersion(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc)
351{
352 Scope scope(b);
353 if (argc < 2)
355
356 Scoped<QQmlSqlDatabaseWrapper> r(scope, *thisObject);
357 if (!r || r->d()->type != Heap::QQmlSqlDatabaseWrapper::Database)
358 V4THROW_REFERENCE("Not a SQLDatabase object");
359
360 QSqlDatabase db = *r->d()->database;
361 QString from_version = argv[0].toQString();
362 QString to_version = argv[1].toQString();
363 ScopedFunctionObject callback(scope, argc > 2 ? argv[2] : Value::undefinedValue());
364
365 if (from_version != *r->d()->version)
366 V4THROW_SQL(SQLEXCEPTION_VERSION_ERR, QQmlEngine::tr("Version mismatch: expected %1, found %2").arg(from_version).arg(*r->d()->version));
367
368 bool ok = true;
369 if (!!callback) {
370 Scoped<QQmlSqlDatabaseWrapper> query(scope, QQmlSqlDatabaseWrapper::create(scope.engine));
371 ScopedObject p(scope, databaseData(scope.engine)->queryProto.value());
372 query->setPrototypeUnchecked(p.getPointer());
374 *query->d()->database = db;
375 *query->d()->version = *r->d()->version;
376
377 ok = false;
378 db.transaction();
379
380 JSCallArguments jsCall(scope, 1);
381 *jsCall.thisObject = scope.engine->globalObject;
382 jsCall.args[0] = query;
383
384 TransactionRollback rollbackOnException(&db, &query->d()->inTransaction);
385 callback->call(jsCall);
386 rollbackOnException.clear();
387 if (!db.commit()) {
388 db.rollback();
389 V4THROW_SQL(SQLEXCEPTION_UNKNOWN_ERR,QQmlEngine::tr("SQL transaction failed"));
390 } else {
391 ok = true;
392 }
393 }
394
395 if (ok) {
396 Scoped<QQmlSqlDatabaseWrapper> w(scope, QQmlSqlDatabaseWrapper::create(scope.engine));
397 ScopedObject p(scope, databaseData(scope.engine)->databaseProto.value());
398 w->setPrototypeUnchecked(p.getPointer());
400 *w->d()->database = db;
401 *w->d()->version = to_version;
402#if QT_CONFIG(settings)
403 const QQmlEnginePrivate *enginePrivate = QQmlEnginePrivate::get(scope.engine->qmlEngine());
404 QSettings ini(enginePrivate->offlineStorageDatabaseDirectory() + db.connectionName() + QLatin1String(".ini"), QSettings::IniFormat);
405 ini.setValue(QLatin1String("Version"), to_version);
406#endif
407 RETURN_RESULT(w.asReturnedValue());
408 }
409
411}
412
413static ReturnedValue qmlsqldatabase_transaction_shared(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc, bool readOnly)
414{
415 Scope scope(b);
417 if (!r || r->d()->type != Heap::QQmlSqlDatabaseWrapper::Database)
418 V4THROW_REFERENCE("Not a SQLDatabase object");
419
420 const FunctionObject *callback = argc ? argv[0].as<FunctionObject>() : nullptr;
421 if (!callback)
422 V4THROW_SQL(SQLEXCEPTION_UNKNOWN_ERR, QQmlEngine::tr("transaction: missing callback"));
423
424 QSqlDatabase db = *r->d()->database;
425
426 Scoped<QQmlSqlDatabaseWrapper> w(scope, QQmlSqlDatabaseWrapper::create(scope.engine));
427 QV4::ScopedObject p(scope, databaseData(scope.engine)->queryProto.value());
428 w->setPrototypeUnchecked(p.getPointer());
430 *w->d()->database = db;
431 *w->d()->version = *r->d()->version;
432 w->d()->readonly = readOnly;
433
434 db.transaction();
435 if (callback) {
436 JSCallArguments jsCall(scope, 1);
437 *jsCall.thisObject = scope.engine->globalObject;
438 jsCall.args[0] = w;
439 TransactionRollback rollbackOnException(&db, &w->d()->inTransaction);
440 callback->call(jsCall);
441 rollbackOnException.clear();
442
443 if (!db.commit())
444 db.rollback();
445 }
446
448}
449
450static ReturnedValue qmlsqldatabase_transaction(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
451{
452 return qmlsqldatabase_transaction_shared(f, thisObject, argv, argc, false);
453}
454
455static ReturnedValue qmlsqldatabase_read_transaction(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
456{
457 return qmlsqldatabase_transaction_shared(f, thisObject, argv, argc, true);
458}
459
461{
462 Scope scope(v4);
463 {
464 ScopedObject proto(scope, v4->newObject());
469 databaseProto = proto;
470 }
471
472 {
473 ScopedObject proto(scope, v4->newObject());
475 queryProto = proto;
476 }
477 {
478 ScopedObject proto(scope, v4->newObject());
481 proto->defineAccessorProperty(QStringLiteral("forwardOnly"),
483 rowsProto = proto;
484 }
485}
486
487/*
488HTML5 "spec" says "rs.rows[n]", but WebKit only impelments "rs.rows.item(n)". We do both (and property iterator).
489We add a "forwardOnly" property that stops Qt caching results (code promises to only go forward
490through the data.
491*/
492
686{
687#if QT_CONFIG(settings)
688 QV4::Scope scope(args->v4engine());
689 if (scope.engine->qmlEngine()->offlineStoragePath().isEmpty())
690 V4THROW_SQL2(SQLEXCEPTION_DATABASE_ERR, QQmlEngine::tr("SQL: can't create database, offline storage is disabled."));
691
692 QV4::ScopedValue v(scope);
693 QString dbname = (v = (*args)[0])->toQStringNoThrow();
694 QString dbversion = (v = (*args)[1])->toQStringNoThrow();
695 QString dbdescription = (v = (*args)[2])->toQStringNoThrow();
696 int dbestimatedsize = (v = (*args)[3])->toInt32();
697 FunctionObject *dbcreationCallback = (v = (*args)[4])->as<FunctionObject>();
698 QString basename = args->v4engine()->qmlEngine()->offlineStorageDatabaseFilePath(dbname);
699 QFileInfo dbFile(basename);
700 if (!QDir().mkpath(dbFile.dir().absolutePath())) {
701 const QString message = QQmlEngine::tr("LocalStorage: can't create path %1").
702 arg(QDir::toNativeSeparators(dbFile.dir().absolutePath()));
704 }
705 QString dbid = dbFile.fileName();
706 bool created = false;
707 QString version = dbversion;
708 QSqlDatabase database;
709
710 {
711 QSettings ini(basename+QLatin1String(".ini"),QSettings::IniFormat);
712
714 database = QSqlDatabase::database(dbid);
715 version = ini.value(QLatin1String("Version")).toString();
716 if (version != dbversion && !dbversion.isEmpty() && !version.isEmpty())
717 V4THROW_SQL2(SQLEXCEPTION_VERSION_ERR, QQmlEngine::tr("SQL: database version mismatch"));
718 } else {
719 created = !QFile::exists(basename+QLatin1String(".sqlite"));
720 if (created) {
721 ini.setValue(QLatin1String("Name"), dbname);
722 if (dbcreationCallback)
723 version = QString();
724 ini.setValue(QLatin1String("Version"), version);
725 ini.setValue(QLatin1String("Description"), dbdescription);
726 ini.setValue(QLatin1String("EstimatedSize"), dbestimatedsize);
727 ini.setValue(QLatin1String("Driver"), QLatin1String("QSQLITE"));
728 } else {
729 if (!dbversion.isEmpty() && ini.value(QLatin1String("Version")) != dbversion) {
730 // Incompatible
731 V4THROW_SQL2(SQLEXCEPTION_VERSION_ERR,QQmlEngine::tr("SQL: database version mismatch"));
732 }
733 version = ini.value(QLatin1String("Version")).toString();
734 }
735 database = QSqlDatabase::addDatabase(QLatin1String("QSQLITE"), dbid);
736 database.setDatabaseName(basename+QLatin1String(".sqlite"));
737 }
738 if (!database.isOpen() && !database.open())
739 V4THROW_SQL2(SQLEXCEPTION_DATABASE_ERR, QQmlEngine::tr("SQL: Cannot open database"));
740 }
741
743 QV4::ScopedObject p(scope, databaseData(scope.engine)->databaseProto.value());
744 db->setPrototypeUnchecked(p.getPointer());
745 *db->d()->database = database;
746 *db->d()->version = version;
747
748 if (created && dbcreationCallback) {
749 JSCallArguments jsCall(scope, 1);
750 *jsCall.thisObject = scope.engine->globalObject;
751 jsCall.args[0] = db;
752 dbcreationCallback->call(jsCall);
753 }
754
755 args->setReturnValue(db.asReturnedValue());
756#else
757 Q_UNUSED(args);
758#endif // settings
759}
760
762
763#include "moc_qqmllocalstorage_p.cpp"
Definition main.cpp:8
\inmodule QtCore
Definition qdir.h:20
static QString toNativeSeparators(const QString &pathName)
Definition qdir.cpp:929
bool exists() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qfile.cpp:351
\inmodule QtCore
Definition qmetatype.h:341
static QQmlEnginePrivate * get(QQmlEngine *e)
QString offlineStorageDatabaseDirectory() const
QString offlineStoragePath
the directory for storing offline user data
Definition qqmlengine.h:58
Q_INVOKABLE void openDatabaseSync(QQmlV4FunctionPtr args)
QV4::PersistentValue rowsProto
QV4::PersistentValue databaseProto
QV4::PersistentValue queryProto
QQmlSqlDatabaseData(QV4::ExecutionEngine *engine)
\inmodule QtCore
Definition qsettings.h:30
The QSqlDatabase class handles a connection to a database.
bool open()
Executes a SQL statement on the database and returns a QSqlQuery object.
void setDatabaseName(const QString &name)
Sets the connection's database name to name.
static QStringList connectionNames()
\threadsafe
bool isOpen() const
Returns true if the database connection is currently open; otherwise returns false.
static QSqlDatabase addDatabase(const QString &type, const QString &connectionName=QLatin1StringView(defaultConnection))
\threadsafe
static QSqlDatabase database(const QString &connectionName=QLatin1StringView(defaultConnection), bool open=true)
\threadsafe
The QSqlQuery class provides a means of executing and manipulating SQL statements.
Definition qsqlquery.h:24
The QSqlRecord class encapsulates a database record.
Definition qsqlrecord.h:20
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
Definition qstring.cpp:5455
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
ObjectType::Data * allocate(Args &&... args)
Definition qv4mm_p.h:298
static V4_NEEDS_DESTROY Heap::QQmlSqlDatabaseWrapper * create(QV4::ExecutionEngine *engine)
static ReturnedValue virtualGet(const Managed *m, PropertyKey id, const Value *receiver, bool *hasProperty)
\inmodule QtCore
Definition qvariant.h:65
QSet< QString >::iterator it
Combined button and popup list for selecting options.
Scoped< FunctionObject > ScopedFunctionObject
quint64 ReturnedValue
Scoped< String > ScopedString
@ CaseInsensitive
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static bool contains(const QJsonArray &haystack, unsigned needle)
Definition qopengl.cpp:116
GLenum GLsizei GLsizei GLint * values
[15]
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
const GLfloat * m
GLuint64 key
GLfloat GLfloat GLfloat w
[0]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint index
[2]
GLboolean r
[2]
GLuint object
[3]
GLfloat GLfloat f
GLenum type
GLuint GLsizei const GLchar * message
GLdouble s
[6]
Definition qopenglext.h:235
GLenum query
GLuint GLfloat * val
GLenum array
GLenum GLenum GLsizei void * row
GLuint64EXT * result
[6]
GLfloat GLfloat p
[1]
static ReturnedValue qmlsqldatabase_version(const FunctionObject *b, const Value *thisObject, const QV4::Value *, int)
static ReturnedValue qmlsqldatabase_transaction(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue qmlsqldatabase_rows_length(const FunctionObject *b, const Value *thisObject, const QV4::Value *, int)
static ReturnedValue qmlsqldatabase_read_transaction(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue qmlsqldatabase_executeSql(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc)
#define V4THROW_SQL2(error, desc)
static ReturnedValue qmlsqldatabase_rows_setForwardOnly(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc)
#define V4THROW_SQL(error, desc)
static QVariant toSqlVariant(const QV4::ScopedValue &value)
static ReturnedValue qmlsqldatabase_rows_item(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue qmlsqldatabase_rows_forwardOnly(const FunctionObject *b, const Value *thisObject, const QV4::Value *, int)
static ReturnedValue qmlsqldatabase_rows_index(const QQmlSqlDatabaseWrapper *r, ExecutionEngine *v4, quint32 index, bool *hasProperty=nullptr)
static ReturnedValue qmlsqldatabase_transaction_shared(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc, bool readOnly)
#define V4THROW_REFERENCE(string)
static ReturnedValue qmlsqldatabase_changeVersion(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc)
#define V4THROW_REFERENCE(string)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
SSL_CTX int void * arg
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
#define Q_UNUSED(x)
unsigned int quint32
Definition qtypes.h:50
unsigned int uint
Definition qtypes.h:34
#define V4_DEFINE_EXTENSION(dataclass, datafunction)
Definition qv4engine_p.h:38
#define V4_NEEDS_DESTROY
#define RETURN_UNDEFINED()
#define RETURN_RESULT(r)
#define SQLEXCEPTION_UNKNOWN_ERR
#define SQLEXCEPTION_DATABASE_ERR
#define SQLEXCEPTION_VERSION_ERR
#define SQLEXCEPTION_SYNTAX_ERR
static int toInt32(Value v)
#define DEFINE_OBJECT_VTABLE(classname)
#define V4_OBJECT2(DataClass, superClass)
QMimeDatabase db
[0]
MyRecord record(int row) const
[0]
QJSValueList args
QJSEngine engine
[0]
static constexpr ReturnedValue undefined()
static constexpr ReturnedValue null()
MemoryManager * memoryManager
QV4::ReturnedValue fromVariant(const QVariant &)
Heap::Object * newObject()
Heap::String * newString(char16_t c)
Heap::String * newIdentifier(const QString &text)
static QVariant toVariant(const QV4::Value &value, QMetaType typeHint, bool createJSValueForObjectsAndSymbols=true)
QQmlEngine * qmlEngine() const
ReturnedValue throwTypeError()
ReturnedValue call(const Value *thisObject, const Value *argv, int argc) const
ExecutionEngine * engine() const
void defineDefaultProperty(StringOrSymbol *name, const Value &value, PropertyAttributes attributes=Attr_Data|Attr_NotEnumerable)
void defineAccessorProperty(const QString &name, VTable::Call getter, VTable::Call setter)
bool hasProperty(PropertyKey id) const
ExecutionEngine * engine
constexpr ReturnedValue asReturnedValue() const
static constexpr VTable::Get virtualGet
static constexpr Value fromInt32(int i)
Definition qv4value_p.h:187
unsigned int toUInt32() const
Definition qv4value_p.h:364
static constexpr Value undefinedValue()
Definition qv4value_p.h:191
const T * as() const
Definition qv4value_p.h:132
QString toQString() const
Definition qv4value.cpp:158
TransactionRollback(QSqlDatabase *database, bool *transactionFlag)
Definition moc.h:23