操作Solid 数据库代码

操作Solid 数据库代码
solid数据可能听说过的人不多,可是很多unix软件很多都采用此数据库,其儿紧凑,也是不大常见所以也能操持其稳定吧
当初为了操作这个东东也是费了好些时候,主要是要申请到solid的sdk包 libsolidsa.a
有了当然好办了,当然没有的可以联系我

  1  /*
  2      nnm_event_downup detail dump
  3      2005.11.07    zhangbin    created
  4 
  5  */
  6 
  7  #include  < iostream >
  8  #include  < string >
  9  #include  < vector >
 10  #include  < stdio.h >
 11  #include  < unistd.h >
 12 
 13  #include  < c.h >
 14  #include  < sscapi.h >
 15  #include  < sa.h >
 16 
 17 
 18  SaRetT         dbrc;
 19  SaConnectT     * dbscon;
 20 
 21 
 22  typedef std::string RPSTRING;
 23  extern  char   * optarg;
 24  extern  int  optind, optopt;
 25 
 26 
 27  struct TableEventDownUp{
 28       int  TRAPSOURCE;
 29       int  APPLICATION_ID;
 30       int  PID;
 31       int  CATEGORY;
 32       int  SEVERITY;
 33       int  EVENT_TIMESTAMP;
 34       int  NUMBER_VARBINDS;
 35       int  IFNUMBER;
 36      RPSTRING TRAP_NAME;
 37      RPSTRING FORWARD_ADDRESS;
 38      RPSTRING EVENT_SOURCE;
 39      RPSTRING EVENT_TIME;
 40      RPSTRING EVENT_UUID;
 41      RPSTRING NODENAME;
 42      RPSTRING MESSAGE;
 43      RPSTRING EVENT_OID;
 44      RPSTRING OV_OBJECTID;
 45      RPSTRING PROTOCOL;
 46      RPSTRING EVENT_TYPE;
 47      RPSTRING IP_ADDRESS;
 48       // char * fs[18];
 49      
 50  };
 51 
 52  typedef struct _sysconf{
 53      RPSTRING        solid_host;
 54      unsigned  short   solid_port;
 55      RPSTRING        solid_user;
 56      RPSTRING        solid_passwd;
 57      RPSTRING        dump_file;
 58      RPSTRING        pattern;    
 59      FILE          *      file;
 60      std::vector < RPSTRING >     fields;        
 61      _sysconf(){
 62          solid_host     =      " 127.0.0.1 " ;
 63          solid_port   =      2690 ;
 64          solid_user     =      " ovdb " ;
 65          solid_passwd  =      " ovdb " ;
 66          dump_file     =   " ./event.dump " ;
 67          pattern      = "" ;
 68          
 69          
 70      }
 71  }SysConf; 
 72   
 73  void  usage(){
 74       char   *  msg = " usage: "
 75           " \n-h  solid db host "
 76           " \n-p  solid db port      "
 77           " \n-U  solid user name     "
 78           " \n-P  solid passwd     "
 79           " \n-f  dump file         "
 80           " \n-l  like pattern     "
 81           " \n " ;
 82      printf( " %s " ,msg);    
 83  }
 84 
 85 
 86   
 87 
 88  void  INT_STRING(SysConf  *  conf, const   char   * field,RPSTRING  & str, int  intv){    
 89       char  buff[ 32 ];
 90       if ( std::find(conf -> fields.begin(),conf -> fields.end(),RPSTRING(field) + " \n " ) != conf -> fields.end()){
 91          sprintf(buff, " \t%u " ,intv);
 92          str += buff;
 93      }
 94  }
 95      
 96  void  STRING_STRING(SysConf  *  conf, const   char *  field,RPSTRING  & str,RPSTRING str2){
 97       if ( std::find(conf -> fields.begin(),conf -> fields.end(),RPSTRING(field) + " \n " ) != conf -> fields.end()){
 98          str += " \t " + str2;
 99      }
100  }
101          
102  void   write_file(SysConf  *  conf,TableEventDownUp row){
103      RPSTRING str  =   "   " ;
104 
105      INT_STRING(conf, " TRAPSOURCE " ,str,row.TRAPSOURCE);
106      INT_STRING(conf, " APPLICATION_ID " ,str,row.APPLICATION_ID);
107      INT_STRING(conf, " PID " ,str,row.PID);
108      INT_STRING(conf, " CATEGORY " ,str,row.CATEGORY);
109      INT_STRING(conf, " SEVERITY " ,str,row.SEVERITY);
110      INT_STRING(conf, " EVENT_TIMESTAMP " ,str,row.EVENT_TIMESTAMP);
111      INT_STRING(conf, " NUMBER_VARBINDS " ,str,row.NUMBER_VARBINDS);
112      INT_STRING(conf, " IFNUMBER " ,str,row.IFNUMBER);
113      STRING_STRING(conf, " TRAP_NAME " ,str,row.TRAP_NAME);
114      str += " \t " ;
115      STRING_STRING(conf, " FORWARD_ADDRESS " ,str,row.FORWARD_ADDRESS);
116      STRING_STRING(conf, " EVENT_SOURCE " ,str,row.EVENT_SOURCE);
117      STRING_STRING(conf, " EVENT_TIME " ,str,row.EVENT_TIME);
118      STRING_STRING(conf, " EVENT_UUID " ,str,row.EVENT_UUID);
119      STRING_STRING(conf, " NODENAME " ,str,row.NODENAME);
120      STRING_STRING(conf, " MESSAGE " ,str,row.MESSAGE);
121      STRING_STRING(conf, " EVENT_OID " ,str,row.EVENT_OID);
122      STRING_STRING(conf, " OV_OBJECTID " ,str,row.OV_OBJECTID);
123      STRING_STRING(conf, " PROTOCOL " ,str,row.PROTOCOL);
124      STRING_STRING(conf, " EVENT_TYPE " ,str,row.EVENT_TYPE);
125      STRING_STRING(conf, " IP_ADDRESS " ,str,row.IP_ADDRESS);
126       // -- rid of "LR"
127      std::replace(str.begin(),str.end(), ' \n ' , '   ' );
128      str += " \n " ;
129       // printf("\nrow==>%s",str.c_str());
130       // return;
131      fputs(str.c_str(),conf -> file);    
132  }   
133      
134      
135  void  dump(SysConf  * conf){
136      TableEventDownUp    reload;
137      SaRetT            rc;
138      SaCursorT     *     scur;
139       char   *     EVENT_UUID;
140       int         EVENT_TIMESTAMP;
141       int         CATEGORY;
142       char   *     NODENAME;
143       int         APPLICATION_ID;
144       char   *     MESSAGE;
145       int         SEVERITY;
146       char   *     EVENT_OID;
147       char   *     OV_OBJECTID;
148       char   *     PROTOCOL;
149       char   *     EVENT_TYPE;
150       char   *     IP_ADDRESS;
151       int         TRAPSOURCE;
152       char   *     TRAP_NAME;
153       int         PID;
154       char   *     FORWARD_ADDRESS;
155       char   *     EVENT_SOURCE;
156       char   *     EVENT_TIME;
157       int         NUMBER_VARBINDS;
158       int         IFNUMBER;
159 
160          EVENT_TIME  =  ( char * )conf -> pattern.c_str();
161          scur  =  SaCursorCreate(dbscon, " NNM_EVENT_DOWNUP " );
162          rc  =  SaCursorColStr(scur, " EVENT_UUID " , & EVENT_UUID);
163          rc  =  SaCursorColInt(scur, " EVENT_TIMESTAMP " , & EVENT_TIMESTAMP);
164          rc  =  SaCursorColInt(scur, " CATEGORY " , & CATEGORY);
165          rc  =  SaCursorColStr(scur, " NODENAME " , & NODENAME);
166          rc  =  SaCursorColInt(scur, " APPLICATION_ID " , & APPLICATION_ID);
167          rc  =  SaCursorColStr(scur, " MESSAGE " , & MESSAGE);
168          rc  =  SaCursorColInt(scur, " SEVERITY " , & SEVERITY);
169          rc  =  SaCursorColStr(scur, " EVENT_OID " , & EVENT_OID);
170          rc  =  SaCursorColStr(scur, " OV_OBJECTID " , & OV_OBJECTID);
171          rc  =  SaCursorColStr(scur, " PROTOCOL " , & PROTOCOL);
172          rc  =  SaCursorColStr(scur, " EVENT_TYPE " , & EVENT_TYPE);
173          rc  =  SaCursorColStr(scur, " IP_ADDRESS " , & IP_ADDRESS);
174          rc  =  SaCursorColInt(scur, " TRAPSOURCE " , & TRAPSOURCE);    
175          rc  =  SaCursorColStr(scur, " TRAP_NAME " , & TRAP_NAME);
176          rc  =  SaCursorColInt(scur, " PID " , & PID);    
177          rc  =  SaCursorColStr(scur, " FORWARD_ADDRESS " , & FORWARD_ADDRESS);
178          rc  =  SaCursorColStr(scur, " EVENT_SOURCE " , & EVENT_SOURCE);
179          rc  =  SaCursorColStr(scur, " EVENT_TIME " , & EVENT_TIME);        
180          rc  =  SaCursorColInt(scur, " NUMBER_VARBINDS " , & NUMBER_VARBINDS);    
181          rc  =  SaCursorColInt(scur, " IFNUMBER " , & IFNUMBER);    
182           // -- bind variables from F1..F18
183          
184 
185          rc  =  SaCursorOpen(scur);        
186          rc  =  SaCursorLike(scur, " EVENT_TIME " ,conf -> pattern.size());        
187          rc  =  SaCursorDescending(scur, " EVENT_TIMESTAMP " );
188          rc  =  SaCursorSearch(scur);
189           while ( SaCursorNext(scur) == SA_RC_SUCC){
190              reload.TRAPSOURCE         = TRAPSOURCE  ;
191              reload.APPLICATION_ID   = APPLICATION_ID ;
192              reload.PID              = PID            ;
193              reload.CATEGORY         = CATEGORY       ;
194              reload.SEVERITY         = SEVERITY       ;
195              reload.EVENT_TIMESTAMP  = EVENT_TIMESTAMP;
196              reload.NUMBER_VARBINDS  = NUMBER_VARBINDS;
197              reload.IFNUMBER         = IFNUMBER       ;
198              reload.TRAP_NAME        = TRAP_NAME      ;
199              reload.FORWARD_ADDRESS  = FORWARD_ADDRESS;
200              reload.EVENT_SOURCE     = EVENT_SOURCE   ;
201              reload.EVENT_TIME       = EVENT_TIME     ;
202              reload.EVENT_UUID       = EVENT_UUID     ;
203              reload.NODENAME         = NODENAME       ;
204              reload.MESSAGE          = MESSAGE        ;
205              reload.EVENT_OID        = EVENT_OID      ;
206              reload.OV_OBJECTID      = OV_OBJECTID    ;
207              reload.PROTOCOL         = PROTOCOL       ;
208              reload.EVENT_TYPE       = EVENT_TYPE     ;
209              reload.IP_ADDRESS       = IP_ADDRESS     ;
210              write_file(conf,reload);
211          }
212          SaCursorFree(scur);
213  }
214 
215  void  filter_field(SysConf  * conf){
216      FILE  *  file;
217      file  =  fopen( " ./dump.conf " , " r " );
218       char   line[ 1024 ];
219       if ! file){
220           return  ;
221      }
222       while ( fgets(line,sizeof(line),file) ){
223          conf -> fields.push_back(RPSTRING(line));
224      }
225      
226      fclose(file);
227  }
228   
229  int  main( int  argc,  char *  argv[]){
230       char  c;
231      SysConf conf;
232      RPSTRING    stime,etime;
233      SaRetT         dbrc;
234      SaRetT            rc;
235      
236      SaCursorT     *     scur;
237       char          buff[ 1024 ];
238      filter_field( & conf);
239      
240       while  ((c  =  getopt(argc, argv,  " :h:p:U:P:f:l: " ))  !=   - 1 ){
241             
242              switch (c) {
243              case   ' h ' :
244              conf.solid_host  =  optarg;                
245                  break ;
246          case   ' p ' :
247                 conf.solid_port  =  (unsigned  short ) atoi(optarg);
248                  break ;
249           case   ' U ' :
250              conf.solid_user  =  optarg;
251               break ;
252           case   ' P ' :
253              conf.solid_passwd  =  optarg;
254               break ;
255           case   ' f ' :
256              conf.dump_file  =  optarg;
257               break ;
258           case   ' l ' :
259              conf.pattern  =  optarg;
260               // printf("\n pattern:%s",optarg);        
261               break ;
262           default :
263              usage();
264              exit( 1 );
265          }
266      }
267       if (  conf.pattern  ==   "" ){        
268          usage();
269          exit( 1 );
270      }    
271 
272      
273      sprintf(buff, " tcp %s %d " ,conf.solid_host.c_str(),conf.solid_port);    
274      dbscon  =  SaConnect(buff,( char * )conf.solid_user.c_str(),( char * )conf.solid_passwd.c_str());
275       if  ( ! dbscon) {
276          printf( " \nconnect solid DB failed! " );
277          exit( 1 );
278      }
279      conf.file  =  fopen(conf.dump_file.c_str(), " w " );    
280       if ( conf.file  ==  NULL){
281          printf( " \n cann't open file:%s\n " ,conf.dump_file.c_str());
282          exit( 1 );
283      }
284      dump( & conf);
285      fclose(conf.file);
286      printf( " that's ok,to see dump file :%s\n " ,conf.dump_file.c_str());
287      
288       return   0 ;
289  }
290 

 1 
 2  #include  " glodef.h "
 3 
 4  #include  < stdio.h >
 5  #include  < c.h >
 6  #include  < sscapi.h >
 7  #include  < sa.h >
 8 
 9 
