📄 carddbi.c
字号:
/**********************************************************
*
*Copyright ? 2001-2003 National ASIC Center, All right Reserved
*
* FILE NAME: Carddb.c
* PROGRAMMER: Christian-ren
* Date of Creation: 2002/08/28
*
* DESCRIPTION: Card module,focus on database
*
* NOTE:
*------------------------------------------------------------------
* FUNCTIONS LIST:
* -- PUBLIC FUNCTIONS --
*
*------------------------------------------------------------------
* -- LOCAL FUNCTIONS --
* CALLCARD * CardTransDatabsFormat(P_U8 databsptr,U32 id)
* CALLCARD * CardLoadRelationData(RELATIONSHIP relation,U16 *len)
* CALLCARD * CardLoadSearchData(P_S8 string,U16 *len,U8 mode)
* STATUS CardDelRecord(CALLCARD*thisptr)
* void GetCardRecordItemNum(CALLCARD*recordinf,CARDBUFRECORDINF * sourceinf)
* void CardCompareModSrc(CALLCARD *thisptr,CARDBUFRECORDINF * inf,U8 * ismodfptr)
* STATUS CardSaveModfToSrc(CALLCARD*thisptr,CARDBUFRECORDINF * inf)
* void CardAddRecordToDB(CALLCARD*thisptr,SAVEMODE mode)
*------------------------------------------------------------------
*
* GLOBAL VARS LIST:
* DBLACB *cardlacb;
*-------------------------------------------------------------------
*
* MODIFICATION HISTORY
*
*
* 2002/08/28 by Christian-ren Create the file
*
*************************************************************/
#include <string.h>
#include <database\carddb.h>
#include <asixwin.h>
#include "Callcard.h"
//主要工作是格式的转换,把电话本的存储格式
//转换成DATABASE的数据格式
//***数据库的使用建议在
// 打开任务务的时候连接初试化数据库,在关闭任务的时候关闭
extern DBLACB *cardlacb;
extern void Bytes2Word( unsigned short *v, unsigned char *s );
extern void ByteReversal( unsigned char *s, unsigned char *v );
CALLCARD * CardTransDatabsFormat(P_U8 databsptr,U32 id)
{
CALLCARD *recordptr;
P_U8 dataptr;
P_U8 tmpdataptr;
U16 offset;
U8 count;
dataptr = databsptr+12;//指向数据块,虑去头信息
tmpdataptr = dataptr;
recordptr = (CALLCARD *)Lmalloc(sizeof(CALLCARD));
if(recordptr == NULL)
{
return NULL;//asix_error
}
memset(recordptr,0x0,sizeof(CALLCARD));
recordptr->ID = id;//存入ID号
//存放姓名
//offset =*((U16*)dataptr);//计算姓名的偏移位置
ByteReversal( &offset, dataptr);
tmpdataptr = dataptr + offset;
strcpy(recordptr->namebuf,tmpdataptr);
recordptr->name = recordptr->namebuf;
//存放手机号码
tmpdataptr = dataptr +sizeof(U16);
for(count=0;count<MAXMOBNUM;count++)//先把指针指向缓冲区
{
recordptr->mobile[count] = recordptr->mobbuf[count];
}
for(count=0;count<MAXMOBNUM;count++)
{
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
if(offset == 0)
{
break;
}
tmpdataptr = dataptr + offset + sizeof(U16);
strcpy(recordptr->mobbuf[count],tmpdataptr);
tmpdataptr = dataptr + offset;
}
//存放电话号码
tmpdataptr = dataptr +2*sizeof(U16);
for(count=0;count<MAXTELNUM;count++)
{
recordptr->tel[count] = recordptr->telbuf[count];//把指针指向缓冲区
}
for(count=0;count<MAXTELNUM;count++)
{
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
if(offset == 0)
{
break;
}
tmpdataptr = dataptr + offset + sizeof(U16);
strcpy(recordptr->telbuf[count],tmpdataptr);
tmpdataptr = dataptr + offset;
}
//存放关系
tmpdataptr = dataptr +3*sizeof(U16);
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
tmpdataptr = dataptr + offset;
switch(*tmpdataptr)
{
case '0':
recordptr->relation = OTHERS;
break;
case '1':
recordptr->relation = FRIEND;
break;
case '2':
recordptr->relation = FAMILY;
break;
case '3':
recordptr->relation = SCHMATE;
break;
case '4':
recordptr->relation = COLLEAGUE;
break;
default: break;
}
//存放寻呼
tmpdataptr = dataptr +4*sizeof(U16);
for(count=0;count<MAXBPNUM;count++)//把指针指向缓冲区
{
recordptr->bp[count] = recordptr->bpbuf[count];
}
for(count=0;count<MAXBPNUM;count++)
{
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
if(offset == 0)
{
break;
}
tmpdataptr = dataptr + offset + sizeof(U16);
strcpy(recordptr->bpbuf[count],tmpdataptr);
recordptr->bp[count] = recordptr->bpbuf[count];
tmpdataptr = dataptr + offset;
}
//存放传真
tmpdataptr = dataptr +5*sizeof(U16);
for(count=0;count<MAXFAX;count++)//把指针指向缓冲区
{
recordptr->fax[count] = recordptr->faxbuf[count];
}
for(count=0;count<MAXFAX;count++)
{
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
if(offset == 0)
{
break;
}
tmpdataptr = dataptr + offset + sizeof(U16);
strcpy(recordptr->faxbuf[count],tmpdataptr);
recordptr->fax[count] = recordptr->faxbuf[count];
tmpdataptr = dataptr + offset;
}
//存放单位
tmpdataptr = dataptr +6*sizeof(U16);
for(count=0;count<MAXUNIT;count++)//把指针指向缓冲区
{
recordptr->unit[count] = recordptr->unitbuf[count];
}
for(count=0;count<MAXUNIT;count++)
{
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
if(offset == 0)
{
break;
}
tmpdataptr = dataptr + offset + sizeof(U16);
strcpy(recordptr->unitbuf[count],tmpdataptr);
recordptr->unit[count] = recordptr->unitbuf[count];
tmpdataptr = dataptr + offset;
}
//存放email
tmpdataptr = dataptr +7*sizeof(U16);
for(count=0;count<MAXEMAIL;count++)//把指针指向缓冲区
{
recordptr->email[count] = recordptr->emailbuf[count];
}
for(count=0;count<MAXEMAIL;count++)
{
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
if(offset == 0)
{
break;
}
tmpdataptr = dataptr + offset + sizeof(U16);
strcpy(recordptr->emailbuf[count],tmpdataptr);
recordptr->email[count] = recordptr->emailbuf[count];
tmpdataptr = dataptr + offset;
}
//存放地址
tmpdataptr = dataptr +8*sizeof(U16);
for(count=0;count<MAXADDRESS;count++)//把指针指向缓冲区
{
recordptr->address[count] = recordptr->addressbuf[count];
}
for(count=0;count<MAXADDRESS;count++)
{
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
if(offset == 0)
{
break;
}
tmpdataptr = dataptr + offset + sizeof(U16);
strcpy(recordptr->addressbuf[count],tmpdataptr);
recordptr->address[count] = recordptr->addressbuf[count];
tmpdataptr = dataptr + offset;
}
//存放QQ
tmpdataptr = dataptr +9*sizeof(U16);
for(count=0;count<MAXQQ;count++)//把指针指向缓冲区
{
recordptr->QQ[count] = recordptr->QQbuf[count];
}
for(count=0;count<MAXQQ;count++)
{
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
if(offset == 0)
{
break;
}
tmpdataptr = dataptr + offset + sizeof(U16);
strcpy(recordptr->QQbuf[count],tmpdataptr);
recordptr->QQ[count] = recordptr->QQbuf[count];
tmpdataptr = dataptr + offset;
}
//存放爱好
tmpdataptr = dataptr +10*sizeof(U16);
for(count=0;count<MAXHABIT;count++)//把指针指向缓冲区
{
recordptr->habbit[count] = recordptr->habbitbuf[count];
}
for(count=0;count<MAXHABIT;count++)
{
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
if(offset == 0)
{
break;
}
tmpdataptr = dataptr + offset + sizeof(U16);
strcpy(recordptr->habbitbuf[count],tmpdataptr);
recordptr->habbit[count] = recordptr->habbitbuf[count];
tmpdataptr = dataptr + offset;
}
//存放邮编
tmpdataptr = dataptr +11*sizeof(U16);
for(count=0;count<MAXPOSTALCODE;count++)//把指针指向缓冲区
{
recordptr->postalcode[count] = recordptr->postalcodebuf[count];
}
for(count=0;count<MAXPOSTALCODE;count++)
{
//offset =*((U16 *)tmpdataptr);
ByteReversal( &offset, tmpdataptr);
if(offset == 0)
{
break;
}
tmpdataptr = dataptr + offset + sizeof(U16);
strcpy(recordptr->postalcodebuf[count],tmpdataptr);
recordptr->postalcode[count] = recordptr->postalcodebuf[count];
tmpdataptr = dataptr + offset;
}
return recordptr;
}
/***********************************************/
/****************************************************/
CALLCARD * CardLoadRelationData(RELATIONSHIP relation,U16 *len)
{
//将需要查询的条件输入,得到ID的长度和ID数组的指针上
LOCALSEARCHLIST *findlist;
U8 count;
CALLCARD * newptr;
CALLCARD * pointer;
CALLCARD * head;
P_S8 getdataptr;
RECORDDATA *tmprecord;
if(relation == AllRelation)
{
findlist = LocalFindRecord(cardlacb, CARD_NAME_FIELD , NULL, GLOBAL_SEARCH );
if(findlist->head == NULL) //当获得的数据为空的时候,就返回NULL
{
*len = 0; //如果搜寻为空,则返回NULL值
return NULL;
}
//全局查找只能获得ID号,而不能获得*data数据块
tmprecord = findlist->head;
getdataptr = LocalReadRecord(cardlacb, tmprecord->index);
*len =findlist->num;
//head = CardTransDatabsFormat(getdataptr,tmprecord->index,tmprecord->datalen);
head = CardTransDatabsFormat(getdataptr,tmprecord->index);
head->prev =NULL;
head->next= NULL;
pointer = head;
Lfree( getdataptr );
for(count=1;count<(findlist->num);count++)
{
tmprecord = findlist->head+count;
getdataptr = LocalReadRecord(cardlacb, tmprecord->index);
newptr = CardTransDatabsFormat(getdataptr,tmprecord->index);
newptr->prev = pointer;
newptr->next = NULL;
pointer->next = newptr;
pointer = newptr;
Lfree( getdataptr );
}
DelOldSearchList(findlist);//释放获得的数据块
return head;
}else{
switch(relation)
{
case OTHERS:
findlist = LocalFindRecord(cardlacb, CARD_RELATION_FIELD , "0", PRECISE_PART_MATCH );
break;
case FRIEND:
findlist = LocalFindRecord(cardlacb, CARD_RELATION_FIELD , "1", PRECISE_PART_MATCH );
break;
case FAMILY:
findlist = LocalFindRecord(cardlacb, CARD_RELATION_FIELD , "2", PRECISE_PART_MATCH );
break;
case SCHMATE:
findlist = LocalFindRecord(cardlacb, CARD_RELATION_FIELD , "3", PRECISE_PART_MATCH );
break;
case COLLEAGUE://数据库需要调整,因为只有容纳四个
findlist = LocalFindRecord(cardlacb, CARD_RELATION_FIELD , "4", PRECISE_PART_MATCH );
break;
default:
break;
}
if(findlist->head == NULL) //当获得的数据为空的时候,就返回NULL
{
*len = 0; //如果搜寻为空,则返回NULL值
DelOldSearchList(findlist);//释放获得的数据块
return NULL;
}
*len = findlist->num;
/* 转换数据块,生成数据链表*/
head = CardTransDatabsFormat(findlist->head->data,findlist->head->index);
head->prev =NULL;
head->next= NULL;
pointer = head;
for(count=1;count<(findlist->num);count++)
{
tmprecord = (findlist->head)+count;
newptr = CardTransDatabsFormat(tmprecord->data,tmprecord->index);
newptr->prev = pointer;
newptr->next = NULL;
pointer->next = newptr;
pointer = newptr;
}
DelOldSearchList(findlist);//释放获得的数据块
return head;
}
}
/***********************************************/
/**********************************************/
CALLCARD * CardLoadSearchData(P_S8 string,U16 *len,U8 mode)
{
LOCALSEARCHLIST *findlist;
U8 count;
CALLCARD * newptr;
CALLCARD * pointer;
CALLCARD * head;
// P_S8 getdataptr;
RECORDDATA *tmprecord;
findlist = LocalFindRecord(cardlacb, CARD_NAME_FIELD, string, mode );
if(findlist->head == NULL) //当获得的数据为空的时候,就返回NULL
{
*len = 0; //如果搜寻为空,则返回NULL值
DelOldSearchList(findlist);//释放获得的数据块
return NULL;
}
*len = findlist->num;
/* 转换数据块,生成数据链表*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -