瀏覽代碼

Merge branch 'candidate-5.6.0' into candidate-6.0.0

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 9 年之前
父節點
當前提交
fc57f5d326

+ 6 - 1
common/remote/sockfile.cpp

@@ -363,7 +363,12 @@ const char *RFCStrings[] =
     RFCText(RFCsetfileperms),
     RFCText(RFCunknown),
 };
-static const char *getRFCText(RemoteFileCommandType cmd) { return RFCStrings[cmd]; }
+static const char *getRFCText(RemoteFileCommandType cmd)
+{
+    if (cmd > RFCmax)
+        cmd = RFCmax;
+    return RFCStrings[cmd];
+}
 
 #define ThrottleText(throttleClass) #throttleClass
 const char *ThrottleStrings[] =

+ 1 - 0
ecl/eclagent/eclagent.cpp

@@ -1863,6 +1863,7 @@ void EclAgent::doProcess()
         {
             MTIME_SECTION(queryActiveTimer(), "Process");
             Owned<IEclProcess> process = loadProcess();
+            QueryTerminationCleanup threadCleanup;
 
             if (checkVersion && (process->getActivityVersion() != eclccCodeVersion))
                 failv(0, "Inconsistent interface versions.  Workunit was created using eclcc for version %u, but the c++ compiler used version %u", eclccCodeVersion, process->getActivityVersion());

+ 1 - 0
esp/scm/ws_workunits.ecm

@@ -602,6 +602,7 @@ ESPrequest WURunRequest
     bool NoRootTag(0);
     ESParray<ESPstruct NamedValue> DebugValues;
     ESParray<ESPstruct NamedValue> Variables;
+    [min_ver("1.56")] ESParray<ESPstruct ApplicationValue> ApplicationValues;
     ESPenum WUExceptionSeverity ExceptionSeverity("info");
 };
 

+ 23 - 11
esp/services/ws_workunits/ws_workunitsHelpers.cpp

@@ -2971,7 +2971,7 @@ void WsWuHelpers::setXmlParameters(IWorkUnit *wu, const char *xml, IArrayOf<ICon
 }
 
 void WsWuHelpers::submitWsWorkunit(IEspContext& context, IConstWorkUnit* cw, const char* cluster, const char* snapshot, int maxruntime, bool compile, bool resetWorkflow, bool resetVariables,
-    const char *paramXml, IArrayOf<IConstNamedValue> *variables, IArrayOf<IConstNamedValue> *debugs)
+    const char *paramXml, IArrayOf<IConstNamedValue> *variables, IArrayOf<IConstNamedValue> *debugs, IArrayOf<IConstApplicationValue> *applications)
 {
     ensureWsWorkunitAccess(context, *cw, SecAccess_Write);
     switch(cw->getState())
@@ -3026,6 +3026,16 @@ void WsWuHelpers::submitWsWorkunit(IEspContext& context, IConstWorkUnit* cw, con
         }
     }
 
+    if (applications)
+    {
+        ForEachItemIn(ii, *applications)
+        {
+            IConstApplicationValue& item = applications->item(ii);
+            if(notEmpty(item.getApplication()) && notEmpty(item.getName()))
+                wu->setApplicationValue(item.getApplication(), item.getName(), item.getValue(), true);
+        }
+    }
+
     if (resetWorkflow)
         wu->resetWorkflow();
     if (!compile)
