Browse Source

HPCC-17680 Add scope and priority to warnings/errors

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 8 years ago
parent
commit
49e3121af2

+ 50 - 19
common/workunit/workunit.cpp

@@ -1828,25 +1828,29 @@ public:
     IMPLEMENT_IINTERFACE;
     CLocalWUException(IPropertyTree *p);
 
-    virtual IStringVal& getExceptionSource(IStringVal &str) const;
-    virtual IStringVal& getExceptionMessage(IStringVal &str) const;
-    virtual unsigned    getExceptionCode() const;
-    virtual ErrorSeverity getSeverity() const;
-    virtual IStringVal & getTimeStamp(IStringVal & dt) const;
-    virtual IStringVal & getExceptionFileName(IStringVal & str) const;
-    virtual unsigned    getExceptionLineNo() const;
-    virtual unsigned    getExceptionColumn() const;
-    virtual unsigned    getActivityId() const;
-    virtual unsigned    getSequence() const;
-    virtual void        setExceptionSource(const char *str);
-    virtual void        setExceptionMessage(const char *str);
-    virtual void        setExceptionCode(unsigned code);
-    virtual void        setSeverity(ErrorSeverity level);
-    virtual void        setTimeStamp(const char * dt);
-    virtual void        setExceptionFileName(const char *str);
-    virtual void        setExceptionLineNo(unsigned r);
-    virtual void        setExceptionColumn(unsigned c);
-    virtual void        setActivityId(unsigned _id);
+    virtual IStringVal& getExceptionSource(IStringVal &str) const override;
+    virtual IStringVal& getExceptionMessage(IStringVal &str) const override;
+    virtual unsigned    getExceptionCode() const override;
+    virtual ErrorSeverity getSeverity() const override;
+    virtual IStringVal & getTimeStamp(IStringVal & dt) const override;
+    virtual IStringVal & getExceptionFileName(IStringVal & str) const override;
+    virtual unsigned    getExceptionLineNo() const override;
+    virtual unsigned    getExceptionColumn() const override;
+    virtual unsigned    getActivityId() const override;
+    virtual unsigned    getSequence() const override;
+    virtual const char * queryScope() const override;
+    virtual unsigned    getPriority() const override;
+    virtual void        setExceptionSource(const char *str) override;
+    virtual void        setExceptionMessage(const char *str) override;
+    virtual void        setExceptionCode(unsigned code) override;
+    virtual void        setSeverity(ErrorSeverity level) override;
+    virtual void        setTimeStamp(const char * dt) override;
+    virtual void        setExceptionFileName(const char *str) override;
+    virtual void        setExceptionLineNo(unsigned r) override;
+    virtual void        setExceptionColumn(unsigned c) override;
+    virtual void        setActivityId(unsigned _id) override;
+    virtual void        setScope(const char * _scope) override;
+    virtual void        setPriority(unsigned _priority) override;
 };
 
 //==========================================================================================
@@ -8729,6 +8733,13 @@ unsigned CLocalWUException::getExceptionColumn() const
 
 unsigned CLocalWUException::getActivityId() const
 {
+    const char * scope = queryScope();
+    if (scope)
+    {
+        const char * colon = strrchr(scope, ':');
+        if (colon && hasPrefix(colon+1, ActivityScopePrefix, true))
+            return atoi(colon+1+strlen(ActivityScopePrefix));
+    }
     return p->getPropInt("@activity", 0);
 }
 
@@ -8737,6 +8748,16 @@ unsigned CLocalWUException::getSequence() const
     return p->getPropInt("@sequence", 0);
 }
 
+const char * CLocalWUException::queryScope() const
+{
+    return p->queryProp("@scope");
+}
+
+unsigned CLocalWUException::getPriority() const
+{
+    return p->getPropInt("@prio", 0);
+}
+
 void CLocalWUException::setExceptionSource(const char *str)
 {
     p->setProp("@source", str);
@@ -8782,6 +8803,16 @@ void CLocalWUException::setActivityId(unsigned _id)
     p->setPropInt("@activity", _id);
 }
 
+void CLocalWUException::setScope(const char * _scope)
+{
+    p->setProp("@scope", _scope);
+}
+
+void CLocalWUException::setPriority(unsigned _priority)
+{
+    p->setPropInt("@prio", _priority);
+}
+
 //==========================================================================================
 
 CLocalWUAppValue::CLocalWUAppValue(IPropertyTree *props, unsigned child) : p(props)

