当前位置:首页 > 技术与方案 > 网络管理相关

用FTP传输实现版本管理中的自动更新 (图)

(2012-09-03 20:20:44)

在客户服务器结构的系统中,要实现应用程序的自动更新通常是一个难题。目前多数的企业中都是采取人工安装更新的方式,需要消耗大量的人力和物力;在更新的过程中,需要确定最新的版本,全部实现一个大型企业内部的程序更新时延性大,降低了工作效率。

本文以一个版本管理程序为例(开发工具为PowerBuilder),介绍如何用FTP传输实现版本自动更新。FTP是一个很常用的功能,实现网络上文件的传输。这里的版本管理特指在应用程序升级后完成由服务器到客户端的自动更新(象一些杀毒软件自动检测更新病毒库那样)。PB中提供的版本管理(ObjectCycle)是针对开发过程的,主要功能是管理每次升级应用系统时更新哪些文件,以及不准许开发人员同时对程序进行修改,与本系统的版本管理的概念是不一样的。

一、系统结构
该程序是建立在客户服务器结构的系统基础上的,系统结构图如如图1:

由于PowerBuilder本身并未提供任何FTP的功能,因此想在PowerBuilder中进行FTP传输,只能应用PowerBuilder以外的资源。一般情况有以下几种方法:
1. 直接调用外部命令;
2. 使用Internet Transfer控件;
3. 使用Mabry Internet FTP/X Control 。
本文采取一种新的方式:将FTP的命令用VC++打包,做成动态链接库(DLL)文件,从系统中调用函数。
二、程序实现流程及部分代码
例子程序序要实现的功能:
1. 检查网络是否连通,显示运行信息;
2. 检查客户机与服务器所运行的应用程序版本是否一致,如果不一致,要求自动进行程序更新。
处理过程:如图2所示
1. 从注册表得到当前的版本号
1) 得到注册表文件的路径;
ls_reg_dbprofiles = gs_reg_keyboot + "" + gs_reg_product
2) 从客户机的注册表中得到当前应用程序的版本号
RegistryGet(ls_reg_dbprofiles, "版本号",RegString!, ls_temp)
2. 连网络和数据库:
确定网络,和数据库是否连通,对用户显示进程信息。
// 设置目的数据库的连接参数
sqlca.DBMS ="xxxxxxxxxx"
sqlca.Database ="xxx"
sqlca.logId ="xxxxx"
sqlca.logPass ="xxxxx"
sqlca.ServerName = "xxxx"
Connect Using sqlca;
If sqlca.SqlCode < 0 then               //连接数据库
 MessageBox("连接出错","不能连接到目的数据库上")
End If

3. 从服务器的数据库中得到当前的版本号
从版本信息表(包括版本号、更改日期、属性)中得到当前最新版本的版本号
datastore lds_sversion                         //定义一个存储过程
string ld_sversion
lds_sversion= CREATE DataStore                //创建一个实例
lds_sversion.dataobject="d_sversion"          //指向一个数据窗口
lds_sversion.settransobject(sqlca)
lds_sversion.retrieve()                       //检索数据
ld_sversion = lds_sversion.object.bbh[1]      //获得当前最新的版本号
DESTROY lds_sversion
return ld_sversion
4. 连接到文件服务器
根据已授权使用的用户名和密码,连接到文件服务器(可以通过窗口输入,也可以预先在应用程序中设定),参数包括:服务器名、服务器IP地址、文件路径、用户名称、用户密码、服务器标志。
//连接到文件服务器
datastore lds_smessage                         //定义一个存储过程
int li_yn
lds_smessage= CREATE DataStore                 //创建一个实例
lds_smessage.dataobject="d_smassage"           //指向一个数据窗口
lds_smessage.settransobject(sqlca)
lds_smessage.retrieve()                        //检索数据
 do while lds_smessage.rowcount()<=0
 li_yn = messagebox("服务器信息","不能取到文件服务器信息,现在设置服务器信息吗?,Exclamation!,YesNo!)
 if li_yn = 1 then
OPEN(w_setfileserver)                //打开配置文件服务器的窗口
 else
exit                                 //文件服务器连结不成功,退出
end if
lds_smessage.retrieve()
loop
if lds_smessage.rowcount()<=0 then
close(this)
else
 gs_server=lds_smessage.object.server_ip[1]         //服务器的IP地址
gs_serparth=lds_smessage.object.server_path[1]     //文件存储路径
gs_user=lds_smessage.object.login_name[1]          //登陆服务器的用户名
gs_pass=lds_smessage.object.login_pwd[1]         //登陆服务器的用户口令
if ftpConnect(gs_server, gs_user, gs_pass) = 0 then  //连结文件服务器
setpointer(arrow!)                             //设置鼠标指针
messagebox("错误提示","文件服务器连接错误", StopSign!)
return 0
end if
DESTROY lds_smessage
end if
5. 检查版本号是否一致,确定是否更新应用程序。
if trim(ls_local_version)=gs_sversion then             //检查版本号是否一致
 MessageBox( "版本管理", "当前应用程序已经是最新版本" )
ELSE
 OPEN(w_changversion_in)                 //打开更新程序的窗口
END IF
6. 强制执行的属性
1) 如果属性值为1,为强制执行。为用户显示更新进程条。
2) 如果属性值为0,为非强制执行。提示用户选择是否更新应用程序。
属性值存在数据库中,对应于每个不同的版本号。
//从数据库中察看新版本的属性,判断是否强制更新
datastore lds_sversion              //定义数据存储过程
int li_sx,i,li_yn
string ls_file,ls_reg_dbprofiles,ls_dw_version,ls_wm
gs_filepath = sle_1.text           //从单行编辑器中输入的文本得到文件路径
lds_sversion= CREATE DataStore          //创建一个实例
lds_sversion.dataobject="d_sversion"    //指向d_sversion数据窗口
lds_sversion.settransobject(sqlca)
lds_sversion.retrieve()                 //检索数据
if lds_sversion.rowcount() >0 then      //检查版本属性是否强制更新
 li_sx = Integer(lds_sversion.object.sx[1])