@@ -3060,13 +3070,13 @@ void WsWuHelpers::submitWsWorkunit(IEspContext& context, IConstWorkUnit* cw, con
 }
 
 void WsWuHelpers::submitWsWorkunit(IEspContext& context, const char *wuid, const char* cluster, const char* snapshot, int maxruntime, bool compile, bool resetWorkflow, bool resetVariables,
-    const char *paramXml, IArrayOf<IConstNamedValue> *variables, IArrayOf<IConstNamedValue> *debugs)
+    const char *paramXml, IArrayOf<IConstNamedValue> *variables, IArrayOf<IConstNamedValue> *debugs, IArrayOf<IConstApplicationValue> *applications)
 {
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory(context.querySecManager(), context.queryUser());
     Owned<IConstWorkUnit> cw = factory->openWorkUnit(wuid);
     if(!cw)
         throw MakeStringException(ECLWATCH_CANNOT_OPEN_WORKUNIT,"Cannot open workunit %s.",wuid);
-    return submitWsWorkunit(context, cw, cluster, snapshot, maxruntime, compile, resetWorkflow, resetVariables, paramXml, variables, debugs);
+    return submitWsWorkunit(context, cw, cluster, snapshot, maxruntime, compile, resetWorkflow, resetVariables, paramXml, variables, debugs, applications);
 }
 
 
@@ -3083,24 +3093,24 @@ void WsWuHelpers::copyWsWorkunit(IEspContext &context, IWorkUnit &wu, const char
 }
 
 void WsWuHelpers::runWsWorkunit(IEspContext &context, StringBuffer &wuid, const char *srcWuid, const char *cluster, const char *paramXml,
-    IArrayOf<IConstNamedValue> *variables, IArrayOf<IConstNamedValue> *debugs)
+    IArrayOf<IConstNamedValue> *variables, IArrayOf<IConstNamedValue> *debugs, IArrayOf<IConstApplicationValue> *applications)
 {
     NewWsWorkunit wu(context);
     wuid.set(wu->queryWuid());
     copyWsWorkunit(context, *wu, srcWuid);
     wu.clear();
 
-    submitWsWorkunit(context, wuid.str(), cluster, NULL, 0, false, true, true, paramXml, variables, debugs);
+    submitWsWorkunit(context, wuid.str(), cluster, NULL, 0, false, true, true, paramXml, variables, debugs, applications);
 }
 
 void WsWuHelpers::runWsWorkunit(IEspContext &context, IConstWorkUnit *cw, const char *srcWuid, const char *cluster, const char *paramXml,
-    IArrayOf<IConstNamedValue> *variables, IArrayOf<IConstNamedValue> *debugs)
+    IArrayOf<IConstNamedValue> *variables, IArrayOf<IConstNamedValue> *debugs, IArrayOf<IConstApplicationValue> *applications)
 {
     WorkunitUpdate wu(&cw->lock());
     copyWsWorkunit(context, *wu, srcWuid);
     wu.clear();
 
-    submitWsWorkunit(context, cw, cluster, NULL, 0, false, true, true, paramXml, variables, debugs);
+    submitWsWorkunit(context, cw, cluster, NULL, 0, false, true, true, paramXml, variables, debugs, applications);
 }
 
 IException * WsWuHelpers::noteException(IWorkUnit *wu, IException *e, ErrorSeverity level)
@@ -3131,7 +3141,8 @@ StringBuffer & WsWuHelpers::resolveQueryWuid(StringBuffer &wuid, const char *que
     return wuid.append(q->queryProp("@wuid"));
 }
 
