Commit 72e34299 authored by Jonas Nylund's avatar Jonas Nylund

Added support for changing type and/or size in an item with only one...

Added support for changing type and/or size in an item with only one attribute, bugfix in oid_to_table for array attributes
parent 78b734f0
......@@ -42,6 +42,26 @@
#define sev_cGarbageInterval 120
#define sev_cGarbageCycle 86400
static int sev_comp_refid(tree_sTable *tp, tree_sNode *x, tree_sNode *y)
{
sev_sRefid *xp = (sev_sRefid *) x;
sev_sRefid *yp = (sev_sRefid *) y;
if (xp->id.nid > yp->id.nid)
return 1;
if (xp->id.nid < yp->id.nid)
return -1;
if (xp->id.rix > yp->id.rix)
return 1;
if (xp->id.rix < yp->id.rix)
return -1;
return 0;
}
int sev_server::init( int noneth)
{
qcom_sNode node;
......@@ -111,6 +131,8 @@ int sev_server::init( int noneth)
m_db->get_items( &m_sts);
m_db->get_objectitems(&m_sts);
m_refid = tree_CreateTable(&sts, sizeof(pwr_tRefId), offsetof(sev_sRefid, id), sizeof(sev_sRefid), 100, sev_comp_refid);
// Create a queue to server
qcom_sQattr attr;
qcom_sQid qid;
......@@ -518,12 +540,18 @@ int sev_server::check_histitems( sev_sMsgHistItems *msg, unsigned int size)
// Remove all refid's for this node
pwr_tNid nid = msg->Items[0].sevid.nid;
pwr_tStatus sts;
sev_sRefid *rp = (sev_sRefid *)tree_Minimum(&sts, m_refid);
sev_sRefid *succ_rp;
while ( rp) {
succ_rp = (sev_sRefid *)tree_Successor(&sts, m_refid, rp);
for ( iterator_refid it = m_refid.begin(); it != m_refid.end(); it++) {
if ( it->first.id.nid == nid)
m_refid.erase( it);
if ( rp->id.nid == nid)
tree_Remove( &sts, m_refid, &rp->id);
rp = succ_rp;
}
for ( int i = 0; i < item_cnt; i++) {
// Deadband requires id variable
......@@ -596,6 +624,7 @@ int sev_server::check_histitems( sev_sMsgHistItems *msg, unsigned int size)
newattr.elem = 0;
newattrVec.push_back(newattr);
bool tableChange = false;
if ( !m_db->check_objectitemattr( &m_sts,
tablename,
buffP->oid,
......@@ -639,8 +668,14 @@ int sev_server::check_histitems( sev_sMsgHistItems *msg, unsigned int size)
m_db->m_items[idx].old_value = malloc(m_db->m_items[idx].value_size);
m_db->m_items[idx].sevid = buffP->sevid;
sev_refid sevid(buffP->sevid);
m_refid[sevid] = idx;
pwr_tRefId rk;
sev_sRefid *rp;
rk = buffP->sevid;
rp = (sev_sRefid *) tree_Insert(&sts, m_refid, &rk);
rp->idx = idx;
}
int numberOfAttributes = buffP->attrnum;
......@@ -663,28 +698,33 @@ int sev_server::check_histitems( sev_sMsgHistItems *msg, unsigned int size)
msg->Items[i].deadband, msg->Items[i].options, &idx);
if ( EVEN(m_sts)) return m_sts;
}
//Create space for the old values used if we have deadband active
if ( m_db->m_items[idx].old_value != 0 ) {
free(m_db->m_items[idx].old_value);
m_db->m_items[idx].old_value = 0;
if ( ODD(m_sts) ) {
//Create space for the old values used if we have deadband active
if ( m_db->m_items[idx].old_value != 0 ) {
free(m_db->m_items[idx].old_value);
m_db->m_items[idx].old_value = 0;
}
m_db->m_items[idx].value_size = msg->Items[i].attr[0].size;
m_db->m_items[idx].old_value = malloc(m_db->m_items[idx].value_size);
//If node is coming up again we do not want deadband to be active due to init of old_value
m_db->m_items[idx].deadband_active = 0;
m_db->m_items[idx].first_storage = 1;
m_db->m_items[idx].sevid = msg->Items[i].sevid;
pwr_tRefId rk;
sev_sRefid *rp;
rk = msg->Items[i].sevid;
rp = (sev_sRefid *) tree_Insert(&sts, m_refid, &rk);
rp->idx = idx;
}
m_db->m_items[idx].value_size = msg->Items[i].attr[0].size;
m_db->m_items[idx].old_value = malloc(m_db->m_items[idx].value_size);
//If node is coming up again we do not want deadband to be active due to init of old_value
m_db->m_items[idx].deadband_active = 0;
m_db->m_items[idx].first_storage = 1;
m_db->m_items[idx].sevid = msg->Items[i].sevid;
sev_refid sevid(msg->Items[i].sevid);
m_refid[sevid] = idx;
}
printf( "---- Node up (%d) ----\n", nid);
for ( iterator_refid it = m_refid.begin(); it != m_refid.end(); it++)
printf( "Refid: %d,%d Idx: %d Name %s\n", it->first.id.nid, it->first.id.rix, it->second, m_db->m_items[it->second].oname);
return 1;
}
/*
int sev_server::receive_histdata( sev_sMsgHistDataStore *msg, unsigned int size)
{
sev_sHistData *dp = (sev_sHistData *)&msg->Data;
......@@ -704,6 +744,31 @@ int sev_server::receive_histdata( sev_sMsgHistDataStore *msg, unsigned int size)
}
return 1;
}
*/
int sev_server::receive_histdata( sev_sMsgHistDataStore *msg, unsigned int size)
{
pwr_tStatus sts;
sev_sHistData *dp = (sev_sHistData *)&msg->Data;
pwr_tTime time;
while ( (char *)dp - (char *)msg < (int)size) {
sev_sRefid *rp;
pwr_tRefId rk = dp->sevid;
rp = (sev_sRefid *) tree_Find(&sts, m_refid, &rk);
if ( !rp) {
dp = (sev_sHistData *)((char *)dp + sizeof( *dp) - sizeof(dp->data) + dp->size);
continue;
}
unsigned int idx = rp->idx;
time = net_NetTimeToTime( &msg->Time);
m_db->store_value( &m_sts, idx, 0, time, &dp->data, dp->size);
dp = (sev_sHistData *)((char *)dp + sizeof( *dp) - sizeof(dp->data) + dp->size);
}
return 1;
}
......
......@@ -34,7 +34,8 @@ class sev_node {
char name[80];
};
class sev_refid {
typedef struct {
#if 0
public:
sev_refid( pwr_tRefId rid) : id(rid) {}
bool operator<(const sev_refid& x) const {
......@@ -44,20 +45,11 @@ class sev_refid {
return true;
return false;
}
pwr_tRefId id;
};
// Struct for binary tree item
typedef struct {
pwr_tOid oid;
pwr_tAName aname;
} sev_sItemKey;
typedef struct {
#endif
tree_sNode node;
sev_sItemKey key;
pwr_tRefId id;
int idx;
} sev_sItem;
} sev_sRefid;
class sev_server {
public:
......@@ -67,12 +59,15 @@ class sev_server {
sev_server() : m_server_status(0), m_msg_id(0) {}
typedef map<sev_refid, unsigned int>::iterator iterator_refid;
// typedef map<sev_refid, unsigned int>::iterator iterator_refid;
pwr_tStatus m_sts;
pwr_tStatus m_server_status;
vector<sev_node> m_nodes;
map<sev_refid, unsigned int> m_refid;
// map<sev_refid, unsigned int> m_refid;
tree_sTable *m_refid;
unsigned int m_msg_id;
sev_db *m_db;
int m_noneth;
......
This diff is collapsed.
......@@ -172,6 +172,8 @@ class sev_dbms : public sev_db {
int get_objectvalues( pwr_tStatus *sts, sev_item *item, unsigned int size, pwr_tTime *starttime, pwr_tTime *endtime,
int maxsize, pwr_tTime **tbuf, void **vbuf, unsigned int *bsize);
pwr_tUInt64 get_minFromIntegerColumn( char *tablename, char *colname );
int handle_attrchange(pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *aname, char *oname,
pwr_eType type, unsigned int size, unsigned int item_idx, unsigned int attr_idx);
};
#endif
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment