added convenience wrapper methods ObjectArray::sort and ObjectArray::find; fixed...
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 19 Jun 2017 19:55:25 +0000 (22:55 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 19 Jun 2017 19:55:25 +0000 (22:55 +0300)
include/nms_util.h
include/nxconfig.h
src/db/libnxdb/dbcp.cpp
src/libnetxms/config.cpp
src/server/core/schedule.cpp
src/server/core/tools.cpp
src/server/include/nxcore_schedule.h

index c8a8f5d..f290958 100644 (file)
@@ -723,6 +723,13 @@ public:
        void unlink(int index) { Array::unlink(index); }
    void unlink(T *object) { Array::unlink((void *)object); }
 
+   void sort(int (*cb)(const T **, const T **)) { Array::sort((int (*)(const void *, const void *))cb); }
+   T *find(const T *key, int (*cb)(const T **, const T **)) const
+   {
+      T **result = (T **)Array::find(&key, (int (*)(const void *, const void *))cb);
+      return (result != NULL) ? *result : NULL;
+   }
+
    Iterator<T> *iterator() { return new Iterator<T>(new ArrayIterator(this)); }
 };
 
index 7515f71..b57f3a9 100644 (file)
@@ -55,12 +55,12 @@ public:
        ConfigEntry(const TCHAR *name, ConfigEntry *parent, const Config *owner, const TCHAR *file, int line, int id);
        ~ConfigEntry();
 
-       ConfigEntry *getNext() { return m_next; }
-       ConfigEntry *getParent() { return m_parent; }
+       ConfigEntry *getNext() const { return m_next; }
+       ConfigEntry *getParent() const { return m_parent; }
 
-       const TCHAR *getName() { return m_name; }
-       int getId() { return m_id; }
-       int getValueCount() { return m_valueCount; }
+       const TCHAR *getName() const { return m_name; }
+       int getId() const { return m_id; }
+       int getValueCount() const { return m_valueCount; }
        int getConcatenatedValuesLength();
 
        const TCHAR *getValue(int index = 0);
index 8e45853..8dec714 100644 (file)
@@ -127,10 +127,9 @@ static bool ResetConnection(PoolConnectionInfo *conn)
 /**
  * Callback for sorting reset list
  */
-static int ResetListSortCallback(const void *e1, const void *e2)
+static int ResetListSortCallback(const PoolConnectionInfo **e1, const PoolConnectionInfo **e2)
 {
-   return ((PoolConnectionInfo *)e1)->usageCount > ((PoolConnectionInfo *)e2)->usageCount ? -1 :
-               (((PoolConnectionInfo *)e1)->usageCount == ((PoolConnectionInfo *)e2)->usageCount ? 0 : 1);
+   return (*e1)->usageCount > (*e2)->usageCount ? -1 : ((*e1)->usageCount == (*e2)->usageCount ? 0 : 1);
 }
 
 /**
index 9c39fa2..92619fc 100644 (file)
@@ -281,11 +281,9 @@ ObjectArray<ConfigEntry> *ConfigEntry::getSubEntries(const TCHAR *mask) const
 /**
  * Comparator for ConfigEntryList::sortById()
  */
-static int CompareById(const void *p1, const void *p2)
+static int CompareById(const ConfigEntry **e1, const ConfigEntry **e2)
 {
-   ConfigEntry *e1 = *((ConfigEntry **)p1);
-   ConfigEntry *e2 = *((ConfigEntry **)p2);
-   return e1->getId() - e2->getId();
+   return (*e1)->getId() - (*e2)->getId();
 }
 
 /**
index fa0237d..bad39db 100644 (file)
@@ -139,11 +139,11 @@ void ScheduledTask::update(const TCHAR *taskHandlerId, time_t nextExecution, con
 /**
  * Save task to database
  */
