[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kexi] /: WIP enable scripting in Kexi.
From: Adam Pigg <null () kde ! org>
Date: 2017-07-24 20:55:46
Message-ID: E1dZkOI-00077j-Es () code ! kde ! org
[Download RAW message or body]
Git commit 4adbe1bd36a46be16915f3e012677e9fc563a8cb by Adam Pigg.
Committed on 24/07/2017 at 20:55.
Pushed by piggz into branch 'master'.
WIP enable scripting in Kexi.
Summary:
No Kexi wrappers are built yet, but module and global scripts are
available to reports
Test Plan:
generate report with scripts
run 'executable' scripts within kexi. Scripts such as Kexi.openItem("report", \
"report_name"); works as expected
Example working script (providing database exists):
```
var db = new KDb();
console.log(db.driverNames());
var driver = db.driver("org.kde.kdb.sqlite");
console.log(driver.fileDBDriverMimeTypes());
var conn_data = db.createConnectionData();
conn_data.setDatabaseName("/home/piggz/Documents/Database/POI.kexi")
var conn = driver.createConnection(conn_data);
if (!conn.connect()) {
console.log("Error connecting to database", conn.lastError());
}
if (!conn.useDatabase("")) {
console.log("Error using database", conn.lastError());
}
console.log(conn.currentDatabase(), conn.isConnected());
console.log(conn.tableNames());
var cursor = conn.executeQueryString("select * from " + conn.tableNames()[0]);
cursor.open();
var fieldcount = cursor.fieldCount();
while (!cursor.eof()) {
for (var i = 0; i < fieldcount; ++i) {
console.log(cursor.value(i));
}
cursor.moveNext();
}
```
Reviewers: staniek
Reviewed By: staniek
Tags: #kexi
Maniphest Tasks: T4649
Differential Revision: https://phabricator.kde.org/D6037
M +9 -0 CMakeLists.txt
M +0 -3 KexiProducts.cmake
M +0 -1 cmake/productsets/desktop.cmake
M +1 -1 src/CMakeLists.txt
M +2 -2 src/plugins/CMakeLists.txt
M +0 -96 src/plugins/reports/KexiDBReportDataSource.cpp
M +0 -2 src/plugins/reports/KexiDBReportDataSource.h
M +1 -0 src/plugins/reports/kexireportdesignview.cpp
M +98 -0 src/plugins/reports/kexireportpart.cpp
M +5 -1 src/plugins/reports/kexireportpart.h
M +1 -0 src/plugins/reports/kexireportview.cpp
M +15 -15 src/plugins/scripting/kexidb/CMakeLists.txt
M +29 -21 src/plugins/scripting/kexidb/kexidbconnection.cpp
M +7 -5 src/plugins/scripting/kexidb/kexidbconnection.h
M +24 -41 src/plugins/scripting/kexidb/kexidbconnectiondata.cpp
M +4 -17 src/plugins/scripting/kexidb/kexidbconnectiondata.h
M +2 -3 src/plugins/scripting/kexidb/kexidbcursor.cpp
M +2 -1 src/plugins/scripting/kexidb/kexidbcursor.h
M +7 -6 src/plugins/scripting/kexidb/kexidbdriver.cpp
M +4 -4 src/plugins/scripting/kexidb/kexidbdriver.h
M +2 -2 src/plugins/scripting/kexidb/kexidbfieldlist.cpp
M +1 -1 src/plugins/scripting/kexidb/kexidbfieldlist.h
M +26 -19 src/plugins/scripting/kexidb/kexidbmodule.cpp
M +14 -14 src/plugins/scripting/kexidb/kexidbmodule.h
M +11 -11 src/plugins/scripting/kexidb/kexidbparser.cpp
M +11 -11 src/plugins/scripting/kexidb/kexidbparser.h
M +14 -14 src/plugins/scripting/kexidb/kexidbschema.cpp
M +9 -9 src/plugins/scripting/kexidb/kexidbschema.h
M +27 -5 src/plugins/scripting/kexiscripting/CMakeLists.txt
A +33 -0 src/plugins/scripting/kexiscripting/KexiScriptingDebug.h [License: \
LGPL (v2+)] R +23 -12 \
src/plugins/scripting/kexiscripting/kexi_scriptplugin.desktop [from: \
src/plugins/scripting/kexiscripting/kexiscripthandler.desktop - 069% similarity] M \
+41 -40 src/plugins/scripting/kexiscripting/kexiscriptadaptor.h M +76 -167 \
src/plugins/scripting/kexiscripting/kexiscriptdesignview.cpp M +6 -10 \
src/plugins/scripting/kexiscripting/kexiscriptdesignview.h M +8 -14 \
src/plugins/scripting/kexiscripting/kexiscripteditor.cpp M +1 -1 \
src/plugins/scripting/kexiscripting/kexiscripteditor.h M +104 -120 \
src/plugins/scripting/kexiscripting/kexiscriptpart.cpp M +7 -0 \
src/plugins/scripting/kexiscripting/kexiscriptpart.h
https://commits.kde.org/kexi/4adbe1bd36a46be16915f3e012677e9fc563a8cb
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9cb6d9ef0..1fc22c48f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -116,6 +116,15 @@ set(REQUIRED_QT_VERSION 5.4.0)
find_package(Qt5 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS Core Gui Widgets Xml \
Network PrintSupport Test) find_package(Qt5 ${REQUIRED_QT_VERSION} COMPONENTS \
UiTools WebKit WebKitWidgets)
+if(KEXI_SCRIPTS_SUPPORT)
+ find_package(Qt5 5.8.0 COMPONENTS Qml)
+ set_package_properties(Qt5Qml PROPERTIES
+ DESCRIPTION "A framework for developing applications and \
libraries with the QML and JavaScript language." + URL \
"http://qt.io" + TYPE REQUIRED PURPOSE "Required by Kexi \
scripting (JavaScript)" + )
+endif()
+
# use sane compile flags
add_definitions(
-DQT_NO_CAST_TO_ASCII
diff --git a/KexiProducts.cmake b/KexiProducts.cmake
index 81f283514..60ed43726 100644
--- a/KexiProducts.cmake
+++ b/KexiProducts.cmake
@@ -59,9 +59,6 @@
# TODO: some products have multiple optional requirements, but need at least one.
# See APP_CONVERTER, FILEMANAGER_*
-# features
-calligra_define_feature(FEATURE_SCRIPTING "Scripting feature" UNPORTED) # TODO
-
# products
calligra_define_product(KEXI_CORE_APP "Kexi core app" REQUIRES)
calligra_define_product(KEXI_DESKTOP_APP "Kexi for desktop" REQUIRES KEXI_CORE_APP)
diff --git a/cmake/productsets/desktop.cmake b/cmake/productsets/desktop.cmake
index f3e41e591..cc53ca331 100644
--- a/cmake/productsets/desktop.cmake
+++ b/cmake/productsets/desktop.cmake
@@ -4,6 +4,5 @@ calligra_define_productset(DESKTOP "Desktop products"
REQUIRES
KEXI_DESKTOP_APP
OPTIONAL
- FEATURE_SCRIPTING
PLUGIN_KEXI_SPREADSHEETMIGRATION
)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 49d1242a5..f222acf8f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -22,7 +22,7 @@ Note: Non-plasma Linux desktops still default to the simple \
replacement at runti endif(NOT KEXI_MOBILE)
# Experimental:
-option(KEXI_SCRIPTS_SUPPORT "Experimental: Enable scripting in Kexi" ON)
+option(KEXI_SCRIPTS_SUPPORT "Experimental: Enable scripting in Kexi" OFF)
# Broken:
option(KEXI_FORM_CURSOR_PROPERTY_SUPPORT "Broken: Enable \"cursor\" property in the \
form designer" OFF)
diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt
index d09a1db81..6bacb6fe9 100644
--- a/src/plugins/CMakeLists.txt
+++ b/src/plugins/CMakeLists.txt
@@ -8,7 +8,7 @@ if(SHOULD_BUILD_KEXI_DESKTOP_APP)
add_subdirectory( migration )
add_subdirectory( importexport )
- if(SHOULD_BUILD_FEATURE_SCRIPTING AND KEXI_SCRIPTS_SUPPORT)
- # KEXI3 TODO add_subdirectory(scripting)
+ if(KEXI_SCRIPTS_SUPPORT)
+ add_subdirectory(scripting)
endif()
endif ()
diff --git a/src/plugins/reports/KexiDBReportDataSource.cpp \
b/src/plugins/reports/KexiDBReportDataSource.cpp index b5a2aa89d..9d063f3e6 100644
--- a/src/plugins/reports/KexiDBReportDataSource.cpp
+++ b/src/plugins/reports/KexiDBReportDataSource.cpp
@@ -302,102 +302,6 @@ qint64 KexiDBReportDataSource::recordCount() const
return 1;
}
-static bool isInterpreterSupported(const QString &interpreterName)
-{
- return 0 == interpreterName.compare(QLatin1String("javascript"), \
Qt::CaseInsensitive)
- || 0 == interpreterName.compare(QLatin1String("qtscript"), \
Qt::CaseInsensitive);
-}
-
-QStringList KexiDBReportDataSource::scriptList() const
-{
- QStringList scripts;
-
- if( d->connection) {
- QList<int> scriptids = d->connection->objectIds(KexiPart::ScriptObjectType);
- QStringList scriptnames = \
d->connection->objectNames(KexiPart::ScriptObjectType);
-
- qDebug() << scriptids << scriptnames;
-
- //A blank entry
- scripts << "";
- int i = 0;
- foreach(int id, scriptids) {
- qDebug() << "ID:" << id;
- tristate res;
- QString script;
- res = d->connection->loadDataBlock(id, &script, QString());
- if (res == true) {
- QDomDocument domdoc;
- bool parsed = domdoc.setContent(script, false);
-
- QDomElement scriptelem = domdoc.namedItem("script").toElement();
- if (parsed && !scriptelem.isNull()) {
- if (scriptelem.attribute("scripttype") == "object"
- && isInterpreterSupported(scriptelem.attribute("language")))
- {
- scripts << scriptnames[i];
- }
- } else {
- qDebug() << "Unable to parse script";
- }
- } else {
- qDebug() << "Unable to loadDataBlock";
- }
- ++i;
- }
-
- qDebug() << scripts;
- }
- return scripts;
-}
-
-QString KexiDBReportDataSource::scriptCode(const QString& scriptname) const
-{
- QString scripts;
-
- if (d->connection) {
- QList<int> scriptids = d->connection->objectIds(KexiPart::ScriptObjectType);
- QStringList scriptnames = \
d->connection->objectNames(KexiPart::ScriptObjectType);
-
- int i = 0;
- foreach(int id, scriptids) {
- qDebug() << "ID:" << id;
- tristate res;
- QString script;
- res = d->connection->loadDataBlock(id, &script, QString());
- if (res == true) {
- QDomDocument domdoc;
- bool parsed = domdoc.setContent(script, false);
-
- if (! parsed) {
- qDebug() << "XML parsing error";
- return QString();
- }
-
- QDomElement scriptelem = domdoc.namedItem("script").toElement();
- if (scriptelem.isNull()) {
- qDebug() << "script domelement is null";
- return QString();
- }
-
- QString interpretername = scriptelem.attribute("language");
- qDebug() << scriptelem.attribute("scripttype");
- qDebug() << scriptname << scriptnames[i];
-
- if ((isInterpreterSupported(interpretername) && \
scriptelem.attribute("scripttype") == "module")
- || scriptname == scriptnames[i])
- {
- scripts += '\n' + scriptelem.text().toUtf8();
- }
- ++i;
- } else {
- qDebug() << "Unable to loadDataBlock";
- }
- }
- }
- return scripts;
-}
-
QStringList KexiDBReportDataSource::dataSourceNames() const
{
//Get the list of queries in the database
diff --git a/src/plugins/reports/KexiDBReportDataSource.h \
b/src/plugins/reports/KexiDBReportDataSource.h index 872020f11..d76ed6833 100644
--- a/src/plugins/reports/KexiDBReportDataSource.h
+++ b/src/plugins/reports/KexiDBReportDataSource.h
@@ -66,8 +66,6 @@ public:
virtual qint64 recordCount() const;
//Utility Functions
- virtual QStringList scriptList() const;
- virtual QString scriptCode(const QString& script) const;
virtual QStringList dataSourceNames() const;
virtual KReportDataSource* create(const QString& source) const \
Q_REQUIRED_RESULT;
diff --git a/src/plugins/reports/kexireportdesignview.cpp \
b/src/plugins/reports/kexireportdesignview.cpp index 3a28aa257..2e54ec8eb 100644
--- a/src/plugins/reports/kexireportdesignview.cpp
+++ b/src/plugins/reports/kexireportdesignview.cpp
@@ -163,6 +163,7 @@ tristate KexiReportDesignView::afterSwitchFrom(Kexi::ViewMode \
mode)
m_reportDesigner = new KReportDesigner(this, tempData()->reportDefinition);
m_sourceSelector->setConnectionData(tempData()->connectionDefinition);
+ m_reportDesigner->setScriptSource(qobject_cast<KexiReportPart*>(part()));
}
connect(m_reportDesigner, SIGNAL(itemInserted(QString)), this, \
SIGNAL(itemInserted(QString)));
diff --git a/src/plugins/reports/kexireportpart.cpp \
b/src/plugins/reports/kexireportpart.cpp index 7fcd3359e..7e055547a 100644
--- a/src/plugins/reports/kexireportpart.cpp
+++ b/src/plugins/reports/kexireportpart.cpp
@@ -23,6 +23,8 @@
#include <QTabWidget>
#include <QDebug>
+#include <KDbConnection>
+
#include <KLocalizedString>
#include <KexiIcon.h>
@@ -48,6 +50,12 @@ public:
QMap<QString, QAction*> toolboxActionsByName;
};
+static bool isInterpreterSupported(const QString &interpreterName)
+{
+ return 0 == interpreterName.compare(QLatin1String("javascript"), \
Qt::CaseInsensitive) + || 0 == \
interpreterName.compare(QLatin1String("qtscript"), Qt::CaseInsensitive); +}
+
KexiReportPart::KexiReportPart(QObject *parent, const QVariantList &l)
: KexiPart::Part(parent,
xi18nc("Translate this word using only lowercase alphanumeric characters \
(a..z, 0..9). " @@ -201,3 +209,93 @@ void KexiReportPart::slotItemInserted(const \
QString& entity) }
}
+QStringList KexiReportPart::scriptList() const
+{
+ QStringList scripts;
+
+ KexiMainWindowIface *win = KexiMainWindowIface::global();
+
+ if (win->project() && win->project()->dbConnection()) {
+ QList<int> scriptids = \
win->project()->dbConnection()->objectIds(KexiPart::ScriptObjectType); + \
QStringList scriptnames = \
win->project()->dbConnection()->objectNames(KexiPart::ScriptObjectType); +
+ qDebug() << scriptids << scriptnames;
+
+ int i = 0;
+ foreach(int id, scriptids) {
+ qDebug() << "ID:" << id;
+ tristate res;
+ QString script;
+ res = win->project()->dbConnection()->loadDataBlock(id, &script, \
QString()); + if (res == true) {
+ QDomDocument domdoc;
+ bool parsed = domdoc.setContent(script, false);
+
+ QDomElement scriptelem = domdoc.namedItem("script").toElement();
+ if (parsed && !scriptelem.isNull()) {
+ if (scriptelem.attribute("scripttype") == "object"
+ && isInterpreterSupported(scriptelem.attribute("language")))
+ {
+ scripts << scriptnames[i];
+ }
+ } else {
+ qWarning() << "Unable to parse script";
+ }
+ } else {
+ qWarning() << "Unable to loadDataBlock";
+ }
+ ++i;
+ }
+
+ qDebug() << scripts;
+ }
+ return scripts;
+}
+
+QString KexiReportPart::scriptCode(const QString& scriptname) const
+{
+ QString scripts;
+
+ KexiMainWindowIface *win = KexiMainWindowIface::global();
+
+ if (win->project() && win->project()->dbConnection()) {
+ QList<int> scriptids = \
win->project()->dbConnection()->objectIds(KexiPart::ScriptObjectType); + \
QStringList scriptnames = \
win->project()->dbConnection()->objectNames(KexiPart::ScriptObjectType); +
+ int i = 0;
+ foreach(int id, scriptids) {
+ qDebug() << "ID:" << id;
+ tristate res;
+ QString script;
+ res = win->project()->dbConnection()->loadDataBlock(id, &script, \
QString()); + if (res == true) {
+ QDomDocument domdoc;
+ bool parsed = domdoc.setContent(script, false);
+
+ if (! parsed) {
+ qWarning() << "XML parsing error";
+ return QString();
+ }
+
+ QDomElement scriptelem = domdoc.namedItem("script").toElement();
+ if (scriptelem.isNull()) {
+ qWarning() << "script domelement is null";
+ return QString();
+ }
+
+ QString interpretername = scriptelem.attribute("language");
+ qDebug() << scriptelem.attribute("scripttype");
+ qDebug() << scriptname << scriptnames[i];
+
+ if ((isInterpreterSupported(interpretername) && \
scriptelem.attribute("scripttype") == "module") || scriptname == scriptnames[i]) + \
{ + scripts += '\n' + scriptelem.text().toUtf8();
+ }
+ ++i;
+ } else {
+ qWarning() << "Unable to loadDataBlock";
+ }
+ }
+ }
+ return scripts;
+}
diff --git a/src/plugins/reports/kexireportpart.h \
b/src/plugins/reports/kexireportpart.h index f64496790..f36e0d81e 100644
--- a/src/plugins/reports/kexireportpart.h
+++ b/src/plugins/reports/kexireportpart.h
@@ -24,6 +24,7 @@
#include <core/KexiWindowData.h>
#include <KReportDataSource>
+#include <KReportScriptSource>
#include <QDomElement>
class KexiReportPartTempData : public KexiWindowData
@@ -42,7 +43,7 @@ public:
/**
* @short Application Main Window
*/
-class KexiReportPart : public KexiPart::Part
+class KexiReportPart : public KexiPart::Part, public KReportScriptSource
{
Q_OBJECT
public:
@@ -61,6 +62,9 @@ public:
virtual KLocalizedString i18nMessage(const QString& englishMessage,
KexiWindow* window) const;
+ QStringList scriptList() const override;
+ QString scriptCode(const QString& script) const override;
+
protected:
virtual KexiView* createView(QWidget *parent, KexiWindow* win,
KexiPart::Item *item, Kexi::ViewMode = \
Kexi::DataViewMode,
diff --git a/src/plugins/reports/kexireportview.cpp \
b/src/plugins/reports/kexireportview.cpp index 73b15d711..bd346b931 100644
--- a/src/plugins/reports/kexireportview.cpp
+++ b/src/plugins/reports/kexireportview.cpp
@@ -367,6 +367,7 @@ tristate KexiReportView::afterSwitchFrom(Kexi::ViewMode mode)
reportData = createSourceData(tempData()->connectionDefinition);
}
m_preRenderer->setSourceData(reportData);
+ m_preRenderer->setScriptSource(qobject_cast<KexiReportPart*>(part()));
m_preRenderer->setName(window()->partItem()->name());
diff --git a/src/plugins/scripting/kexidb/CMakeLists.txt \
b/src/plugins/scripting/kexidb/CMakeLists.txt index 0e72d1c49..70a1ce0f2 100644
--- a/src/plugins/scripting/kexidb/CMakeLists.txt
+++ b/src/plugins/scripting/kexidb/CMakeLists.txt
@@ -1,15 +1,15 @@
-set(krossmodulekexidb_PART_SRCS
- kexidbmodule.cpp
- kexidbfield.cpp
- kexidbfieldlist.cpp
- kexidbschema.cpp
- kexidbparser.cpp
- kexidbcursor.cpp
- kexidbconnectiondata.cpp
- kexidbconnection.cpp
- kexidbdriver.cpp )
-
-add_library(krossmodulekexidb MODULE ${krossmodulekexidb_PART_SRCS})
-
-target_link_libraries(krossmodulekexidb KDb)
-install(TARGETS krossmodulekexidb DESTINATION ${KEXI_PLUGIN_INSTALL_DIR})
+#set(krossmodulekexidb_PART_SRCS
+# kexidbmodule.cpp
+# kexidbfield.cpp
+# kexidbfieldlist.cpp
+# kexidbschema.cpp
+# kexidbparser.cpp
+# kexidbcursor.cpp
+# kexidbconnectiondata.cpp
+# kexidbconnection.cpp
+# kexidbdriver.cpp )
+#
+#add_library(krossmodulekexidb MODULE ${krossmodulekexidb_PART_SRCS})
+#
+#target_link_libraries(krossmodulekexidb KDb KF5::ConfigCore KF5::ConfigGui)
+#install(TARGETS krossmodulekexidb DESTINATION ${KEXI_PLUGIN_INSTALL_DIR})
diff --git a/src/plugins/scripting/kexidb/kexidbconnection.cpp \
b/src/plugins/scripting/kexidb/kexidbconnection.cpp index e2c324d3e..6a314124a 100644
--- a/src/plugins/scripting/kexidb/kexidbconnection.cpp
+++ b/src/plugins/scripting/kexidb/kexidbconnection.cpp
@@ -24,17 +24,27 @@
#include "kexidbfieldlist.h"
#include "kexidbschema.h"
#include "kexidbparser.h"
+#include "KexiScriptingDebug.h"
#include <KDbTransaction>
+#include <KDbConnectionOptions>
#include <QDebug>
using namespace Scripting;
-KexiDBConnection::KexiDBConnection(KDbConnection* connection, KexiDBDriver* driver, \
KexiDBConnectionData* connectiondata) \
+KexiDBConnection::KexiDBConnection(KDbConnection* connection, KexiDBConnectionData* \
connectiondata, KexiDBDriver* driver) + : QObject()
+ , m_connection(connection)
+ , m_driver(driver ? driver : new KexiDBDriver(this, connection->driver()))
+{
+ m_connectiondata = connectiondata;
+ setObjectName("KexiDBConnection");
+}
+
+KexiDBConnection::KexiDBConnection(KDbConnection* connection, KexiDBDriver* driver)
: QObject()
, m_connection(connection)
- , m_connectiondata(connectiondata ? connectiondata : new \
KexiDBConnectionData(this, connection->data(), false))
, m_driver(driver ? driver : new KexiDBDriver(this, connection->driver()))
{
setObjectName("KexiDBConnection");
@@ -46,11 +56,11 @@ KexiDBConnection::~KexiDBConnection()
bool KexiDBConnection::hadError() const
{
- return m_connection->error();
+ return m_connection->result().isError();
}
-const QString KexiDBConnection::lastError() const
+QString KexiDBConnection::lastError() const
{
- return m_connection->errorMsg();
+ return m_connection->result().message();
}
QObject* KexiDBConnection::data()
@@ -77,14 +87,14 @@ bool KexiDBConnection::disconnect()
bool KexiDBConnection::isReadOnly() const
{
- return m_connection->isReadOnly();
+ return m_connection->options()->isReadOnly();
}
bool KexiDBConnection::databaseExists(const QString& dbname)
{
return m_connection->databaseExists(dbname);
}
-const QString KexiDBConnection::currentDatabase() const
+QString KexiDBConnection::currentDatabase() const
{
return m_connection->currentDatabase();
}
@@ -119,7 +129,7 @@ const QStringList KexiDBConnection::queryNames() const
bool ok = true;
QStringList queries = m_connection->objectNames(KDb::QueryObjectType, &ok);
if (! ok) {
- qDebug() << QString("Failed to determinate querynames.");
+ KexiScriptingWarning() << "Failed to determinate querynames.";
return QStringList();
}
return queries;
@@ -130,15 +140,15 @@ QObject* KexiDBConnection::executeQueryString(const QString& \
sqlquery)
// The KDbConnection::executeQuery() method does not check if we pass a valid \
SELECT-statement
// or e.g. a DROP TABLE operation. So, let's check for such dangerous operations \
right now. KDbParser parser(m_connection);
- if (! parser.parse(sqlquery)) {
- qDebug() << QString("Failed to parse query: %1 \
%2").arg(parser.error().type()).arg(parser.error().error()); + if (! \
parser.parse(KDbEscapedString(sqlquery))) { + KexiScriptingWarning() << \
"Failed to parse query: "<< parser.error().type() << parser.error().message(); \
return 0; }
- if (parser.query() == 0 || parser.operation() != KDbParser::OP_Select) {
- qDebug() << QString("Invalid query operation \
\"%1\"").arg(parser.operationString()); + if (parser.query() == 0 || \
parser.statementType() != KDbParser::Select) { + KexiScriptingWarning() << \
"Invalid query operation " << parser.statementTypeString(); return 0;
}
- KDbCursor* cursor = m_connection->executeQuery(sqlquery);
+ KDbCursor* cursor = m_connection->executeQuery(KDbEscapedString(sqlquery));
return cursor ? new KexiDBCursor(this, cursor, true) : 0;
}
@@ -152,10 +162,10 @@ bool KexiDBConnection::insertRecord(QObject* obj, const \
QVariantList& values) {
KexiDBFieldList* fieldlist = dynamic_cast< KexiDBFieldList* >(obj);
if (fieldlist)
- return m_connection->insertRecord(*fieldlist->fieldlist(), values);
+ return m_connection->insertRecord(fieldlist->fieldlist(), values);
KexiDBTableSchema* tableschema = dynamic_cast< KexiDBTableSchema* >(obj);
if (tableschema)
- return m_connection->insertRecord(*tableschema->tableschema(), values);
+ return m_connection->insertRecord(tableschema->tableschema(), values);
return false;
}
@@ -170,7 +180,7 @@ bool KexiDBConnection::dropDatabase(const QString& dbname)
bool KexiDBConnection::createTable(KexiDBTableSchema* tableschema)
{
- return m_connection->createTable(tableschema->tableschema(), false);
+ return m_connection->createTable(tableschema->tableschema());
}
bool KexiDBConnection::dropTable(const QString& tablename)
{
@@ -178,11 +188,11 @@ bool KexiDBConnection::dropTable(const QString& tablename)
}
bool KexiDBConnection::alterTable(KexiDBTableSchema* fromschema, KexiDBTableSchema* \
toschema) {
- return true == m_connection->alterTable(*fromschema->tableschema(), \
*toschema->tableschema()); + return true == \
m_connection->alterTable(fromschema->tableschema(), toschema->tableschema()); }
bool KexiDBConnection::alterTableName(KexiDBTableSchema* tableschema, const QString& \
newtablename) {
- return m_connection->alterTableName(*tableschema->tableschema(), newtablename);
+ return m_connection->alterTableName(tableschema->tableschema(), newtablename);
}
QObject* KexiDBConnection::tableSchema(const QString& tablename)
@@ -193,9 +203,7 @@ QObject* KexiDBConnection::tableSchema(const QString& tablename)
bool KexiDBConnection::isEmptyTable(KexiDBTableSchema* tableschema) const
{
- bool success;
- bool notempty = m_connection->isEmpty(*tableschema->tableschema(), success);
- return (!(success && notempty));
+ return m_connection->isEmpty(tableschema->tableschema()) == true;
}
QObject* KexiDBConnection::querySchema(const QString& queryname)
diff --git a/src/plugins/scripting/kexidb/kexidbconnection.h \
b/src/plugins/scripting/kexidb/kexidbconnection.h index 7dc492f18..0d795033f 100644
--- a/src/plugins/scripting/kexidb/kexidbconnection.h
+++ b/src/plugins/scripting/kexidb/kexidbconnection.h
@@ -26,12 +26,13 @@
#include <KDbConnection>
+#include "kexidbconnectiondata.h"
+
namespace Scripting
{
// Forward declarations.
class KexiDBDriver;
-class KexiDBConnectionData;
class KexiDBCursor;
class KexiDBTableSchema;
class KexiDBQuerySchema;
@@ -64,7 +65,8 @@ class KexiDBConnection : public QObject
{
Q_OBJECT
public:
- KexiDBConnection(KDbConnection* connection, KexiDBDriver* driver = 0, \
KexiDBConnectionData* connectiondata = 0); + KexiDBConnection(KDbConnection* \
connection, KexiDBConnectionData* connectiondata, KexiDBDriver* driver = 0); + \
KexiDBConnection(KDbConnection* connection, KexiDBDriver* driver = 0); virtual \
~KexiDBConnection();
public Q_SLOTS:
@@ -72,7 +74,7 @@ public Q_SLOTS:
/** Return true if there was an error during last operation on the database. */
bool hadError() const;
/** Return the last errormessage. */
- const QString lastError() const;
+ QString lastError() const;
/** Return the \a KexiDBConnectionData object used to create this connection. */
QObject* data();
@@ -93,7 +95,7 @@ public Q_SLOTS:
bool databaseExists(const QString& dbname);
/** Return the name of currently used database for this connection or empty
string if there is no used database. */
- const QString currentDatabase() const;
+ QString currentDatabase() const;
/** Return list of database names for opened connection. */
const QStringList databaseNames() const;
/** Return true if connection is properly established. */
@@ -158,7 +160,7 @@ public Q_SLOTS:
private:
KDbConnection* m_connection;
- QPointer<KexiDBConnectionData> m_connectiondata;
+ KexiDBConnectionData* m_connectiondata;
QPointer<KexiDBDriver> m_driver;
};
diff --git a/src/plugins/scripting/kexidb/kexidbconnectiondata.cpp \
b/src/plugins/scripting/kexidb/kexidbconnectiondata.cpp index 96334eeb9..801bc6633 \
100644
--- a/src/plugins/scripting/kexidb/kexidbconnectiondata.cpp
+++ b/src/plugins/scripting/kexidb/kexidbconnectiondata.cpp
@@ -22,121 +22,104 @@
using namespace Scripting;
-KexiDBConnectionData::KexiDBConnectionData(QObject* parent, KDbConnectionData* data, \
bool owner) +KexiDBConnectionData::KexiDBConnectionData() : QObject() {
+ m_data = new KDbConnectionData();
+}
+
+KexiDBConnectionData::KexiDBConnectionData(QObject* parent, KDbConnectionData* data)
: QObject(parent)
, m_data(data)
- , m_owner(owner)
{
setObjectName("KexiDBConnectionData");
}
KexiDBConnectionData::~KexiDBConnectionData()
{
- if (m_owner)
- delete m_data;
}
const QString KexiDBConnectionData::caption() const
{
- return m_data->caption;
+ return m_data->caption();
}
void KexiDBConnectionData::setCaption(const QString& name)
{
- m_data->caption = name;
+ m_data->setCaption(name);
}
const QString KexiDBConnectionData::description() const
{
- return m_data->description;
+ return m_data->description();
}
void KexiDBConnectionData::setDescription(const QString& desc)
{
- m_data->description = desc;
+ m_data->setDescription(desc);
}
const QString KexiDBConnectionData::driverName() const
{
- return m_data->driverName;
+ return m_data->driverId();
}
void KexiDBConnectionData::setDriverName(const QString& driver)
{
- m_data->driverName = driver;
+ m_data->setDriverId(driver);
}
bool KexiDBConnectionData::localSocketFileUsed() const
{
- return m_data->useLocalSocketFile;
+ return m_data->useLocalSocketFile();
}
void KexiDBConnectionData::setLocalSocketFileUsed(bool used)
{
- m_data->useLocalSocketFile = used;
+ m_data->setUseLocalSocketFile(used);
}
const QString KexiDBConnectionData::localSocketFileName() const
{
- return m_data->localSocketFileName;
+ return m_data->localSocketFileName();
}
void KexiDBConnectionData::setLocalSocketFileName(const QString& socketfilename)
{
- m_data->localSocketFileName = socketfilename;
+ m_data->setLocalSocketFileName(socketfilename);
}
-const QString KexiDBConnectionData::databaseName() const
-{
- return m_dbname;
-}
void KexiDBConnectionData::setDatabaseName(const QString& dbname)
{
- m_dbname = dbname;
+ m_data->setDatabaseName(dbname);
}
const QString KexiDBConnectionData::hostName() const
{
- return m_data->hostName;
+ return m_data->hostName();
}
void KexiDBConnectionData::setHostName(const QString& hostname)
{
- m_data->hostName = hostname;
+ m_data->setHostName(hostname);
}
int KexiDBConnectionData::port() const
{
- return m_data->port;
+ return m_data->port();
}
void KexiDBConnectionData::setPort(int p)
{
- m_data->port = p;
+ m_data->setPort(p);
}
const QString KexiDBConnectionData::password() const
{
- return m_data->password;
+ return m_data->password();
}
void KexiDBConnectionData::setPassword(const QString& passwd)
{
- m_data->password = passwd;
+ m_data->setPassword(passwd);
}
const QString KexiDBConnectionData::userName() const
{
- return m_data->userName;
+ return m_data->userName();
}
void KexiDBConnectionData::setUserName(const QString& username)
{
- m_data->userName = username;
-}
-
-const QString KexiDBConnectionData::fileName() const
-{
- return m_data->fileName();
-}
-void KexiDBConnectionData::setFileName(const QString& filename)
-{
- m_data->setFileName(filename);
-}
-
-const QString KexiDBConnectionData::dbPath() const
-{
- return m_data->dbPath();
+ m_data->setUserName(username);
}
const QString KexiDBConnectionData::databaseName() const
{
diff --git a/src/plugins/scripting/kexidb/kexidbconnectiondata.h \
b/src/plugins/scripting/kexidb/kexidbconnectiondata.h index a4ea89a23..90d0bf845 \
100644
--- a/src/plugins/scripting/kexidb/kexidbconnectiondata.h
+++ b/src/plugins/scripting/kexidb/kexidbconnectiondata.h
@@ -37,7 +37,8 @@ class KexiDBConnectionData : public QObject
{
Q_OBJECT
public:
- KexiDBConnectionData(QObject* parent, KDbConnectionData* data, bool owner);
+ KexiDBConnectionData();
+ KexiDBConnectionData(QObject* parent, KDbConnectionData* data);
virtual ~KexiDBConnectionData();
KDbConnectionData* data() {
return m_data;
@@ -95,26 +96,12 @@ public Q_SLOTS:
const QString userName() const;
/** Set the username. */
void setUserName(const QString& username);
-
- // For filebased drivers
-
- /** Return the filename. */
- const QString fileName() const;
- /** Set the filename. */
- void setFileName(const QString& filename);
-
- /** Return the database path. */
- const QString dbPath() const;
- /** Return the database filename. */
- const QString databaseName() const;
-
+
/** Return a user-friendly string representation. */
const QString toUserVisibleString() const;
private:
- KDbConnectionData* m_data;
- QString m_dbname;
- bool m_owner;
+ KDbConnectionData *m_data = nullptr;
};
}
diff --git a/src/plugins/scripting/kexidb/kexidbcursor.cpp \
b/src/plugins/scripting/kexidb/kexidbcursor.cpp index e9065b05c..b202953a5 100644
--- a/src/plugins/scripting/kexidb/kexidbcursor.cpp
+++ b/src/plugins/scripting/kexidb/kexidbcursor.cpp
@@ -40,7 +40,6 @@ KexiDBCursor::~KexiDBCursor()
clearBuffers();
if (m_owner) {
m_cursor->close();
- delete m_cursor;
}
}
@@ -127,7 +126,7 @@ bool KexiDBCursor::setValue(int index, QVariant value)
const qint64 position = m_cursor->at();
if (! m_modifiedrecords.contains(position))
m_modifiedrecords.insert(position, new Record(m_cursor));
- m_modifiedrecords[position]->buffer->insert(*column, value);
+ m_modifiedrecords[position]->buffer->insert(column, value);
return true;
}
@@ -146,7 +145,7 @@ bool KexiDBCursor::save()
QMap<qint64, Record*>::ConstIterator
it(m_modifiedrecords.constBegin()), end(m_modifiedrecords.constEnd());
for (; it != end; ++it) {
- bool b = m_cursor->updateRow(it.value()->rowdata, * it.value()->buffer, \
m_cursor->isBuffered()); + bool b = \
m_cursor->updateRecord(&it.value()->rowdata, it.value()->buffer, \
m_cursor->isBuffered()); if (ok) {
ok = b;
//break;
diff --git a/src/plugins/scripting/kexidb/kexidbcursor.h \
b/src/plugins/scripting/kexidb/kexidbcursor.h index 5ee31721c..1841d533b 100644
--- a/src/plugins/scripting/kexidb/kexidbcursor.h
+++ b/src/plugins/scripting/kexidb/kexidbcursor.h
@@ -24,6 +24,7 @@
#include <KDbCursor>
#include <KDbRecordEditBuffer>
+#include <KDbRecordData>
namespace Scripting
{
@@ -134,7 +135,7 @@ private:
KDbRecordEditBuffer* buffer;
Record(KDbCursor* cursor)
: buffer(new KDbRecordEditBuffer(true)) {
- cursor->storeCurrentRow(rowdata);
+ cursor->storeCurrentRecord(&rowdata);
}
~Record() {
delete buffer;
diff --git a/src/plugins/scripting/kexidb/kexidbdriver.cpp \
b/src/plugins/scripting/kexidb/kexidbdriver.cpp index a78a430a4..2f2273290 100644
--- a/src/plugins/scripting/kexidb/kexidbdriver.cpp
+++ b/src/plugins/scripting/kexidb/kexidbdriver.cpp
@@ -22,6 +22,7 @@
#include "kexidbconnectiondata.h"
#include <KDbConnection>
+#include <KDbDriverMetaData>
using namespace Scripting;
@@ -38,20 +39,20 @@ KexiDBDriver::~KexiDBDriver()
bool KexiDBDriver::isValid()
{
- return m_driver->isValid();
+ return !m_driver->result().isError();
}
QString KexiDBDriver::escapeString(const QString& s)
{
- return m_driver->escapeString(s);
+ return m_driver->escapeString(KDbEscapedString(s).toString()).toString();
}
bool KexiDBDriver::isFileDriver()
{
- return m_driver->isFileDriver();
+ return m_driver->metaData()->isFileBased();
}
-QString KexiDBDriver::fileDBDriverMimeType()
+QStringList KexiDBDriver::fileDBDriverMimeTypes()
{
- return m_driver->fileDBDriverMimeType();
+ return m_driver->metaData()->mimeTypes();
}
bool KexiDBDriver::isSystemObjectName(const QString& name)
{
@@ -67,7 +68,7 @@ bool KexiDBDriver::isSystemFieldName(const QString& name)
}
QString KexiDBDriver::valueToSql(const QString& fieldtype, const QVariant& value)
{
- return m_driver->valueToSql(fieldtype, value);
+ return m_driver->valueToSql(KDbField::typeForString(fieldtype), \
value).toString(); }
QObject* KexiDBDriver::createConnection(QObject* data)
diff --git a/src/plugins/scripting/kexidb/kexidbdriver.h \
b/src/plugins/scripting/kexidb/kexidbdriver.h index 5d0a400c5..239b820e3 100644
--- a/src/plugins/scripting/kexidb/kexidbdriver.h
+++ b/src/plugins/scripting/kexidb/kexidbdriver.h
@@ -71,11 +71,11 @@ public Q_SLOTS:
QString escapeString(const QString& s);
/** Returns true if this driver is file-based. */
bool isFileDriver();
- /** Return a name of MIME type of files handled by this driver if it is a
- file-based database's driver otherwise returns null string. */
- QString fileDBDriverMimeType();
+ /** Return a list of MIME types of files handled by this driver if it is a
+ file-based database's driver otherwise returns an empty list */
+ QStringList fileDBDriverMimeTypes();
/** Returns true if the passed string is a system object's name, eg. name
- of build-in system table that cannot be used or created by a user. */
+ of build-in system table that cannot be used or creataned by a user. */
bool isSystemObjectName(const QString& name);
/** Returns true if the passed string is a system database's name, eg. name
of build-in, system database that cannot be used or created by a user. */
diff --git a/src/plugins/scripting/kexidb/kexidbfieldlist.cpp \
b/src/plugins/scripting/kexidb/kexidbfieldlist.cpp index ef9d45282..5b535269b 100644
--- a/src/plugins/scripting/kexidb/kexidbfieldlist.cpp
+++ b/src/plugins/scripting/kexidb/kexidbfieldlist.cpp
@@ -56,10 +56,10 @@ QObject* KexiDBFieldList::fieldByName(const QString& name)
bool KexiDBFieldList::hasField(QObject* field)
{
KexiDBField* f = dynamic_cast<KexiDBField*>(field);
- return f ? m_fieldlist->hasField(f->field()) : false;
+ return f ? m_fieldlist->hasField(*f->field()) : false;
}
-const QStringList KexiDBFieldList::names() const
+QStringList KexiDBFieldList::names() const
{
return m_fieldlist->names();
}
diff --git a/src/plugins/scripting/kexidb/kexidbfieldlist.h \
b/src/plugins/scripting/kexidb/kexidbfieldlist.h index 25f212869..b3600cb0c 100644
--- a/src/plugins/scripting/kexidb/kexidbfieldlist.h
+++ b/src/plugins/scripting/kexidb/kexidbfieldlist.h
@@ -76,7 +76,7 @@ public Q_SLOTS:
/** Returns true if the passed \a KexiDBField \p field object is in the field \
list. */ bool hasField(QObject* field);
/** Return a list of field names. */
- const QStringList names() const;
+ QStringList names() const;
/** Adds the \a KexiDBField object passed as an argument to the field list. */
bool addField(QObject* field);
diff --git a/src/plugins/scripting/kexidb/kexidbmodule.cpp \
b/src/plugins/scripting/kexidb/kexidbmodule.cpp index fe52c75bf..d51c002c4 100644
--- a/src/plugins/scripting/kexidb/kexidbmodule.cpp
+++ b/src/plugins/scripting/kexidb/kexidbmodule.cpp
@@ -23,6 +23,7 @@
#include "kexidbconnectiondata.h"
#include "kexidbfield.h"
#include "kexidbschema.h"
+#include "KexiScriptingDebug.h"
#include <KDbDriver>
#include <KDbConnectionData>
@@ -31,9 +32,11 @@
#include <KDbQuerySchema>
#include <KConfigGroup>
+#include <KConfig>
#include <QDebug>
#include <QMimeDatabase>
+#include <QUrl>
// The as version() published versionnumber of this kross-module.
#define KROSS_KEXIDB_VERSION 1
@@ -44,7 +47,7 @@ extern "C"
* Exported an loadable function as entry point to use
* the \a KexiDBModule.
*/
- KDE_EXPORT QObject* krossmodule() {
+ /*KEXI_EXPORT*/ QObject* krossmodule() {
return new Scripting::KexiDBModule();
}
}
@@ -66,43 +69,47 @@ int KexiDBModule::version()
return KROSS_KEXIDB_VERSION;
}
-const QStringList KexiDBModule::driverNames()
+QStringList KexiDBModule::driverNames()
{
- return m_drivermanager.driverNames();
+ return m_drivermanager.driverIds();
}
QObject* KexiDBModule::driver(const QString& drivername)
{
QPointer< KDbDriver > driver = m_drivermanager.driver(drivername); // caching is \
done by the DriverManager if (! driver) {
- qWarning() << "No such driver '%1'" << drivername;
+ KexiScriptingWarning() << "No such driver:" << drivername;
return 0;
}
- if (driver->error()) {
- qWarning() << "Error for drivername" << drivername << driver->errorMsg();
+ if (driver->result().isError()) {
+ KexiScriptingWarning() << "Error for drivername" << drivername << \
driver->result().message(); return 0;
}
return new KexiDBDriver(this, driver);
}
-const QString KexiDBModule::lookupByMime(const QString& mimetype)
+QString KexiDBModule::lookupByMime(const QString& mimetype)
{
- return m_drivermanager.lookupByMime(mimetype);
+ QStringList ids = m_drivermanager.driverIdsForMimeType(mimetype);
+ if (ids.size() > 0) {
+ return ids.at(0);
+ }
+ return QString();
}
-const QString KexiDBModule::mimeForFile(const QString& filename)
+QString KexiDBModule::mimeForFile(const QString& filename)
{
QMimeDatabase db;
QString mimename = db.mimeTypeForFile(filename, \
QMimeDatabase::MatchContent).name();
if (mimename.isEmpty() || mimename == "application/octet-stream" || mimename == \
"text/plain") {
- mimename = db.mimeTypeForUrl(filename).name();
+ mimename = db.mimeTypeForUrl(QUrl::fromLocalFile(filename)).name();
}
return mimename;
}
QObject* KexiDBModule::createConnectionData()
{
- return new KexiDBConnectionData(this, new KDbConnectionData(), true);
+ return new KexiDBConnectionData();
}
QObject* KexiDBModule::createConnectionDataByFile(const QString& filename)
@@ -111,7 +118,7 @@ QObject* KexiDBModule::createConnectionDataByFile(const QString& \
filename) QMimeDatabase db;
QString mimename = db.mimeTypeForFile(filename, \
QMimeDatabase::MatchContent).name();
if (mimename.isEmpty() || mimename == "application/octet-stream" || mimename == \
"text/plain") {
- mimename = db.mimeTypeForUrl(filename).name();
+ mimename = db.mimeTypeForUrl(QUrl::fromLocalFile(filename)).name();
}
if (mimename == "application/x-kexiproject-shortcut" || mimename == \
"application/x-kexi-connectiondata") { KConfig _config(filename, \
KConfig::NoGlobals); @@ -123,8 +130,9 @@ QObject* \
KexiDBModule::createConnectionDataByFile(const QString& filename) break;
}
}
+
if (groupkey.isNull()) {
- qDebug() << "No groupkey, filename=" << filename;
+ KexiScriptingWarning() << "No groupkey, filename=" << filename;
return 0;
}
@@ -156,14 +164,14 @@ QObject* KexiDBModule::createConnectionDataByFile(const \
QString& filename) data->setSavePassword(!data->password().isEmpty());
data->setUserName(config.readEntry("user"));
- KexiDBConnectionData* c = new KexiDBConnectionData(this, data, true);
+ KexiDBConnectionData* c = new KexiDBConnectionData(this, data);
c->setDatabaseName(dbname);
return c;
}
const QStringList driverIds = m_drivermanager.driverIdsForMimeType(mimename);
if (driverIds.isEmpty()) {
- qDebug() << "No driver, filename=" << filename << "mimename=" << mimename;
+ KexiScriptingWarning() << "No driver, filename=" << filename << "mimename=" \
<< mimename; return 0;
}
@@ -171,7 +179,7 @@ QObject* KexiDBModule::createConnectionDataByFile(const QString& \
filename) data->setDatabaseName(filename);
//! @todo there can be more than one driver
data->setDriverId(driverIds.first());
- return new KexiDBConnectionData(this, data, true);
+ return new KexiDBConnectionData(this, data);
}
QObject* KexiDBModule::field()
@@ -189,9 +197,8 @@ QObject* KexiDBModule::querySchema()
return new KexiDBQuerySchema(this, new KDbQuerySchema(), true);
}
-QObject* KexiDBModule::connectionWrapper(QObject* connection)
+QObject* KexiDBModule::connectionWrapper(KDbConnection* connection)
{
- KDbConnection* c = dynamic_cast< KDbConnection* >(connection);
- return c ? new KexiDBConnection(c) : 0;
+ return new KexiDBConnection(connection);
}
diff --git a/src/plugins/scripting/kexidb/kexidbmodule.h \
b/src/plugins/scripting/kexidb/kexidbmodule.h index 488e1e4ca..68451b35b 100644
--- a/src/plugins/scripting/kexidb/kexidbmodule.h
+++ b/src/plugins/scripting/kexidb/kexidbmodule.h
@@ -24,6 +24,7 @@
#include <QObject>
#include <KDbDriverManager>
+#include <KDbConnection>
namespace Scripting
{
@@ -43,49 +44,48 @@ class KexiDBModule : public QObject
{
Q_OBJECT
public:
- explicit KexiDBModule(QObject* parent = 0);
+ Q_INVOKABLE explicit KexiDBModule(QObject* parent = 0);
virtual ~KexiDBModule();
-public Q_SLOTS:
-
/** Returns the version number the KexiDB module defines. */
- int version();
+ Q_INVOKABLE int version();
/** Returns a list with available drivernames. */
- const QStringList driverNames();
+ Q_INVOKABLE QStringList driverNames();
/** Return the to the defined \p drivername matching \a KexiDBDriver object. */
- QObject* driver(const QString& drivername);
+ Q_INVOKABLE QObject* driver(const QString& drivername);
/** Return the to the defined mimetype-string matching drivername. */
- const QString lookupByMime(const QString& mimetype);
+ Q_INVOKABLE QString lookupByMime(const QString& mimetype);
/** Return the matching mimetype for the defined file. */
- const QString mimeForFile(const QString& filename);
+ Q_INVOKABLE QString mimeForFile(const QString& filename);
/** Return a new \a KexiDBConnectionData object. */
- QObject* createConnectionData();
+ Q_INVOKABLE QObject* createConnectionData();
/** Create and return a \a KexiDBConnectionData object. Fill the content of the
KexiDBConnectionData object with the defined file as. The file could be e.g.
a *.kexi file or a *.kexis file. */
- QObject* createConnectionDataByFile(const QString& filename);
+ Q_INVOKABLE QObject* createConnectionDataByFile(const QString& filename);
/** Return a new \a KexiDBField object. */
- QObject* field();
+ Q_INVOKABLE QObject* field();
/** Return a new \a KexiDBTableSchema object. */
- QObject* tableSchema(const QString& tablename);
+ Q_INVOKABLE QObject* tableSchema(const QString& tablename);
/** Return a new \a KexiDBQuerySchema object. */
- QObject* querySchema();
+ Q_INVOKABLE QObject* querySchema();
private Q_SLOTS:
//! Wraps a KDbConnection into a KexiDBConnection
- QObject* connectionWrapper(QObject* connection);
+ QObject* connectionWrapper(KDbConnection* connection);
private:
KDbDriverManager m_drivermanager;
+
};
}
diff --git a/src/plugins/scripting/kexidb/kexidbparser.cpp \
b/src/plugins/scripting/kexidb/kexidbparser.cpp index 72b6bdfd1..6f2a91353 100644
--- a/src/plugins/scripting/kexidb/kexidbparser.cpp
+++ b/src/plugins/scripting/kexidb/kexidbparser.cpp
@@ -41,15 +41,15 @@ KexiDBParser::~KexiDBParser()
bool KexiDBParser::parse(const QString& sql)
{
- return m_parser->parse(sql);
+ return m_parser->parse(KDbEscapedString(sql));
}
void KexiDBParser::clear()
{
- m_parser->clear();
+ m_parser->reset();
}
-const QString KexiDBParser::operation()
+QString KexiDBParser::operation() const
{
- return m_parser->operationString();
+ return m_parser->statementTypeString();
}
QObject* KexiDBParser::table()
@@ -68,21 +68,21 @@ QObject* KexiDBParser::connection()
{
return m_connection;
}
-const QString KexiDBParser::statement()
+QString KexiDBParser::statement() const
{
- return m_parser->statement();
+ return m_parser->statement().toString();
}
-const QString KexiDBParser::errorType()
+QString KexiDBParser::errorType() const
{
return m_parser->error().type();
}
-const QString KexiDBParser::errorMsg()
+QString KexiDBParser::errorMsg() const
{
- return m_parser->error().error();
+ return m_parser->error().message();
}
-int KexiDBParser::errorAt()
+int KexiDBParser::errorAt() const
{
- return m_parser->error().at();
+ return m_parser->error().position();
}
diff --git a/src/plugins/scripting/kexidb/kexidbparser.h \
b/src/plugins/scripting/kexidb/kexidbparser.h index 7bedfe855..c66609aef 100644
--- a/src/plugins/scripting/kexidb/kexidbparser.h
+++ b/src/plugins/scripting/kexidb/kexidbparser.h
@@ -58,30 +58,30 @@ public:
KexiDBParser(KexiDBConnection* connection, KDbParser* parser, bool owner);
virtual ~KexiDBParser();
-public Q_SLOTS:
+public:
/** Clears previous results and runs the parser on the SQL statement passed as \
an argument. */
- bool parse(const QString& sql);
+ Q_INVOKABLE bool parse(const QString& sql);
/** Clears parsing results. */
- void clear();
+ Q_INVOKABLE void clear();
/** Returns the resulting operation. */
- const QString operation();
+ Q_INVOKABLE QString operation() const;
/** Returns the \a KexiDBTableSchema object on a CREATE TABLE operation. */
- QObject* table();
+ Q_INVOKABLE QObject* table();
/** Returns the \a KexiDBQuerySchema object on a SELECT operation. */
- QObject* query();
+ Q_INVOKABLE QObject* query();
/** Returns the \a KexiDBConnection object pointing to the used database \
connection. */
- QObject* connection();
+ Q_INVOKABLE QObject* connection();
/** Returns the SQL query statement. */
- const QString statement();
+ Q_INVOKABLE QString statement() const;
/** Returns the type string of the last error. */
- const QString errorType();
+ Q_INVOKABLE QString errorType() const;
/** Returns the message of the last error. */
- const QString errorMsg();
+ Q_INVOKABLE QString errorMsg() const;
/** Returns the position where the last error occurred. */
- int errorAt();
+ Q_INVOKABLE int errorAt() const;
private:
QPointer<KexiDBConnection> m_connection;
diff --git a/src/plugins/scripting/kexidb/kexidbschema.cpp \
b/src/plugins/scripting/kexidb/kexidbschema.cpp index 144769100..e8683c646 100644
--- a/src/plugins/scripting/kexidb/kexidbschema.cpp
+++ b/src/plugins/scripting/kexidb/kexidbschema.cpp
@@ -23,6 +23,8 @@
#include <QRegularExpression>
#include <QDebug>
+#include <KDbExpression>
+
using namespace Scripting;
/***************************************************************************
@@ -42,7 +44,7 @@ KexiDBSchema::~KexiDBSchema()
{
}
-const QString KexiDBSchema::name() const
+QString KexiDBSchema::name() const
{
return m_schema->name();
}
@@ -50,7 +52,7 @@ void KexiDBSchema::setName(const QString& name)
{
m_schema->setName(name);
}
-const QString KexiDBSchema::caption() const
+QString KexiDBSchema::caption() const
{
return m_schema->caption();
}
@@ -58,7 +60,7 @@ void KexiDBSchema::setCaption(const QString& caption)
{
m_schema->setCaption(caption);
}
-const QString KexiDBSchema::description() const
+QString KexiDBSchema::description() const
{
return m_schema->description();
}
@@ -116,21 +118,18 @@ KDbQuerySchema* KexiDBQuerySchema::queryschema()
return static_cast< KDbQuerySchema* >(m_schema);
}
-const QString KexiDBQuerySchema::statement() const
+QString KexiDBQuerySchema::statement() const
{
- return static_cast< KDbQuerySchema* >(m_schema)->statement();
+ return static_cast< KDbQuerySchema* >(m_schema)->statement().toString();
}
void KexiDBQuerySchema::setStatement(const QString& statement)
{
- static_cast< KDbQuerySchema* >(m_schema)->setStatement(statement);
+ static_cast< KDbQuerySchema* \
>(m_schema)->setStatement(KDbEscapedString(statement)); }
bool KexiDBQuerySchema::setWhereExpression(const QString& whereexpression)
{
- KDbExpression* oldexpr = static_cast< KDbQuerySchema* \
>(m_schema)->whereExpression();
- Q_UNUSED(oldexpr);
-
///@todo use KDbParser for such kind of parser-functionality.
QString s = whereexpression;
QRegularExpression re("[\"',]{1,1}");
@@ -142,13 +141,15 @@ bool KexiDBQuerySchema::setWhereExpression(const QString& \
whereexpression) s = s.mid(pos + 1).trimmed();
QString value;
+ QRegularExpressionMatch match = re.match(s);
int sp = s.indexOf(re);
- if (sp >= 0) {
- if (re.cap(0) == ",") {
+
+ if (match.hasMatch()) {
+ if (match.captured(1) == ",") {
value = s.left(sp).trimmed();
s = s.mid(sp + 1).trimmed();
} else {
- int ep = s.indexOf(re.cap(0), sp + 1);
+ int ep = s.indexOf(match.captured(1), sp + 1);
value = s.mid(sp + 1, ep - 1);
s = s.mid(ep + 1);
}
@@ -171,8 +172,7 @@ bool KexiDBQuerySchema::setWhereExpression(const QString& \
whereexpression)
QString errorMessage;
QString errorDescription;
- if (!static_cast<KDbQuerySchema *>(m_schema)->addToWhereExpression(
- field, v, &errorMessage, &errorDescription))
+ if (!static_cast<KDbQuerySchema *>(m_schema)->addToWhereExpression(field, v, \
KDbToken('='), &errorMessage, &errorDescription)) {
qWarning() << "addToWhereExpression() failed, message=" << errorMessage
<< "description=" << errorDescription;
diff --git a/src/plugins/scripting/kexidb/kexidbschema.h \
b/src/plugins/scripting/kexidb/kexidbschema.h index 920ebf176..d8f61b5cc 100644
--- a/src/plugins/scripting/kexidb/kexidbschema.h
+++ b/src/plugins/scripting/kexidb/kexidbschema.h
@@ -61,25 +61,25 @@ public:
KexiDBSchema(QObject* parent, const QString& name, KDbObject* schema, \
KDbFieldList* fieldlist, bool owner); virtual ~KexiDBSchema();
-public Q_SLOTS:
+public:
/** Returns the name of the schema. */
- const QString name() const;
+ Q_INVOKABLE QString name() const;
/** Set the name of the schema. */
- void setName(const QString& name);
+ Q_INVOKABLE void setName(const QString& name);
/** Returns the caption of the schema. */
- const QString caption() const;
+ Q_INVOKABLE QString caption() const;
/** Set the caption of the schema. */
- void setCaption(const QString& caption);
+ Q_INVOKABLE void setCaption(const QString& caption);
/** Returns a description of the schema. */
- const QString description() const;
+ Q_INVOKABLE QString description() const;
/** Set a description of the schema. */
- void setDescription(const QString& description);
+ Q_INVOKABLE void setDescription(const QString& description);
/** Returns the \a KexiDBFieldList object this schema has. */
- QObject* fieldlist();
+ Q_INVOKABLE QObject* fieldlist();
protected:
KDbObject* m_schema;
@@ -117,7 +117,7 @@ public:
private:
/** Returns the SQL-statement of this query schema. */
- const QString statement() const;
+ QString statement() const;
/** Set the SQL-statement of this query schema. */
void setStatement(const QString& statement);
/** Set the where-expression. */
diff --git a/src/plugins/scripting/kexiscripting/CMakeLists.txt \
b/src/plugins/scripting/kexiscripting/CMakeLists.txt index ad8318063..68533b412 \
100644
--- a/src/plugins/scripting/kexiscripting/CMakeLists.txt
+++ b/src/plugins/scripting/kexiscripting/CMakeLists.txt
@@ -1,8 +1,16 @@
+remove_definitions( -DKDE_DEFAULT_DEBUG_AREA=44021 )
+add_definitions(-DKDE_DEFAULT_DEBUG_AREA=44025)
+
+option(KEXI_SCRIPTING_DEBUG "Enable debugging for the scripting plugin" OFF)
+
+if (KEXI_SCRIPTING_DEBUG)
+ add_definitions(-DKEXI_SCRIPTING_DEBUG)
+endif()
+
include_directories(
${CMAKE_SOURCE_DIR}/src/core
${CMAKE_SOURCE_DIR}/src/widget
-
- ${KOKROSS_INCLUDES}
+ ${CMAKE_SOURCE_DIR}/src/plugins/scripting/kexiscripting
)
# the main plugin
@@ -12,17 +20,31 @@ set(kexi_scriptplugin_SRCS
kexiscriptdesignview.cpp
)
+set(krossmodulekexidb_PART_SRCS
+ ../kexidb/kexidbmodule.cpp
+ ../kexidb/kexidbfield.cpp
+ ../kexidb/kexidbfieldlist.cpp
+ ../kexidb/kexidbschema.cpp
+ ../kexidb/kexidbparser.cpp
+ ../kexidb/kexidbcursor.cpp
+ ../kexidb/kexidbconnectiondata.cpp
+ ../kexidb/kexidbconnection.cpp
+ ../kexidb/kexidbdriver.cpp )
+
+
qt5_wrap_cpp(kexi_scriptplugin_SRCS kexiscriptadaptor.h)
-add_library(kexi_scriptplugin MODULE ${kexi_scriptplugin_SRCS})
+add_library(kexi_scriptplugin MODULE ${kexi_scriptplugin_SRCS} \
${krossmodulekexidb_PART_SRCS}) kcoreaddons_desktop_to_json(kexi_scriptplugin \
kexi_scriptplugin.desktop)
target_link_libraries(kexi_scriptplugin
PRIVATE
kexiextendedwidgets
- kokross
kexicore
-
+ Qt5::Qml
KF5::KIOWidgets
+ KDb
+ KF5::ConfigCore
+ KF5::ConfigGui
)
install(TARGETS kexi_scriptplugin DESTINATION ${KEXI_PLUGIN_INSTALL_DIR})
diff --git a/src/plugins/scripting/kexiscripting/KexiScriptingDebug.h \
b/src/plugins/scripting/kexiscripting/KexiScriptingDebug.h new file mode 100644
index 000000000..defbd923e
--- /dev/null
+++ b/src/plugins/scripting/kexiscripting/KexiScriptingDebug.h
@@ -0,0 +1,33 @@
+/* This file is part of the KDE project
+ Copyright (C) 2017 Adam Pigg <adam@piggz.co.uk>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KEXISCRIPTDEBUG_H
+#define KEXISCRIPTDEBUG_H
+#include <QDebug>
+
+
+#ifdef KEXI_SCRIPTING_DEBUG
+#define KexiScriptingDebug qDebug
+#define KexiScriptingWarning qWarning
+#else
+#define KexiScriptingDebug while (0) qDebug
+#define KexiScriptingWarning while (0) qWarning
+#endif
+
+#endif
diff --git a/src/plugins/scripting/kexiscripting/kexiscripthandler.desktop \
b/src/plugins/scripting/kexiscripting/kexi_scriptplugin.desktop similarity index 69%
rename from src/plugins/scripting/kexiscripting/kexiscripthandler.desktop
rename to src/plugins/scripting/kexiscripting/kexi_scriptplugin.desktop
index 5beb69271..c7b29c15a 100644
--- a/src/plugins/scripting/kexiscripting/kexiscripthandler.desktop
+++ b/src/plugins/scripting/kexiscripting/kexi_scriptplugin.desktop
@@ -1,7 +1,4 @@
[Desktop Entry]
-Type=Service
-X-KDE-ServiceTypes=Kexi/Handler
-
GenericName=Scripts
GenericName[ca]=Scripts
GenericName[ca@valencia]=Scripts
@@ -18,6 +15,7 @@ GenericName[ja]=スクリプト
GenericName[nb]=Skripter
GenericName[nl]=Scripts
GenericName[pl]=Skrypty
+
GenericName[pt]=Programas
GenericName[pt_BR]=Scripts
GenericName[se]=Skriptat
@@ -49,15 +47,28 @@ Name[sv]=Skript
Name[uk]=Скрипт
Name[x-test]=xxScriptxx
Name[zh_CN]=脚本
-X-KDE-Library=kexihandler_script
-X-KDE-ParentApp=kexi
-X-Kexi-PartVersion=2
+
+Type=Service
+Icon=script
+Encoding=UTF-8
+
+X-KDE-Library=kexi_scriptplugin
+X-KDE-ServiceTypes=Kexi/Editor
+X-KDE-PluginInfo-Author=Kexi Team
+X-KDE-PluginInfo-Email=kexi@kde.org
+X-KDE-PluginInfo-Name=org.kexi-project.script
+X-KDE-PluginInfo-Version=3.1
+X-KDE-PluginInfo-Website=http://kexi-project.org
+X-KDE-PluginInfo-Category=
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=LGPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+X-Kexi-GroupName=Scripts
X-Kexi-TypeName=script
-X-Kexi-Class=org.kexi-project.script
-X-Kexi-ItemIcon=script
-X-Kexi-SupportsDataView=false
-X-Kexi-SupportsDesignView=true
-X-Kexi-SupportsDataViewInUserMode=false
-X-Kexi-SupportsExecution=true
+X-Kexi-ServiceTypesInUserMode=Kexi/Editor
+X-Kexi-VisibleInProjectNavigator=true
X-Kexi-SupportsDataExport=false
X-Kexi-SupportsPrinting=false
+X-Kexi-SupportsExecution=true
+
diff --git a/src/plugins/scripting/kexiscripting/kexiscriptadaptor.h \
b/src/plugins/scripting/kexiscripting/kexiscriptadaptor.h index 5bd7c5158..733447d0c \
100644
--- a/src/plugins/scripting/kexiscripting/kexiscriptadaptor.h
+++ b/src/plugins/scripting/kexiscripting/kexiscriptadaptor.h
@@ -23,8 +23,8 @@
#include <QObject>
#include <QMetaObject>
#include <QAction>
-
-#include <Kross/Manager>
+#include <QJSEngine>
+#include <QJSValue>
#include <KDbConnection>
@@ -35,6 +35,9 @@
#include <KexiWindow.h>
#include <KexiView.h>
+#include "../kexidb/kexidbmodule.h"
+#include "KexiScriptingDebug.h"
+
/**
* Adaptor class that provides Kexi specific functionality to
* the scripting world.
@@ -43,23 +46,22 @@ class KexiScriptAdaptor : public QObject
{
Q_OBJECT
public:
- explicit KexiScriptAdaptor() : m_kexidbmodule(0) {
- setObjectName("Kexi");
+ Q_INVOKABLE KexiScriptAdaptor() {
+ KexiScriptingDebug() << "Created Script Adaptor";
}
virtual ~KexiScriptAdaptor() {}
-public Q_SLOTS:
/**
* Returns the current KexiWindow widget.
*/
- QWidget* windowWidget() const {
+ Q_INVOKABLE QWidget* windowWidget() const {
return currentWindow();
}
/**
* Returns the current KexiView widget.
*/
- QWidget* viewWidget() const {
+ Q_INVOKABLE QWidget* viewWidget() const {
return currentView();
}
@@ -75,7 +77,7 @@ public Q_SLOTS:
* print "name=%s text=%s" % (a.objectName,a.text)
* \endcode
*/
- QVariantList actions() {
+ Q_INVOKABLE QVariantList actions() {
QVariantList list;
foreach(QAction* action, mainWindow()->allActions()) {
QVariant v;
@@ -89,7 +91,7 @@ public Q_SLOTS:
* Returns the QAction instance the Kexi main window provides that
* has the objectName \p name or NULL if there is no such action.
*/
- QObject* action(const QString& name) {
+ Q_INVOKABLE QObject* action(const QString& name) {
foreach(QAction* action, mainWindow()->allActions()) {
if (action->objectName() == name)
return action;
@@ -101,7 +103,7 @@ public Q_SLOTS:
* Returns true if we are connected with a project else false
* is returned.
*/
- bool isConnected() {
+ Q_INVOKABLE bool isConnected() {
return project() ? project()->isConnected() : false;
}
@@ -110,13 +112,11 @@ public Q_SLOTS:
* project or return NULL if there was no project opened (no
* connection established).
*/
- QObject* getConnection() {
- if (! m_kexidbmodule)
- m_kexidbmodule = Kross::Manager::self().module("kexidb");
+ Q_INVOKABLE QObject* getConnection() {
KDbConnection *connection = project() ? project()->dbConnection() : 0;
- if (m_kexidbmodule && connection) {
+ if (connection) {
QObject* result = 0;
- if (QMetaObject::invokeMethod(m_kexidbmodule, "connectionWrapper", \
Q_RETURN_ARG(QObject*, result), Q_ARG(QObject*, connection))) + if \
(QMetaObject::invokeMethod(&m_kexidbmodule, "connectionWrapper", \
Q_RETURN_ARG(QObject*, result), Q_ARG(KDbConnection*, connection))) return result;
}
return 0;
@@ -133,11 +133,11 @@ public Q_SLOTS:
* print Kexi.items("table")
* \endcode
*/
- QStringList items(const QString& pluginId) {
+ Q_INVOKABLE QStringList items(const QString& plugin) {
QStringList list;
if (project()) {
KexiPart::ItemList l;
- project()->getSortedItemsForPluginId(&l, pluginId(pluginId).toUtf8());
+ project()->getSortedItemsForPluginId(&l, pluginId(plugin).toUtf8());
l.sort();
foreach(KexiPart::Item* i, l) {
list << i->name();
@@ -149,32 +149,32 @@ public Q_SLOTS:
/**
* Returns the caption for the item defined with \p pluginId and \p name .
*/
- QString itemCaption(const QString& pluginId, const QString& name) const {
- KexiPart::Item *item = partItem(pluginId(pluginId), name);
+ Q_INVOKABLE QString itemCaptioq_gadgetn(const QString& plugin, const QString& \
name) const { + KexiPart::Item *item = partItem(pluginId(plugin), name);
return item ? item->caption() : QString();
}
/**
* Set the caption for the item defined with \p pluginId and \p name .
*/
- void setItemCaption(const QString& pluginId, const QString& name, const QString& \
caption) {
- if (KexiPart::Item *item = partItem(pluginId(pluginId), name))
+ Q_INVOKABLE void setItemCaption(const QString& plugin, const QString& name, \
const QString& caption) { + if (KexiPart::Item *item = \
partItem(pluginId(plugin), name)) item->setCaption(caption);
}
/**
* Returns the description for the item defined with \p className and \p name .
*/
- QString itemDescription(const QString& pluginId, const QString& name) const {
- KexiPart::Item *item = partItem(pluginId(pluginId), name);
+ Q_INVOKABLE QString itemDescription(const QString& plugin, const QString& name) \
const { + KexiPart::Item *item = partItem(pluginId(plugin), name);
return item ? item->description() : QString();
}
/**
* Set the description for the item defined with \p className and \p name .
*/
- void setItemDescription(const QString& pluginId, const QString& name, const \
QString& description) {
- if (KexiPart::Item *item = partItem(pluginId(pluginId), name))
+ Q_INVOKABLE void setItemDescription(const QString& plugin, const QString& name, \
const QString& description) { + if (KexiPart::Item *item = \
partItem(pluginId(plugin), name)) item->setDescription(description);
}
@@ -192,11 +192,11 @@ public Q_SLOTS:
* Kexi.windowWidget().setDirty(True)
* \endcode
*/
- bool openItem(const QString& pluginId, const QString& name, const QString& \
viewmode = QString(), + Q_INVOKABLE bool openItem(const QString& plugin, const \
QString& name, const QString& viewmode = QString(), QVariantMap args = \
QVariantMap()) {
bool openingCancelled;
- KexiPart::Item *item = partItem(pluginId(pluginId), name);
+ KexiPart::Item *item = partItem(pluginId(plugin), name);
KexiWindow* window = item
? mainWindow()->openObject(
item,
@@ -220,17 +220,17 @@ public Q_SLOTS:
* Kexi.closeItem("table","table1")
* \endcode
*/
- bool closeItem(const QString& pluginId, const QString& name) {
- if (KexiPart::Item *item = partItem(pluginId(pluginId), name))
+ Q_INVOKABLE bool closeItem(const QString& plugin, const QString& name) {
+ if (KexiPart::Item *item = partItem(pluginId(plugin), name))
return mainWindow()->closeObject(item) == true;
return false;
}
/**
- * Print the item defined with \p pluginId and \p name .
+ * Print the item defined with \p plugin and \p name .
*/
- bool printItem(const QString& pluginId, const QString& name, bool preview = \
false) {
- if (KexiPart::Item *item = partItem(pluginId(pluginId), name))
+ Q_INVOKABLE bool printItem(const QString& plugin, const QString& name, bool \
preview = false) { + if (KexiPart::Item *item = partItem(pluginId(plugin), \
name))
return (preview ? mainWindow()->printPreviewForItem(item) : \
mainWindow()->printItem(item)) == true; return false;
}
@@ -238,8 +238,8 @@ public Q_SLOTS:
/**
* Executes custom action for the item defined with \p pluginId and \p name .
*/
- bool executeItem(const QString& pluginId, const QString& name, const QString& \
actionName) {
- if (KexiPart::Item *item = partItem(pluginId(pluginId), name))
+ Q_INVOKABLE bool executeItem(const QString& plugin, const QString& name, const \
QString& actionName) { + if (KexiPart::Item *item = partItem(pluginId(plugin), \
name))
return mainWindow()->executeCustomActionForObject(item, actionName) == \
true; return false;
}
@@ -249,14 +249,14 @@ public Q_SLOTS:
* Returns the name of the current viewmode. This could be for example "data",
* "design", "text" or just an empty string if there is no view at the moment.
*/
- QString viewMode() const {
+ Q_INVOKABLE QString viewMode() const {
return currentView() ? viewModeToString(currentView()->viewMode()) : \
QString(); }
/**
* Returns a list of names of all available viewmodes the view supports.
*/
- QStringList viewModes() const {
+ Q_INVOKABLE QStringList viewModes() const {
QStringList list;
if (currentWindow()) {
Kexi::ViewModes modes = currentWindow()->supportedViewModes();
@@ -274,12 +274,12 @@ public Q_SLOTS:
* Returns true if there is a current view and those current view is dirty aka
* has the dirty-flag set that indicates that something changed.
*/
- bool viewIsDirty() const {
+ Q_INVOKABLE bool viewIsDirty() const {
return currentView() ? currentView()->isDirty() : false;
}
private:
- QObject* m_kexidbmodule;
+ Scripting::KexiDBModule m_kexidbmodule;
KexiMainWindowIface* mainWindow() const {
return KexiMainWindowIface::global();
@@ -293,8 +293,8 @@ private:
KexiView* currentView() const {
return currentWindow() ? currentWindow()->selectedView() : 0;
}
- KexiPart::Item* partItem(const QString& pluginId, const QString& name) const {
- return project() ? project()->itemForPluginId(pluginId(pluginId), name) : 0;
+ KexiPart::Item* partItem(const QString& plugin, const QString& name) const {
+ return project() ? project()->itemForPluginId(pluginId(plugin), name) : 0;
}
QString pluginId(const QString& pluginId) const {
return pluginId.contains('.') ? pluginId : \
(QString::fromLatin1("org.kexi-project.")+pluginId); @@ -321,6 +321,7 @@ private:
return Kexi::TextViewMode;
return defaultViewMode;
}
+
};
#endif
diff --git a/src/plugins/scripting/kexiscripting/kexiscriptdesignview.cpp \
b/src/plugins/scripting/kexiscripting/kexiscriptdesignview.cpp index \
4429d5dc7..b828fad21 100644
--- a/src/plugins/scripting/kexiscripting/kexiscriptdesignview.cpp
+++ b/src/plugins/scripting/kexiscripting/kexiscriptdesignview.cpp
@@ -22,14 +22,17 @@
#include "kexiscriptdesignview.h"
#include "kexiscripteditor.h"
+#include "kexiscriptadaptor.h"
+#include "../kexidb/kexidbmodule.h"
+#include "KexiScriptingDebug.h"
+#include "kexiscriptpart.h"
+
#include <KexiIcon.h>
#include <KexiMainWindowIface.h>
-
-#include <Kross/Manager>
-#include <Kross/Action>
-#include <Kross/Interpreter>
+#include <kexipart.h>
#include <KDbConnection>
+#include <KPropertyListData>
#include <KActionMenu>
#include <KMessageBox>
@@ -38,8 +41,23 @@
#include <QTimer>
#include <QDomDocument>
#include <QTextBrowser>
-#include <QDebug>
#include <QFileDialog>
+#include <QMenu>
+#include <QJSEngine>
+#include <QJSValue>
+#include <QJSValueIterator>
+
+static QString _stdout;
+
+void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const \
QString &msg) +{
+ if (QString(context.category) == "js") {
+ _stdout += msg + "\n";
+ } else {
+ fprintf(stderr, "%s\n", msg.toLocal8Bit().constData());
+ fflush(stderr);
+ }
+}
/// @internal
class KexiScriptDesignViewPrivate
@@ -47,13 +65,7 @@ class KexiScriptDesignViewPrivate
public:
QSplitter* splitter;
-
- /**
- * The \a Kross::Action instance which provides
- * us access to the scripting framework Kross.
- */
- Kross::Action* scriptaction;
-
+
/// The \a KexiScriptEditor to edit the scripting code.
KexiScriptEditor* editor;
@@ -74,15 +86,17 @@ public:
object such as a report or form
*/
QString scriptType;
+
+ QString factoryConstructors;
};
KexiScriptDesignView::KexiScriptDesignView(
- QWidget *parent, Kross::Action* scriptaction)
+ QWidget *parent)
: KexiView(parent)
, d(new KexiScriptDesignViewPrivate())
{
setObjectName("KexiScriptDesignView");
- d->scriptaction = scriptaction;
+
d->updatesProperties = false;
d->splitter = new QSplitter(this);
@@ -173,14 +187,12 @@ KexiScriptDesignView::KexiScriptDesignView(
setMainMenuActions(mainMenuActions);
- loadData();
-
d->properties = new KPropertySet(this);
connect(d->properties, SIGNAL(propertyChanged(KPropertySet&,KProperty&)),
this, SLOT(slotPropertyChanged(KPropertySet&,KProperty&)));
- // To schedule the initialize fixes a crasher in Kate.
- QTimer::singleShot(50, this, SLOT(initialize()));
+ initialize("");
+ loadData();
}
KexiScriptDesignView::~KexiScriptDesignView()
@@ -189,37 +201,27 @@ KexiScriptDesignView::~KexiScriptDesignView()
delete d;
}
-Kross::Action* KexiScriptDesignView::scriptAction() const
+#if 0
+QString KexiScriptDesignView::scriptAction() const
{
return d->scriptaction;
}
+#endif
-void KexiScriptDesignView::initialize()
+void KexiScriptDesignView::initialize(const QString &program)
{
setDirty(false);
updateProperties();
- d->editor->initialize(d->scriptaction);
+ d->editor->initialize(program);
connect(d->editor, SIGNAL(textChanged()), this, SLOT(setDirty()));
d->splitter->setSizes( QList<int>() << height() * 2 / 3 << height() * 1 / 3 );
}
void KexiScriptDesignView::slotImport()
{
- QStringList filters;
- foreach(const QString &interpreter, Kross::Manager::self().interpreters()) {
- filters << Kross::Manager::self().interpreterInfo(interpreter)->mimeTypes();
- }
- //! @todo KEXI3 add equivalent of kfiledialog:///
- //! @todo KEXI3 multiple filters
- // for now support jsut one filter
- QString filterString;
- if (filters.count() == 1) {
- const QMimeDatabase db;
- const QString filterString = \
db.mimeTypeForName(filters.first()).filterString();
- }
//QUrl("kfiledialog:///kexiscriptingdesigner"),
const QUrl result = QFileDialog::getOpenFileUrl(this, xi18nc("@title:window", \
"Import Script"),
- QUrl(), filterString);
+ QUrl(), "Javascript (*.js)");
if (!result.isValid()) {
return;
}
@@ -227,7 +229,7 @@ void KexiScriptDesignView::slotImport()
QFile f(result.toLocalFile());
if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) {
KMessageBox::sorry(this,
- xi18nc("@info", "Could not read <filename>%1</filename>.", file));
+ xi18nc("@info", "Could not read <filename>%1</filename>.", \
result.toLocalFile())); return;
}
d->editor->setText(f.readAll());
@@ -236,19 +238,14 @@ void KexiScriptDesignView::slotImport()
void KexiScriptDesignView::slotExport()
{
- QStringList filters;
- foreach(const QString &interpreter, Kross::Manager::self().interpreters()) {
- filters << Kross::Manager::self().interpreterInfo(interpreter)->mimeTypes();
- }
- const QString file = KFileDialog::getSaveFileName(
- QUrl("kfiledialog:///kexiscriptingdesigner"),
- filters.join(" "), this, xi18nc("@title:window", "Export Script"));
- if (file.isEmpty())
+ const QUrl result = QFileDialog::getSaveFileUrl(this, xi18nc("@title:window", \
"Export Script"), + \
QUrl("kfiledialog:///kexiscriptingdesigner"), "Javascript (*.js)" ); + if \
(!result.isValid()) return;
- QFile f(file);
+ QFile f(result.toLocalFile());
if (! f.open(QIODevice::WriteOnly | QIODevice::Text)) {
KMessageBox::sorry(this,
- xi18nc("@info", "Could not write <filename>%1</filename>.", file));
+ xi18nc("@info", "Could not write <filename>%1</filename>.", \
result.toLocalFile())); return;
}
f.write(d->editor->text().toUtf8());
@@ -261,29 +258,6 @@ void KexiScriptDesignView::updateProperties()
return;
d->updatesProperties = true;
- Kross::Manager* manager = &Kross::Manager::self();
-
- QString interpretername = d->scriptaction->interpreter();
- Kross::InterpreterInfo* info = interpretername.isEmpty() ? 0 : \
manager->interpreterInfo(interpretername);
-
- if (!info) {
- // if interpreter isn't defined or invalid, try to fallback.
- foreach (const QString& interpretername,
- QStringList() << "python" << "ruby" << "qtscript" << "javascript" << \
"java")
- {
- info = manager->interpreterInfo(interpretername);
- if (info) {
- d->scriptaction->setInterpreter(interpretername);
- break;
- }
- }
- }
-
- if (!info) {
- d->updatesProperties = false;
- return;
- }
-
d->properties->clear();
QStringList types;
@@ -299,35 +273,6 @@ void KexiScriptDesignView::updateProperties()
);
d->properties->addProperty(t);
- QStringList interpreters = manager->interpreters();
-
- qDebug() << interpreters;
-
- KPropertyListData* proplist = new KPropertyListData(interpreters, interpreters);
- KProperty* prop = new KProperty(
- "language", // name
- proplist, // ListData
- d->scriptaction->interpreter(), // value
- xi18n("Interpreter"), // caption
- xi18n("The used scripting interpreter."), // description
- KProperty::List // type
- );
- d->properties->addProperty(prop);
-
- Kross::InterpreterInfo::Option::Map options = info->options();
- Kross::InterpreterInfo::Option::Map::ConstIterator it, end(options.constEnd());
- for (it = options.constBegin(); it != end; ++it) {
- Kross::InterpreterInfo::Option* option = it.value();
- KProperty* prop = new KProperty(
- it.key().toLatin1(), // name
- d->scriptaction->option(it.key(), option->value), // value
- it.key(), // caption
- option->comment, // description
- KProperty::Auto // type
- );
- d->properties->addProperty(prop);
- }
-
//propertySetSwitched();
propertySetReloaded(true);
d->updatesProperties = false;
@@ -343,24 +288,12 @@ void KexiScriptDesignView::slotPropertyChanged(KPropertySet& \
/*set*/, KProperty& if (property.isNull())
return;
- if (property.name() == "language") {
- QString language = property.value().toString();
- qDebug() << "language:" << language;
- d->scriptaction->setInterpreter(language);
- // We assume Kross and the HighlightingInterface are using same
- // names for the support languages...
- d->editor->setHighlightMode(language);
- updateProperties();
- }
- else if (property.name() == "type") {
+ if (property.name() == "type") {
d->scriptType = property.value().toString();
}
else {
- bool ok = d->scriptaction->setOption(property.name(), property.value());
- if (! ok) {
- qWarning() << "unknown property:" << property.name();
- return;
- }
+ KexiScriptingWarning() << "unknown property:" << property.name();
+ return;
}
setDirty(true);
@@ -373,31 +306,37 @@ void KexiScriptDesignView::execute()
time.start();
d->statusbrowser->append(xi18nc("@info",
"Execution of the script <resource>%1</resource> \
started.",
- d->scriptaction->name()));
-
- d->scriptaction->trigger();
- if (d->scriptaction->hadError()) {
- QString errormessage = d->scriptaction->errorMessage();
- d->statusbrowser->append(QString("<b>%2</b><br>").arg(errormessage.toHtmlEscaped()));
-
- QString tracedetails = d->scriptaction->errorTrace();
- d->statusbrowser->append(tracedetails.toHtmlEscaped());
-
- long lineno = d->scriptaction->errorLineNo();
- if (lineno >= 0)
- d->editor->setLineNo(lineno);
- }
- else {
- // xgettext: no-c-format
- d->statusbrowser->append(xi18n("Successfully executed. Time elapsed: %1ms", \
time.elapsed())); + part()->instanceName()));
+
+ KexiScriptPart *pt = qobject_cast<KexiScriptPart*>(part());
+
+ _stdout = QString();
+ qInstallMessageHandler(myMessageOutput);
+ if (pt) {
+ QJSValue result = pt->execute(d->editor->text().toUtf8());
+
+ d->statusbrowser->append(_stdout);
+ if (result.isError()) {
+ QString errormessage = result.toString();
+ d->statusbrowser->append(QString("<b>%2</b><br>").arg(errormessage.toHtmlEscaped()));
+
+ long lineno = result.property("lineNumber").toInt();
+ if (lineno >= 0)
+ d->editor->setLineNo(lineno);
+ }
+ else {
+ // xgettext: no-c-format
+ d->statusbrowser->append(xi18n("Successfully executed. Time elapsed: \
%1ms", time.elapsed())); + }
}
+ qInstallMessageHandler(0);
}
bool KexiScriptDesignView::loadData()
{
QString data;
if (!loadDataBlock(&data)) {
- qDebug() << "no DataBlock";
+ KexiScriptingDebug() << "no DataBlock";
return false;
}
@@ -409,13 +348,13 @@ bool KexiScriptDesignView::loadData()
bool parsed = domdoc.setContent(data, false, &errMsg, &errLine, &errCol);
if (! parsed) {
- qDebug() << "XML parsing error line: " << errLine << " col: " << errCol << " \
message: " << errMsg; + KexiScriptingWarning() << "XML parsing error line: " \
<< errLine << " col: " << errCol << " message: " << errMsg; return false;
}
QDomElement scriptelem = domdoc.namedItem("script").toElement();
if (scriptelem.isNull()) {
- qDebug() << "script domelement is null";
+ KexiScriptingWarning() << "script domelement is null";
return false;
}
@@ -424,25 +363,7 @@ bool KexiScriptDesignView::loadData()
d->scriptType = "executable";
}
- QString interpretername = scriptelem.attribute("language");
- Kross::Manager* manager = &Kross::Manager::self();
- Kross::InterpreterInfo* info = interpretername.isEmpty() ? 0 : \
manager->interpreterInfo(interpretername);
- if (info) {
- d->scriptaction->setInterpreter(interpretername);
-
- Kross::InterpreterInfo::Option::Map options = info->options();
- Kross::InterpreterInfo::Option::Map::ConstIterator it, end = \
options.constEnd();
- for (it = options.constBegin(); it != end; ++it) {
- QString value = scriptelem.attribute(it.key());
- if (! value.isNull()) {
- QVariant v(value);
- if (v.convert(it.value()->value.type())) // preserve the \
QVariant's type
- d->scriptaction->setOption(it.key(), v);
- }
- }
- }
-
- d->scriptaction->setCode(scriptelem.text().toUtf8());
+ initialize(scriptelem.text().toUtf8());
return true;
}
@@ -457,7 +378,7 @@ KDbObject* KexiScriptDesignView::storeNewData(const KDbObject& \
object, delete s;
return 0;
}
- qDebug() << "new id:" << s->id();
+ KexiScriptingDebug() << "new id:" << s->id();
if (! storeData()) {
qWarning() << "Failed to store the data.";
@@ -473,29 +394,17 @@ KDbObject* KexiScriptDesignView::storeNewData(const KDbObject& \
object,
tristate KexiScriptDesignView::storeData(bool /*dontAsk*/)
{
+ KexiScriptingDebug() << "Saving script" << d->editor->text().toUtf8();
QDomDocument domdoc("script");
QDomElement scriptelem = domdoc.createElement("script");
domdoc.appendChild(scriptelem);
- QString language = d->scriptaction->interpreter();
- scriptelem.setAttribute("language", language);
+ scriptelem.setAttribute("language", "javascript");
//! @todo move different types to their own part??
scriptelem.setAttribute("scripttype", d->scriptType);
- Kross::InterpreterInfo* info = Kross::Manager::self().interpreterInfo(language);
- if (info) {
- Kross::InterpreterInfo::Option::Map defoptions = info->options();
- QMap<QString, QVariant> options = d->scriptaction->options();
- QMap<QString, QVariant>::ConstIterator it, end(options.constEnd());
- for (it = options.constBegin(); it != end; ++it)
- if (defoptions.contains(it.key())) // only remember options which the \
InterpreterInfo knows about...
- scriptelem.setAttribute(it.key(), it.value().toString());
- }
-
- QDomText scriptcode = domdoc.createTextNode(d->scriptaction->code());
+ QDomText scriptcode = domdoc.createTextNode(d->editor->text().toUtf8());
scriptelem.appendChild(scriptcode);
return storeDataBlock(domdoc.toString());
}
-
-
diff --git a/src/plugins/scripting/kexiscripting/kexiscriptdesignview.h \
b/src/plugins/scripting/kexiscripting/kexiscriptdesignview.h index \
e587c8af9..9530d428a 100644
--- a/src/plugins/scripting/kexiscripting/kexiscriptdesignview.h
+++ b/src/plugins/scripting/kexiscripting/kexiscriptdesignview.h
@@ -27,16 +27,12 @@
#include <KPropertySet>
#include <KProperty>
+#include <QJSValue>
// Forward declarations.
class KexiScriptEditor;
class KexiScriptDesignViewPrivate;
-namespace Kross
-{
-class Action;
-}
-
/**
* The KexiScriptDesignView class provides the KexiView to
* manage script modules in the design-view. The design-view
@@ -52,7 +48,7 @@ public:
/**
* Constructor.
*/
- KexiScriptDesignView(QWidget *parent, Kross::Action* scriptaction);
+ KexiScriptDesignView(QWidget *parent);
/**
* Destructor.
@@ -60,10 +56,10 @@ public:
virtual ~KexiScriptDesignView();
/**
- * \return the \a Kross::Action this \a KexiScriptDesignView
+ * \return the program string this \a KexiScriptDesignView
* is responsible for.
*/
- Kross::Action* scriptAction() const;
+// QString scriptAction() const;
/**
* \return a property set for this view.
@@ -95,7 +91,7 @@ private Q_SLOTS:
/**
* Deferred initialization.
*/
- void initialize();
+ void initialize(const QString &program);
void slotImport();
void slotExport();
@@ -118,7 +114,7 @@ private Q_SLOTS:
private:
KexiScriptDesignViewPrivate* d;
-
+
/**
* Load the data from XML source and fill the internally
* used \a Kross::Action instance.
diff --git a/src/plugins/scripting/kexiscripting/kexiscripteditor.cpp \
b/src/plugins/scripting/kexiscripting/kexiscripteditor.cpp index e8f49b711..96de2e9b5 \
100644
--- a/src/plugins/scripting/kexiscripting/kexiscripteditor.cpp
+++ b/src/plugins/scripting/kexiscripting/kexiscripteditor.cpp
@@ -22,14 +22,12 @@
#include "kexiscripteditor.h"
-#include <Kross/Action>
-
/// \internal d-pointer class
class Q_DECL_HIDDEN KexiScriptEditor::Private
{
public:
- Kross::Action* scriptaction;
- Private() : scriptaction(0) {}
+ QString scriptaction;
+ Private() {}
};
KexiScriptEditor::KexiScriptEditor(QWidget *parent)
@@ -45,18 +43,16 @@ KexiScriptEditor::~KexiScriptEditor()
bool KexiScriptEditor::isInitialized() const
{
- return d->scriptaction != 0;
+ return !d->scriptaction.isEmpty();
}
-void KexiScriptEditor::initialize(Kross::Action* scriptaction)
+void KexiScriptEditor::initialize(const QString &scriptaction)
{
d->scriptaction = scriptaction;
- Q_ASSERT(d->scriptaction);
disconnect(this, SIGNAL(textChanged()), this, SLOT(slotTextChanged()));
- QString code = d->scriptaction->code();
- if (code.isEmpty()) {
+ if (d->scriptaction.isEmpty()) {
// If there is no code we just add some information.
///@todo remove after release
#if 0
@@ -71,10 +67,10 @@ void KexiScriptEditor::initialize(Kross::Action* scriptaction)
\
"http://www.kexi-project.org/scripting/"), true).join("\n# ") + "\n"; #endif
}
- KexiEditor::setText(code);
+ KexiEditor::setText(d->scriptaction);
// We assume Kross and the HighlightingInterface are using same
// names for the support languages...
- setHighlightMode(d->scriptaction->interpreter());
+ setHighlightMode("javascript");
clearUndoRedo();
KexiEditor::setDirty(false);
@@ -84,9 +80,7 @@ void KexiScriptEditor::initialize(Kross::Action* scriptaction)
void KexiScriptEditor::slotTextChanged()
{
KexiEditor::setDirty(true);
- if (d->scriptaction) {
- d->scriptaction->setCode(KexiEditor::text().toUtf8());
- }
+ d->scriptaction = KexiEditor::text();
}
void KexiScriptEditor::setLineNo(long lineno)
diff --git a/src/plugins/scripting/kexiscripting/kexiscripteditor.h \
b/src/plugins/scripting/kexiscripting/kexiscripteditor.h index ac371a224..402e1ea38 \
100644
--- a/src/plugins/scripting/kexiscripting/kexiscripteditor.h
+++ b/src/plugins/scripting/kexiscripting/kexiscripteditor.h
@@ -62,7 +62,7 @@ public:
* highlighter will be reset, undo/redo are cleared and
* setDirty(false) is set.
*/
- void initialize(Kross::Action* scriptaction);
+ void initialize(const QString &scriptProgram);
public Q_SLOTS:
void slotTextChanged();
diff --git a/src/plugins/scripting/kexiscripting/kexiscriptpart.cpp \
b/src/plugins/scripting/kexiscripting/kexiscriptpart.cpp index 053e69dc3..4ac4e3839 \
100644
--- a/src/plugins/scripting/kexiscripting/kexiscriptpart.cpp
+++ b/src/plugins/scripting/kexiscripting/kexiscriptpart.cpp
@@ -22,6 +22,9 @@
#include "kexiscriptpart.h"
#include "kexiscriptdesignview.h"
#include "kexiscriptadaptor.h"
+#include "../kexidb/kexidbmodule.h"
+#include "KexiScriptingDebug.h"
+
#include <kexipart.h>
#include <kexipartitem.h>
#include <KexiIcon.h>
@@ -29,9 +32,7 @@
#include <KexiWindow.h>
#include <KexiMainWindowIface.h>
#include <kexiproject.h>
-
-#include <Kross/Manager>
-#include <Kross/ActionCollection>
+#include <KDbConnection>
#include <KConfig>
#include <KConfigGroup>
@@ -39,6 +40,10 @@
#include <KMessageBox>
#include <QDebug>
+#include <QJSEngine>
+#include <QJSValue>
+#include <QJSValueIterator>
+#include <QDomDocument>
KEXI_PLUGIN_FACTORY(KexiScriptPart, "kexi_scriptplugin.json")
@@ -47,28 +52,14 @@ class Q_DECL_HIDDEN KexiScriptPart::Private
{
public:
explicit Private(KexiScriptPart* p)
- : p(p)
- , actioncollection(new Kross::ActionCollection("projectscripts"))
- , adaptor(0) {}
+ : p(p) {}
~Private() {
- delete actioncollection; delete adaptor;
}
+ QJSEngine engine;
KexiScriptPart* p;
- Kross::ActionCollection* actioncollection;
- KexiScriptAdaptor* adaptor;
-
- Kross::Action* action(const QString &partname) {
- Kross::Action *action = actioncollection->action(partname);
- if (! action) {
- if (! adaptor)
- adaptor = new KexiScriptAdaptor();
- action = new Kross::Action(p, partname);
- actioncollection->addAction(action);
- action->addObject(adaptor);
- }
- return action;
- }
+ KexiScriptAdaptor adaptor;
+ Scripting::KexiDBModule kexidbmodule;
};
KexiScriptPart::KexiScriptPart(QObject *parent, const QVariantList& l)
@@ -82,6 +73,15 @@ KexiScriptPart::KexiScriptPart(QObject *parent, const \
QVariantList& l) l)
, d(new Private(this))
{
+ d->engine.installExtensions(QJSEngine::ConsoleExtension);
+
+ registerMetaObjects();
+
+ QJSValueIterator it(d->engine.globalObject());
+ while (it.hasNext()) {
+ it.next();
+ KexiScriptingDebug() << it.name() << ": " << it.value().toString();
+ }
}
KexiScriptPart::~KexiScriptPart()
@@ -97,96 +97,43 @@ bool KexiScriptPart::execute(KexiPart::Item* item, QObject* \
sender) return false;
}
-#if 0
- KexiDialogBase* dialog = new KexiDialogBase(m_mainWin);
- dialog->setId(item->identifier());
- KexiScriptDesignView* view = dynamic_cast<KexiScriptDesignView*>(
- createView(dialog, dialog, *item, \
Kexi::DesignViewMode));
- if (! view) {
- qWarning() << "Failed to create a view.";
- return false;
- }
+ QString p = loadData(item);
- Kross::Action* scriptaction = view->scriptAction();
- if (scriptaction) {
-
- const QString dontAskAgainName = "askExecuteScript";
- KSharedConfig::Ptr config = KSharedConfig::openConfig();
- QString dontask = config->readEntry(dontAskAgainName).toLower();
-
- bool exec = (dontask == "yes");
- if (!exec && dontask != "no") {
- exec = KMessageBox::Yes == KMessageBox::questionYesNo(view,
- futureI18n("Do you want to execute the script \"%1\"?\n\n"
- "Scripts obtained from unknown sources can contain \
dangerous code.", scriptaction->text()),
- futureI18n("Execute Script?"), \
KGuiItem(futureI18nc("@action:button", "Execute"), \
koIconName("system-run")),
- dontAskAgainName, KMessageBox::Notify | KMessageBox::Dangerous
- );
- }
+ QJSValue result = execute(p);
+
+ if (result.isError()) {
+ QString errormessage = result.toString();
+ long lineno = result.property("lineNumber").toInt();
+ QMessageBox mb(xi18n("Kexi Script"), xi18n("Error executing script at \
line %1:\n%2").arg(lineno).arg(errormessage), QMessageBox::Critical, \
QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); + \
mb.exec(); + return false;
+ }
+ return true;
+}
- if (exec) {
- //QTimer::singleShot(10, scriptaction, SLOT(activate()));
- d->scriptguiclient->executeScriptAction(scriptaction);
- }
+QJSValue KexiScriptPart::execute(const QString& program)
+{
+ QJSValue val;
+
+ if (!d->engine.globalObject().hasProperty("KDb")) {
+ val = d->engine.newQObject(&d->kexidbmodule);
+ d->engine.globalObject().setProperty("KDb", val);
}
- view->deleteLater(); // not needed any longer.
-#else
-
- Kross::Action *action = d->action(item->name());
- Q_ASSERT(action);
- action->trigger();
-#endif
- return true;
+
+ if (!program.isEmpty()) {
+ return d->engine.evaluate(program);
+ }
+ return QJSValue();
}
void KexiScriptPart::initPartActions()
{
- qDebug() << ".............";
-#if 0
- if (m_mainWin) {
- // At this stage the KexiPart::Part::m_mainWin should be defined, so
- // that we are able to use it's KXMLGUIClient.
-
- // Initialize the ScriptGUIClient.
- d->scriptguiclient = new Kross::Api::ScriptGUIClient(m_mainWin);
-
- // Publish the KexiMainWindow singelton instance. At least the KexiApp
- // scripting-plugin depends on this instance and loading the plugin will
- // fail if it's not avaiable.
- if (! Kross::Api::Manager::scriptManager()->hasChild("KexiMainWindow")) {
- Kross::Api::Manager::scriptManager()->addQObject(m_mainWin, \
"KexiMainWindow");
-
- // Add the QAction's provided by the ScriptGUIClient to the
- // KexiMainWindow.
- //FIXME: fix+use createSharedPartAction() whyever it doesn't work as \
expected right now...
- Q3PopupMenu* popup = m_mainWin->findPopupMenu("tools");
- if (popup) {
- QAction* execscriptaction = \
d->scriptguiclient->action("executescriptfile");
- if (execscriptaction)
- execscriptaction->plug(popup);
- QAction* configscriptaction = \
d->scriptguiclient->action("configurescripts");
- if (configscriptaction)
- configscriptaction->plug(popup);
- QAction* scriptmenuaction = \
d->scriptguiclient->action("installedscripts");
- if (scriptmenuaction)
- scriptmenuaction->plug(popup);
- /*
- QAction * execscriptmenuaction = \
d->scriptguiclient->action("executedscripts");
- if(execscriptmenuaction)
- execscriptmenuaction->plug( popup );
- QAction * loadedscriptmenuaction = \
d->scriptguiclient->action("loadedscripts");
- if(loadedscriptmenuaction)
- loadedscriptmenuaction->plug( popup );
- */
- }
- }
- }
-#endif
+
}
void KexiScriptPart::initInstanceActions()
{
- createSharedAction(Kexi::DesignViewMode, xi18n("Configure Editor..."),
+ createSharedAction(Kexi::TextViewMode, xi18n("Configure Editor..."),
koIconName("configure"), QKeySequence(), \
"script_config_editor"); }
@@ -199,28 +146,11 @@ KexiView* KexiScriptPart::createView(QWidget *parent,
Q_ASSERT(item);
Q_UNUSED(window);
Q_UNUSED(staticObjectArgs);
- qDebug() << "............. createView";
+
QString partname = item->name();
if (! partname.isNull()) {
- Kross::Action *action = d->action(partname);
-#if 0
- KexiMainWindow *win = dialog->mainWin();
- if (!win || !win->project() || !win->project()->dbConnection())
- return 0;
- Kross::Api::ScriptActionCollection* collection = \
d->scriptguiclient->getActionCollection("projectscripts");
- if (! collection) {
- collection = new Kross::Api::ScriptActionCollection(xi18n("Scripts"), \
d->scriptguiclient->actionCollection(), "projectscripts");
- d->scriptguiclient->addActionCollection("projectscripts", collection);
- }
- const char* name = partname.toLatin1();
- Kross::Api::ScriptAction::Ptr scriptaction = collection->action(name);
- if (! scriptaction) {
- scriptaction = new Kross::Api::ScriptAction(partname);
- collection->attach(scriptaction); //!< @todo remove again on unload!
- }
-#endif
- if (viewMode == Kexi::DesignViewMode) {
- return new KexiScriptDesignView(parent, action);
+ if (viewMode == Kexi::TextViewMode) {
+ return new KexiScriptDesignView(parent);
}
}
return 0;
@@ -236,4 +166,58 @@ KLocalizedString KexiScriptPart::i18nMessage(
return Part::i18nMessage(englishMessage, window);
}
+QString KexiScriptPart::loadData(KexiPart::Item* item)
+{
+ QString data;
+ if (!item) {
+ return QString();
+ }
+
+ if (true != KexiMainWindowIface::global()->project()->dbConnection()->loadDataBlock(
+ item->identifier(), &data))
+ {
+ return QString();
+ }
+
+ QString errMsg;
+ int errLine;
+ int errCol;
+
+ QString scriptType;
+
+ QDomDocument domdoc;
+ bool parsed = domdoc.setContent(data, false, &errMsg, &errLine, &errCol);
+
+ if (!parsed) {
+ KexiScriptingWarning() << "XML parsing error line: " << errLine << " col: " \
<< errCol << " message: " << errMsg; + return QString();
+ }
+
+ QDomElement scriptelem = domdoc.namedItem("script").toElement();
+ if (scriptelem.isNull()) {
+ KexiScriptingWarning() << "script domelement is null";
+ return QString();
+ }
+
+ scriptType = scriptelem.attribute("scripttype");
+ if (scriptType.isEmpty()) {
+ scriptType = "executable";
+ }
+
+ if (scriptType == "executable") {
+ return scriptelem.text().toUtf8();
+ } else {
+ return QString();
+ }
+}
+
+void KexiScriptPart::registerMetaObjects()
+{
+ QJSValue meta = d->engine.newQMetaObject(&KexiScriptAdaptor::staticMetaObject);
+ d->engine.globalObject().setProperty("KexiScriptAdaptor", meta);
+
+ meta = d->engine.newQMetaObject(&Scripting::KexiDBModule::staticMetaObject);
+ d->engine.globalObject().setProperty("KDb", meta);
+}
+
#include "kexiscriptpart.moc"
diff --git a/src/plugins/scripting/kexiscripting/kexiscriptpart.h \
b/src/plugins/scripting/kexiscripting/kexiscriptpart.h index 5d9b214fe..cb146017c \
100644
--- a/src/plugins/scripting/kexiscripting/kexiscriptpart.h
+++ b/src/plugins/scripting/kexiscripting/kexiscriptpart.h
@@ -25,6 +25,7 @@
#include <kexi.h>
#include <kexipart.h>
+#include <QJSValue>
/**
* Kexi Scripting Plugin.
@@ -55,6 +56,8 @@ public:
*/
virtual bool execute(KexiPart::Item* item, QObject* sender = 0);
+ QJSValue execute(const QString &program);
+
/**
* \return the i18n message for the passed \p englishMessage string.
*/
@@ -96,6 +99,10 @@ private:
class Private;
/// \internal d-pointer instance.
Private* const d;
+
+ void registerMetaObjects();
+
+ QString loadData(KexiPart::Item* item);
};
#endif
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic