realtimeShowLog.c
========================================================================
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
const char HEAD_R[]="RECV"; //判定有效行头标志
const char HEAD_S[]="SEND";
const char HEAD_D[]="DATA";
const char HEAD_RE[]="<n>"; //判定行结束标志
const char HEAD_DE[]=">";
const char HEAD_SE[]="NEXT<";
const char TYPE_NO1[]="TYPE:<82>"; //有效行标志开始
const char TYPE_NO2[]="TYPE:<a8>";
void realtimeReadLog(char*,char*); //读取日志
void realtimeWriteLog(char*,char*); //保存日志
int isstr(const char*,const char*); //判定是否含有字串
/*
*openLog读取的日志文件
*saveLog保存的日志文件
*该函数实现的从一个实时更新的文件中读取文件信息,
*筛选其中有效的信息,
*保存在数据库中,同时保存在一个标准的日志文件中。
*/
void realtimeReadLog(char* openLog,char* saveLog)
{
FILE *fp;
int i=0;
char tmp[500]; //临时保存读取的文件信息
char* str_content=NULL; //保存日志信息
long last_access_size=0; //上次读取文件大小
long tmp_access_size; //临时读取文件大小
clock_t start,finish;
start=clock();
printf("Start Clock is:%ld/n",start);
fp=fopen(openLog,"r");
if(!fp)
{
printf("不能打开读取文件/n");
return;
}
loop: fseek(fp,last_access_size,SEEK_SET); //跳过已读文件内容,把文件指针指向未读过的文件内容
tmp_access_size=ftell(fp); //获取当前文件已读文件大小
//printf("tmp_access_size 1 is %ld/n",tmp_access_size);
while(!feof(fp))
{
fgets(tmp,500,fp); //获取行内容
//判断是否是指令数据
if(!(isstr(tmp,HEAD_R)||isstr(tmp,HEAD_S)||isstr(tmp,HEAD_D)))
{
continue;
}
//判断是否指令数据是完整行
if (!((isstr(tmp,HEAD_R)&&isstr(tmp,HEAD_RE))||(isstr(tmp,HEAD_D)&& isstr(tmp,HEAD_DE))||(isstr(tmp,HEAD_S)&& isstr(tmp,HEAD_SE))))
{
continue ;
}
//printf("%s/n",tmp);
//判断数据行是否匹配格式
if(isstr(tmp,TYPE_NO1)||isstr(tmp,TYPE_NO2))
{
str_content=(char*)malloc(500*4);
if(NULL == str_content)
return ;
memset(str_content,0,500*4);
last_access_size=tmp_access_size; //记录已经读取文件的大小
//printf("last_access_size 1 is %ld/n",last_access_size);
i=1;
}
else
{
if(i==0)
{
last_access_size=ftell(fp); //获取当前文件已读文件大小
//printf("tmp_access_size 2 is %ld/n",tmp_access_size);
}
}
if (i!=0&&i<=4)
{
strcat(str_content,tmp);
strcat(str_content,"/n");
if (i==4){
realtimeWriteLog(str_content,saveLog); //保存到日志文件
free(str_content);
}
i = i +1;
if(i>4){
i=0;
if(str_content!=NULL)
str_content=NULL;
last_access_size=ftell(fp); //获取当前文件已读文件大小
//printf("last_access_size 2 is %ld/n",last_access_size);
}
}
tmp_access_size=ftell(fp); //获取文件临时已读大小
//printf("tmp_access_size 3 is %ld/n",tmp_access_size);
//printf("last_access_size 3 is %ld/n",last_access_size);
}
finish=clock();
printf("Finish Clock is %ld/n",finish);
printf("All Running Time is %ld/n",finish - start);
//等待
//sleep(1);
if(last_access_size!=tmp_access_size)
{ wait(1000);
printf("waiting.../n");
goto loop;
}
fclose(fp);
}
/*
*str_content有效的日志信息
*savelog保存的日志文件
*此函数用于将有效的数据分割成四段数据
*并保存在数据库中
*/
void realtimeWriteLog(char* str_content,char* savelog)
{
int j=0;
char *data[4];
FILE *fw;
char* token = strtok(str_content, "/n"); //分割字符串
//fw=fopen("trade.log","a+");
fw=fopen(savelog,"a+");
if(!fw)
{
printf("不能打开写入文件/n");
return;
}
while( token != NULL )
{
data[j]=token;
//printf("%s/n",data[j]);
if(!fprintf(fw,"%s/n",token))
printf("保存入日志错误/n");
j++;
token = strtok( NULL, "/n");
}
insert(data[0],data[1],data[2],data[3]);
//realtimeInsertDB(data[0],data[1],data[2],data[3]);
fflush(fw);
fclose(fw);
}
int isstr(const char *source,const char *dest)
{
int i=0,j,k;
while(source[i]!='/0')
{
k=i;j=0;
while(source[k]!='/0'&&dest[j]!='/0'&&source[k]==dest[j])
k++,j++;
if(dest[j]=='/0')
return 1;
if(source[k]=='/0')
return 0;
i++;
}
return 0;
}
=================================================================================
LogView.pc
=================================================================================
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
/* 包含SQL通讯区,它用于处理错误。*/
#include <sqlca.h>
void connect(); /* 连接到Oracle Server */
void disconnect(); /* 断开到Oracle Server的连接 */
void sql_error(char *); /* 处理错误句柄 */
void insert(char*,char*,char*,char*);
void doLogFile(char*,char*);
//void realtimeInsertDB(char*,char*,char*,char*);
extern sqlglm(char *,int *,int *);
int main(int argc,char* argv[])
{
//char* openLog="F:/project/MTIMessage.log";
//char* saveLog="F:/project/savelog.log";
//doLogFile(openLog,saveLog);
doLogFile(argv[1],argv[2]);
return 0;
}
/* 主程序 */
/*
void realtimeInsertDB(char* d1,char* d2,char* d3,char* d4)
{
//安装错误处理句柄/
EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle错误--/n");
//连接到数据库/
connect();
//执行插入/
insert(d1,d2,d3,d4);
//断开数据库连接/
disconnect();
}*/
void doLogFile(char* openLog,char* saveLog)
{
EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle错误--/n");
connect();
realtimeReadLog(openLog,saveLog);
disconnect();
}
/*子程序*/
/*连接子程序connect()*/
void connect()
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR username[10],password[13],server[10];
EXEC SQL END DECLARE SECTION;
/*输入用户名、口令以及服务器名*/
strcpy((char*)username.arr, "ets");
username.len=(unsigned short)strlen((char*)username.arr);
strcpy((char*)password.arr, "ets");
password.len=(unsigned short)strlen((char*)password.arr);
strcpy((char*)server.arr,"ORCL");
server.len=(unsigned short)strlen((char*)server.arr);
/*链接到Oracle服务器上*/
EXEC SQL CONNECT:username IDENTIFIED BY :password USING:server;
//printf("/n以用户%s成功地连接到了服务器%s上!/n",username.arr,server.arr);
}
/*断开连接子程序disconnect()*/
void disconnect()
{
EXEC SQL COMMIT WORK RELEASE;
}
void insert(char* d1,char* d2,char* d3,char* d4)
{
EXEC SQL BEGIN DECLARE SECTION;
char data1[500],data2[500],data3[500],data4[500];
EXEC SQL END DECLARE SECTION;
strcpy((char*)data1,d1);
strcpy((char*)data2,d2);
strcpy((char*)data3,d3);
strcpy((char*)data4,d4);
//seq=ets.SEQ_p2_jwat_mt.nextval
EXEC SQL INSERT INTO t_p2_jwat_mt (currentdate, seq,data1,data2,data3,data4)
VALUES (to_char(sysdate,'yyyymmdd'),ets.SEQ_p2_jwat_mt.nextval,:data1,:data2,:data3,:data4);
EXEC SQL COMMIT WORK;
}
/*错误处理子程序sql_error()*/
void sql_error(char* msg)
{
char err_msg[128];
size_t buf_len,msg_len;
/*出现SQL错误,继续往下执行*/
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("/n%s/n",msg);
buf_len=sizeof(err_msg);
/*调用函数sqlglm()获得错误消息*/
sqlglm(err_msg,&buf_len,&msg_len);
printf("%.*s/n",msg_len,err_msg);
/*回退事务,断开连接,退出程序*/
EXEC SQL ROLLBACK RELEASE;
exit(EXIT_FAILURE);
}
=================================================================================
在windows下,vs2008配置好环境,可以正常运行。
但是移植到linux下却说 can‘t find the file sqlca.h
把oracle下的这个文件拷贝到同一目录下,依然出现这种情况。
请问