-void WsWuHelpers::runWsWuQuery(IEspContext &context, IConstWorkUnit *cw, const char *queryset, const char *query, const char *cluster, const char *paramXml)
+void WsWuHelpers::runWsWuQuery(IEspContext &context, IConstWorkUnit *cw, const char *queryset, const char *query,
+    const char *cluster, const char *paramXml, IArrayOf<IConstApplicationValue> *applications)
 {
     StringBuffer srcWuid;
 
@@ -3140,10 +3151,11 @@ void WsWuHelpers::runWsWuQuery(IEspContext &context, IConstWorkUnit *cw, const c
     copyWsWorkunit(context, *wu, srcWuid);
     wu.clear();
 
-    submitWsWorkunit(context, cw, cluster, NULL, 0, false, true, true, paramXml);
+    submitWsWorkunit(context, cw, cluster, NULL, 0, false, true, true, paramXml, NULL, NULL, applications);
 }
 
-void WsWuHelpers::runWsWuQuery(IEspContext &context, StringBuffer &wuid, const char *queryset, const char *query, const char *cluster, const char *paramXml)
+void WsWuHelpers::runWsWuQuery(IEspContext &context, StringBuffer &wuid, const char *queryset, const char *query,
+    const char *cluster, const char *paramXml, IArrayOf<IConstApplicationValue> *applications)
 {
     StringBuffer srcWuid;
 
@@ -3153,7 +3165,7 @@ void WsWuHelpers::runWsWuQuery(IEspContext &context, StringBuffer &wuid, const c
     copyWsWorkunit(context, *wu, srcWuid);
     wu.clear();
 
-    submitWsWorkunit(context, wuid.str(), cluster, NULL, 0, false, true, true, paramXml);
+    submitWsWorkunit(context, wuid.str(), cluster, NULL, 0, false, true, true, paramXml, NULL, NULL, applications);
 }
 
 void WsWuHelpers::checkAndTrimWorkunit(const char* methodName, StringBuffer& input)

+ 8 - 6
esp/services/ws_workunits/ws_workunitsHelpers.hpp

@@ -478,19 +478,21 @@ namespace WsWuHelpers
 {
     void setXmlParameters(IWorkUnit *wu, const char *xml, bool setJobname=false);
     void submitWsWorkunit(IEspContext& context, IConstWorkUnit* cw, const char* cluster, const char* snapshot, int maxruntime, bool compile, bool resetWorkflow, bool resetVariables,
-            const char *paramXml=NULL, IArrayOf<IConstNamedValue> *variables=NULL, IArrayOf<IConstNamedValue> *debugs=NULL);
+            const char *paramXml=NULL, IArrayOf<IConstNamedValue> *variables=NULL, IArrayOf<IConstNamedValue> *debugs=NULL, IArrayOf<IConstApplicationValue> *applications=NULL);
     void setXmlParameters(IWorkUnit *wu, const char *xml, IArrayOf<IConstNamedValue> *variables, bool setJobname=false);
     void submitWsWorkunit(IEspContext& context, const char *wuid, const char* cluster, const char* snapshot, int maxruntime, bool compile, bool resetWorkflow, bool resetVariables,
-            const char *paramXml=NULL, IArrayOf<IConstNamedValue> *variables=NULL, IArrayOf<IConstNamedValue> *debugs=NULL);
+            const char *paramXml=NULL, IArrayOf<IConstNamedValue> *variables=NULL, IArrayOf<IConstNamedValue> *debugs=NULL, IArrayOf<IConstApplicationValue> *applications=NULL);
     void copyWsWorkunit(IEspContext &context, IWorkUnit &wu, const char *srcWuid);
     void runWsWorkunit(IEspContext &context, StringBuffer &wuid, const char *srcWuid, const char *cluster, const char *paramXml=NULL,
-            IArrayOf<IConstNamedValue> *variables=NULL, IArrayOf<IConstNamedValue> *debugs=NULL);
+            IArrayOf<IConstNamedValue> *variables=NULL, IArrayOf<IConstNamedValue> *debugs=NULL, IArrayOf<IConstApplicationValue> *applications=NULL);
     void runWsWorkunit(IEspContext &context, IConstWorkUnit *cw, const char *srcWuid, const char *cluster, const char *paramXml=NULL,
-            IArrayOf<IConstNamedValue> *variables=NULL, IArrayOf<IConstNamedValue> *debugs=NULL);
+            IArrayOf<IConstNamedValue> *variables=NULL, IArrayOf<IConstNamedValue> *debugs=NULL, IArrayOf<IConstApplicationValue> *applications=NULL);
     IException * noteException(IWorkUnit *wu, IException *e, ErrorSeverity level=SeverityError);
     StringBuffer & resolveQueryWuid(StringBuffer &wuid, const char *queryset, const char *query, bool notSuspended=true, IWorkUnit *wu=NULL);
