void AbstractDb::registerAllFunctions() { for (const RegisteredFunction& regFn : registeredFunctions) { if (!deregisterFunction(regFn.name, regFn.argCount)) qWarning() << "Failed to deregister custom SQL function:" << regFn.name; } registeredFunctions.clear(); RegisteredFunction regFn; for (FunctionManager::ScriptFunction* fnPtr : FUNCTIONS->getScriptFunctionsForDatabase(getName())) { regFn.argCount = fnPtr->undefinedArgs ? -1 : fnPtr->arguments.count(); regFn.name = fnPtr->name; regFn.type = fnPtr->type; registerFunction(regFn); } for (FunctionManager::NativeFunction* fnPtr : FUNCTIONS->getAllNativeFunctions()) { regFn.argCount = fnPtr->undefinedArgs ? -1 : fnPtr->arguments.count(); regFn.name = fnPtr->name; regFn.type = fnPtr->type; registerFunction(regFn); } disconnect(FUNCTIONS, SIGNAL(functionListChanged()), this, SLOT(registerAllFunctions())); connect(FUNCTIONS, SIGNAL(functionListChanged()), this, SLOT(registerAllFunctions())); }
bool AbstractDb::closeQuiet() { QWriteLocker locker(&dbOperLock); QWriteLocker connectionLocker(&connectionStateLock); interruptExecution(); bool res = closeInternal(); clearAttaches(); registeredFunctions.clear(); registeredCollations.clear(); if (FUNCTIONS) // FUNCTIONS is already null when closing db while closing entire app disconnect(FUNCTIONS, SIGNAL(functionListChanged()), this, SLOT(registerAllFunctions())); return res; }
bool AbstractDb::openAndSetup() { bool result = openInternal(); if (!result) return result; // When this is an internal configuration database if (connOptions.contains(DB_PURE_INIT)) return true; // Implementation specific initialization initAfterOpen(); // Custom SQL functions registerAllFunctions(); // Custom collations registerAllCollations(); return result; }
G_MODULE_EXPORT int xlAutoOpen() { registerAllFunctions(); return 1; }
EXPORT_EXTERN_C int xlAutoOpen() { registerAllFunctions(); return 1; }