-void ScheduledTask::saveToDatabase(bool newObject)
+void ScheduledTask::saveToDatabase(bool newObject) const
 {
    DB_HANDLE db = DBConnectionPoolAcquireConnection();
-   DB_STATEMENT hStmt;
 
+   DB_STATEMENT hStmt;
    if (newObject)
    {
                hStmt = DBPrepare(db,
@@ -158,22 +158,22 @@ void ScheduledTask::saveToDatabase(bool newObject)
                     _T("WHERE id=?"));
    }
 
-       DBBind(hStmt, 1, DB_SQLTYPE_VARCHAR, m_taskHandlerId, DB_BIND_STATIC);
-       DBBind(hStmt, 2, DB_SQLTYPE_VARCHAR, m_schedule, DB_BIND_STATIC);
-       DBBind(hStmt, 3, DB_SQLTYPE_VARCHAR, m_params, DB_BIND_STATIC);
-       DBBind(hStmt, 4, DB_SQLTYPE_INTEGER, (UINT32)m_executionTime);
-       DBBind(hStmt, 5, DB_SQLTYPE_INTEGER, (UINT32)m_lastExecution);
-       DBBind(hStmt, 6, DB_SQLTYPE_INTEGER, (LONG)m_flags);
-       DBBind(hStmt, 7, DB_SQLTYPE_INTEGER, m_owner);
-       DBBind(hStmt, 8, DB_SQLTYPE_INTEGER, m_objectId);
-   DBBind(hStmt, 9, DB_SQLTYPE_VARCHAR, m_comments, DB_BIND_STATIC);
-       DBBind(hStmt, 10, DB_SQLTYPE_INTEGER, (LONG)m_id);
-
-       if (hStmt == NULL)
-               return;
-
-   DBExecute(hStmt);
-   DBFreeStatement(hStmt);
+   if (hStmt != NULL)
+   {
+      DBBind(hStmt, 1, DB_SQLTYPE_VARCHAR, m_taskHandlerId, DB_BIND_STATIC);
+      DBBind(hStmt, 2, DB_SQLTYPE_VARCHAR, m_schedule, DB_BIND_STATIC);
+      DBBind(hStmt, 3, DB_SQLTYPE_VARCHAR, m_params, DB_BIND_STATIC);
+      DBBind(hStmt, 4, DB_SQLTYPE_INTEGER, (UINT32)m_executionTime);
+      DBBind(hStmt, 5, DB_SQLTYPE_INTEGER, (UINT32)m_lastExecution);
+      DBBind(hStmt, 6, DB_SQLTYPE_INTEGER, (LONG)m_flags);
+      DBBind(hStmt, 7, DB_SQLTYPE_INTEGER, m_owner);
+      DBBind(hStmt, 8, DB_SQLTYPE_INTEGER, m_objectId);
+      DBBind(hStmt, 9, DB_SQLTYPE_VARCHAR, m_comments, DB_BIND_STATIC);
+      DBBind(hStmt, 10, DB_SQLTYPE_INTEGER, (LONG)m_id);
+
+      DBExecute(hStmt);
+      DBFreeStatement(hStmt);
+   }
        DBConnectionPoolReleaseConnection(db);
        NotifyClientSessions(NX_NOTIFY_SCHEDULE_UPDATE,0);
 }
@@ -181,10 +181,10 @@ void ScheduledTask::saveToDatabase(bool newObject)
 /**
  * Scheduled task comparator (used for task sorting)
  */
