You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

637 lines
17 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* @addtogroup service
* @{
*/
/**
* @file service_part_no.cpp
* @brief retrieve new item id according some mark code
* @date 2009/7/26
* @author James Pang
* @history
* ===================================================================================
* Date Name Description
* 26-Jul-2009 James created
*/
#pragma warning(disable:4819)
#pragma warning(disable:4267)
/**
* @headerfile tcua Í·Îļþ
*/
#include <ict/ict_userservice.h>
#include <ae/dataset.h>
#include <ae/datasettype.h>
#include <tccore/grmtype.h>
#include <tccore/grm.h>
#include <tccore/item.h>
#include <tccore/aom.h>
#include <tc/folder.h>
#include <sa/user.h>
#include <pom/enq/enq.h>
/**
* @headerfile standard c & cpp header files
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include<tc/tc_macros.h>
/**
* @headerfile user's header files
*/
#include "itk_service_common.h"
#include "error_handling.h"
#define CONSOLE_PRINT 1
/* Define the number of retries when fetching the next ID. */
/* This must be stored in both numeric and string forms. */
#define GET_ID_RETRIES 10
#define CYCLE_TIMES 10
#define STARTNUMBER 1
#define PADNUMBER 4
#define RETRY_STRING "10"
#define HANDLE_ERROR_S1(E,S) \
{ EMH_store_initial_error_s1(EMH_severity_error,(E),(S)); return(E); }
#define REPORT_IFAIL(M) \
ifail?printf("%s : ERROR : ifail = %d\n",M,ifail):printf("%s : Ok\n",M)
#define HANDLE_ERROR(E) \
{ EMH_store_initial_error(EMH_severity_error,(E)); return(E); }
#define HANDLE_ERROR_S1(E,S) \
{ EMH_store_initial_error_s1(EMH_severity_error,(E),(S)); return(E); }
#define HANDLE_ERROR_AND_RELEASE(E,I) \
{ \
(void)release_number(I); \
EMH_store_initial_error(EMH_severity_error,(E)); \
return(E); \
}
#define TEST_ERROR(E) \
if ((E) != ITK_ok) return(E);
#define TEST_POM_ERROR(E) \
if ((E) != ITK_ok) HANDLE_ERROR(E)
#define TEST_ERROR_AND_RELEASE(E,I) \
if ((E) != ITK_ok) { (void)release_number(I); return(E); }
/* Define the number of retries when fetching the next ID. */
/* This must be stored in both numeric and string forms. */
#define GET_ID_RETRIES 10
#define RETRY_STRING "10"
/* Empty string test macro */
#define IS_EMPTY(S) (!(*(S)))
/* Define the methods by which a new item name can be obtained */
#define SEED_METHOD 0
#define BUILD_METHOD 1
/* The following define the maximum index number to be used. *
* Note that the actual maximum is one less than MAXNUM. *
* NUMERIC_LIMIT must be large enough to store decimal string *
* version of MAXNUM plus a NULL terminator. */
#define NUMERIC_LIMIT 12
#define MAXNUM 0x7FFFFFFF
/* define the class for which id and rev is generated */
#define CLASS_IS_ITEM 0
#define CLASS_IS_DATASET 1
/* Store the tags for the next_id POM object and the actual ID attribute. */
/* This saves us having to obtain these every time a user hits the Assign */
/* button. The logical variables define whether the tags are legal or not. */
/* I tried to set to tag_t's to NULLTAG for this purpose, but the HP C */
/* compiler did not like this. Typical. */
static logical inst_ok = false;
static logical attr_ok = false;
static tag_t instance;
static tag_t attr_id;
static logical is_new = false;
/*Store the class identifier for the id and rev generation. */
/* This helps us share some of the existing codes */
static int class_is = -1;
/* Store all Item IDs issued, whether they are used or not.*/
static int item_ids_issued = 0;
static char** item_ids_issued_list = NULL;
static char* ITEM_POM_CLASS = "ITEM";
/*------------------------------------------------------------------------------------------------------------------------------*/
/*
*
* int release_number ( tag_t instance )
*
* Release the lock on the index number in the database. This is only
* CALLed in error situations.
*
* Parameters:
* instance The tag of the POM object to be released. This is
* returned by the load function.
*
*/
static int release_number ( tag_t instance )
{
if (instance != NULLTAG)
{
return POM_refresh_instances_any_class(1, &instance, POM_no_lock);
}
else
{
return ITK_ok;
}
} /* end release_number */
static int ORIGIN_select_counter ( const char *counter_name,int num )
{
int i, n;
tag_t class_id;
tag_t name_attr,num_attr;
tag_t *inst_tag;
char *value;
int num_value;
logical vNull, vEmpty;
int ifail;
instance = NULLTAG;
attr_id = NULLTAG;
inst_ok = false;
attr_ok = false;
/* Find the Next ID class */
POM_class_id_of_class("ImanNextId", &class_id);
/* Find all the instances of this class */
ITKCALL(ifail = POM_instances_of_class(class_id, false, &n, &inst_tag))
/* Locate the appropriate attribute */
ITKCALL(ifail = POM_attr_id_of_attr("name","ImanNextId", &name_attr))
ITKCALL(ifail = POM_attr_id_of_attr ("next_id","ImanNextId",&num_attr))
/* Try to locate the named instance */
for (i=0; ((i<n)&&(instance==NULLTAG)); i++)
{
ITKCALL(ifail = POM_refresh_instances_any_class(1, &(inst_tag[i]), POM_no_lock))
ITKCALL(ifail = POM_ask_attr_string(inst_tag[i], name_attr, &value,&vNull, &vEmpty))
if ((ifail == ITK_ok) &&
(!vNull) &&
(!vEmpty) &&
(strcmp(value, counter_name) == 0))
{
instance = inst_tag[i];
ITKCALL(ifail = POM_ask_attr_int (inst_tag[i],num_attr,&num_value,&vNull,&vEmpty))
printf("num_value=%d\n",num_value);
ITKCALL(ifail = POM_attr_id_of_attr("next_id","ImanNextId", &num_attr))
printf("num_attr=%d\n",num_attr);
printf("inst_tag[i]=%d\n",inst_tag[i]);
is_new = false;
}
}
//Èç¹ûûÓв鵽¼ÆÊýÆ÷,Ôò´´½¨Ò»¸ö¼ÆÊýÆ÷
if( instance == NULLTAG )
{
ITKCALL(ifail = POM_class_id_of_class("ImanNextId", &class_id))
if (ifail != ITK_ok)
return ifail;
ITKCALL(ifail = POM_attr_id_of_attr("name", "ImanNextId", &attr_id))
if (ifail != ITK_ok)
return ifail;
ITKCALL(ifail = POM_attr_id_of_attr("next_id","ImanNextId", &num_attr))
if (ifail != ITK_ok)
return ifail;
ITKCALL(ifail = POM_create_instance(class_id, &instance))
if (ifail != ITK_ok)
return ifail;
ITKCALL(ifail = POM_set_attr_string(1, &instance, attr_id, counter_name))
if (ifail != ITK_ok)
return ifail;
ITKCALL(ifail = POM_set_attr_int (1,&instance,num_attr,num))
if (ifail != ITK_ok)
return ifail;
ITKCALL(ifail = POM_save_instances(1, &instance, true))
ITKCALL(ifail = POM_refresh_instances_any_class(1, &instance, POM_no_lock))
printf( "No instance, create one\n" );
is_new = true;
}
inst_ok = true;
return(ITK_ok);
}
static int get_next_id_attribute(void)
{
int ifail;
attr_id = NULLTAG;
attr_ok = false;
ITKCALL(ifail = POM_attr_id_of_attr("next_id","ImanNextId", &attr_id))
TEST_POM_ERROR(ifail)
attr_ok = true;
return(ITK_ok);
}
static int load_current_number (const char *counter_name , int *num )
{
int i;
logical vNull, vEmpty;
int ifail;
int temp;
logical tagValid = false ;
*num = 0;
POM_is_tag_valid( instance , &tagValid);
if (!inst_ok || !tagValid )
{
ifail = ORIGIN_select_counter(counter_name, 1);
TEST_ERROR(ifail)
}
/* Try to load and lock the instance */
ifail = ITK_ok+1;
for (i=0; ((i<GET_ID_RETRIES) && (ifail!=ITK_ok)); i++)
ifail = POM_refresh_instances_any_class(1, &instance, POM_modify_lock);
if (i == GET_ID_RETRIES)
{
//if (class_is==CLASS_IS_ITEM)
// HANDLE_ERROR_S1(ITEM_next_id_lock_failed,RETRY_STRING)
//else if (class_is==CLASS_IS_DATASET)
// HANDLE_ERROR_S1(AE_next_id_lock_failed,RETRY_STRING)
}
TEST_POM_ERROR(ifail)
if (!attr_ok)
{
ifail = get_next_id_attribute();
TEST_ERROR(ifail)
}
ifail = POM_ask_attr_int(instance, attr_id, &temp, &vNull, &vEmpty);
TEST_POM_ERROR(ifail)
*num = temp;
return(ITK_ok);
} /* end load_number */
static int generation_num(char *TeZhengMa,int num_len,int curr_num,char **final_num)
{
int i=0;
char pad_string[64],str_num[64];
char *new_name=NULL;
if(num_len<0 || num_len>50)
return -1;
if(TeZhengMa==NULL)
return -1;
strcpy(pad_string,"\0");
sprintf(str_num,"%d",curr_num);
printf("str_num = %s\n",str_num);
printf("strlen = %d\n",strlen(str_num));
//new_name = (char*)malloc(sizeof(char)*100);
//strcpy(new_name,"");
if((num_len-(int)strlen(str_num))>0)
{
printf("111\n");
pad_string[num_len-strlen(str_num)] = '\0';
for(i=0;i<num_len-strlen(str_num);i++)
{
pad_string[i] = '0';
}
//pad_string[i+1]='\0';
*final_num = (char *)MEM_alloc(sizeof(char)*100);
//strcpy(*final_num,"");
sprintf(*final_num, "%s%s%s", TeZhengMa, pad_string,str_num);
//sprintf(new_name, "%s%s%s", TeZhengMa, pad_string,str_num);
//*final_num = new_name;
printf("final_num1 = %s\n",*final_num);
}
else
{
printf("222\n");
*final_num = (char *)MEM_alloc(sizeof(char)*100);
sprintf(*final_num, "%s%s", TeZhengMa, str_num);
//sprintf(new_name, "%s%s", TeZhengMa, str_num);
printf("*final_num = %s\n",*final_num);
//*final_num = new_name;
//return -1;
}
return 0;
}
static int EnqLikeNo(char* TeZhengManWithNumber,int* num)
{
int ifail;
int n_instance,n_failtures;
tag_t
enquiry_id = NULLTAG,
class_to_load_as = NULLTAG,
*instances,
*failed_instances;
char *enquiryLikeItem = "Select_ITEM";
char *select_attrs[1] = { "puid" };
int rows, cols, i, j;
void ***report = NULL;
//===============select puid form Item where ITEM_ID like TeZhengManWithNumber%
printf("creat select\n");
ITKCALL( POM_enquiry_create( enquiryLikeItem ) );
printf("search:%s\n",TeZhengManWithNumber);
ITKCALL( POM_enquiry_add_select_attrs( enquiryLikeItem, ITEM_POM_CLASS, 1, (const char**) select_attrs ) );
//"PartIdRev","PmiName",
ITKCALL( POM_enquiry_set_string_value( enquiryLikeItem, "item_id_value", 1, (const char**)( &TeZhengManWithNumber ), POM_enquiry_asc_order ) );
//ITKCALL( POM_enquiry_set_string_value( enquiryLikeItem, "item_id_value", 1,"myTeZhengMa1014%", POM_enquiry_bind_value ) );
ITKCALL( POM_enquiry_set_attr_expr( enquiryLikeItem, "item_id_exp", ITEM_POM_CLASS, "ITEM_ID", POM_enquiry_like, "item_id_value" ) );
//ITKCALL( POM_enquiry_set_string_value( enquiryLikeItem, "pmi_id_value", 1, (const char**)( &szPmiId ), POM_enquiry_bind_value ) );
//ITKCALL( POM_enquiry_set_attr_expr( enquiryLikeItem, "pmi_id_exp", ITEM_POM_CLASS, "PmiId", POM_enquiry_equal, "pmi_id_value" ) );
//ITKCALL( POM_enquiry_set_expr( enquiryLikeItem, "filter_exp", "item_id_exp", POM_enquiry_and, "pmi_id_exp" ) );
ITKCALL( POM_enquiry_set_where_expr( enquiryLikeItem, "item_id_exp" ) );
printf("execute select\n");
ITKCALL( POM_enquiry_execute( enquiryLikeItem, &rows, &cols, &report ) );
printf("executed select\n");
*num= rows;
/* for( i=0; i<rows; i++ )
{
for( j=0; j<cols; j++ )
{
MEM_free( report[i][j] );
}
MEM_free( report[i] );
}
MEM_free( report );*/
MEM_free( report );
//ITKCALL( POM_load_instances_possible_by_enquiry( enquiryLikeItem, ITEM_POM_CLASS, &n_instance, &instances, &n_failtures, &failed_instances ) );
ITKCALL( ifail = POM_enquiry_delete( enquiryLikeItem ) );
printf("ifail=%d\n",ifail);
printf("rows=%d\n",rows);
return ifail;
}
int SaveCounter(char* TeZhengMa, int length, int start_num, int end_num,int step,char **sNum)
{
int ifail;
logical tagValid = false ;
int number,rows,i=0;
int *rtn;
char *new_num=NULL;
char counter_name[255];
void *returnValueType;
POM_is_tag_valid( instance , &tagValid);
ifail = ORIGIN_select_counter(TeZhengMa,start_num);
TEST_ERROR(ifail)
ifail = load_current_number(TeZhengMa,&number);
printf("counter number = %d\n",number);
if (!attr_ok)
{
ifail = get_next_id_attribute();
TEST_ERROR(ifail)
}
//sprintf(item_number,"%s%d",TeZhengMa,number+1);
*sNum = (char *)MEM_alloc(sizeof(char)*100);
/* for( i=1;i<CYCLE_TIMES;i++) //zjd
*/
i=0;
do
{
i++;
ifail = generation_num(TeZhengMa,length,number+i,&new_num);
sprintf(*sNum,"%s",new_num);
printf("new_num = %s\n",new_num);
strcpy(counter_name,"%");
strcat(counter_name,new_num);
strcat(counter_name,"%");
printf("new_num of TeZhengMa=%s\n",counter_name);
ifail = EnqLikeNo(counter_name,&rows);
//if(new_num!=NULL)
// MEM_free(new_num);
/* if(rows==0) //zjd
{
break;
}*/
} while(rows!=0); //zjd
//ifail = generation_num(TeZhengMa,length,number+step,&new_num);
//printf("new_num = %s\n",new_num);
//strcpy(counter_name,"%");
//strcat(counter_name,new_num);
//strcat(counter_name,"%");
//printf("new_num of TeZhengMa=%s\n",counter_name);
//ifail = EnqLikeNo(counter_name,&rows);
//MEM_free(new_num);
//printf("rows = %d\n",rows);
if(is_new||start_num>number)
{
ifail = POM_set_attr_int( 1, &instance, attr_id, start_num);
//*sNum = start_num;
}
else
{
ifail = POM_set_attr_int( 1, &instance, attr_id, number+i);
//*sNum = number+i;
}
//TEST_POM_ERROR(ifail)
ifail = POM_save_instances( 1, &instance, true );
TEST_POM_ERROR(ifail);
printf("sNum = %s\n",*sNum);
return ifail;
}
int GetSeqNo(char* TeZhengMa, int length, int start_num, int end_num,int step,int *sNum)
{
int ifail;
logical tagValid = false ;
int number;
int *rtn;
char counter_name[255];
void *returnValueType;
sprintf(counter_name,"%s$%d$%d$%d$%d",TeZhengMa,length,start_num,end_num,step);
printf("counter_name = %s\n",counter_name);
POM_is_tag_valid( instance , &tagValid);
ifail = ORIGIN_select_counter(counter_name,start_num);
TEST_ERROR(ifail)
ifail = load_current_number(counter_name,&number);
printf("counter number = %d\n",number);
if (!attr_ok)
{
ifail = get_next_id_attribute();
TEST_ERROR(ifail)
}
if(is_new)
ifail = POM_set_attr_int( 1, &instance, attr_id, start_num);
else
{
if(number+step>end_num)
{
*sNum=number+step;
return -1;
}
ifail = POM_set_attr_int( 1, &instance, attr_id, number+step);
}
TEST_POM_ERROR(ifail)
ifail = POM_save_instances( 1, &instance, true );
TEST_POM_ERROR(ifail)
//(int*)returnValueType = number+step;
//printf("current_number = %d\n",number+step);
//printf("returnValueType = %d\n",returnValueType);
if(is_new)
*sNum = start_num;
else
*sNum = number+step;
return ifail;
//return number+step;
//return ITK_ok;
}
int SERVICE_part_no( void *retValType )
{
int ifail = ITK_ok, i=0;
char
*argTeZhengMa=NULL, strTeZhengMa[ITEM_id_size_c + 1] = "",
*new_num=NULL, counter_name[256] = "", temp[ITEM_id_size_c + 1] = "",
*data = NULL;
int arg1 = 0, arg2 = 0, arg3 = 0, arg4 = 0, num = 0, rows = 0;
//È¡µÃ¿Í»§¶ËjavaËù´«À´µÄ²ÎÊý
ifail = USERARG_get_string_argument(&argTeZhengMa);
ifail = USERARG_get_int_argument(&arg1);
ifail = USERARG_get_int_argument(&arg2);
ifail = USERARG_get_int_argument(&arg3);
ifail = USERARG_get_int_argument(&arg4);
if(argTeZhengMa!=NULL)
{
strcpy(strTeZhengMa,argTeZhengMa);
}
//µ÷ÓÃ×Ô¼ºµÄ·½·¨£¬²ÎÊýÀ´×ÔJava
ifail = GetSeqNo(strTeZhengMa,arg1,arg2,arg3,arg4,&num);
TEST_ERROR(ifail)
sprintf(temp,"%d",num);
do
{
i++;
ifail = generation_num(strTeZhengMa,arg1,num,&new_num);
//char counter_name[256] = "";
strcpy(counter_name,"%");
strcat(counter_name,new_num);
strcat(counter_name,"%");
ifail = EnqLikeNo(counter_name,&rows);
if ( rows != 0 )
free(new_num);
} while(rows!=0 && i<10000);
if(num>arg3)
strcpy(temp,"Error: Current WaterNumber is out of Max Value!");
else
sprintf(temp,"%s",new_num);
//data = (char *) MEM_alloc ( sizeof(char)*(strlen(pszID) + 1 ) );
printf("new_num= %s\n",new_num);
data = (char *)MEM_alloc((ITEM_id_size_c + 1)*sizeof(char));
strcpy( data, temp );
*((char**) retValType) = data;
MEM_free(new_num);
printf( "new itemid = %s\n", *(char**)retValType);
return ITK_ok;
}
int SERVICE_internal_part_no( const char *argMark, int length, int start_num, int end_num,int step, char **newID )
{
int ifail = ITK_ok, i=0;
char
strTeZhengMa[ITEM_id_size_c + 1] = "",
*new_num=NULL, counter_name[256] = "", temp[ITEM_id_size_c + 1] = "",
*data = NULL;
int arg1 = length, arg2 = start_num, arg3 = end_num, arg4 = step, num = 0, rows = 0;
if(argMark!=NULL)
{
strcpy( strTeZhengMa, argMark );
}
//µ÷ÓÃ×Ô¼ºµÄ·½·¨£¬²ÎÊýÀ´×ÔJava
ifail = GetSeqNo(strTeZhengMa,arg1,arg2,arg3,arg4,&num);
TEST_ERROR(ifail)
sprintf(temp,"%d",num);
do
{
i++;
ifail = generation_num(strTeZhengMa,arg1,num,&new_num);
//char counter_name[256] = "";
strcpy(counter_name,"%");
strcat(counter_name,new_num);
strcat(counter_name,"%");
ifail = EnqLikeNo(counter_name,&rows);
if ( rows != 0 )
free(new_num);
} while(rows!=0 && i<10000);
if(num>arg3)
strcpy(temp,"Error: Current WaterNumber is out of Max Value!");
else
sprintf(temp,"%s",new_num);
MEM_free(new_num);
*newID = (char *)MEM_alloc((ITEM_id_size_c + 1)*sizeof(char));
strcpy( *newID, temp );
printf( "new itemid = %s\n", temp);
return ITK_ok;
}
/**
* @}
*/