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;
}
示例#2
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);
}
示例#3
0
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);
}
示例#4
0
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;
		  
		  }
    }   

}