10  SaRetT         dbrc;
11  SaConnectT     * dbscon;
12 
13  int  connect_solid(SysConf  *  conf){    
14       char  buff[ 128 ];
15      SaRetT            rc;
16  //     SaCursorT    *    scur;
17      
18      sprintf(buff, " tcp %s %d " ,conf -> solid_host.c_str(),
19                      conf -> solid_port);
20      dbscon  =  SaConnect(buff,( char * )conf -> solid_user.c_str(),
21                      ( char * )conf -> solid_passwd.c_str());
22       if  (  ! dbscon) {
23           return   false ;
24      }
25       // -- check table
26       char   *  sql  = " CREATE TABLE nnm_interfaces_extra\
27               (topo_id                   varchar NOT NULL PRIMARY KEY,\
28               ifspeed                    integer ,\
29               ifiextra1                                    integer ,\
30               ifiextra2                                    integer ,\
31               ifstrextra1                                varchar ,\
32               ifstrextra2                                varchar ,\
33               ifstrextra3                                varchar \
34            ) " ;
35          rc  =  SaSQLExecDirect(dbscon,sql);        
36          rc  =  SaTransCommit(dbscon);
37           if ( rc  !=  SA_RC_SUCC){
38              rplog -> Print( 1 , " Create Table[NNM_INTERFACES_EXTRA] Failed! " );
39               return   false ;
40          }
41 
42      
43      sql  =   " CREATE TABLE nnm_event_downup\
44             (event_uuid        varchar   NOT NULL PRIMARY KEY,\
45          event_timestamp   integer   NOT NULL,\
46          category          integer   NOT NULL, \
47          nodename          varchar   NOT NULL,\
48          application_id    integer,\
49          message           varchar,\
50          severity          integer   NOT NULL,\
51          event_oid         varchar   NOT NULL,\
52          ov_objectid       varchar,\
53          protocol          varchar,\
54          event_type        varchar   NOT NULL,\
55          ip_address        varchar,\
56          trapsource        integer,\
57          trap_name         varchar,\
58          pid               integer,\
59          forward_address   varchar,\
60          event_source      varchar,\
61          event_time        varchar,\
62          number_varbinds   integer,\
63          ifnumber          integer\
64          ) " ;
65 
66          rc  =  SaSQLExecDirect(dbscon,sql);        
67          rc  =  SaTransCommit(dbscon);
68           if ( rc  !=  SA_RC_SUCC){
69              rplog -> Print( 1 , " Create Table[NNM_EVENT_DOWNUP] Failed! " );
70               return   false ;
71          }
72       return   true ;
73  }
74 
75  void  free_solid(){
76      
77  }
78 
  1 
  2  #ifdef WIN32
  3  #pragma  warning(disable:  4786 )
  4  #endif
  5 
  6  #include  " event.h "
  7  #include  " snmpprint.h "
  8  #include  " util.h "
  9 
 10 
 11  #include  < stdio.h >
 12  #ifdef WIN32
 13  #include  < ctype.h >
 14  #endif
 15 
 16  #include  < OV / ovw.h >
 17 
 18  #include  < stdio.h >
 19  #include  < c.h >
 20  #include  < sscapi.h >
 21  #include  < sa.h >
 22 
 23 
 24 
 25  extern SaConnectT     * dbscon;
 26  OVsnmpVarBind *  GetVarBindByIndex( int  index,OVsnmpPdu  * pdu);
 27 
 28  void  GrabEvent::pdu_process( int  type, OVsnmpSession  * session, OVsnmpPdu  * pdu){
 29      EventContext  *  ec;;
 30  //     char buff[1024*4];
 31  //     OVsnmpVarBind *var;
 32       if ! pdu ){
 33           return  ;
 34      }
 35       switch (pdu -> specific_type ){
 36           case  EVENT_NODE_DOWN_ID:
 37           case  EVENT_NODE_UP_ID:
 38           case  EVENT_IF_DOWN_ID:
 39           case  EVENT_IF_UP_ID:
 40               break ;
 41           default :
 42               return ;
 43      }
 44      rplog -> Print( 1 , " recive Event from NNM-ECS! %d " ,pdu -> specific_type);
 45       /*
 46      var = pdu->variables;
 47      while(var){
 48          sprint_by_type(buff,sizeof(buff),var,TYPE_VAL);
 49          var = var->next_variable;
 50          rplog->Print(1,"VarBind Detail:\t%s",buff);
 51      } */
 52      
 53 
 54      ec  =   new  EventContext;
 55      ec -> event  =  pdu -> specific_type;
 56      ec -> pdu  =  OVsnmpCopyPdu(pdu);    
 57      ec -> check_time  =  _conf -> up_status_check_interval  +  time( 0 );
 58      
 59      ec -> rid  =  DoUpdate(ec);    
 60       if ( pdu -> specific_type  ==  EVENT_NODE_DOWN_ID  ||  
 61          pdu -> specific_type  ==  EVENT_IF_DOWN_ID){        
 62          _evctx_lock.Lock();        
 63          
 64  #ifdef _DEBUG
 65  /*
 66          for(int n=0;n<50;n++){        
 67              printf("\7");
 68              Sleep(1);
 69          } */
 70  #endif
 71          rplog -> Print( 1 , " %s Occur,Be Push Into Queue To Be Processed! " ,
 72              pdu -> specific_type == EVENT_NODE_DOWN_ID ? " EVENT_NODE_DOWN_ID " : " EVENT_IF_DOWN_ID " );
 73          _evctx_list.push_back(ec);
 74          DumpDownEvent2File();
 75          _evctx_lock.Unlock();
 76      } else {
 77          delete ec;
 78      }
 79  }
 80 
 81  // --记录唯一的数据库编号,转存到本地文件
 82  void     GrabEvent::DumpDownEvent2File(){
 83      FILE  *  fp;
 84      EventContext_List::iterator itr;
 85      EventContext  *  ec;    
 86 
 87      fp  =  fopen(FILE_RELOAD, " w " );
 88       if ! fp )     return ;
 89      rplog -> Print( 1 , " DumpList size:%d " ,_evctx_list.size());
 90       for ( itr  =  _evctx_list.begin() ;itr !=  _evctx_list.end();itr ++ ){
 91          ec  =   * itr;
 92           // rplog->Print(1,"Dump Record ID:%s",ec->rid.c_str());
 93          fwrite(ec -> rid.c_str(),ec -> rid.size(), 1 ,fp);
 94          fwrite( " \n " ,strlen( " \n " ), 1 ,fp);
 95      }
 96      fclose(fp);
 97  }
 98 
 99  // --记录唯一的数据库编号,转存到本地文件