+ 4 - 0
common/workunit/workunit.hpp

@@ -507,6 +507,8 @@ interface IConstWUException : extends IInterface
     virtual unsigned getExceptionColumn() const = 0;
     virtual unsigned getSequence() const = 0;
     virtual unsigned getActivityId() const = 0;
+    virtual const char * queryScope() const = 0;
+    virtual unsigned getPriority() const = 0;  // For ordering within a severity - e.g. warnings about inefficiency
 };
 
 
@@ -521,6 +523,8 @@ interface IWUException : extends IConstWUException
     virtual void setExceptionLineNo(unsigned r) = 0;
     virtual void setExceptionColumn(unsigned c) = 0;
     virtual void setActivityId(unsigned _id) = 0;
+    virtual void setScope(const char * _scope) = 0;
+    virtual void setPriority(unsigned _priority) = 0;
 };
 
 

+ 2 - 0
ecl/hql/hqlwuerr.cpp

@@ -76,6 +76,8 @@ void WorkUnitErrorReceiver::report(IError* eclError)
                     eclError->getFilename(), eclError->getLine(), eclError->getColumn(), eclError->getPosition());
     if (eclError->getActivity())
         exception->setActivityId(eclError->getActivity());
+    if (eclError->queryScope())
+        exception->setScope(eclError->queryScope());
 }
 
 size32_t WorkUnitErrorReceiver::errCount()

+ 15 - 3
ecl/hqlcpp/hqlcpp.cpp

@@ -2107,14 +2107,26 @@ void HqlCppTranslator::doReportWarning(WarnErrorCategory category, ErrorSeverity
     if (!location)
         location = queryActiveActivityLocation();
     unsigned activity = 0;
+    const char * scope = nullptr;
+    StringBuffer scopeText;
     if (activeActivities.ordinality())
-        activity = activeActivities.tos().queryActivityId();
+    {
+        ABoundActivity & top = activeActivities.tos();
+        activity = top.queryActivityId();
+        ActivityInstance * active = top.queryActive();
+        dbgassertex(active);
+        if (active)
+        {
+            active->getScope(scopeText);
+            scope = scopeText;
+        }
+    }
 
     ErrorSeverity severity = (explicitSeverity == SeverityUnknown) ? queryDefaultSeverity(category) : explicitSeverity;
     if (location)
-        warnError.setown(createError(category, severity, id, msg, str(location->querySourcePath()), location->getStartLine(), location->getStartColumn(), 0, activity));
+        warnError.setown(createError(category, severity, id, msg, str(location->querySourcePath()), location->getStartLine(), location->getStartColumn(), 0, activity, scope));
     else
-        warnError.setown(createError(category, severity, id, msg, activity));
+        warnError.setown(createError(category, severity, id, msg, activity, scope));
 
     errorProcessor->report(warnError);
 }

+ 4 - 0
ecl/hqlcpp/hqlcppc.hpp

@@ -57,6 +57,7 @@ public:
     virtual bool buildReadAhead(HqlCppTranslator & translator, BuildCtx & ctx, ReadAheadState & state) = 0;
 };
 
+class ActivityInstance;
 class HQLCPP_API ABoundActivity : public IInterface, public CInterface
 {
 public:
@@ -75,6 +76,8 @@ public:
     inline unsigned queryContainerId() const { return containerId; }
     inline unsigned queryGraphId() const { return graphId; }
     inline unsigned nextOutputCount() { return outputCount++; }
+    inline void setActive(ActivityInstance * _active) { active = _active; }
+    inline ActivityInstance * queryActive() const { return active; }
     IHqlDelayedCodeGenerator * createOutputCountCallback();
 
     void updateActivityKind(ThorActivityKind newKind) { kind = newKind; }
@@ -83,6 +86,7 @@ private:
     ThorActivityKind        kind;
     HqlExprAttr             represents;
     HqlExprAttr             bound;
+    ActivityInstance *      active = nullptr; // points at the active instance while the activity is being generated
     unsigned                activityId;
     unsigned                containerId;
     unsigned                graphId;

+ 2 - 0
ecl/hqlcpp/hqlhtcpp.cpp

@@ -1824,10 +1824,12 @@ ActivityInstance::ActivityInstance(HqlCppTranslator & _translator, BuildCtx & ct
     }
 
     table = new ThorBoundActivity(dataset, boundName, activityId, containerId, translator.curSubGraphId(ctx), kind);
+    table->setActive(this);
 }
 
 ActivityInstance::~ActivityInstance()
 {
+    table->setActive(nullptr);
     table->Release();
 }
 