-    void runWsWuQuery(IEspContext &context, IConstWorkUnit *cw, const char *queryset, const char *query, const char *cluster, const char *paramXml=NULL);
-    void runWsWuQuery(IEspContext &context, StringBuffer &wuid, const char *queryset, const char *query, const char *cluster, const char *paramXml=NULL);
+    void runWsWuQuery(IEspContext &context, IConstWorkUnit *cw, const char *queryset, const char *query, const char *cluster, const char *paramXml=NULL,
+            IArrayOf<IConstApplicationValue> *applications=NULL);
+    void runWsWuQuery(IEspContext &context, StringBuffer &wuid, const char *queryset, const char *query, const char *cluster, const char *paramXml=NULL,
+            IArrayOf<IConstApplicationValue> *applications=NULL);
     void checkAndTrimWorkunit(const char* methodName, StringBuffer& input);
 };
 

+ 6 - 3
esp/services/ws_workunits/ws_workunitsService.cpp

@@ -987,15 +987,18 @@ bool CWsWorkunitsEx::onWURun(IEspContext &context, IEspWURunRequest &req, IEspWU
                 throw MakeStringException(ECLWATCH_INVALID_INPUT, "Invalid Workunit ID: %s", runWuid);
 
             if (req.getCloneWorkunit())
-                WsWuHelpers::runWsWorkunit(context, wuid, runWuid, cluster, req.getInput(), &req.getVariables(), &req.getDebugValues());
+                WsWuHelpers::runWsWorkunit(context, wuid, runWuid, cluster, req.getInput(), &req.getVariables(),
+                    &req.getDebugValues(), &req.getApplicationValues());
             else
             {
-                WsWuHelpers::submitWsWorkunit(context, runWuid, cluster, NULL, 0, false, true, true, req.getInput(), &req.getVariables(), &req.getDebugValues());
+                WsWuHelpers::submitWsWorkunit(context, runWuid, cluster, NULL, 0, false, true, true, req.getInput(),
+                    &req.getVariables(), &req.getDebugValues(), &req.getApplicationValues());
                 wuid.set(runWuid);
             }
         }
         else if (notEmpty(req.getQuerySet()) && notEmpty(req.getQuery()))
-            WsWuHelpers::runWsWuQuery(context, wuid, req.getQuerySet(), req.getQuery(), cluster, req.getInput());
+            WsWuHelpers::runWsWuQuery(context, wuid, req.getQuerySet(), req.getQuery(), cluster, req.getInput(),
+                &req.getApplicationValues());
         else
             throw MakeStringException(ECLWATCH_MISSING_PARAMS,"Workunit or Query required");
 

+ 94 - 4
plugins/mysql/mysqlembed.cpp

@@ -961,6 +961,76 @@ protected:
 
 // Each call to a MySQL function will use a new MySQLEmbedFunctionContext object
 
