Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1142838
  • 博文数量: 312
  • 博客积分: 12522
  • 博客等级: 上将
  • 技术积分: 3376
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-27 18:35
文章分类

全部博文(312)

文章存档

2016年(3)

2015年(1)

2013年(1)

2012年(28)

2011年(101)

2010年(72)

2009年(13)

2008年(93)

分类: 项目管理

2009-01-17 22:32:54

ClearQuest二次开发

ClearQuest API概述

Rational ClearQuest 是重要的变更管理工具,Rational ClearQuest 更能让客户根据自己的具体需求,灵活的设计变更管理流程。除此之外,Rational ClearQuest 还提供了一套编程接口,即 Rational ClearQuest API,让用户和开发人员可以根据需要通过编程来实现 Rational ClearQuest 的相关功能,同时还可以通过编程来实现模式中 Hook 脚本的开发和定制,从而使整个 Rational ClearQuest 产品的功能更加灵活和强大。
通过CQ的二次开发接口,我们可以更灵活的定义自己的统计,或是使用脚本来批量修改CQ中的MR。
ClearQuest API 提供了VBS实现和Perl实现。也就是说可以使用VBS或Perl进行CQ的二次开发,两种开发方式提供了完全一致的开发接口。同时由于VBS是用过调用COM来使用CQ接口,理论上可以使用其他开发语言通过直接调用COM的方式来使用CQ的API。
由于VBS和COM都为MS的专有技术,VBS的脚本只能在windows平台上执行,Perl脚本则可以实现跨平台。 相比VBS,Perl的使用面更广,功能也更为强大,且考虑到Perl的跨平台性,使用Perl进行CQ的二次开发会是一个比较好的选择。

Perl语言基础知识

需要使用CQ的API需要先安装CQ的客户端。CQ的客户端有带一个专供CQ使用的perl引擎,cqperl,在运行perl脚本时候直接使用cqperl xx.pl运行。
考虑到熟悉Perl的用户并不多,在介绍CQ API前先对Perl的相关语法等做个简单的介绍。这里只提供基础的入门介绍,以便perl程序的阅读,如需要更深入的了解请阅读参考中的相关文档。

基本语法

perl里面语句也是用“;”来分开的。注释使用“#”。

变量符号
  • 标量定义,以$号开头,如:$num =1;
  • 数组定义,以@开头,如:@array = (1,2,3);
    数组元素调用 @array[index],其中index表示数组下标,如上例,@array[0]的值是1

  • 散列定义,以%开头,如:%hash=("a",1,"b",2);
    散列调用 %hash,其中key表示键值,如上例,%hash{"b"}的值是1

变量范围
  • $xx什么都不写,表示全局变量。整个文件中都可以访问到;
  • local $xx 表示局部变量,但是这个值可以被其调用的子程序访问到
  • my $xx 表示局部变量,只能在这一个函数里面可以使用,子程序就不能使用
函数定义
sub FunctionName
{
local ($a,$b)=@_;
return “”;
}

注意: 函数后便没有(),也没有参数列表定义。也就是说,他接受任何形式的参数,以数组的方式传递过来。所以内部使用的话,就用@_这个默认当前参数来取之。

操控语句(语法)
  • 除" " "0"(空字符,0),以外都为真。
  • if/while/until/for等语法类似c/cpp/java
  • 使用foreach进行遍历。

    foreach $user (@users) {
    do something...
    }
  • 跳出控制结构: next 和 last。next跳过当前操作,进入下一循环。last直接跳出循环。
  • perl包含文件。具体说明参考Perl中的文件包含(do, require, use)

ClearQuest API使用说明/范例

连接CQ库

CQ的数据存储在数据库(用户数据库)中,我们公司使用的是SQL Server。虽然可以通过直接访问SQL Server数据库的方式获取MR信息,但由于数据库的表结构复杂且受权限的约束(没有开放写权限),很多时候直接访问数据库并不是一个好主意。
在使用CQ API时,首先要做的是和CQ建立session,连接上CQ的库(模式库)。主要步骤为:

  • 创建session对象

    my $session = CQSession::Build();
  • 登陆CQ库

    $session->UserLogon(login_name, password, database_name, database_set);
    • login_name 登陆的用户名,也就是使用CQ客户端登陆的用户名。
    • password 用户密码,同CQ客户端登陆的密码。
    • database_name 库名
    • database_set 库集。
  • 操作完成后关闭session。

    CQSession::Unbuild($session);
创建查询