+ 6 - 1
esp/scm/ecldirect.ecm

@@ -25,6 +25,8 @@ ESPStruct [nil_remove] ECLDirectException
     int LineNo;
     int Column;
     int Activity;
+    [min_version("1.01")] string Scope;
+    [min_version("1.01")] int Priority;
 };
 
 ESPrequest RunEclRequest
@@ -73,7 +75,10 @@ ESPresponse [nil_remove] RunEclExResponse
 };
 
 
-ESPservice [auth_feature("DEFERRED")]EclDirect
+ESPservice [
+    auth_feature("DEFERRED"),
+    version("1.01"), default_client_version("1.01")
+    ] EclDirect
 {
     ESPmethod RunEcl(RunEclRequest, RunEclResponse);
     ESPmethod RunEclEx(RunEclExRequest, RunEclExResponse);

+ 3 - 1
esp/scm/ws_workunits.ecm

@@ -46,6 +46,8 @@ ESPStruct [nil_remove] ECLException
     int LineNo;
     int Column;
     [min_ver("1.63")] int Activity;
+    [min_ver("1.69")] string Scope;
+    [min_ver("1.69")] int Priority;
 };
 //  ===========================================================================
 ESPStruct [nil_remove] ECLSchemaItem
@@ -1818,7 +1820,7 @@ ESPresponse [exceptions_inline, nil_remove] WUGetNumFileToCopyResponse
 
 ESPservice [
     auth_feature("DEFERRED"), //This declares that the method logic handles feature level authorization
-    version("1.68"), default_client_version("1.68"),
+    version("1.69"), default_client_version("1.69"),
     noforms,exceptions_inline("./smc_xslt/exceptions.xslt"),use_method_name] WsWorkunits
 {
     ESPmethod [resp_xsl_default("/esp/xslt/workunits.xslt")]     WUQuery(WUQueryRequest, WUQueryResponse);

+ 3 - 0
esp/services/ecldirect/EclDirectService.cpp

@@ -49,6 +49,9 @@ EclDirectWUExceptions::EclDirectWUExceptions(IConstWorkUnit& cw)
         e->setLineNo(item.getExceptionLineNo());
         e->setColumn(item.getExceptionColumn());
         e->setActivity(item.getActivityId());
+        if (item.getPriority())
+            e->setPriority(item.getPriority());
+        e->setScope(item.queryScope());
 
         switch (it->query().getSeverity())
         {

+ 3 - 0
esp/services/ws_workunits/ws_workunitsHelpers.cpp

@@ -159,6 +159,9 @@ WsWUExceptions::WsWUExceptions(IConstWorkUnit& wu): numerr(0), numwrn(0), numinf
         e->setColumn(cur.getExceptionColumn());
         if (cur.getActivityId())
             e->setActivity(cur.getActivityId());
+        if (cur.getPriority())
+            e->setPriority(cur.getPriority());
+        e->setScope(cur.queryScope());
 
         const char * label = "";
         switch (cur.getSeverity())

+ 23 - 21
system/jlib/jexcept.cpp

@@ -1438,20 +1438,21 @@ void printStackReport(__int64 startIP)
 class jlib_decl CError : public CInterfaceOf<IError>
 {
 public:
-    CError(WarnErrorCategory _category,ErrorSeverity _severity, int _no, const char* _msg, const char* _filename, int _lineno, int _column, int _position, unsigned _activity);
-
-    virtual int             errorCode() const { return no; }
-    virtual StringBuffer &  errorMessage(StringBuffer & ret) const { return ret.append(msg); }
-    virtual MessageAudience errorAudience() const { return MSGAUD_user; }
-    virtual const char* getFilename() const { return filename; }
-    virtual WarnErrorCategory getCategory() const { return category; }
-    virtual int getLine() const { return lineno; }
-    virtual int getColumn() const { return column; }
-    virtual int getPosition() const { return position; }
-    virtual StringBuffer& toString(StringBuffer&) const;
-    virtual ErrorSeverity getSeverity() const { return severity; }
-    virtual IError * cloneSetSeverity(ErrorSeverity _severity) const;
-    virtual unsigned getActivity() const { return activity; }
+    CError(WarnErrorCategory _category,ErrorSeverity _severity, int _no, const char* _msg, const char* _filename, int _lineno, int _column, int _position, unsigned _activity, const char * _scope);
+
+    virtual int             errorCode() const override { return no; }
+    virtual StringBuffer &  errorMessage(StringBuffer & ret) const override { return ret.append(msg); }
+    virtual MessageAudience errorAudience() const override { return MSGAUD_user; }
+    virtual const char* getFilename() const override { return filename; }
+    virtual WarnErrorCategory getCategory() const override { return category; }
+    virtual int getLine() const override { return lineno; }
+    virtual int getColumn() const override { return column; }
+    virtual int getPosition() const override { return position; }
+    virtual StringBuffer& toString(StringBuffer&) const override;
+    virtual ErrorSeverity getSeverity() const override { return severity; }
+    virtual IError * cloneSetSeverity(ErrorSeverity _severity) const override;
+    virtual unsigned getActivity() const override { return activity; }
+    virtual const char * queryScope() const override { return scope; }
 
 protected:
     ErrorSeverity severity;
@@ -1459,14 +1460,15 @@ protected:
     int no;
     StringAttr msg;
     StringAttr filename;
+    StringAttr scope;
     int lineno;
     int column;
     int position;
     unsigned activity;
 };
 
-CError::CError(WarnErrorCategory _category, ErrorSeverity _severity, int _no, const char* _msg, const char* _filename, int _lineno, int _column, int _position, unsigned _activity)
-    : severity(_severity), category(_category), msg(_msg), filename(_filename), activity(_activity)
+CError::CError(WarnErrorCategory _category, ErrorSeverity _severity, int _no, const char* _msg, const char* _filename, int _lineno, int _column, int _position, unsigned _activity, const char * _scope)
+    : severity(_severity), category(_category), msg(_msg), filename(_filename), scope(_scope), activity(_activity)
 {
     no = _no;
     lineno = _lineno;
@@ -1491,15 +1493,15 @@ IError * CError::cloneSetSeverity(ErrorSeverity newSeverity) const
 {
     return new CError(category, newSeverity,
                          errorCode(), msg, filename,
-                         getLine(), getColumn(), getPosition(), getActivity());
+                         getLine(), getColumn(), getPosition(), getActivity(), queryScope());
 }
 
-IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, const char * filename, int lineno, int column, int pos, unsigned activity)
+IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, const char * filename, int lineno, int column, int pos, unsigned activity, const char * scope)
 {
-    return new CError(category,severity,errNo,msg,filename,lineno,column,pos, activity);
+    return new CError(category,severity,errNo,msg,filename,lineno,column,pos, activity, scope);
 }
 
-IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, unsigned activity)
+IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, unsigned activity, const char * scope)
 {
-    return new CError(category,severity,errNo,msg,nullptr, 0, 0, 0, activity);
+    return new CError(category,severity,errNo,msg,nullptr, 0, 0, 0, activity, scope);
 }

+ 3 - 2
system/jlib/jexcept.hpp

@@ -220,13 +220,14 @@ public:
     virtual ErrorSeverity getSeverity() const = 0;
     virtual IError * cloneSetSeverity(ErrorSeverity _severity) const = 0;
     virtual unsigned getActivity() const = 0;
+    virtual const char * queryScope() const = 0;
 };
 
 inline bool isError(IError * error) { return isError(error->getSeverity()); }
 inline bool isFatal(IError * error) { return isFatal(error->getSeverity()); }
 
-extern jlib_decl IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, const char *filename, int lineno=0, int column=0, int pos=0, unsigned activity = 0);
-extern jlib_decl IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, unsigned activity);
+extern jlib_decl IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, const char *filename, int lineno=0, int column=0, int pos=0, unsigned activity = 0, const char * scope = nullptr);
+extern jlib_decl IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, unsigned activity, const char * scope);
 
 #endif