Chinaunix首页 | 论坛 | 博客
  • 博客访问: 823082
  • 博文数量: 137
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1409
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(137)

文章存档

2024年(8)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: DB2/Informix

2011-11-20 22:07:09

风之舞原创,转载请注明来源。
=====================================================

最近尽做一些过期的咚咚,郁闷之余,也重新复习了一下N年以前的知识。

闲话少说,进入正题。

  • 系统环境:
                  SCO Openerver 5.0.6 Ni
                  IDS 731 for OSR5

  • 系统安装:
                 SCO OpenServer 5.0.6 Ni 的安装(略)
                 【注意事项:网卡的地址一定要配置成静态地址,为下面讲解方便,此处我们安装时设置机器的主机名为 webs109,主机域名是 unix-dr.com , 主机地址是 192.168.18.200】

                 IDS 731 for OSR5 的安装。
                 安装顺序为
                 a、sql
                 b、esql
                 c、4gl
                 d、online
                 e、lszh

                 安装方法:
                  step 1)
                            创建 informix 用户组和用户
                            groupadd informix
                            useradd -d /opt/informix -g informix -s /bin/sh -m -c "Informix Users" informix

                   step 2)
                            修改环境变量配置文件 .profile
                             添加如下内容:
                             INFORMIXDIR=/opt/informix
                             PATH=${PATH}:${INFORMIXDIR}/bin:.
                             TERMCAP=${INFORMIXDIR}/etc/termcap
                             export INFORMIXDIR PATH TERMCAP

                   step 3)
                            用 informix 用户登录系统,并切换到 root 用户。
                            Login:informix
                            Password:
                            $ su root           【特别注意,此处千万不能用 su - root 来切换用户,这样做的目的是为了保留前面所做的环境变量的值】
                            #

                   step 4)
                             依次进行安装
                            # ./installsql
                            # ./installesql
                            # ./install4gl
                            # ./installserver
                            # ./installzhcn

                     【特别注意:您的安装介质可能是压缩的包,需要展开,如果您的软件包是 .tar 的文件,使用 tar xvf <文件名>z展开,如果是 .cpi 或 cpio 的文件名,使用 cpio -ivcdBum <文件名> 展开。】

  • 配置 informix 服务。
                 step 1)
                             创建 account 服务用户和用户组(你也可以就使用 informix 用户,不过俺不建议这样,还是分开的好)
                            # groupadd account
                            # useradd -d /usr/account -s /bin/sh -g account -G informix -c "Account Users" -m account

                 step 2)
                           修改环境变量配置文件 .profile
                           添加如下内容:
                           INFORMIXDIR=/opt/informix
                           PATH=${PATH}:${INFORMIXDIR}/bin:.
                           TERMCAP=${INFORMIXDIR}/etc/termcap
                           LD_LIBRARY_PATH=${INFORMIXDIR}/lib:${INFORMIXDIR}/lib/esql:
                           ONCONFIG=onconfig.webs109
                           INFORMIXSERVER=webs109_sys
                           INFORMIXSERVERALIAS=webs109_sys_ali
                           export INFORMIXDIR PATH TERMCAP LD_LIBRARY_PATH ONCONFIG INFORMIXSERVER INFORMIXSERVERALIAS

                   step 3)
                           修改操作系统,添加IDS 的 tlitcp 服务的端口号
                           # vi /etc/serivces
                           在最后添加如下内容
                           webs109_comm                     50000/tcp
                           【注意:这个端口名字和端口号是你自己定义的,你可以随意,只要你定义的端口号没有被占用就好了。】

                   step 4)
                            修改系统内核参数,并重链内核,重启系统。
                             # cd /etc/conf/cf.d
                             # vi stune
                              添加或修改如下内容
                             SHMMAX  409600000
                             SHMMIN  1
                             SHMALL  512
                             SHMMNI  100
                             SHMSEG  6
                             MAXUMEM 524287
                             SEMMNI  8192
                             SEMMNS  8192
                             SEMMAP  8192
                             SEMMNU  100
                             SEMMSL  25
                             # ./link_unix
                             # reboot
                             【注意:如果重链内核时报错,请仔细检查拼写是否错误,如没有拼写错误,请修改 mtune 文件,在其中修改相应内容,然后再重新链接】

                    step 5)
                           配置 IDS 的通讯配置文件。
                          # vi /opt/informix/etc/sqlhosts
                          将其中的内容用 '#'  注释掉,然后添加如下内容:
                          webs109_sys     ontlitcp        webs109         webs109_comm
                          webs109_sys_alias onipcshm      webs109         sqlexec
                        【第一列:是 IDS 服务名,即 INFORMIXSERVER 和 INFORMIXSERVERALIAS 定义的部分,第二列是通讯类型名,ontlitcp 为 tcpip 方式,onipcshm 为共享内存方式,第三列是你的服务器名称,就是你在安装的时候的服务器的名称,第四列是对应的服务动作的名称,webs109_comm 对应的是 /etc/services 文件中前面定义的部分,表示是通过网络端口 webs109_comm端口 来访问 ids 服务,sqlexec 表示是直接在服务器上执行 sql 访问ids服务。】

                   step 6)
                            配置 IDS 共享内存配置文件 onconfig.webs109 (就是你在环境变量 ONCONFIG 中定义的文件名)
                           # cd /opt/informix/etc
                           # cp onconfig.std onconfig.webs109
                           # vi onconfig.webs109
                           修改如下内容:
                            ROOTPATH         /usr/account/dbs/rootdbs         #【你的数据文件块名称,如果是使用的裸设备,请在这里指定具体的裸设备文件名。】
                            ROOTSIZE          2000000                                      #【数据文件的大小,这里俺设置的是 2GB,需要注意的是,在 OSR5 中单个文件的大小不能超过 2GB】
                            MSGPATH           /usr/account/log/online.log      #【系统日志文件定义】
                            CONSOLE            /dev/null                                     #【控制台消息输出,原来是指向 /dev/console 的,这里俺把它重定向到了 /dev/null ,控制台输出信息将不会再输出了。】
                            ALARMPROGRAM    /opt/informix/etc/log_full.sh  #【log 脚本文件位置】
                            SYSALARMPROGRAM /opt/informix/etc/evidence.sh #【系统设备启动脚本文件位置】
                            TAPEDEV         /dev/null                                          #【数据库备份设备,这里俺是一个实验环境,所以定义到了空设备,如果是生产环境,你需要定义成磁带机,这样会保险得多,最起码你应该定义代一个物理磁盘设备,这样有利于数据备份。】
                            LTAPEDEV        /dev/null                                         # 【日志文件备份设备,这里俺是一个实验环境,所以定义到了空设备,如果是生产环境,你需要定义成磁带机,这样会保险得多,最起码你应该定义代一个物理磁盘设备,这样有利于数据备份。】
                            SERVERNUM       1                                                   # 【服务编号,通常情况下,你的机器上也许不只一个 IDS 服务,这时候,你需要保证该值的唯一性。】
                            DBSERVERNAME    webs109_sys                          # 【数据服务名,与你的环境变量中的 INFORMIXSERVER 参数定义的内容相对应。】
                            DBSERVERALIASES webs109_sys_alias               # 【数据服务别名,与你的环境变量中的 INFORMIXSERVERALIAS 参数定义的内容相对应。】
                            NETTYPE tlitcp,1,20,NET                                        #   【数据服务类型定义,与 sqlhost 文件中的相应部分对应,此处对应的是 ontlitcp 方式。】
                            NETTYPE ipcshm,1,20,CPU                                    #   【数据服务类型定义,与 sqlhost 文件中的相应部分对应,此处对应的是 onipcshm 方式。】
                            DRLOSTFOUND     /opt/informix/etc/dr.lostfound   # 【这个定义不知道是干嘛的,俺只是将 /usr/informix/etc/dr.lostfound 改成了 /opt/informix/etc/dr.lostfound 】


                   step 7)
                           添加数据服务的日志目录和数据块文件。
                           用 account 用户注册,进入系统。
                           Login: account
                           Password:
                          $ mkdir dbs
                          $ cd dbs
                          $ > rootdbs
                          $ cd ..
                          $ chmod -R g+rwx dbs
                          $ chown -R informix:informix dbs
                          $ mkdir log
                          $ mkdir bin

                    step 8)
                          初始化共享内存,并启动服务。
                         $ oninit -iy
                         $ onmode -ky
                         $ oninit -y
                         $ onstat -a

  • 系统使用
             用 account 用户运行 dbaccess ,创建一个数据库 accountdbs , 并创建一个 test 的表。
             test 表的信息如下:
  1. create table test (
  2.     id int,
  3.     name char(12),
  4.     mess char(40),
  5.     enabledate date
  6. );

  7. create unique index idx_test_01 on test(id);
           插入一条信息:
  1. insert into test value (1,'aaaa','bbbbbb','11/12/2011');
           【注意:有关如何建库建表,请参考 informix 相关书籍,其实大多数的数据库建库建表的 sql 语句都相同的】

  • 编程测试使用数据
          以下部分以 C 语言编写例子:
          编写如下程序代码进行数据访问
          test.ec
  1. #include <libSDK.h>
  2. EXEC SQL include sqlca;
  3. EXEC SQL include sqlda;
  4. EXEC SQL include sqlca;
  5. EXEC SQL include sqltypes;
  6. EXEC SQL include decimal;
  7. EXEC SQL include accountdbs.h;


  8. int main ( void )
  9. {
  10.         EXEC SQL BEGIN DECLARE SECTION;
  11.         struct test rd_test;
  12.         EXEC SQL END DECLARE SECTION;
  13.         char enabledate[11];

  14.         EXEC SQL DATABASE accountdbs;

  15.         EXEC SQL select * into :rd_test from test where id
  16. =1;
  17.         if (sqlca.sqlcode)
  18.         { fprintf(stdout,"==%ld==\n",sqlca.sqlcode);
  19.         } else {
  20.                 rfmtdate(rd_test.enabledate,"yyyy/mm/dd",enabledate);
  21.                 fprintf(stdout,"==%04d\n===%20s\n==%40s\n==%10s\n",rd_test.
  22. id,rd_test.name,rd_test.mess,enabledate);
  23.         }
  24.         EXEC SQL CLOSE DATABASE;
  25.         return 0;
  26. }
                libSDK.h
  1. #ifndef __LIBSDK__
  2. #define __libSDK__
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <sys/stat.h>
  7. #include <ustat.h>
  8. #include <signal.h>
  9. #include <setjmp.h>
  10. #include <malloc.h>
  11. #include <math.h>
  12. #include <ctype.h>
  13. #include <sys/types.h>
  14. #include <time.h>

  15. #ifndef TRUE
  16. #define TRUE 0
  17. #endif

  18. #ifndef FALSE
  19. #define FALSE -1
  20. #endif

  21. #ifndef NULL
  22. #define NULL '\0x00'
  23. #endif

  24. #ifndef NUL
  25. #define NUL '\0x00'
  26. #endif

  27. #endif /* __libSDK__ */
              accountdbs.h
  1. EXEC SQL BEGIN DECLARE SECTION;
  2. struct test
  3. {
  4.         int id;
  5.         char name[13];
  6.         char mess[41];
  7.         date enabledate;
  8. };
  9. EXEC SQL END DECLARE SECTION;
               Makefile

  1. INCL = -I../incl -I$(INFORMIXDIR)/incl -I$(INFORMIXDIR)/incl/esql

  2. ESQL = $(INFORMIXDIR)/bin/esql

  3. TARGET = test

  4. all:$(TARGET)

  5. test:test.ec
  6.         $(ESQL) -o test $(INCL) test.ec
  7.         mv test $(HOME)/bin
        在 src 目录下执行 gmake ,编译 test 【注意,这个 Makefile 文件是针对  gmake 3.8.1 写的,系统自带的 make 可能不支持这种写法,请参阅相关的 Make 文档】

       执行 test 将输出信息。
       $ test
==0001
===aaaa         
==bbbbb
==2011/11/12

  • 最后的总结
       1、在 ec 文件中使用数据结构体变量,需要在定义结构体的时候就采用标准的 SQL 定义变量的方式定义,不能使用纯 c 的方式定义,否则编译过程中会失败。
       2、在 ec 文件中引入定义数据结构体的定义文件的时候,需要采用 SQL 引入头文件的方式,不能使用纯 c 语言的方式引入。
       3、在 ec 中定义数据结构体变量的时候,需要采用 SQL 定义变量的方式来定义, 不能使用纯 c 定义变量的方式,否则会造成编译失败。
       4、在 informix 的 esql 语句中,rfmtdate 函数用来将一个 date 型变量转换成 char 型的数组变量,有关 rfmtdate 函数的使用方法,请参考 informix 的相关书籍。
       5、.h 的文件放置在 ./incl 目录下 , .ec 文件和 Makefile 文件放置在 src 目录下。


阅读(1469) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~