PRO*C 在linux下如何编译

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下的这个文件拷贝到同一目录下,依然出现这种情况。

请问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值