打印本文 打印本文 关闭窗口 关闭窗口
UNIX系统下informix自制开发工具构思介绍
作者:武汉SEO闵涛  文章来源:敏韬网  点击数5686  更新时间:2009/4/22 23:21:56  文章录入:mintao  责任编辑:mintao
p;  
     ┏━━━━━┓       SQL语句送后台          ┏━━━━━━━━━┓
     ┃          ┃  ────────────→  ┃                  ┃
     ┃  前  台  ┃  ........TCP/IP...........   ┃ 后台(net_server) ┃
     ┃  client  ┃  ←────────────  ┃      server      ┃
     ┗━━━━━┛    查询、更新结果返回前台    ┗━━━━━━━━━┛


                        ------图16-----


查询的核心代码:

Select(int tag, char *command)
{
$char *sel, Str[128];
$short flag;
$date Date;
$long Number, b_count, j;
$long prec;
$long type;
$long scale;
$double money;
$char result[128];
 int ret, offset=0;
 int i=0;
 char fmt[32], Tag;

 if(DisplayFlag) printf("tag=%c\nsql=%s\n", tag, command);
 RetPacket.txcode=SELECT;

 if(tag=='M'){
  //多项查询
  sel=getfield(command, &offset);
  if(strlen(sel)<2) goto EXIT1;
  Tag=sel[0];
  }
  else
  Tag=tag;
 sel=getfield(command, &offset);
 if(tag=='M') ChangeCmd(sel);
 if(strlen(sel)<10) goto EXIT1;

 if((ret=ComposeBrowse(10, sel))<0){
  SqlErrHandle(SQLCODE, SELECT);
  goto EXIT0;
  }
 RetPacket.txcode=SELECT;

 $get descriptor 'browsdesc' :b_count=count;
 if(SQLCODE){
  SqlErrHandle(SQLCODE, SELECT);
  goto EXIT0;
  }

 $fetch BROWSE using sql descriptor 'browsdesc';
 if(SQLCODE){
  strcpy(RetPacket.data, "SELECT ERROR|");
  SqlErrHandle(SQLCODE, SELECT);
  goto EXIT0;
  }

 for(j=1;j<=b_count;j++){
  $get descriptor 'browsdesc' value $j
  $prec=precision, /*money、decimal*/
  $scale=scale,  /*money、decimal*/
  $type=type;
  if(SQLCODE){
   strcpy(RetPacket.data, "SELECT ERROR|");
   SqlErrHandle(SQLCODE, SELECT);
   goto EXIT0;
   }
  switch(type){
  case SQLFLOAT:
  case SQLSMFLOAT:
  case SQLDECIMAL:
  case SQLMONEY:
   if(prec)
   sprintf(fmt, "%s%d.%df\0", "%",prec+1, scale);
   else
   strcpy(fmt, "%f");
   $get descriptor 'browsdesc' value $j
    $money=data;
   sprintf(result, fmt, money);

   if(SQLCODE==DATAISNULL) result[0]=0;
   break;
  default:
   $get descriptor 'browsdesc' value $j
    $result=data;
   }//switch

  DelTailSpace(result);

  if(SQLCODE==DATAISNULL) SQLCODE=0;

  if(SQLCODE){
   strcpy(RetPacket.data, "SELECT ERROR|");
   SqlErrHandle(SQLCODE, SELECT);
   goto EXIT0;
   }

  strcat(RetPacket.data, result);
  strcat(RetPacket.data, "|");
  }//for
 if(DisplayFlag) puts(RetPacket.data);

EXIT0:
 $close BROWSE;
 $free BROWSE;
 $deallocate descriptor 'browsdesc';
EXIT1:
return TRUE;
}

 

 

(一)网络版的作用:
    增强安全性。INFORMIX能访问远程数据库,但须建立对等关系,会造成不安全。
    本版无须建立对等关系,克服了这个弱点。

(二)网络版的用法:
    1. 网络通讯使用TCP/IP协议。
    2. 前、后台程序也可在同台机器上. 
    3. FORM的定制、函数及功能不变.
    4. 链接的程序库: /usr/wform/lib/libnetform.a。
    5. 通讯的配置文件: $HOME/etc/sys.net的内容:

        (1)数据库名:对后台而设
        [Database]
        Database=mobile
        (2)后台机器名:前、后台须一致。/etc/hosts中存在,也可以直接写IP地址。
        [ServerHost]
        ServerHost=save01

        (3)端口号:前、后台须一致。
        [NetForm Tcp Port]
        NetFormTcpPort=8168

        (4)socket超时报警时间(秒),确省值60
 [Socket Read & Write Time Out(s)]
 SocketTimeOut=35

        (5)查询超时报警时间(秒),确省值60, 仅对前台而设。
 [Wgetch Time Out(s)]
 WgetchTimeOut=30

        (6)跟踪标志,仅对前台而设,0屏蔽,1开放。跟踪文件:$HOME/run/trace
 [Trace Flag]
 TraceFlag=0

        (7)connect超时报警时间(秒) 仅对前台而设。
 [Company Server Connect Time Out(s)]
 ConnectTimeOut=8

        (8) fork()服务子进程同时存在的最大数, 仅对后台而设。
 [Max User Number]
 UserNum=10

        (9)显示部分服务程序接受和发送的数据。0屏蔽,1开放
        [Display Server Data Flag]
 DisplayFlag=1


    6. 地址簿文件: $HOME/etc/hosts.equ 设在后台
       记录允许访问数据库的前台机器的IP地址,未记录的机器不能访问。
       设置方法:
  (1)文件中加入all.hosts,对所有的客户开放。
  (2)文件中加入网段地址(如13.7.5),对该网段开放。
  (3)文件中加入完整的客户端IP地址(如12.17.23.76),对该客户机开放。

    7. 服务器的启动:net_server

    8. 服务器的停止:net_server stop

    9. 返回值∶  当sqlcode>-10时是本系统定义,含义如下∶

                 -1 收数据包出错: 如超时。
                 -2 拒绝服务∶    地址簿无本机IP地址
   -4 服务进程超过限定的数目。

 

 

上一页  [1] [2] [3] [4] [5] [6] [7] [8] 

打印本文 打印本文 关闭窗口 关闭窗口