int ndb_logevent_get_next(const NdbLogEventHandle h, struct ndb_logevent *dst, unsigned timeout_in_milliseconds) { if (timeout_in_milliseconds == 0) { int res; while ((res = ndb_logevent_get_next(h, dst, 60000))==0); return res; } SocketInputStream in(h->socket, timeout_in_milliseconds); Properties p; char buf[256]; /* header */ while (1) { if (in.gets(buf,sizeof(buf)) == 0) { h->m_error= NDB_LEH_READ_ERROR; return -1; } if ( buf[0] == 0 ) { // timed out return 0; } if ( strcmp("log event reply\n", buf) == 0 ) break; if ( strcmp("<PING>\n", buf) ) ndbout_c("skipped: %s", buf); if(in.timedout()) return 0; } /* read name-value pairs into properties object */ while (1) { if (in.gets(buf,sizeof(buf)) == 0) { h->m_error= NDB_LEH_READ_ERROR; return -1; } if (in.timedout()) return 0; if ( buf[0] == '\n' ) { break; } if (insert_row(buf,p)) { h->m_error= NDB_LEH_READ_ERROR; return -1; } } int i; const char *val; dst->type= (enum Ndb_logevent_type)-1; /* fill in header info from p*/ for (i= 0; ndb_logevent_header[i].token; i++) { if ( p.get(ndb_logevent_header[i].token, &val) == 0 ) { ndbout_c("missing: %s\n", ndb_logevent_header[i].token); h->m_error= NDB_LEH_MISSING_EVENT_SPECIFIER; return -1; } if ( memcpy_atoi((char *)dst+ndb_logevent_header[i].offset, val, ndb_logevent_header[i].size) ) { h->m_error= NDB_LEH_INTERNAL_ERROR; return -1; } } Uint32 level; LogLevel::EventCategory category; Logger::LoggerLevel severity; EventLoggerBase::EventTextFunction text_fn; /* fill in rest of header info event_lookup */ if (EventLoggerBase::event_lookup(dst->type,category,level,severity,text_fn)) { ndbout_c("unknown type: %d\n", dst->type); h->m_error= NDB_LEH_UNKNOWN_EVENT_TYPE; return -1; } dst->category= (enum ndb_mgm_event_category)category; dst->severity= (enum ndb_mgm_event_severity)severity; dst->level= level; /* fill in header info from p */ for (i= 0; ndb_logevent_body[i].token; i++) { if ( ndb_logevent_body[i].type != dst->type ) continue; if ( p.get(ndb_logevent_body[i].token, &val) == 0 ) { h->m_error= NDB_LEH_UNKNOWN_EVENT_VARIABLE; return -1; } if ( memcpy_atoi((char *)dst+ndb_logevent_body[i].offset, val, ndb_logevent_body[i].size) ) { h->m_error= NDB_LEH_INTERNAL_ERROR; return -1; } } return 1; }
int ndb_logevent_get_next(const NdbLogEventHandle h, struct ndb_logevent *dst, unsigned timeout_in_milliseconds) { if (timeout_in_milliseconds == 0) { int res; while ((res = ndb_logevent_get_next(h, dst, 60000))==0); return res; } SocketInputStream in(h->socket, timeout_in_milliseconds); /* Read log event header until header received or timeout expired. The MGM server will continusly send <PING>'s that should be ignored. */ char buf[1024]; NDB_TICKS start = NdbTick_CurrentMillisecond(); while(1) { if (in.gets(buf,sizeof(buf)) == 0) { h->m_error= NDB_LEH_READ_ERROR; return -1; } if ( buf[0] == 0 ) { // timed out return 0; } if ( strcmp("log event reply\n", buf) == 0 ) break; if ( strcmp("<PING>\n", buf) ) ndbout_c("skipped: %s", buf); if(in.timedout()) return 0; if ((NdbTick_CurrentMillisecond() - start) > timeout_in_milliseconds) return 0; }; /* Read name-value pairs until empty new line */ Properties p; while (1) { if (in.gets(buf,sizeof(buf)) == 0) { h->m_error= NDB_LEH_READ_ERROR; return -1; } if (in.timedout()) return 0; if ( buf[0] == '\n' ) { break; } if (insert_row(buf,p)) { h->m_error= NDB_LEH_READ_ERROR; return -1; } } int i; const char *val; dst->type= (enum Ndb_logevent_type)-1; /* fill in header info from p*/ for (i= 0; ndb_logevent_header[i].token; i++) { if ( p.get(ndb_logevent_header[i].token, &val) == 0 ) { ndbout_c("missing: %s\n", ndb_logevent_header[i].token); h->m_error= NDB_LEH_MISSING_EVENT_SPECIFIER; return -1; } if ( memcpy_atoi((char *)dst+ndb_logevent_header[i].offset, val, ndb_logevent_header[i].size) ) { h->m_error= NDB_LEH_INTERNAL_ERROR; return -1; } } Uint32 level; LogLevel::EventCategory category; Logger::LoggerLevel severity; EventLoggerBase::EventTextFunction text_fn; /* fill in rest of header info event_lookup */ if (EventLoggerBase::event_lookup(dst->type,category,level,severity,text_fn)) { ndbout_c("unknown type: %d\n", dst->type); h->m_error= NDB_LEH_UNKNOWN_EVENT_TYPE; return -1; } dst->category= (enum ndb_mgm_event_category)category; dst->severity= (enum ndb_mgm_event_severity)severity; dst->level= level; /* fill in header info from p */ for (i= 0; ndb_logevent_body[i].token; i++) { if ( ndb_logevent_body[i].type == dst->type ) break; } if (ndb_logevent_body[i].token) { do { if ( p.get(ndb_logevent_body[i].token, &val) == 0 ) { h->m_error= NDB_LEH_UNKNOWN_EVENT_VARIABLE; return -1; } if ( memcpy_atoi((char *)dst+ndb_logevent_body[i].offset, val, ndb_logevent_body[i].size) ) { h->m_error= NDB_LEH_INTERNAL_ERROR; return -1; } } while (ndb_logevent_body[++i].type == dst->type); } else { if (!p.get("data", &val)) { h->m_error= NDB_LEH_UNKNOWN_EVENT_VARIABLE; return -1; } BaseString tmp(val); Vector<BaseString> list; tmp.split(list); for (size_t j = 0; j<list.size(); j++) { dst->Data[j] = atoi(list[j].c_str()); } } return 1; }