int main(int argc, char* argv[]) { char err_msg [512]; struct oci_connection conn; OCIStmt* sh; int i_out; double d_out; char* c_out; OCIDate dt_out; int day, month, year, hour, minute, second; c_out = (char*) malloc(101); if (argc < 2) { printf("usage %s username/password[@dbname]\n", argv[0]); exit (-1); } text username[31]; text password[31]; text dbname [31]; parse_connect_string(argv[1],username, password, dbname); if (! oci_connect(username, password, dbname,&conn, err_msg)) { printf(err_msg); goto clean_up; } if (! (sh=oci_parse("select number_, number_5_3, varchar2_100, date_ from oci_test_table where " "number_ > :1 or number_5_3 = :2 or varchar2_100 < :3", err_msg, &conn))) { printf(err_msg); goto clean_up; } if (! oci_define(sh, err_msg, &conn, 4, SQLT_INT, &i_out, SQLT_FLT, &d_out, SQLT_CHR, c_out, 100, SQLT_ODT, &dt_out)) { printf(err_msg); goto clean_up; } if (! oci_execute(sh, err_msg, &conn, 3, SQLT_INT, 5, SQLT_FLT, 4.8, SQLT_CHR, "zzz")) { printf(err_msg); goto clean_up; } while (oci_fetch(sh, err_msg,&conn)) { OCIDateGetDate(&dt_out, &year, &month , &day ); OCIDateGetTime(&dt_out, &hour, &minute, &second); printf ("fetched %d %f %s %02d.%02d.%04d %02d:%02d:%02d\n",i_out, d_out, c_out, day, month, year, hour, minute, second); } clean_up: free (c_out); OCITerminate(OCI_DEFAULT); printf("\n"); return 0; }
// close the connections in the connection pool void tm_close_conn_pool (void) { unsigned int i; for (i = 0; i < MAX_THREADS; i++) { tm_free_conn (tm_own_connpool_1[i].db_connection); tm_free_conn (tm_own_connpool_2[i].db_connection); } for (i = 0; i < MAX_CONNECTION; i++) { tm_free_conn (tm_common_connpool[i].db_connection); } DeleteCriticalSection (&conn_pool_lock); // this should be called only once per process... OCITerminate(OCI_DEFAULT); }
void close_conn(OCI_CONNECTION *db_connection) { OCISessionEnd(db_connection->svchp, db_connection->errhp, db_connection->authp, OCI_DEFAULT); OCIServerDetach(db_connection->srvhp, db_connection->errhp, OCI_DEFAULT); OCIHandleFree(db_connection->authp, OCI_HTYPE_SESSION); OCIHandleFree(db_connection->srvhp, OCI_HTYPE_SERVER); OCIHandleFree(db_connection->svchp, OCI_HTYPE_SVCCTX); OCIHandleFree(db_connection->errhp, OCI_HTYPE_ERROR); OCIHandleFree(db_connection->envhp, OCI_HTYPE_ENV); free(db_connection); OCITerminate(OCI_DEFAULT); }
void *thread_process() { int thisret,size,i,fields,j,bufout=0,counter=0; int fetch_resu; long int datalen,buflen=0; int ociposi=-1; char buf[_buflen],tmp[_buflen],*realdata ; mytext *sqldata; int realdatalen=0; ub1 *bufp; int bufpint=1024; dvoid *hdlptr = (dvoid *) 0,*tmphdlptr = (dvoid *) 0; ub1 in_out = 0; sb2 indptr = 0; ub1 piece = OCI_FIRST_PIECE; ub4 hdltype = OCI_HTYPE_DEFINE, iter = 0, idx = 0; int poid; pthread_detach(pthread_self()); sqldata=(mytext *)malloc(sizeof(mytext)); sqldata->next=0; sqldata->last=0; sqldata->size=0; bufp=(ub1 *)malloc(sizeof(ub1)*_clobmax);//**bufp must set to _clobmax realdata=(char *)malloc(_buflen); realdatalen=_buflen; if((ociposi=getsession())==-1){ printf("pool is busy!!\n"); buf[16]=0; exit(1); } poci[ociposi].threadid=pthread_self(); poci[ociposi].id=ociposi; printf("thread id=%d , ociposi=%d \n",pthread_self(),ociposi); memset(buf,0,_buflen); while(1){ pthread_mutex_lock(&mylock); thisret=accept(sock,NULL,NULL); pthread_mutex_unlock(&mylock); poci[ociposi].busy=1; bufout=0; conn_times++; if(conn_times>=1000000){conn_times1++;conn_times=0;} if(conn_times1>=1000000)conn_times1=0; printf("connections %d millions %d socket=%d ociposi=%d\n",conn_times1,conn_times,thisret,ociposi); poci[ociposi].datetime=datetime->tm_min*60+datetime->tm_sec; poci[ociposi].transfer=0; //data_buffer(sqldata,"",2,0); while(sqldata->next){ sqldata=sqldata->next; } sqldata->size=0; while(sqldata->last){ sqldata=sqldata->last; sqldata->size=0; } poci[ociposi].sock=thisret; while(size=recv(thisret,buf,_buflen,0)){ buflen=size; buf[buflen]=0; poci[ociposi].transfer=1; //printf("--buflen=%d \n",buflen); if(buflen>2){ } else{ bufout++; if(bufout>=5 || buflen<=0)break; } size=buflen; if(poci[ociposi].sock==0)continue; poci[ociposi].datetime=datetime->tm_min*60+datetime->tm_sec; data_buffer(sqldata,buf,1,buflen); //end j=0; if(size>9) for(i=size-9;i<size;i++){ tmp[j]=buf[i]; j++; } tmp[j]=0; if((strncmp(buf,_end,strlen(_end))==0)||(strncmp(tmp,_end,strlen(_end))==0)){ break; } //set commit off if(strncmp(buf,_commitoff,strlen(_commitoff))==0){ poci[ociposi].commitmode=1; memset(buf,0,sizeof(buf)); send(thisret,_autocommitoff,strlen(_autocommitoff),0); continue; } //_commit if(strncmp(buf,_commit,strlen(_commit))==0){ OCITransCommit(poci[ociposi].svchp,poci[ociposi].errhp,OCI_DEFAULT ); memset(buf,0,sizeof(buf)); continue; } //set commit on if(strncmp(buf,_commiton,strlen(_commiton))==0){ poci[ociposi].commitmode=0; memset(buf,0,sizeof(buf)); send(thisret,_autocommiton,strlen(_autocommiton),0); continue; } //rollback if(strncmp(buf,_rollback,strlen(_rollback))==0){ OCITransRollback(poci[ociposi].svchp,poci[ociposi].errhp,OCI_DEFAULT) ; poci[ociposi].commitmode=1; memset(buf,0,sizeof(buf)); continue; } //_serverdown if(strncmp(buf,_serverdown,strlen(_serverdown))==0){ OCITerminate(OCI_DEFAULT); exit(1); } if(sqldata->size+1>=_mytextlen) while(sqldata->next){ if(sqldata->size+1>=_mytextlen) sqldata=sqldata->next; else break; } //end input size=sqldata->size; datalen=size-2; j=0; if(size>15) for(i=size-15;i<size;i++){ tmp[j]=sqldata->mydata[i]; j++; } tmp[j]=0; if((strncmp(tmp,_inputend,strlen(_inputend))==0)){ datalen=data_buffer(sqldata,buf,3,0); if(datalen+1>realdatalen){ printf("free\n"); free(realdata); printf("malloc\n"); realdata=(char *)malloc(datalen+1); realdatalen=datalen+1; } data_buffer(sqldata,realdata,4,0); size=realdatalen; realdata[size-17]=0; OCIHandleAlloc(poci[ociposi].envhp,(dvoid*)&poci[ociposi].stmthp,OCI_HTYPE_STMT,0,0); printf("oracle_query \n"); fields=oracle_query(&poci[ociposi],realdata,datalen-17,tmp); printf("oracle_query ok fields=%d \n",fields); if(fields<=0)break; //printf("start fetch\n"); i=0; counter=0; if(fields>0){ piece = OCI_FIRST_PIECE ; bufp[0]=0; fetch_data(&poci[ociposi]); counter++;printf("counter=%d \n",counter); send_process(_output_begin,strlen(_output_begin),&poci[ociposi]); while (poci[ociposi].status != OCI_NO_DATA){ //if(OCI_NEED_DATA==poci[ociposi].status){ //bufpint=4096; //poci[ociposi].status = OCIStmtGetPieceInfo(poci[ociposi].stmthp, poci[ociposi].errhp, &hdlptr, &hdltype,&in_out, &iter, &idx, &piece); //poci[ociposi].status = OCIStmtSetPieceInfo(hdlptr, hdltype, poci[ociposi].errhp,(dvoid *) bufp, &bufpint, piece,(CONST dvoid *) &indptr, (ub2 *) 0); //} //printf("data=%s\n",poci[ociposi].data[0]); //printf("data=%s\n",poci[ociposi].data[1]); //printf("data=%s\n",poci[ociposi].data[2]); fetch_data(&poci[ociposi]); if(poci[ociposi].status<0)break; counter++;printf("OCI_NO_DATA=%d , poci[ociposi].status=%d , counter=%d fetch_resu=%d \n",OCI_NO_DATA,poci[ociposi].status,counter); bufp[bufpint]=0; for (i=0;i<fields;i++){ send_process(poci[ociposi].data[i],strlen(poci[ociposi].data[i]),&poci[ociposi]); if(i+1<fields){ send_process(_output_column,strlen(_output_column),&poci[ociposi]); } } send_process(_output_row,strlen(_output_row),&poci[ociposi]); /* if(poci[ociposi].status==OCI_NEED_DATA){ if(tmphdlptr!=hdlptr){ i++; if(i>1) if((i-1)%fields==0){ send_process(_output_row,strlen(_output_row),&poci[ociposi]); }else{ send_process(_output_column,strlen(_output_column),&poci[ociposi]); } tmphdlptr=hdlptr; } send_process(bufp,bufpint,&poci[ociposi]); }*/ } if(i>1){ send_process(_output_column,strlen(_output_column),&poci[ociposi]); send_process(bufp,bufpint,&poci[ociposi]); send_process(_output_row,strlen(_output_row),&poci[ociposi]); } send_process(_output_end,strlen(_output_end),&poci[ociposi]); }else{ if((fields<0) && (strlen(poci[ociposi].errbuf)>0)){ send_process(_output_beginerr,strlen(_output_beginerr),&poci[ociposi]); send_process(poci[ociposi].errbuf,512,&poci[ociposi]); send_process(_output_end,strlen(_output_end),&poci[ociposi]); }else{ send_process(_ok,strlen(_ok),&poci[ociposi]); } } OCIHandleFree(poci[ociposi].stmthp,OCI_HTYPE_STMT); //printf("fetch ok\n"); send_process("",-1,&poci[ociposi]); //printf("data send ok\n"); datalen=0; //data_buffer(sqldata,"",2,0); while(sqldata->next){ sqldata=sqldata->next; } sqldata->size=0; while(sqldata->last){ sqldata=sqldata->last; sqldata->size=0; } //printf("query complete\n"); } poci[ociposi].transfer=0; } close(thisret); poci[ociposi].busy=0; if(fields==-99){ poci[ociposi].id=-1; OCILogoff(poci[ociposi].svchp,poci[ociposi].errhp); OCIHandleFree(poci[ociposi].envhp,OCI_HTYPE_ENV); pthread_create(&ph[ociposi], NULL, &thread_process,NULL); printf("exit program \n"); break; } } }