cdrserver.cpp
来自「MySQL数据库开发源码 值得一看哦」· C++ 代码 · 共 1,492 行 · 第 1/5 页
CPP
1,492 行
/* This loop will keep receiving until all 10 bytes */ /* have been received, thus guaranteeing that the */ /* next recv at the top of the loop will start at */ /* the begining of the next request. */ for (;len < headerlen;) { x = recv(s,buf,(headerlen-len),0); if (x == -1) { snprintf(msg,sizeof(msg),"Error from recv"); if ((checkchangelog(log,lognamn))==0) n2log(log,msg); goto errout; /* error from recv */ } len=len+x; } if (ops == 0) { MyTransaction = MyNdb.startTransaction(); if (MyTransaction == NULL) error_handler(MyNdb.getNdbErrorString()); }//if MyOperation = MyTransaction->getNdbOperation(tableName); if (MyOperation == NULL) error_handler(MyTransaction->getNdbErrorString()); /*------------------------------------------------------*/ /* Parse header of CDR records */ /*------------------------------------------------------*/ /*------------------------------------------------------*/ /* 1. Type of cdr */ /*------------------------------------------------------*/ /* Not used for the moment cdrtype=(char)buf[0]; */ /*------------------------------------------------------*/ /* 2. Total length of CDR */ /*------------------------------------------------------*/ swab(buf+1,buf+1,2); memcpy(&cdrlen,buf+1,2); /*------------------------------------------------------*/ /* 3. Partial type of CDR */ /*------------------------------------------------------*/ cdrsubtype=(char)buf[3]; switch (cdrsubtype) { case 0: c1++; tmpcdrptr->CallAttemptState = 1; check = MyOperation->insertTuple(); break; case 1: c2++; tmpcdrptr->CallAttemptState = 2; check = MyOperation->updateTuple(); break; case 2: c3++; tmpcdrptr->CallAttemptState = 3; check = MyOperation->deleteTuple(); break; case 3: c4++; tmpcdrptr->CallAttemptState = 4; check = MyOperation->deleteTuple(); break; if (check == -1) error_handler(MyTransaction->getNdbErrorString()); } /*cdrsubtype=(cdrsubtype << 24) >> 24;*/ /*------------------------------------------------------*/ /* 4. ID number */ /*------------------------------------------------------*/ /*swab(buf+4,buf+4,4);*/ /* ABCD -> BADC */ /* swab(buf+4,buf+4,4); swab(buf+5,buf+5,2); swab(buf+6,buf+6,2); swab(buf+4,buf+4,2); swab(buf+5,buf+5,2); */ memcpy(&cdrid,buf+4,4); tmpcdrptr->CallIdentificationNumber = cdrid; #ifdef SETDBG puts("CIN"); #endif check = MyOperation->equal("CIN",(char*)&cdrid); if (check == -1) error_handler(MyTransaction->getNdbErrorString()); #ifdef SETDBG puts("CAS"); #endif if (cdrsubtype < 2) { check = MyOperation->setValue("CAS",(char*)&cdrsubtype); if (check == -1) error_handler(MyTransaction->getNdbErrorString()); } /*------------------------------------------------------*/ /* 5. Time stamp */ /*------------------------------------------------------*/ swab(buf+12,buf+12,4); swab(buf+13,buf+13,2); swab(buf+14,buf+14,2); swab(buf+12,buf+12,2); swab(buf+13,buf+13,2); memcpy(&cdrtime,buf+12,4); switch (cdrsubtype) { case 0: #ifdef SETDBG puts("START_TIME"); #endif check = MyOperation->setValue("START_TIME",(char*)&cdrtime); break; case 1: #ifdef SETDBG puts("Start1"); #endif check = MyOperation->setValue("StartOfCharge",(char*)&cdrtime); break; case 2: #ifdef SETDBG puts("Start2"); #endif /* check = MyOperation->setValue("StopOfCharge",(char*)&cdrtime); */ check = 0; break; if (check == -1) error_handler(MyTransaction->getNdbErrorString()); } /*------------------------------------------------------*/ /* 6. Milliseconds */ /*------------------------------------------------------*/ /* Not used by application swab(buf+16,buf+16,2); memcpy(&cdrmillisec,buf+16,2); */ /*------------------------------------------------------*/ /* 7. CDR status reserverd for future use */ /*------------------------------------------------------*/ /* Not used by application memcpy(&cdrstatus,buf+18,1); */ /*------------------------------------------------------*/ /* 8. CDR equipe id, number of sending equipement */ /*------------------------------------------------------*/ /* Not used by application memcpy(&cdrequipeid,buf+19,1); */ /*cdrequipeid=(cdrequipeid << 24) >> 24;*/ /*------------------------------------------------------*/ /* 9. CDR reserverd for furter use */ /*------------------------------------------------------*/ /* Not used by applikation swab(buf+20,buf+20,4); swab(buf+21,buf+21,2); swab(buf+22,buf+22,2); swab(buf+20,buf+20,2); swab(buf+21,buf+21,2); memcpy(&cdrreserved1,buf+20,4); */ /*------------------------------------------------------*/ /* calculate length of datapart in record */ /* Formula recordlength-headerlen-1 */ /*------------------------------------------------------*/ cdrrestlen=cdrlen-(headerlen-1); /*------------------------------------------------------*/ /* Finished with header */ /*------------------------------------------------------*/ /* Read remaining cdr data into buffer for furter */ /* handling. */ /*------------------------------------------------------*/ len = recv(s,buf,cdrrestlen,MSG_WAITALL); if (len == -1) { snprintf(msg,sizeof(msg),"Error from recv"); if ((checkchangelog(log,lognamn))==0) n2log(log,msg); goto errout; /* error from recv */ } for (;len<cdrrestlen;) { x = recv(s,buf,len-cdrrestlen,0); if (x == -1) { snprintf(msg,sizeof(msg),"Error from recv"); if ((checkchangelog(log,lognamn))==0) n2log(log,msg); goto errout; /* error from recv */ } len=len+x; } done=FALSE; /* Count the transfer/sec */ tmptransfer += cdrlen; if (cdrsubtype > 1) { #ifdef SETDBG puts("Going to execute"); #endif ops++; if (ops == ops_before_exe) { ops = 0; check = MyTransaction->execute(Commit, CommitAsMuchAsPossible); if ((check == -1) && (MyTransaction->getNdbError() != 0)) error_handler(MyTransaction->getNdbErrorString()); MyNdb.closeTransaction(MyTransaction); #ifdef SETDBG puts("Transaction closed"); #endif }//if reqcnt++; continue; } for (x=0;x<=cdrrestlen && !done && cdrrestlen > 1;) { uc=buf[x]; parmtype=uc; /*parmtype=(parmtype << 24) >> 24;*/ /* Modified in sun worked in hp */ parmlen = buf[x+1]; /*parmlen =(parmlen << 24) >> 24;*/ x+=2; switch (parmtype) { case 4: /* Called party number */ bcd_decode2(parmlen,&buf[x],crap); tmpcdrptr->BSubscriberNumberLength = (char)parmlen; strcpy(tmpcdrptr->BSubscriberNumber,crap); tmpcdrptr->BSubscriberNumber[parmlen] = '\0'; x=x+(parmlen/2); if (parmlen % 2) x++; tmpcdrptr->USED_FIELDS |= B_BSubscriberNumber; #ifdef SETDBG puts("BNumber"); #endif check = MyOperation->setValue("BNumber",(char*)&tmpcdrptr->BSubscriberNumber); if (check == -1) error_handler(MyTransaction->getNdbErrorString()); break; case 9: /* Calling Partys cataegory */ if (parmlen != 1) printf("ERROR: Calling partys category has wrong length %d\n",parmlen); else tmpcdrptr->ACategory=(char)buf[x]; x+=parmlen; tmpcdrptr->USED_FIELDS |= B_ACategory; #ifdef SETDBG puts("ACategory"); #endif check = MyOperation->setValue("ACategory",(char*)&tmpcdrptr->ACategory); if (check == -1) error_handler(MyTransaction->getNdbErrorString()); break; case 10: /* Calling Party Number */ bcd_decode2(parmlen,&buf[x],crap); tmpcdrptr->ASubscriberNumberLength = (char)parmlen; strcpy(tmpcdrptr->ASubscriberNumber,crap); tmpcdrptr->ASubscriberNumber[parmlen] = '\0'; x=x+(parmlen/2); if (parmlen % 2) x++; tmpcdrptr->USED_FIELDS |= B_ASubscriberNumber; #ifdef SETDBG puts("ANumber"); #endif check = MyOperation->setValue("ANumber",(char*)&tmpcdrptr->ASubscriberNumber); if (check == -1) error_handler(MyTransaction->getNdbErrorString()); break; case 11: /* Redirecting number */ bcd_decode2(parmlen,&buf[x],crap); strcpy(tmpcdrptr->RedirectingNumber,crap); x=x+(parmlen/2); if (parmlen % 2) x++; tmpcdrptr->USED_FIELDS |= B_RedirectingNumber; #ifdef SETDBG puts("RNumber"); #endif check = MyOperation->setValue("RNumber",(char*)&tmpcdrptr->RedirectingNumber); if (check == -1) error_handler(MyTransaction->getNdbErrorString()); break; case 17: /* Called partys category */ if (parmlen != 1) printf("ERROR: Called partys category has wrong length %d\n",parmlen); else tmpcdrptr->EndOfSelectionInformation=(char)buf[x]; x+=parmlen; tmpcdrptr->USED_FIELDS |= B_EndOfSelectionInformation; #ifdef SETDBG puts("EndOfSelInf"); #endif check = MyOperation->setValue("EndOfSelInf",(char*)&tmpcdrptr->EndOfSelectionInformation); if (check == -1) error_handler(MyTransaction->getNdbErrorString()); break; case 18: /* Release reason */ if (parmlen != 1) printf("ERROR: Release reason has wrong length %d\n",parmlen); else tmpcdrptr->CauseCode=(char)buf[x]; x+=parmlen; tmpcdrptr->USED_FIELDS |= B_CauseCode; #ifdef SETDBG
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?