+static __thread ThreadTermFunc threadHookChain;
+static __thread MySQLConnection *cachedConnection = NULL;
+static __thread const char *cachedServer = NULL;
+static __thread const char *cachedUser = NULL;
+static __thread const char *cachedPassword = NULL;
+static __thread const char *cachedDatabase = NULL;
+static __thread unsigned cachedPort = 0;
+
+static bool cachedConnectionMatches(const char *server, unsigned port, const char *user, const char *password, const char *database)
+{
+    return streq(server, cachedServer) && port==cachedPort && streq(user, cachedUser) && streq(password, cachedPassword) && streq(database, cachedDatabase);
+}
+
+static void clearCache()
+{
+    ::Release(cachedConnection);
+    cachedConnection = NULL;
+    free((void *) cachedServer);
+    free((void *) cachedUser);
+    free((void *) cachedPassword);
+    free((void *) cachedDatabase);
+    cachedServer = cachedUser = cachedPassword = cachedDatabase = NULL;
+    cachedPort = 0;
+}
+
+static bool mysqlInitialized = false;
+static __thread bool mysqlThreadInitialized = false;
+static CriticalSection initCrit;
+
+static void terminateMySqlThread()
+{
+    clearCache();
+    mysql_thread_end();
+    mysqlThreadInitialized = false;  // In case it was a threadpool thread...
+    if (threadHookChain)
+    {
+        (*threadHookChain)();
+        threadHookChain = NULL;
+    }
+}
+
+static void initializeMySqlThread()
+{
+    if (!mysqlThreadInitialized)
+    {
+        {
+            CriticalBlock b(initCrit);
+            if (!mysqlInitialized)
+            {
+                mysqlInitialized = true;
+                mysql_library_init(0, NULL, NULL);
+            }
+        }
+        mysql_thread_init();
+        threadHookChain = addThreadTermFunc(terminateMySqlThread);
+        mysqlThreadInitialized = true;
+    }
+}
+
+static void cacheConnection(MySQLConnection *connection, const char *server, unsigned port, const char *user, const char *password, const char *database)
+{
+    clearCache();
+    cachedServer = strdup(server);
+    cachedUser = strdup(user);
+    cachedPassword = strdup(password);
+    cachedDatabase = strdup(database);
+    cachedPort = port;
+    cachedConnection = LINK(connection);
+}
+
 class MySQLEmbedFunctionContext : public CInterfaceOf<IEmbedFunctionContext>
 {
 public:
@@ -971,6 +1041,7 @@ public:
         const char *user = "";
         const char *password = "";
         const char *database = "";
+        bool caching = true;
         unsigned port = 0;
         StringArray opts;
         opts.appendList(options, ",");
@@ -992,13 +1063,32 @@ public:
                     password = val;
                 else if (stricmp(optName, "database")==0)
                     database = val;
+                else if (stricmp(optName, "cache")==0)
+                    caching = clipStrToBool(val);
             }
         }
-        conn.setown(new MySQLConnection(mysql_init(NULL)));
-        if (!mysql_real_connect(*conn, server, user, password, database, port, NULL, 0))
+        initializeMySqlThread();
+        if (caching && cachedConnection && cachedConnectionMatches(server, port, user, password, database))
+        {
+            conn.set(cachedConnection);
+        }
+        else
         {
-            VStringBuffer err("mysql: failed to connect (%s)", mysql_error(*conn));
-            rtlFail(0, err.str());
+            if (cachedConnection)
+            {
+                ::Release(cachedConnection);
+                cachedConnection = NULL;
+            }
+            conn.setown(new MySQLConnection(mysql_init(NULL)));
+            if (!mysql_real_connect(*conn, server, user, password, database, port, NULL, 0))
+            {
+                VStringBuffer err("mysql: failed to connect (%s)", mysql_error(*conn));
+                rtlFail(0, err.str());
+            }
+            if (caching)
+            {
+                cacheConnection(conn, server, port, user, password, database);
+            }
         }
     }
     virtual bool getBooleanResult()

+ 1 - 0
roxie/ccd/ccdcontext.cpp