在成功建立session后就可以对CQ库进行操作了。
创建查询的主要步骤如下。

  • 创建Query对象。

    my $queryDef = $session->BuildQuery(entitydef_name);
    • entitydef_name 这个就是在CQ客户端创建查询时候选择的record type。
  • 设定需要返回的字段(同CQ客户端上选择的输出字段)。

    $queryDef->BuildField("id");#id
    $queryDef->BuildField("Headline");#标题
    ......
  • 创建查询条件。
    • 创建查询条件对象。

      my $operator = $querydef->BuildFilterOperator(bool_operator);
      • bool_operator 这个为逻辑条件。常用的逻辑条件如:$CQPerlExt::CQ_BOOL_OP_AND(与) $CQPerlExt::CQ_COMP_OP_EQ(等于)
    • 为查询对象,设置过滤条件。

      $operator->BuildFilter(field_name, comparison_operator, value);
    • field_name 进行过滤的字段名,同CQ客户端中设置的过滤条件字段。
    • comparison_operator 逻辑判断条件。$CQPerlExt::CQ_COMP_OP_EQ 等。
    • value 该字段的值
  • 创建结果集

    my $resultSet = $session->BuildResultSet($queryDef);
执行查询,获取查询结果
  • 执行查询

    $resultSet->Execute();
  • 遍历,获取查询的结果集的值。

    while (($resultSet->MoveNext()) == 1)
    {
    my $mr_id=$resultSet->GetColumnValue(1);
    }
    • 使用$resultset->GetColumnValue(columnNum);获取字段的返回结果,其中columnNum为返回字段的序列,由1开始。

编辑MR

除获取MR外,对MR进行一些编辑也是常用的操作。编辑MR主要需要以下操作。

  • 获取需要编辑的MR对象

    $session->GetEntity(entity def_name, display_name);
    • def_name 这里同BuildQuery的参数类似

    • display_name 这里填写MR ID
  • 编辑对象

    $session->EditEntity(entity, edit_action_name);
    • entity 需要编辑的对象
    • edit_action_name 编辑操作的名称,(例如: "modify" or "resolve")
  • 设定字段的值

    $entity->SetFieldValue(field_name, new_value);
    • field_name 字段名称
    • new_value 修改后的值
  • 提交/回滚修改
    • 提交 $entity->Commit();

    • 回滚 $entity->Revert();

完整范例

在这个范例中,将查找出在dbname里Product为prd10000且Verified的MR,并将其Close。

use CQPerlExt;
###连接CQ###
my $loginName = "loginName";
my $loginPassword = "loginPassword";
my $databaseName = "dbname";
my $databaseSet = "dbset";
my $session = CQSession::Build();
$session->UserLogon($loginName, $loginPassword, $databaseName, $databaseSet);

###创建查询,查询出需要close的MR###
my $queryDef = $session->BuildQuery("Dev_Defect");
$queryDef->BuildField("id");#id
my $operator1 = $queryDef->BuildFilterOperator($CQPerlExt::CQ_BOOL_OP_AND);

@Product = ("%prd10000%");
$operator1->BuildFilter("Product", $CQPerlExt::CQ_COMP_OP_LIKE, \@NE_Product);
@State = ("Verified");
$operator1->BuildFilter("State", $CQPerlExt::CQ_COMP_OP_EQ, \@State);

my $resultSet = $session->BuildResultSet($queryDef);
$resultSet->EnableRecordCount();
$resultSet->Execute();
my $count = $resultSet->GetRecordCount();#获取查询出的MR个数
print "count: $count\n";
###遍历查询出的MR,并进行Close操作###
while (($resultSet->MoveNext()) == 1)
{
$id = $resultSet->GetColumnValue(1);
print "$id\n";
###执行Close操作###
$entity = $session->GetEntity( "Dev_Defect", $id );
$session->EditEntity($entity,"close");
$entity->SetFieldValue("Closed_Information", "Close");
my $Status = $entity->Validate();
if($Status eq "")
{
# 提交数据记录
$entity->Commit();
}
else
{
# 打印错误信息
print $Status;
$entity->Revert();
}
}
CQSession::Unbuild($session);
转自:!96F003C204150CFE!810.entry

参考资料

  • ClearQuest API Reference
    ClearQuest API使用手册,安装CQ客户端附带。

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

chinaunix网友2009-04-29 14:35:52

不好意思,现在已经更正~

chinaunix网友2009-04-24 10:50:01

发现这个文章是我写的。 转帖请注明,谢谢。