20#include "KDbTableSchemaChangeListener.h"
21#include "KDbConnection.h"
22#include "KDbConnection_p.h"
23#include "KDbLookupFieldSchema.h"
26#ifdef KDB_TABLESCHEMACHANGELISTENER_DEBUG
27# define localDebug(...) kdbDebug(__VA_ARGS__)
29# define localDebug(...) if (true) {} else kdbDebug(__VA_ARGS__)
32class KDbTableSchemaChangeListenerPrivate
35 KDbTableSchemaChangeListenerPrivate()
49 conn->d->tableSchemaChangeListeners.insert(table, listeners);
51 localDebug() <<
"listener=" << listener << listener->
name() <<
"table=" << table << table->
name();
52 listeners->
insert(listener);
63 = conn->d->queryTableSchemaChangeListeners.value(query);
66 conn->d->queryTableSchemaChangeListeners.insert(query, listeners);
68 localDebug() <<
"listener=" << listener->
name() <<
"query=" <<
query->name();
69 listeners->
insert(listener);
79 = conn->d->tableSchemaChangeListeners.value(table);
84 <<
"table=" << table << table->
name();
86 listeners->
remove(listener);
88 delete conn->d->tableSchemaChangeListeners.take(table);
99 = conn->d->queryTableSchemaChangeListeners.value(query);
104 <<
"query=" <<
query->name();
106 listeners->
remove(listener);
117 localDebug() <<
"listener=" << listener->
name();
119 listeners->
remove(listener);
122 listeners->
remove(listener);
134 if (checkedTables->
contains(table1)) {
135 localDebug() <<
"Table" << table1 << table1->
name() <<
"already checked";
138 checkedTables->
insert(table1);
139 localDebug() <<
"Checking if table" << table1 << table1->
name() <<
"depends on table"
140 << table2 << table2->
name();
141 if (table1 == table2) {
142 localDebug() <<
"Yes";
146 switch (lookup->recordSource().type()) {
149 = conn->
tableSchema(lookup->recordSource().name());
151 && tableDependsOnTable(checkedTables, checkedQueries, conn, sourceTable, table2))
159 = conn->
querySchema(lookup->recordSource().name());
161 && queryDependsOnTable(checkedTables, checkedQueries, conn, sourceQuery, table2))
168 kdbWarning() <<
"Unsupported lookup field's source type" << lookup->recordSource().typeName();
173 localDebug() <<
"No";
184 if (checkedTables->
contains(table)) {
185 localDebug() <<
"Table" << table->
name() <<
"already checked";
188 checkedTables->
insert(table);
189 localDebug() <<
"Checking if table" << table->
name() <<
"depends on query" <<
query->name();
191 switch (lookup->recordSource().type()) {
194 = conn->
tableSchema(lookup->recordSource().name());
196 && tableDependsOnQuery(checkedTables, checkedQueries, conn, sourceTable, query))
204 = conn->
querySchema(lookup->recordSource().name());
206 && queryDependsOnQuery(checkedTables, checkedQueries, conn, sourceQuery, query))
213 kdbWarning() <<
"Unsupported lookup field's source type" << lookup->recordSource().typeName();
228 if (checkedQueries->
contains(query)) {
229 localDebug() <<
"Query" <<
query->name() <<
"already checked";
232 checkedQueries->
insert(query);
233 localDebug() <<
"Checking if query" <<
query->name() <<
"depends on table" << table->
name();
235 if (tableDependsOnTable(checkedTables, checkedQueries, conn, queryTable, table)) {
251 if (checkedQueries->
contains(query1)) {
252 localDebug() <<
"Query" << query1->
name() <<
"already checked";
255 checkedQueries->
insert(query1);
256 localDebug() <<
"Checking if query" << query1->
name() <<
"depends on query" << query2->
name();
257 if (query1 == query2) {
258 localDebug() <<
"Yes";
262 if (tableDependsOnQuery(checkedTables, checkedQueries, conn, queryTable, query2)) {
280 conn->d->tableSchemaChangeListeners.constBegin());
281 it != conn->d->tableSchemaChangeListeners.constEnd(); ++it)
286 if (tableDependsOnTable(&checkedTables, &checkedQueries, conn, it.key(), table)) {
293 conn->d->queryTableSchemaChangeListeners.constBegin());
294 it != conn->d->queryTableSchemaChangeListeners.constEnd(); ++it)
299 if (queryDependsOnTable(&checkedTables, &checkedQueries, conn, it.key(), table)) {
321 conn->d->tableSchemaChangeListeners.constBegin());
322 it != conn->d->tableSchemaChangeListeners.constEnd(); ++it)
327 if (tableDependsOnQuery(&checkedTables, &checkedQueries, conn, it.key(), query)) {
334 conn->d->queryTableSchemaChangeListeners.constBegin());
335 it != conn->d->queryTableSchemaChangeListeners.constEnd(); ++it)
340 if (queryDependsOnQuery(&checkedTables, &checkedQueries, conn, it.key(), query)) {
348 Q_DISABLE_COPY(KDbTableSchemaChangeListenerPrivate)
351KDbTableSchemaChangeListener::KDbTableSchemaChangeListener()
352 : d(new KDbTableSchemaChangeListenerPrivate)
356KDbTableSchemaChangeListener::~KDbTableSchemaChangeListener()
377 kdbWarning() <<
"Missing connection";
381 kdbWarning() <<
"Missing listener";
385 kdbWarning() <<
"Missing table";
388 KDbTableSchemaChangeListenerPrivate::registerForChanges(conn, listener, table);
397 kdbWarning() <<
"Missing connection";
401 kdbWarning() <<
"Missing listener";
405 kdbWarning() <<
"Missing query";
408 KDbTableSchemaChangeListenerPrivate::registerForChanges(conn, listener, query);
417 kdbWarning() <<
"Missing connection";
421 kdbWarning() <<
"Missing listener";
425 kdbWarning() <<
"Missing table";
428 KDbTableSchemaChangeListenerPrivate::unregisterForChanges(conn, listener, table);
436 kdbWarning() <<
"Missing connection";
440 kdbWarning() <<
"Missing table";
443 KDbTableSchemaChangeListenerPrivate::unregisterForChanges(conn,
nullptr, table);
451 kdbWarning() <<
"Missing connection";
455 kdbWarning() <<
"Missing listener";
459 kdbWarning() <<
"Missing query";
462 KDbTableSchemaChangeListenerPrivate::unregisterForChanges(conn, listener, query);
470 kdbWarning() <<
"Missing connection";
474 kdbWarning() <<
"Missing query";
477 KDbTableSchemaChangeListenerPrivate::unregisterForChanges(conn,
nullptr, query);
485 kdbWarning() <<
"Missing connection";
489 kdbWarning() <<
"Missing listener";
492 KDbTableSchemaChangeListenerPrivate::unregisterForChanges(conn, listener);
500 kdbWarning() <<
"Missing connection";
504 kdbWarning() <<
"Missing table";
508 KDbTableSchemaChangeListenerPrivate::collectListeners(&result, conn, table);
517 kdbWarning() <<
"Missing connection";
521 kdbWarning() <<
"Missing query";
525 KDbTableSchemaChangeListenerPrivate::collectListeners(&result, conn, query);
534 kdbWarning() <<
"Missing connection";
538 kdbWarning() <<
"Missing table";
545 if (localResult !=
true) {
546 result = localResult;
557 kdbWarning() <<
"Missing connection";
561 kdbWarning() <<
"Missing query";
568 if (localResult !=
true) {
569 result = localResult;
Provides database connection, allowing queries and data modification.
KDbTableSchema * tableSchema(int tableId)
KDbQuerySchema * querySchema(int queryId)
@ Table
table as lookup record source
@ Query
named query as lookup record source
Provides information about lookup field's setup.
KDbQuerySchema provides information about database query.
An interface allowing to listen for table schema changes.
virtual tristate closeListener()=0
Closes listening object so it will be deleted and thus no longer use a conflicting table schema.
static tristate closeListeners(KDbConnection *conn, const KDbTableSchema *table, const QList< KDbTableSchemaChangeListener * > &except=QList< KDbTableSchemaChangeListener * >())
Closes all table schema listeners for table schema table except for the ones from the except list.
static void registerForChanges(KDbConnection *conn, KDbTableSchemaChangeListener *listener, const KDbTableSchema *table)
Registers listener for receiving (listening) information about changes in table schema table and all ...
static void unregisterForChanges(KDbConnection *conn, KDbTableSchemaChangeListener *listener, const KDbTableSchema *table)
Unregisters listener for receiving (listening) information about changes in table schema table.
static QList< KDbTableSchemaChangeListener * > listeners(KDbConnection *conn, const KDbTableSchema *table)
void setName(const QString &name)
3-state logical type with three values: true, false and cancelled and convenient operators.
KSERVICE_EXPORT KService::List query(FilterFunc filterFunc)
bool contains(const QSet< T > &other) const const
iterator insert(const T &value)
bool remove(const T &value)
QSet< T > & unite(const QSet< T > &other)
QList< T > values() const const
QString fromLatin1(QByteArrayView str)