@@ -2788,6 +2788,7 @@ public:
     virtual void process()
     {
         MTIME_SECTION(myTimer, "Process");
+        QueryTerminationCleanup threadCleanup;
         EclProcessFactory pf = (EclProcessFactory) factory->queryDll()->getEntry("createProcess");
         Owned<IEclProcess> p = pf();
         try

+ 11 - 3
roxie/ccd/ccdlistener.cpp

@@ -1444,7 +1444,7 @@ private:
             // convert to XML with attribute values in single quotes - makes replaying queries easier
             uid = queryXML->queryProp("@uid");
             if (!uid)
-                uid = "-";
+                uid = queryXML->queryProp("_TransactionId");
             isBlind = queryXML->getPropBool("@blind", false) || queryXML->getPropBool("_blind", false);
             isDebug = queryXML->getPropBool("@debug") || queryXML->getPropBool("_Probe", false);
             toXML(queryXML, saniText, 0, isBlind ? (XML_SingleQuoteAttributeValues | XML_Sanitize) : XML_SingleQuoteAttributeValues);
@@ -1645,8 +1645,15 @@ readAnother:
                 bool isRequestArray = false;
                 bool isBlind = false;
                 bool isDebug = false;
-
+                const char *uid = NULL;
                 sanitizeQuery(queryXml, queryName, sanitizedText, httpHelper, uid, isRequest, isRequestArray, isBlind, isDebug);
+                if (uid)
+                {
+                    logctx.set(ep.getIpText(ctxstr).appendf(":%u{%s}", ep.port, uid).str());
+                    ctxstr.clear();
+                }
+                else
+                    uid = "-";
                 pool->checkAccess(peer, queryName, sanitizedText, isBlind);
                 if (isDebug)
                 {
@@ -1732,7 +1739,8 @@ readAnother:
                             {
                                 // we need to reparse input xml, as global whitespace setting has been overridden
                                 parseQueryPTFromString(queryXml, httpHelper, rawText.str(), (PTreeReaderOptions)(xmlReadFlags | ptr_ignoreNameSpaces));
-                                sanitizeQuery(queryXml, queryName, sanitizedText, httpHelper, uid, isRequest, isRequestArray, isBlind, isDebug);
+                                const char *dummy;
+                                sanitizeQuery(queryXml, queryName, sanitizedText, httpHelper, dummy, isRequest, isRequestArray, isBlind, isDebug);
                             }
                             IArrayOf<IPropertyTree> requestArray;
                             if (isHTTP)

+ 11 - 10
system/jlib/jthread.cpp

@@ -56,6 +56,15 @@ ThreadTermFunc addThreadTermFunc(ThreadTermFunc onTerm)
     return old;
 }
 
+void callThreadTerminationHooks()
+{
+    if (threadTerminationHook)
+    {
+        (*threadTerminationHook)();
+        threadTerminationHook = NULL;
+    }
+}
+
 PointerArray *exceptionHandlers = NULL;
 MODULE_INIT(INIT_PRIORITY_JTHREAD)
 {
@@ -275,11 +284,7 @@ int Thread::begin()
         handleException(MakeStringException(0, "Unknown exception in Thread %s", getName()));
     }
 #endif
-    if (threadTerminationHook)
-    {
-        (*threadTerminationHook)();
-        threadTerminationHook = NULL;
-    }
+    callThreadTerminationHooks();
 #ifdef _WIN32
 #ifndef _DEBUG
     CloseHandle(hThread);   // leak handle when debugging, 
@@ -866,11 +871,7 @@ public:
                 handleException(MakeStringException(0, "Unknown exception in Thread from pool %s", parent.poolname.get()));
             }
 #endif
-            if (threadTerminationHook)
-            {
-                (*threadTerminationHook)();    // Reset any pre-thread state.
-                threadTerminationHook = NULL;
-            }
+            callThreadTerminationHooks();    // Reset any pre-thread state.
         } while (parent.notifyStopped(this));
         return 0;
     }

+ 8 - 0
system/jlib/jthread.hpp

@@ -62,6 +62,14 @@ extern jlib_decl unsigned threadLogID();  // for use in logging
 
 typedef void (*ThreadTermFunc)();
 extern jlib_decl ThreadTermFunc addThreadTermFunc(ThreadTermFunc onTerm);