-static int ScheduledTaskComparator(const void *e1, const void *e2)
+static int ScheduledTaskComparator(const ScheduledTask **e1, const ScheduledTask **e2)
 {
-   ScheduledTask * s1 = *((ScheduledTask**)e1);
-   ScheduledTask * s2 = *((ScheduledTask**)e2);
+   const ScheduledTask *s1 = *e1;
+   const ScheduledTask *s2 = *e2;
 
    // Executed schedules should go down
    if (s1->checkFlag(SCHEDULED_TASK_EXECUTED) != s2->checkFlag(SCHEDULED_TASK_EXECUTED))
@@ -235,7 +235,7 @@ void ScheduledTask::run(SchedulerCallback *callback)
 /**
  * Fill NXCP message with task data
  */
-void ScheduledTask::fillMessage(NXCPMessage *msg)
+void ScheduledTask::fillMessage(NXCPMessage *msg) const
 {
    msg->setField(VID_SCHEDULED_TASK_ID, m_id);
    msg->setField(VID_TASK_HANDLER, m_taskHandlerId);
@@ -252,7 +252,7 @@ void ScheduledTask::fillMessage(NXCPMessage *msg)
 /**
  * Fill NXCP message with task data
  */
-void ScheduledTask::fillMessage(NXCPMessage *msg, UINT32 base)
+void ScheduledTask::fillMessage(NXCPMessage *msg, UINT32 base) const
 {
    msg->setField(base, m_id);
    msg->setField(base + 1, m_taskHandlerId);
@@ -269,7 +269,7 @@ void ScheduledTask::fillMessage(NXCPMessage *msg, UINT32 base)
 /**
  * Check if user can access this scheduled task
  */
-bool ScheduledTask::canAccess(UINT32 userId, UINT64 systemAccess)
+bool ScheduledTask::canAccess(UINT32 userId, UINT64 systemAccess) const
 {
    if (systemAccess & SYSTEM_ACCESS_ALL_SCHEDULED_TASKS)
       return true;
index fb2547d..7d45d8c 100644 (file)
@@ -416,9 +416,9 @@ json_t *ObjectUrl::toJson() const
 /**
  * Distance array sorting callback
  */
-int DistanceSortCallback(const void *obj1, const void *obj2)
+int DistanceSortCallback(const ObjectsDistance **obj1, const ObjectsDistance **obj2)
 {
-   return ((ObjectsDistance *)obj1)->m_distance - ((ObjectsDistance *)obj2)->m_distance;
+   return (*obj1)->m_distance - (*obj2)->m_distance;
 }
 
 /**
index 4808478..0ad8f44 100644 (file)
@@ -87,31 +87,32 @@ public:
    ScheduledTask(DB_RESULT hResult, int row);
    ~ScheduledTask();
 
-   UINT32 getId() { return m_id; }
-   const TCHAR *getTaskHandlerId() { return m_taskHandlerId; }
-   const TCHAR *getSchedule() { return m_schedule; }
-   const TCHAR *getParams() { return m_params; }
-   time_t getExecutionTime() { return m_executionTime; }
-   UINT32 getOwner() { return m_owner; }
-   UINT32 getObjectId() { return m_objectId; }
-   UINT32 getFlags() { return m_flags; }
+   UINT32 getId() const { return m_id; }
+   const TCHAR *getTaskHandlerId() const { return m_taskHandlerId; }
+   const TCHAR *getSchedule() const { return m_schedule; }
+   const TCHAR *getParams() const { return m_params; }
+   time_t getExecutionTime() const { return m_executionTime; }
+   UINT32 getOwner() const { return m_owner; }
+   UINT32 getObjectId() const { return m_objectId; }
+   UINT32 getFlags() const { return m_flags; }
 
    void setLastExecutionTime(time_t time) { m_lastExecution = time; };
    void setExecutionTime(time_t time) { m_executionTime = time; }
    void setFlag(UINT32 flag) { m_flags |= flag; }
    void removeFlag(UINT32 flag) { m_flags &= ~flag; }
 
+   void run(SchedulerCallback *callback);
+
    void update(const TCHAR *taskHandlerId, const TCHAR *schedule, const TCHAR *params, const TCHAR *comments, UINT32 owner, UINT32 objectId, UINT32 flags);
    void update(const TCHAR *taskHandlerId, time_t nextExecution, const TCHAR *params, const TCHAR *comments, UINT32 owner, UINT32 objectId, UINT32 flags);
 
-   void saveToDatabase(bool newObject);
-   void run(SchedulerCallback *callback);
-   void fillMessage(NXCPMessage *msg);
-   void fillMessage(NXCPMessage *msg, UINT32 base);
+   void saveToDatabase(bool newObject) const;
+   void fillMessage(NXCPMessage *msg) const;
+   void fillMessage(NXCPMessage *msg, UINT32 base) const;
 
-   bool checkFlag(UINT32 flag) { return (m_flags & flag) != 0; }
-   bool isRunning() { return (m_flags & SCHEDULED_TASK_RUNNING) != 0; }
-   bool canAccess(UINT32 userId, UINT64 systemAccess);
+   bool checkFlag(UINT32 flag) const { return (m_flags & flag) != 0; }
+   bool isRunning() const { return (m_flags & SCHEDULED_TASK_RUNNING) != 0; }
+   bool canAccess(UINT32 userId, UINT64 systemAccess) const;
 };
 
 /**