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 + -
显示快捷键?