100  void     GrabEvent::DumpFile2DownEvent(){
101      FILE  *  fp;
102      RPSTRING str;
103       // EventContext * ec;    
104       char  line[ 1024 ];
105       char   *  chars;
106 
107      fp  =  fopen(FILE_RELOAD, " r " );
108       if ! fp )     return ;
109      
110       while ( chars  =  fgets(line,sizeof(line),fp) ){
111          str  =  ValidString(chars);
112          LoadDBRecord(str);
113           // ec = new EventContext;
114           // ec->rid = str;
115           // _evctx_list.push_back(ec);
116      }
117      fclose(fp);
118  }
119 
120 
121  void  GrabEvent::Run( void   * ){
122      struct fd_set     read_fds;
123       int              count, num_snmp_fds;
124      struct timeval     timeout;
125      rplog -> Print( 1 , " GrabEvent Thread Enter! " );
126       while  (THREAD_CONTINUE_T) {
127          FD_ZERO( & read_fds);
128          num_snmp_fds  =  OVsnmpGetRetryInfo(  & read_fds,  & timeout );
129           if  ( num_snmp_fds  ==   0  ) {
130              SLEEP_MSEC( 200 );
131               // fprintf(stderr, "testapp:  No SNMP Sessions open.  Goodbye.\n");
132               continue ;
133          }
134           // rplog->Print(1,"Block to Select");
135          count  =  select(num_snmp_fds,  & read_fds, NULL, NULL, NULL);
136           // rplog->Print(1,"Something Arrived,Select it");
137           if  (count  <   0 ) {
138              perror( " select " );
139               // OVsnmpClose(session);
140               break ;
141          }  else  {
142              OVsnmpRead( & read_fds);
143          }
144      }
145      rplog -> Print( 1 , " GrabEvent Thread will exit " );
146      _update_thr -> Terminate();
147      _update_thr -> Wait();
148      rplog -> Print( 1 , " GrabEvent has been exited! " );
149  }
150 
151  int  GrabEvent::Connect(SysConf  *  conf){    
152       const   char   *     filter  =   " {ALL} .* " ;
153      _conf  =  conf;
154       // -- parse trapd.conf
155      _ep_list.insert(EventDetail_List::value_type(EVENT_NODE_DOWN_ID, & _tp_node_down));
156      _ep_list.insert(EventDetail_List::value_type(EVENT_NODE_UP_ID, & _tp_node_up));
157      _ep_list.insert(EventDetail_List::value_type(EVENT_IF_DOWN_ID, & _tp_if_down));
158      _ep_list.insert(EventDetail_List::value_type(EVENT_IF_UP_ID, & _tp_if_up));
159      LoadEventDetail(EVENT_NODE_DOWN_ID, & _tp_node_down);
160      LoadEventDetail(EVENT_NODE_UP_ID, & _tp_node_up);
161      LoadEventDetail(EVENT_IF_DOWN_ID, & _tp_if_down);
162      LoadEventDetail(EVENT_IF_UP_ID, & _tp_if_up);
163       // --加载目前未up的信息
164       // MessageBox(0,"begin to dumpfile2downevent",0,MB_OK);
165      DumpFile2DownEvent();
166       // MessageBox(0,"after dumpfile2downevent",0,MB_OK);
167      
168      
169       // --
170      session  =  OVsnmpEventOpen(conf -> nnm_host.c_str(),
171                       " report-patch  "
172                      GrabThread::pdu_process_entry,
173                      ( void   * this ,
174                      filter );
175       if  (session  ==  NULL) {        
176           return   false ;
177      }
178      _update_thr  =   new  UpdateThread( this );
179      _update_thr -> Create();
180      NVThread::Create();
181       return   true ;
182  }
183 
184  // -- add on 05.08.10 13:00
185  void  GrabEvent::LoadDBRecord(RPSTRING  &  rid){
186       //  first start  up
187  //     TableEventDownUp * downup;
188      SaRetT            rc;
189      SaCursorT     *     scur;
190       char   *     EVENT_UUID;
191       int         EVENT_TIMESTAMP;
192       int         CATEGORY;
193       char   *     NODENAME;
194       int         APPLICATION_ID;
195       char   *     MESSAGE;
196       int         SEVERITY;
197       char   *     EVENT_OID;
198       char   *     OV_OBJECTID;
199       char   *     PROTOCOL;
200       char   *     EVENT_TYPE;
201       char   *     IP_ADDRESS;
202       int         TRAPSOURCE;
203       char   *     TRAP_NAME;
204       int         PID;
205       char   *     FORWARD_ADDRESS;
206       char   *     EVENT_SOURCE;
207       char   *     EVENT_TIME;
208       int         NUMBER_VARBINDS;
209       int         IFNUMBER;
210 
211       char   *  fs[ 18 ];
212  //     char buff[128];
213      memset(fs, 0 ,sizeof( char * ) * 18 );
214       // --load downEvent from dump-file
215      EventContext  *  ec;
216       // EventContext_List::iterator itr;
217       // for( itr = _evctx_list.begin() ;itr!= _evctx_list.end();itr++){
218           // ec = *itr;
219          
220          EVENT_UUID  =  ( char * )rid.c_str();
221          
222          scur  =  SaCursorCreate(dbscon, " NNM_EVENT_DOWNUP " );
223          rc  =  SaCursorColStr(scur, " EVENT_UUID " , & EVENT_UUID);
224          rc  =  SaCursorColInt(scur, " EVENT_TIMESTAMP " , & EVENT_TIMESTAMP);
225          rc  =  SaCursorColInt(scur, " CATEGORY " , & CATEGORY);
226          rc  =  SaCursorColStr(scur, " NODENAME " , & NODENAME);
227          rc  =  SaCursorColInt(scur, " APPLICATION_ID " , & APPLICATION_ID);
228          rc  =  SaCursorColStr(scur, " MESSAGE " , & MESSAGE);
229          rc  =  SaCursorColInt(scur, " SEVERITY " , & SEVERITY);
230          rc  =  SaCursorColStr(scur, " EVENT_OID " , & EVENT_OID);
231          rc  =  SaCursorColStr(scur, " OV_OBJECTID " , & OV_OBJECTID);
232          rc  =  SaCursorColStr(scur, " PROTOCOL " , & PROTOCOL);
233          rc  =  SaCursorColStr(scur, " EVENT_TYPE " , & EVENT_TYPE);
234          rc  =  SaCursorColStr(scur, " IP_ADDRESS " , & IP_ADDRESS);
235          rc  =  SaCursorColInt(scur, " TRAPSOURCE " , & TRAPSOURCE);    
236          rc  =  SaCursorColStr(scur, " TRAP_NAME " , & TRAP_NAME);
237          rc  =  SaCursorColInt(scur, " PID " , & PID);    
238          rc  =  SaCursorColStr(scur, " FORWARD_ADDRESS " , & FORWARD_ADDRESS);
239          rc  =  SaCursorColStr(scur, " EVENT_SOURCE " , & EVENT_SOURCE);
240          rc  =  SaCursorColStr(scur, " EVENT_TIME " , & EVENT_TIME);        
241          rc  =  SaCursorColInt(scur, " NUMBER_VARBINDS " , & NUMBER_VARBINDS);    
242          rc  =  SaCursorColInt(scur, " IFNUMBER " , & IFNUMBER);    
243           // -- bind variables from F1..F18
244           /*
245          for( int n =0; n< 18; n++){
246              sprintf(buff,"F%d",n+1);
247              rc = SaCursorColStr(scur,buff,&fs[n]);
248          } */
249          
250 
251          rc  =  SaCursorOpen(scur);
252          rc  =  SaCursorEqual(scur, " EVENT_UUID " );        
253          rc  =  SaCursorSearch(scur);
254           if ( SaCursorNext(scur) != SA_RC_SUCC){
255              SaCursorFree(scur);
256               // continue;
257               return  ;
258          }
259      
260          {
261              ec  =   new  EventContext;
262              ec -> rid  =  rid;
263              ec -> reload  =   new  TableEventDownUp;
264              ec -> reload -> TRAPSOURCE         = TRAPSOURCE  ;
265              ec -> reload -> APPLICATION_ID   = APPLICATION_ID ;
266              ec -> reload -> PID              = PID            ;
267              ec -> reload -> CATEGORY         = CATEGORY       ;
268              ec -> reload -> SEVERITY         = SEVERITY       ;
269              ec -> reload -> EVENT_TIMESTAMP  = EVENT_TIMESTAMP;
270              ec -> reload -> NUMBER_VARBINDS  = NUMBER_VARBINDS;
271              ec -> reload -> IFNUMBER         = IFNUMBER       ;
272              ec -> reload -> TRAP_NAME        = TRAP_NAME      ;
273              ec -> reload -> FORWARD_ADDRESS  = FORWARD_ADDRESS;
274              ec -> reload -> EVENT_SOURCE     = EVENT_SOURCE   ;
275              ec -> reload -> EVENT_TIME       = EVENT_TIME     ;
276              ec -> reload -> EVENT_UUID       = EVENT_UUID     ;
277              ec -> reload -> NODENAME         = NODENAME       ;
278              ec -> reload -> MESSAGE          = MESSAGE        ;
279              ec -> reload -> EVENT_OID        = EVENT_OID      ;
280              ec -> reload -> OV_OBJECTID      = OV_OBJECTID    ;
281              ec -> reload -> PROTOCOL         = PROTOCOL       ;
282              ec -> reload -> EVENT_TYPE       = EVENT_TYPE     ;
283              ec -> reload -> IP_ADDRESS       = IP_ADDRESS     ;
284               // -=- load fields from F1..F18,data copy deeply
285               /*
286              for(int n=0;n<18;n++){
287                  strcpy(ec->reload->fs[n],fs[n]);
288              } */
289               // -- have read out field's values
290          }
291          SaCursorFree(scur);
292           if ( strcmp(EVENT_OID, " 1.3.6.1.4.1.11.2.17.1.0.58916865 " ) == 0 ){
293              ec -> event  =  EVENT_NODE_DOWN_ID;    
294          } else    if ( strcmp(EVENT_OID, " 1.3.6.1.4.1.11.2.17.1.0.58916867 " ) == 0  ){
295              ec -> event  =  EVENT_IF_DOWN_ID;
296          } else {
297              delete ec;
298               return  ;
299          }
300 
301          ec -> pdu  =  NULL;
302          ec -> check_time  =  _conf -> up_status_check_interval  +  time( 0 );    
303          _evctx_lock.Lock();
304          _evctx_list.push_back(ec);
305          _evctx_lock.Unlock();
306       // }
307  }
308 
309  GrabEvent::GrabEvent(){
310      _starttime  =  time( 0 );
311      _evuuid  =   0 ;
312  }
313 
314 
315 
316  RPSTRING    GrabEvent::DoUpdate(EventContext  *  ec){
317      SaRetT        rc ;
318      SaCursorT     * scur  =  NULL;
319      RPSTRING    ret;
320       char   *  EVENT_UUID;
321       int         EVENT_TIMESTAMP;
322       int         CATEGORY;
323       char   *     NODENAME;
324       int         APPLICATION_ID;
325       char   *     MESSAGE;
326       int         SEVERITY;
327       char   *     EVENT_OID;
328       char   *     OV_OBJECTID;
329       char   *     PROTOCOL;
330       char   *     EVENT_TYPE;
331       char   *     IP_ADDRESS;
332       int         TRAPSOURCE;
333       char   *     TRAP_NAME;
334       int         PID;
335       char   *     FORWARD_ADDRESS;
336       char   *     EVENT_SOURCE;
337       char   *     EVENT_TIME;
338       int         NUMBER_VARBINDS;
339       int         IFNUMBER;
340      
341      scur  =  SaCursorCreate(dbscon, " NNM_EVENT_DOWNUP " );
342 
343      rc  =  SaCursorColStr(scur, " EVENT_UUID " , & EVENT_UUID);
344      rc  =  SaCursorColInt(scur, " EVENT_TIMESTAMP " , & EVENT_TIMESTAMP);
345      rc  =  SaCursorColInt(scur, " CATEGORY " , & CATEGORY);
346      rc  =  SaCursorColStr(scur, " NODENAME " , & NODENAME);
347      rc  =  SaCursorColInt(scur, " APPLICATION_ID " , & APPLICATION_ID);
348      rc  =  SaCursorColStr(scur, " MESSAGE " , & MESSAGE);
349      rc  =  SaCursorColInt(scur, " SEVERITY " , & SEVERITY);
350      rc  =  SaCursorColStr(scur, " EVENT_OID " , & EVENT_OID);
351      rc  =  SaCursorColStr(scur, " OV_OBJECTID " , & OV_OBJECTID);
352      rc  =  SaCursorColStr(scur, " PROTOCOL " , & PROTOCOL);
353      rc  =  SaCursorColStr(scur, " EVENT_TYPE " , & EVENT_TYPE);
354      rc  =  SaCursorColStr(scur, " IP_ADDRESS " , & IP_ADDRESS);
355      rc  =  SaCursorColInt(scur, " TRAPSOURCE " , & TRAPSOURCE);    
356      rc  =  SaCursorColStr(scur, " TRAP_NAME " , & TRAP_NAME);
357      rc  =  SaCursorColInt(scur, " PID " , & PID);    
358      rc  =  SaCursorColStr(scur, " FORWARD_ADDRESS " , & FORWARD_ADDRESS);
359      rc  =  SaCursorColStr(scur, " EVENT_SOURCE " , & EVENT_SOURCE);
360      rc  =  SaCursorColStr(scur, " EVENT_TIME " , & EVENT_TIME);        
361      rc  =  SaCursorColInt(scur, " NUMBER_VARBINDS " , & NUMBER_VARBINDS);    
362      rc  =  SaCursorColInt(scur, " IFNUMBER " , & IFNUMBER);    
363 
364 
365      rc  =  SaCursorOpen(scur);
366       if  ( rc  !=  SA_RC_SUCC){
367          rplog -> Print( 1 , " ReloadSpeedContext::SaCursorOpen Failed! " );
368           return   0 ;
369      }
370      EVENT_TIMESTAMP  =  GetEventTimestamp(ec);
371      CATEGORY     =  GetCategory(ec);
372      APPLICATION_ID  =  GetAppID(ec);
373      SEVERITY     =  GetSeverity(ec);
374      TRAPSOURCE     =  GetTrapSource(ec);
375      PID             =  GetPID(ec);
376      NUMBER_VARBINDS     =  GetNumVars(ec);
377      IFNUMBER         =  GetIfNumber(ec);
378      EVENT_UUID  =   new   char [FIELD_STRING_SIZE];    
379      strcpy(EVENT_UUID,GetEventUUID().c_str());    
380      NODENAME =   new   char [FIELD_STRING_SIZE];    
381      strcpy(NODENAME ,GetNodeName(ec).c_str());    
382      MESSAGE = new   char [FIELD_STRING_SIZE];
383      strcpy(MESSAGE,GetMessage(ec).c_str());
384      EVENT_OID = new   char [FIELD_STRING_SIZE];
385      strcpy(EVENT_OID,GetEvent_OID(ec).c_str());
386      OV_OBJECTID = new   char [FIELD_STRING_SIZE];
387      strcpy(OV_OBJECTID,GetOVObjectID(ec).c_str());
388      PROTOCOL = new   char [FIELD_STRING_SIZE];    
389      strcpy(PROTOCOL,GetProtocal(ec).c_str());
390      EVENT_TYPE = new   char [FIELD_STRING_SIZE];    
391      strcpy(EVENT_TYPE,GetEventType(ec).c_str());
392      IP_ADDRESS = new   char [FIELD_STRING_SIZE];    
393      strcpy(IP_ADDRESS,GetIpAddress(ec).c_str());
394      TRAP_NAME = new   char [FIELD_STRING_SIZE];    
395      strcpy(TRAP_NAME,GetTrapName(ec).c_str());
396      FORWARD_ADDRESS = new   char [FIELD_STRING_SIZE];
397      strcpy(FORWARD_ADDRESS,GetForwardAddress(ec).c_str());
398      EVENT_SOURCE = new   char [FIELD_STRING_SIZE];    
399      strcpy(EVENT_SOURCE,GetEventSource(ec).c_str());
400      EVENT_TIME = new   char [FIELD_STRING_SIZE];    
401      strcpy(EVENT_TIME,GetEventTimeString(ec).c_str());
402      
403      rc  =  SaCursorInsert(scur);
404      rc  =  SaTransCommit(dbscon);
405      SaCursorFree(scur);
406 
407      ret  =  EVENT_UUID;
408 
409      delete[] EVENT_UUID;        
410      delete[] NODENAME;        
411      delete[] MESSAGE;
412      delete[] EVENT_OID;
413      delete[] OV_OBJECTID;
414      delete[] PROTOCOL;    
415      delete[] EVENT_TYPE;    
416      delete[] IP_ADDRESS;    
417      delete[] TRAP_NAME;    
418      delete[] FORWARD_ADDRESS;
419      delete[] EVENT_SOURCE;    
420      delete[] EVENT_TIME;
421       /*
422      //--add on 2005.08.10
423      if( ec->reload == NULL){
424          //--写入pdu所有参数进表 F1..F18        
425          PduVars2DB(ec,ret.c_str());
426      } */
427 
428       return  ret;
429  }
430 
431  int     GrabEvent::PduVars2DB(EventContext *  ec, const   char   *  rid){
432       char   * fs[ 18 ];
433       char  buff[ 128 ];
434       int  n;
435 
436      OVsnmpVarBind  *  var;
437      memset(fs, 0 ,sizeof( char * ) * 18 );
438 
439 
440      SaRetT            rc;
441      SaCursorT     *     scur;
442      
443       char   *     pid;
444      pid  =  ( char * )rid;
445      scur  =  SaCursorCreate(dbscon, " NNM_EVENT_DOWNUP " );
446      rc  =  SaCursorColStr(scur, " EVENT_UUID " , & pid);
447 
448       for ( n = 0 ;n < 18 ;n ++ ){
449          sprintf(buff, " F%d " ,n + 1 );
450          rc  =  SaCursorColStr(scur,buff, & fs[n]);        
451      }
452      rc  =  SaCursorOpen(scur);
453      rc  =  SaCursorEqual(scur, " EVENT_UUID " );        
454      rc  =  SaCursorSearch(scur);
455       if ( SaCursorNext(scur) != SA_RC_SUCC){
456          SaCursorFree(scur);
457           return   false ;
458      }
459       for ( n = 0 ;n < 18 ;n ++ ){
460          fs[n] =   new   char [FIELD_STRING_SIZE];    
461          memset(fs[n], 0 ,FIELD_STRING_SIZE);
462      }
463      n = 0 ;
464      var  =  ec -> pdu -> variables;
465       while ( var ){                
466          sprint_by_type(fs[n],FIELD_STRING_SIZE,var,VAL_ONLY);        
467          n ++ ;
468          var  =  var -> next_variable;
469      }
470      rc  =  SaCursorUpdate(scur);
471 
472       for ( n = 0 ;n < 18 ;n ++ ){
473          delete[] fs[n];
474      }
475       return   true ;
476  }
477 
478  // --明天做
479  void     GrabEvent::GetCategorySeverity(EventDetail *  ed, char   * line){
480       if ( strstr(line, " LOGONLY " )){
481          ed -> cat.id  =   1 ;
482      } else   if ( strstr(line, " Error Alarms " )){
483          ed -> cat.id  =   2 ;
484      } else   if ( strstr(line, " Threshold Alarms " )){
485          ed -> cat.id  =   3 ;
486      } else   if ( strstr(line, " Status Alarms " )){
487          ed -> cat.id  =   4 ;
488      } else   if ( strstr(line, " Configuration Alarms " )){
489          ed -> cat.id  =   5 ;
490      } else   if ( strstr(line, " Application Alert Alarms " )){
491          ed -> cat.id  =   6 ;
492      }
493       // ----
494       if ( strstr(line, " Normal " ) ){
495          ed -> seve.id  =   1 ;
496      } else   if ( strstr(line, " Warning " ) ){
497          ed -> seve.id  =   2 ;
498      } else   if ( strstr(line, " Minor " ) ){
499          ed -> seve.id  =   3 ;
500      } else   if ( strstr(line, " Major " ) ){
501          ed -> seve.id  =   4 ;
502      } else   if ( strstr(line, " Critical " ) ){
503          ed -> seve.id  =   5 ;
504      }
505  }
506 
507  void     GrabEvent::LoadEventDetail( int  ev,EventDetail  *  ed){
508      FILE  *  fp;
509       char  line[ 1024 ];
510       char  buff[ 1024 ];
511       char   *  occur;
512       char   * s; // ,*e;
513       char   * =   0 ;
514       if ( _conf -> trapd == "" ){
515          printf( " \n error: read trapd.conf failed! " );
516          exit( 2 );
517      }
518      fp  =  fopen(_conf -> trapd.c_str(), " r " );
519       if ! fp ){
520          printf( " \n error: read trapd.conf fopen failed! %s " ,_conf -> trapd.c_str());
521          exit( 2 );
522      }
523       while ( occur  =  fgets(line,sizeof(line),fp)){
524          sprintf(buff, " %u " ,ev);
525           if ( p  =  strstr(line,buff) ){
526               // -- deal with first line,grab category and severity
527              GetCategorySeverity(ed,line);
528               // -- get next line
529              occur  =  fgets(line,sizeof(line),fp);
530               if ! occur){
531                   break ;
532              }
533               // -- to parse parameters
534 
535              EventFormatSplitedPart  * esp;
536               if ( strstr(occur, " FORMAT " ) ){
537                  occur  += strlen( " FORMAT " ) + 1 ;
538              }
539               for (s  = occur; * s != ' \0 ' ;s ++ ) {
540                   if * s == ' $ ' ){
541                      p  =  s;
542                       continue ;
543                  }
544                   if ( p  &&   ! isdigit( * s) &&  (s - p) > 1  ){
545                      {
546                           if ( p - occur > 0 ){
547                              esp  =   new  EventFormatSplitedPart;
548                              esp -> type  =  EventFormatSplitedPart::PROMPT;
549                              memset(buff, 0 ,p - occur + 1 );
550                              memcpy(buff,occur,p - occur);
551                              esp -> val  =  buff;
552                              ed -> list.push_back(esp);
553                          }
554                      }                    
555                      {                    
556                          memset(buff, 0 ,s - p);
557                          memcpy(buff,p + 1 ,s - p - 1 );
558                          esp  =   new  EventFormatSplitedPart;
559                          esp -> type  =  EventFormatSplitedPart::PARAMETER;
560                          esp -> val  =  buff;
561                          ed -> list.push_back(esp);
562                          
563                          p  =   0 ;
564                           if * == ' $ ' ){
565                              s -- ;
566                          }
567                      }
568                      occur  =  s;
569                  } // -- end if
570              } // -- end for
571               if ( (strlen(line) + line)  > occur){
572                  esp  =   new  EventFormatSplitedPart;
573                  esp -> type  =  EventFormatSplitedPart::PROMPT;
574                  esp -> val  =  occur;
575                  ed -> list.push_back(esp);                        
576              }
577          }
578      }
579      fclose(fp);
580  }
581 
582  RPSTRING GrabEvent::GetEventUUID(){
583       char  buff[ 512 ];
584      sprintf(buff, " %x-%x-000d-71da-0f4e-c0a80e890000 " ,_starttime, ++ _evuuid);
585       return  RPSTRING(buff);
586  }
587 
588  int     GrabEvent::GetEventTimestamp(EventContext *  ec){
589       int  ret;
590  //     OVsnmpVarBind* var;
591  //     char buff[20];
592      ret  =   0 ;
593       /*
594      memset(buff,0,sizeof(buff));
595      var = GetVarBindByIndex(5,ec->pdu);
596      if( var->type == ASN_OCTET_STR){
597          sprintf(buff,(char*)var->val.string,var->val_len);
598          ret = atoi(buff);
599      } */
600      ret  =  time( 0 );
601       return  ret;
602  }
603 
604  int     GrabEvent::GetCategory(EventContext *  ec){
605       int  ret;
606      ret  =   0 ;
607      EventDetail  *  ed  =  _ep_list[ec -> event];
608       if ( ed ) ret  =  ed -> cat.id;
609       return  ret;
610  }
611  int     GrabEvent::GetAppID(EventContext *  ec){
612       int  ret  =   0 ;
613      OVsnmpVarBind *  var;    
614       if ( ec -> reload ){
615           return  ec -> reload -> APPLICATION_ID;
616      }
617      var  =  GetVarBindByIndex( 1 ,ec -> pdu);
618       if ( var )
619      ret  =   * var -> val.integer;
620       return  ret;
621  }
622 
623  int     GrabEvent::GetSeverity(EventContext *  ec){
624       int  ret  =   0 ;
625      EventDetail  *  ed  =  _ep_list[ec -> event];
626       if ( ed ) ret  =  ed -> seve.id;
627       return  ret;
628  }
629  int     GrabEvent::GetTrapSource(EventContext *  ec){
630       int  ret = 0 ;
631       return  ret;
632  }
633  int     GrabEvent::GetPID(EventContext *  ec){
634       int  ret = 0 ;
635       return  ret;
636  }
637 
638  int     GrabEvent::GetNumVars(EventContext *  ec){
639       int  ret  =   0 ;
640      OVsnmpVarBind  *  var;
641       int  n;
642      n  = 0 ;
643       if ( ec -> reload){
644           return  ec -> reload -> NUMBER_VARBINDS;
645      }
646      var  =  ec -> pdu -> variables;
647       while ( var ){
648          n ++ ;
649          var  =  var -> next_variable;
650      }
651      ret  =  n;
652       return  ret;
653  }
654 
655  int     GrabEvent::GetIfNumber(EventContext *  ec){
656      OVwFieldId fid ;
657      OVwObjectId oid ;
658      RPSTRING ip;
659      OVsnmpVarBind *  var;
660      OVwFieldValue *  fv;
661       char  buff[ 128 ];
662 
663       int  ret = 0 ;
664      
665       if ( ec -> reload){
666           return  ec -> reload -> IFNUMBER;
667      }
668 
669       if ( ec -> event  ==  EVENT_NODE_DOWN_ID  ||  ec -> event == EVENT_NODE_UP_ID){
670          ret  =   0 ;
671      } else   if ( ec -> event  ==  EVENT_IF_DOWN_ID  ||  ec -> event  ==  EVENT_IF_UP_ID){                
672          var  =  GetVarBindByIndex( 6 ,ec -> pdu);        
673           if ! var ){
674               return   false ;
675          }
676           if ( var -> type  ==  ASN_OCTET_STR){        
677              buff[var -> val_len]  = ' \0 ' ;
678              memcpy(buff,var -> val.string,var -> val_len);
679              oid  =  atoi(buff);            
680          } else   if (var -> type  ==  ASN_INTEGER){
681              oid  =   * var -> val.integer;
682          } else {
683               return  ret;
684          }
685          fid  =  OVwDbFieldNameToFieldId( " SNMP ifIndex " );        
686          fv   =  OVwDbGetFieldValue(oid,fid);
687           if ( fv) {
688              ret  =  fv -> un.int_val;
689          }
690      }
691       return  ret;
692  }
693      
694  RPSTRING    GrabEvent::GetNodeName(EventContext *  ec){
695      RPSTRING ret = " Unknow NodeName " ;
696       char  buf[ 2048 ];
697       int  buflen  =  sizeof(buf);    
698      OVsnmpVarBind *  var;
699 
700       if ( ec -> reload){
701           return  ec -> reload -> NODENAME;
702      }
703      var  =  GetVarBindByIndex( 2 ,ec -> pdu);
704       if ( var )
705          sprint_by_type(buf, buflen, var, TYPE_VAL);
706      ret  =  buf;
707       return  ret;
708  }
709 
710  RPSTRING    GrabEvent::GetMessage(EventContext *  ec){
711      RPSTRING ret = "" ;
712       char  buf[ 2048 ];
713      OVsnmpVarBind *  var;
714       int  idx;
715       int  n;
716       int  buflen  =  sizeof(buf);    
717      EventDetail  *  ed  =  _ep_list[ec -> event];
718       if ( ec -> reload ){
719           return  ec -> reload -> MESSAGE;
720      }
721      
722       for (n = 0 ;n < ed -> list.size();n ++ ){
723           if ( ed -> list.at(n) -> type  ==  EventFormatSplitedPart::PROMPT){
724              ret  <<  ed -> list.at(n) -> val  <<   "   " ;
725               continue ;
726          }
727          idx  =  atoi(ed -> list.at(n) -> val.c_str());
728          var  =  GetVarBindByIndex(idx,ec -> pdu);
729           if ( var ){
730              sprint_by_type(buf,buflen,var,VAL_ONLY);
731              ret  <<  RPSTRING( "   " ) <<  buf;
732          }
733      }
734       return  ret;
735  }
736 
737  RPSTRING    GrabEvent::GetEvent_OID(EventContext *  ec){
738      RPSTRING ret;
739 
740       switch (ec -> event){
741       case  EVENT_NODE_DOWN_ID:
742          ret  =   " 1.3.6.1.4.1.11.2.17.1.0.58916865 " ;
743           break ;
744       case  EVENT_NODE_UP_ID:
745          ret  =   " 1.3.6.1.4.1.11.2.17.1.0.58916864 " ;
746           break ;
747       case  EVENT_IF_DOWN_ID:
748          ret  =   " 1.3.6.1.4.1.11.2.17.1.0.58916867 " ;
749           break ;
750 
751       case  EVENT_IF_UP_ID:
752          ret  =   " 1.3.6.1.4.1.11.2.17.1.0.58916866 " ;
753      }
754       return  ret;
755  }
756 
757  RPSTRING    GrabEvent::GetOVObjectID(EventContext *  ec){
758      RPSTRING ret = " 0 " ;
759       char  buff[ 1024 ];
760      OVsnmpVarBind *  var;
761       if ( ec -> reload){
762           return  ec -> reload -> OV_OBJECTID;
763      }
764      
765       if ( ec -> event  ==  EVENT_NODE_DOWN_ID  ||  ec -> event == EVENT_NODE_UP_ID){
766          var  =  GetVarBindByIndex( 3 ,ec -> pdu);        
767      } else   if ( ec -> event  ==  EVENT_IF_DOWN_ID  ||  ec -> event  ==  EVENT_IF_UP_ID){                
768          var  =  GetVarBindByIndex( 6 ,ec -> pdu);        
769      }
770       if ! var ){
771           return  ret;
772      }
773 
774       if ( var -> type  ==  ASN_OCTET_STR){        
775          buff[var -> val_len]  = ' \0 ' ;
776          memcpy(buff,var -> val.string,var -> val_len);
777          ret  =  buff;
778      }    
779       return  ret;
780  }
781 
782  RPSTRING    GrabEvent::GetProtocal(EventContext *  ec){
783      RPSTRING ret;
784      ret = " Canonical(generic)-event " ;
785       return  ret;
786  }
787 
788  RPSTRING GrabEvent::GetEventType(EventContext *  ec){
789      RPSTRING ret;
790      ret  <<   " . "   <<  GetEvent_OID(ec);
791       return  ret;
792  }
793 
794  RPSTRING GrabEvent::GetIpAddress(EventContext *  ec){
795      RPSTRING ret;
796      in_addr in;
797       if ( ec -> reload){
798           return  ec -> reload -> IP_ADDRESS;
799      }
800      in.s_addr  =  ec -> pdu -> address.sin_addr.s_addr;
801      ret  =  inet_ntoa(in);
802       return  ret;
803  }
804 
805  RPSTRING GrabEvent::GetTrapName(EventContext *  ec){
806      RPSTRING ret = "" ;
807       switch  (ec -> event){
808       case  EVENT_NODE_DOWN_ID:
809          ret  =   " OV_Node_Down " ;
810           break ;
811       case  EVENT_NODE_UP_ID:
812          ret  =   " OV_Node_Up " ;
813           break ;
814       case   EVENT_IF_DOWN_ID:
815          ret  =   " OV_IF_Down " ;
816           break ;
817       case  EVENT_IF_UP_ID:
818          ret  =   " OV_IF_Up " ;
819           break ;
820      }
821       return  ret;
822  }
823 
824  RPSTRING    GrabEvent::GetForwardAddress(EventContext *  ec){
825      RPSTRING ret;
826      ret  = " 0.0.0.0 " ;
827       return  ret;
828  }
829 
830  RPSTRING GrabEvent::GetEventSource(EventContext *  ec){
831      RPSTRING ret;
832      ret  =   " IP " ;
833       return  ret;
834  }
835 
836  RPSTRING    GrabEvent::GetEventTimeString(EventContext *  ec){
837      RPSTRING ret;
838      unsigned  int  t  =  GetEventTimestamp(ec);
839       char  buff[ 100 ];        
840      tm  * ptm;    
841      ptm  = localtime((time_t * ) & t);    
842      sprintf(buff, " %04d-%02d-%02d %02d:%02d:%02d " ,ptm -> tm_year + 1900  ,ptm -> tm_mon + 1 ,ptm -> tm_mday,ptm -> tm_hour,ptm -> tm_min,ptm -> tm_sec);
843      ret  =  buff;    
844       return  ret;
845  }
846 
847 
848  int  GrabEvent::IsUp(EventContext *  ec){
849       //  -- to do check ,monday work,eyes litte tired
850       // -- invoke ovw functions
851      
852      OVwFieldId fid ;
853      OVwObjectId oid ;
854      RPSTRING ip;
855      OVsnmpVarBind *  var;
856      OVwFieldValue *  fv;
857       char  buff[ 128 ];
858 
859       if ( ec -> reload){     // --历史加载数据
860          oid  =  atoi(ec -> reload -> OV_OBJECTID.c_str());
861      } else {    
862           if ( ec -> event  ==  EVENT_NODE_DOWN_ID){
863              var  =  GetVarBindByIndex( 3 ,ec -> pdu);
864          } else   if ( ec -> event  ==  EVENT_IF_DOWN_ID){
865              var  =  GetVarBindByIndex( 6 ,ec -> pdu);
866          }
867           if ! var ){
868               return   false ;
869          }
870          buff[var -> val_len]  = ' \0 ' ;
871          memcpy(buff,var -> val.string,var -> val_len);
872          oid  =  atoi(buff);
873      }
874      fid  =  OVwDbFieldNameToFieldId( " IP Status " );        
875      fv   =  OVwDbGetFieldValue(oid,fid);
876       if ( fv ){
877           if ( fv -> un.enum_val  !=   0   &&  fv -> un.enum_val != 4 ){
878              rplog -> Print( 1 , " [%s]OpenView ObjectID [%d] status is UP! " ,
879                  ec -> event == EVENT_NODE_DOWN_ID ? " EVENT_NODE_DOWN_ID " : " EVENT_IF_DOWN_ID " ,
880                  oid);
881               return   true ;
882          }
883      }
884           /*
885          var = GetVarBindByIndex(2,ec->pdu){
886          if( var->type == ASN_OCTET_STR){
887              buff[var->val_len] ='\0';
888              memcpy(buff,var->val.string,var->val_len);
889              fid = OVwDbFieldNameToFieldId("IP Status");
890              oid = OVwDbHostnameToObjectId(buff);        
891              fv  = OVwDbGetFieldValue(oid,fid);    
892              rplog->Print(1,"Test Host Node[%s] Status ",buff);
893              if( fv ){
894                  if( fv->un.enum_val != 0 && fv->un.enum_val!=4){
895                      rplog->Print(1,"Node[%s] status is UP!",buff);
896                      return true;
897                  }
898              }
899          } */         
900       return   false ;
901  }
902 
903  void  GrabEvent::Close(){
904      _update_thr -> Terminate();
905      _update_thr -> Wait();
906      rplog -> Print( 1 , " terminated upthread ! " );
907      OVsnmpClose(session);
908      Terminate();
909      Wait();
910  }
911 
912  RPSTRING GetDetectObjectName(EventContext  *  ec){
913      OVsnmpVarBind *  var;
914      RPSTRING ret;
915       char  buff[ 1024 ];
916      ret =   "" ;
917       if ( ec -> reload ){
918          ret  <<  ec -> reload -> NODENAME  <<   " :IF=> "   <<  ec -> reload -> IP_ADDRESS;
919           return  ret;
920      }
921      var  =  GetVarBindByIndex( 2 ,ec -> pdu);
922       if ! var){
923           return  ret;
924      }
925      
926      buff[var -> val_len] = ' \0 ' ;
927      memcpy(buff,var -> val.string,var -> val_len);        
928      ret  =  buff;
929 
930       if ( ec -> event  ==  EVENT_NODE_DOWN_ID){
931          ;    
932      } else  {
933          var  =  GetVarBindByIndex( 7 ,ec -> pdu);
934           if ! var  ||  var -> type != ASN_OCTET_STR){
935              ;
936          } else {
937              buff[var -> val_len] = ' \0 ' ;
938              memcpy(buff,var -> val.string,var -> val_len);    
939              ret  <<   " -(IF)  " ;
940              ret  <<  buff;
941          }
942      }
943       return  ret ;
944  }
945  //////////////////////////////////////////////////////////////////////////
946  // status detect thread 
947  void     UpdateThread::Run( void   * ){
948      EventContext_List::iterator itr;
949       while (    THREAD_CONTINUE_T  ){
950          SLEEP_MSEC( 100 );
951          _master -> _evctx_lock.Lock();
952           for ( itr  =  _master -> _evctx_list.begin() ;itr !=  _master -> _evctx_list.end();
953              itr ++ ){
954              EventContext  *  ec;
955              ec  =   * itr;
956              
957              time_t now  =  time( 0 );
958               if ( now  >=  ec -> check_time){  //  should be checked                
959                   // -- check status 
960                   // rplog->Print(1,"准备检测状态,事件源:%s,对象:%s",ec->event==EVENT_NODE_DOWN_ID?
961                   //             "EVENT_NODE_DOWN_ID":"EVENT_IF_DOWN_ID",GetDetectObjectName(ec).c_str());
962                   if ( _master -> IsUp(ec) ){
963                       //  modify event's status                     
964                       if ( ec -> event  ==  EVENT_NODE_DOWN_ID){
965                          ec -> event  =  EVENT_NODE_UP_ID;
966                      }
967                       if ( ec -> event  ==  EVENT_IF_DOWN_ID){
968                          ec -> event  =  EVENT_IF_UP_ID;
969                      }
970                       //  time will be updated in GetEventTimeStamp()
971                       // rplog->Print(1,"设备[%s]已转化为UP状态,开始更新数据库",GetDetectObjectName(ec).c_str());
972                      ec -> shift  =   true ;
973                      _master -> DoUpdate(ec);
974                      _master -> _evctx_list.erase(itr);                    
975                      delete ec;
976                      _master -> DumpDownEvent2File();     //  rewrite event file for next-load
977                      rplog -> Print( 1 , " 残留轮训队列对象数:%d " ,_master -> _evctx_list.size());
978                       break ; //  haha : lazy to jump out,wait next 
979                  } else {
980                       // rplog->Print(1,"设备[%s]没有转化为UP状态,继续等待超时",GetDetectObjectName(ec).c_str());
981                      ec -> check_time  =  now  +  _master -> _conf -> up_status_check_interval;
982                  }
983              }
984          }
985          _master -> _evctx_lock.Unlock();    
986      }
987      rplog -> Print( 1 , " UpThread Exiting! " );
988  }
989 
990  //////////////////////////////////////////////////////////////////////////
991 
992  void  GrabThread::pdu_process_entry( int  type, OVsnmpSession  * session, OVsnmpPdu  * pdu,  void   * data){
993      GrabThread  *  gt  =  (GrabThread * ) data;
994      gt -> pdu_process(type, session, pdu);
995  }
996 
997 
998 

你可能感兴趣的:(操作Solid 数据库代码)