if li_sx = 1 then                   //版本属性为“强制”时,直接更新
open(w_change)                  //打开更新文件的窗口
else
 li_yn = messagebox("非强制更新","是否要更新应用程序",Exclamation!,YesNo!)               //版本属性为“非强制”时,向用户询问
if li_yn = 1 then
OPEN(w_change)             //打开更新文件的窗口
end if
 end if
end if
7. 备份文件
在客户机存放应用程序的目录下再建立一个BAK目录,每更新一个文件前,将原有文件备份到BAK目录下。
cb_1.Enabled = false               
 //“完成”按钮设置为灰度(不可操作)
int li_sx,li_kx,li_iy
string ls_reg_dbprofiles,ls_dw_version,ls_wm
dw_1.SetTransObject(sqlca)
dw_1.Retrieve()                     
//检索数据
li_iy = dw_1.rowcount()             
//统计要传输的文件的总数
ii_control = 0
for li_kx = 1 to li_iy             
 //逐个地传输文件
 ls_wm = dw_1.object.wm[li_kx]
gs_back = gs_filepath + "bak"   
//设置备份文件的目录
 CopyFileA(gs_filepath + "" + ls_wm,gs_back + ls_wm,false)  //备份文件
If ftpGetfile(gs_serparth + "/" + ls_wm, gs_filepath + "" + ls_wm, false, 128, 2) = 0  then                    //传输文件
 setpointer(arrow!)         //设置鼠标指针
messagebox("文件传输","从服务器传文件失败!")
ftpDisconnect()           //断开连结
exit
else
st_2.text = ls_wm         //继续传输下一个文件
ii_control =  ii_control + 1
end if
next
if ii_control = li_iy then          
//判断是否文件传输全部结束
ls_reg_dbprofiles = gs_reg_keyboot + "" + gs_reg_product
if RegistrySet( ls_reg_dbprofiles, "版本号", RegString!, gs_sversion) = -1 then                                   //将新的版本号写入注册表
messagebox("注册表更新","文件传输成功,但注册表更新错误")
end if
cb_1.Enabled = true                 
//“完成”按钮属性设置为可操作
end if

8. 恢复程序:
1) 如果更新不成功,恢复所修改的文件。
2) 根据传输文件表(包括版本号、传输文件)确定需要更新的文件,为用户显示所更新的文件列表,更新之后删除备份的文件。
CopyFileA(gs_back + ls_wm,gs_filepath + "" + ls_wm,false)

三、结束语

该程序不受集成的应用程序的限制,可外挂到其他应用系统中。用这种自动更新的方式,还可实现许多其它的功能,例如:文件广播、公告牌等等。
该程序的正确性和可用性都已经通过测试,现已嵌入大型的应用程序中使用。
操作系统支持:
服务器:HP UnixSco UnixAIXSUN SOLARISWIN2000WINNT
客户端:WIN2000WIN95WIN98WINXP等
数据库支持:ORACLESybaseInformixMS SQL ServerDB2FOXPRO等等

“老字号”与“新管理”
 
天津同仁堂制药厂创建于1852年,迄今已有150年的历史,是国家命名的“中华老字号”企业。同仁堂早年为前店后厂式经营,后院与北运畔相通,凭借便利的水路运输,产品远销美国、欧洲等西方各国,东南亚地区的中成药行更是长期定购。
本世纪50年代,该厂的阿胶销量、质量均在国内首屈一指,为扩大产量,厂址迁至西于庄。60年代中期,该厂自行设计研制建成北方第一条布基橡皮膏生产线;1980-2000年,天津同仁堂得到了迅猛发展,建起了提取楼、口服液大楼、片剂大楼及科研办公楼,配备了许多国内外先进的设备、仪器,已初步具备现代化制药企业的条件。
随着公司业务的发展,同仁堂业务系统日趋复杂,范围广,产品种类多,客户数量大。在不断改进更新其硬件环境的同时,同仁堂更清楚的认识到加强企业内部管理的重要性。特别是对于医药行业至关重要的批次批好管理,传统的手工跟踪方式已经很难全面胜任。如何实现自动跟踪、实时查询(原料入库、生产领料、完工入库、销售出库、销售退回)等都成为极待解决的问题。
2001年底开始,同仁堂开始了新一代企业管理软件的选型工作。金蝶制造(流程)行业解决方案,在财务数据的及时性、迅速增长的客户管理、产品的分类管理、原材料的库存管理精度、产品和材料的质量跟踪等方面针对医药行业特点设计,一举中标。摆脱了原有部门级软件的限制,将企业信息化拓展到生产计划、采购、销售等企业营运的各个领域,构建集成、整体的解决方案。(洁)

作者:中科院软件所 唐雅娜 杨立

更多
关闭窗口 打印 
网站首页    -    联系我们    -   收藏本站    -    网站地图                                                               客户服务热线:0571-85023000
本网站所有网页信息已申请知识产权和著作权保护,版权归四海光纤公司所有,未经授权禁止任何人复制或镜像,违者必究。
公司主营:杭州光纤光缆视频会议系统,是专业的通信网络工程、视频会议系统建设专家

中华人民共和国备案号:浙ICP备10018243号