+extern jlib_decl void callThreadTerminationHooks();
+
+//An exception safe way of ensuring that the thread termination hooks are called.
+class jlib_decl QueryTerminationCleanup
+{
+public:
+    inline ~QueryTerminationCleanup() { callThreadTerminationHooks(); }
+};
 
 class jlib_decl Thread : public CInterface, public IThread
 {

+ 4 - 0
system/security/LdapSecurity/CMakeLists.txt

@@ -24,6 +24,10 @@
 
 project( LdapSecurity ) 
 
+if (APPLE AND CMAKE_COMPILER_IS_CLANG)
+  SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
+endif()
+
 set (    SRCS 
          ../shared/authmap.cpp 
          ../shared/caching.cpp 

+ 1 - 1
testing/regress/ecl/key/mysqlembed.xml

@@ -21,7 +21,7 @@
  <Row><name>name2</name><value>2</value><boolval>false</boolval><r8>5.6</r8><r4>7.800000190734863</r4><d>3030</d><ddd>-1234567.89</ddd><u1>là</u1><u2>là      </u2><dt>2015-12-25 01:23:45</dt></Row>
 </Dataset>
 <Dataset name='Result 7'>
- <Row><Result_7>2</Result_7></Row>
+ <Row><Result_7>4</Result_7></Row>
 </Dataset>
 <Dataset name='Result 8'>
  <Row><Result_8>true</Result_8></Row>

+ 23 - 20
testing/regress/ecl/mysqlembed.ecl

@@ -20,6 +20,7 @@
 
 IMPORT mysql;
 
+myServer := 'localhost' : stored('myServer');
 myUser := 'rchapman' : stored('myUser');
 myDb := 'test' : stored('myDb');
 
@@ -47,31 +48,31 @@ END;
 init := DATASET([{'name1', 1, true, 1.2, 3.4, D'aa55aa55', 1234567.89, U'Straße', U'Straße'},
                  {'name2', 2, false, 5.6, 7.8, D'00', -1234567.89, U'là', U'là', '2015-12-25 01:23:45' }], childrec);
 
-drop() := EMBED(mysql : user('rchapman'),database('test'))
+drop() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   DROP TABLE IF EXISTS tbl1;
 ENDEMBED;
 
-create() := EMBED(mysql : user('rchapman'),database('test'))
+create() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   CREATE TABLE tbl1 ( name VARCHAR(20), value INT, boolval TINYINT, r8 DOUBLE, r4 FLOAT, d BLOB, ddd DECIMAL(10,2), u1 VARCHAR(10), u2 VARCHAR(10), dt DATETIME );
 ENDEMBED;
 
-initialize(dataset(childrec) values) := EMBED(mysql : user(myUser),database(myDb))
+initialize(dataset(childrec) values) := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   INSERT INTO tbl1 values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
 ENDEMBED;
 
-initializeNulls() := EMBED(mysql : user('rchapman'),database(myDb))
+initializeNulls() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   INSERT INTO tbl1 (name) values ('nulls');
 ENDEMBED;
 
-initializeUtf8() := EMBED(mysql : user(myUser),database('test'))
+initializeUtf8() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   INSERT INTO tbl1 values ('utf8test', 1, 1, 1.2, 3.4, 'aa55aa55', 1234567.89, 'Straße', 'Straße', '2019-02-01 23:59:59');
 ENDEMBED;
 
-dataset(childrec) testMySQLDS() := EMBED(mysql : user('rchapman'),database('test'))
+dataset(childrec) testMySQLDS() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT * from tbl1;
 ENDEMBED;
 
-childrec testMySQLRow() := EMBED(mysql : user('rchapman'),database('test'))
+childrec testMySQLRow() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT * from tbl1 LIMIT 1;
 ENDEMBED;
 
@@ -83,47 +84,47 @@ childrec testMySQLParms(
    real4 r4,
    DATA d,
    UTF8 u1,
-   UNICODE8 u2) := EMBED(mysql : user('rchapman'),database('test'))
+   UNICODE8 u2) := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT * from tbl1 WHERE name=? AND value=? AND boolval=? AND r8=? AND r4=? AND d=? AND u1=? AND u2=?;
 ENDEMBED;
 
-string testMySQLString() := EMBED(mysql : user('rchapman'),database('test'))
+string testMySQLString() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT max(name) from tbl1;
 ENDEMBED;
 
-dataset(childrec) testMySQLStringParam(string filter) := EMBED(mysql : user('rchapman'),database('test'))
+dataset(childrec) testMySQLStringParam(string filter) := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT * from tbl1 where name = ?;
 ENDEMBED;
 
-dataset(childrec) testMySQLDSParam(dataset(stringrec) inrecs) := EMBED(mysql : user('rchapman'),database('test'))
+dataset(childrec) testMySQLDSParam(dataset(stringrec) inrecs) := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT * from tbl1 where name = ?;
 ENDEMBED;
 
-integer testMySQLInt() := EMBED(mysql : user('rchapman'),database('test'))
+integer testMySQLInt() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT max(value) from tbl1;
 ENDEMBED;
 
-boolean testMySQLBool() := EMBED(mysql : user('rchapman'),database('test'))
+boolean testMySQLBool() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT max(boolval) from tbl1;
 ENDEMBED;
 
-real8 testMySQLReal8() := EMBED(mysql : user('rchapman'),database('test'))
+real8 testMySQLReal8() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT max(r8) from tbl1;
 ENDEMBED;
 
-real4 testMySQLReal4() := EMBED(mysql : user('rchapman'),database('test'))
+real4 testMySQLReal4() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT max(r4) from tbl1;
 ENDEMBED;
 
-data testMySQLData() := EMBED(mysql : user('rchapman'),database('test'))
+data testMySQLData() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT max(d) from tbl1;
 ENDEMBED;
 
-UTF8 testMySQLUtf8() := EMBED(mysql : user('rchapman'),database('test'))
+UTF8 testMySQLUtf8() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT max(u1) from tbl1;
 ENDEMBED;
 
-UNICODE testMySQLUnicode() := EMBED(mysql : user('rchapman'),database('test'))
+UNICODE testMySQLUnicode() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT max(u2) from tbl1;
 ENDEMBED;
 
@@ -132,7 +133,7 @@ datetimerec := RECORD
    STRING19 dt2;
 END;
 
-dataset(datetimerec) testMySQLDateTime() := EMBED(mysql : user('rchapman'),database('test'))
+dataset(datetimerec) testMySQLDateTime() := EMBED(mysql : server(myServer),user(myUser),database(myDB))
   SELECT dt, dt from tbl1;
 ENDEMBED;
 
@@ -143,13 +144,14 @@ sequential (
   initialize(init),
   initializeNulls(),
   initializeUtf8(),
+  PARALLEL (
   OUTPUT(testMySQLDS()),
   OUTPUT(testMySQLRow().name),
   OUTPUT(testMySQLParms('name1', 1, true, 1.2, 3.4, D'aa55aa55', U'Straße', U'Straße')),
   OUTPUT(testMySQLString()),
   OUTPUT(testMySQLStringParam(testMySqlString())),
   OUTPUT(testMySQLDSParam(PROJECT(init, extractName(LEFT)))),
-  OUTPUT(testMySQLInt()),
+    OUTPUT(testMySQLInt()+testMySQLInt()),
   OUTPUT(testMySQLBool()),
   OUTPUT(testMySQLReal8()),
   OUTPUT(testMySQLReal4()),
@@ -157,4 +159,5 @@ sequential (
   OUTPUT(testMySQLUtf8()),
   OUTPUT(testMySQLUnicode()),
   OUTPUT(testMySQLDateTime())
+  )
 );

+ 4 - 0
tools/initldap/CMakeLists.txt

@@ -25,6 +25,10 @@
 
 project( initldap )
 
+if (APPLE AND CMAKE_COMPILER_IS_CLANG)
+  SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
+endif()
+
 set (    SRCS
          initldap.cpp
     )