⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db_create.c

📁 一个微型的数据库系统
💻 C
📖 第 1 页 / 共 2 页
字号:
			__trimleft(strTemp);
			__trimright(strTemp);

//			if(strTemp.Find((LPCTSTR)KeyName[4],0) == 0 )//unsigned char
			if(strstr(strTemp,(char*)KeyName[4] )==(char*) strTemp )//unsigned char
			{
				
				goto Lab_unsi_char;
			}
			else if(strstr(strTemp,(char*)KeyName[5] )==(char*) strTemp )//unsigned short
			{
				
				goto Lab_unsi_short;
			}
			else if(strstr(strTemp,(char*)KeyName[6]) ==(char*)strTemp )//unsigned int
			{
				
				goto Lab_unsi_int;
			}
			else if(strstr(strTemp,(char*)KeyName[7]) == (char*)strTemp)//unsigned long
			{
				
				goto Lab_unsi_long;
			}
			break;
			
		case 10://uchar
Lab_unsi_char:	if(m_pre_flag != 1)
					break;
				m_field_idx ++;
//				strTemp = *pstr;	
//				strTemp.Replace("uchar","unsigned char");
//				strTemp2 = strTemp;
//				strTemp.Format("	%s\n",strTemp2);
				
				type_count = GetTypeCount(pstr);
				m_Field[m_field_idx].wType = TY_UNSIGNED_CHAR;
//				if(pstr->Find("*",0) > 0)
				if(strstr(pstr,"*"))
				{					
					m_Field[m_field_idx].wSize = 4*type_count;
					m_Field[m_field_idx].wType2 |= 0x02;
					if(m_Align==4)
						if(m_DbdHeader.Record_Size%4!=0)
						{
							m_Field[m_field_idx-1].wSize += (m_DbdHeader.Record_Size+3)/4*4-m_DbdHeader.Record_Size;					
							m_DbdHeader.Record_Size = (m_DbdHeader.Record_Size+3)/4*4;
						}
					else
						if(m_DbdHeader.Record_Size%2!=0)
						{
							m_Field[m_field_idx-1].wSize++;
							m_DbdHeader.Record_Size++;
						}
				}
				else
					m_Field[m_field_idx].wSize = type_size[m_Field[m_field_idx].wType][m_IsTaret]*type_count;				
				
				if(m_Field[m_field_idx].wSize>1)
					m_Field[m_field_idx].wSize--;
			
				m_DbdHeader.Record_Size += m_Field[m_field_idx].wSize;
				m_DbdHeader.Field_Count++;
				ret = 1;
				break;
				
		case 11://ushort
Lab_unsi_short:	if(m_pre_flag != 1)
					break;
				m_field_idx ++;
//				strTemp = *pstr;	
//				strTemp.Replace("ushort","unsigned short");
//				strTemp2 = strTemp;
//				strTemp.Format("	%s\n",strTemp2);
				
				type_count = GetTypeCount(pstr);
				m_Field[m_field_idx].wType = TY_UNSIGNED_SHORT;
//				if(pstr->Find("*",0) > 0)
				if(strstr(pstr,"*"))
				{
					m_Field[m_field_idx].wSize = 4*type_count;
					m_Field[m_field_idx].wType2 |= 0x02;
					if(m_Align==4)
						if(m_DbdHeader.Record_Size%4!=0)
						{
							m_Field[m_field_idx-1].wSize += (m_DbdHeader.Record_Size+3)/4*4-m_DbdHeader.Record_Size;					
							m_DbdHeader.Record_Size = (m_DbdHeader.Record_Size+3)/4*4;
						}
					else
						if(m_DbdHeader.Record_Size%2!=0)
						{
							m_Field[m_field_idx-1].wSize++;
							m_DbdHeader.Record_Size++;
						}
				}
				else
					m_Field[m_field_idx].wSize = type_size[m_Field[m_field_idx].wType][m_IsTaret]*type_count;				
			
				m_DbdHeader.Record_Size += m_Field[m_field_idx].wSize;
				m_DbdHeader.Field_Count++;
				ret = 1;
				break;
				
		case 12://uint
Lab_unsi_int:	if(m_pre_flag != 1)
					break;
				m_field_idx ++;
//				strTemp = *pstr;	
//				strTemp.Replace("uint","unsigned int");
//				strTemp2 = strTemp;
//				strTemp.Format("	%s\n",strTemp2);
				
				type_count = GetTypeCount(pstr);
				m_Field[m_field_idx].wType = TY_UNSIGNED_INT;
//				if(pstr->Find("*",0) > 0)
				if(strstr(pstr,"*"))
				{
					m_Field[m_field_idx].wSize = 4*type_count;
					m_Field[m_field_idx].wType2 |= 0x02;
				}
				else
					m_Field[m_field_idx].wSize = type_size[m_Field[m_field_idx].wType][m_IsTaret]*type_count;				
				
			
				
				m_DbdHeader.Record_Size += m_Field[m_field_idx].wSize;
				m_DbdHeader.Field_Count++;
				ret = 1;
				break;
				
		case 13://ulong
Lab_unsi_long:	if(m_pre_flag != 1)
					break;
				m_field_idx ++;
//				strTemp = *pstr;	
//				strTemp.Replace("ulong","unsigned long");
//				strTemp2 = strTemp;
//				strTemp.Format("	%s\n",strTemp2);
				
				type_count = GetTypeCount(pstr);
				m_Field[m_field_idx].wType = TY_UNSIGNED_LONG;
//				if(pstr->Find("*",0) > 0)
				if(strstr(pstr,"*"))
				{
					m_Field[m_field_idx].wSize = 4*type_count;
					m_Field[m_field_idx].wType2 |= 0x02;
				}
				else
					m_Field[m_field_idx].wSize = type_size[m_Field[m_field_idx].wType][m_IsTaret]*type_count;				
				
				m_DbdHeader.Record_Size += m_Field[m_field_idx].wSize;
				m_DbdHeader.Field_Count++;
				ret = 1;
				break;
				
		case 14://float
			if(m_pre_flag != 1)
				break;
			m_field_idx ++;
//			strTemp = *pstr;				
//			strTemp2 = strTemp;
//			strTemp.Format("	%s\n",strTemp2);
			
			type_count = GetTypeCount(pstr);
			m_Field[m_field_idx].wType = TY_FLOAT;
//			if(pstr->Find("*",0) > 0)
			if(strstr(pstr,"*"))
			{
				m_Field[m_field_idx].wSize = 4*type_count;
				m_Field[m_field_idx].wType2 |= 0x02;
			}
			else
				m_Field[m_field_idx].wSize = type_size[m_Field[m_field_idx].wType][m_IsTaret]*type_count;				
			
			m_DbdHeader.Record_Size += m_Field[m_field_idx].wSize;
			m_DbdHeader.Field_Count++;
			ret = 1;
			break;
		case 27://varchar myh2002-08-19
			if(m_pre_flag != 1)
				break;
			m_field_idx ++;		
			m_Field[m_field_idx].wType = TY_VARCHAR;
			m_Field[m_field_idx].wSize = 6;
			psize1=strstr(pstr,"[");
			psize2=strstr(pstr,"]");
			memset(strTemp,0,sizeof(strTemp));
			if(psize1&&psize2)
			{
				memcpy(strTemp,psize1+1,strlen(psize1)-strlen(psize2)-1);
				type_count=atoi(strTemp);
			}
			else
			{
				type_count=1;
			}
			m_Field[m_field_idx].WReserve=type_count;

			m_DbdHeader.Record_Size += m_Field[m_field_idx].wSize;
			m_DbdHeader.Field_Count++;
			ret = 1;
			break;
		case 28://varchar myh2002-08-19
			if(m_pre_flag != 1)
				break;
			m_field_idx ++;		  
			m_Field[m_field_idx].wType = TY_VARBYTE;
			m_Field[m_field_idx].wSize = 6;
			psize1=strstr(pstr,"[");
			psize2=strstr(pstr,"]");
			memset(strTemp,0,sizeof(strTemp));
			if(psize1&&psize2)
			{
				memcpy(strTemp,psize1+1,strlen(psize1)-strlen(psize2)-1);
				type_count=atoi(strTemp);
			}
			else
			{
				type_count=1;
			}
			m_Field[m_field_idx].WReserve=type_count;

			m_DbdHeader.Record_Size += m_Field[m_field_idx].wSize;
			m_DbdHeader.Field_Count++;
			ret = 1;
			break;		
		case 15://double
			if(m_pre_flag != 1)
				break;
			m_field_idx ++;
//			strTemp = *pstr;				
//			strTemp2 = strTemp;
//			strTemp.Format("	%s\n",strTemp2);
			
			type_count = GetTypeCount(pstr);
			m_Field[m_field_idx].wType = TY_DOUBLE;
//			if(pstr->Find("*",0) > 0)
			if(strstr(pstr,"*"))
			{
				m_Field[m_field_idx].wSize = 4*type_count;
				m_Field[m_field_idx].wType2 |= 0x02;
			}
			else
				m_Field[m_field_idx].wSize = type_size[m_Field[m_field_idx].wType][m_IsTaret]*type_count;				
			m_DbdHeader.Record_Size += m_Field[m_field_idx].wSize;
			m_DbdHeader.Field_Count++;
			ret = 1;
			break;
			
		case 16://{
			if(m_pre_flag == 1)
			{
//				strTemp.Format("{\n");

				ret = 1;
			}
			break;
			
		case 17://}
			if(m_pre_flag == 1)
			{
//				strTemp.Format("};\n");
				m_pre_flag = 0;
				ret = 1;
			}
			break;
			
		case 18://primary
		case 19://alternate	
		case 20:////
		case 21://
		case 22://\n
		case 23://\r
		case 24://\t
		case 25://on
		case 26://foreign
			ret = 1;
			break;
			
		default:
			m_pre_flag = 0;
			ret = 1;
			break;
		}
	}
	else
	{			
		m_pre_flag = 0;
		ret = 1;
	}
	
	m_FileNum++;
	return ret;
}




unsigned short GetTypeCount(char *pstr) 
{
	// TODO: Add your control notification handler code here]
	char * strmy;
	char * strTmp;
	char strTemp[200];
	char strTemp3[200];
	char strCount[200];
	char ddlTmp[1024];
	int cur_old;
	short  ret_len;
	char strFieldName[200];
	char* pos2,*pos1,*pos3,*pos4;
	int i,j,k;
	char* find_pos,find_pos2;
	int bFlag;
	
	bFlag=0;
	i=0;
	j=0;
	k=0;
	ret_len=0;
	
	strcpy(strTemp,pstr);
	strcpy(strFieldName,pstr);

	for(i=0;i<strlen(strFieldName);i++)
	{
		if(strFieldName[i]!=0x20)
			break;
		j++;
	}
	strcpy(strFieldName,&strFieldName[j]);

	for(i=strlen(strFieldName)-1;i>0;i--)
	{
		if(strFieldName[i]!=0x20)
			break;
		strFieldName[i]=0;
	}
	//////
	
	if(pos3=strstr(strFieldName," "))
	{
		
		for(i= 0;i<6;i++)
		{
			pos1 = pos3;
			if((pos4=strstr(pos1,(char*)KeyType_[i]))||(pos4=strstr(pos1,(char*)KeyType[i])))
			{	
				pos1=strstr(pos4+3," ");
				if(pos1)
					pos4=pos1;
				if((pos2 = strstr(pos4,"*")))
					pos1 = pos2;
				else 
					pos1 = pos4;
				break;
			}
		}
		if((pos2=strstr(pos1,"*")))
					pos1 = pos2;

		if((pos2 =strstr(pos1,"["))||(pos2=strstr(pos1,";")))
		{
			GetSubStr(strFieldName,strlen(strFieldName)-strlen(pos1)+1,strlen(strFieldName)-strlen(pos2)-1,strFieldName);
			for(i=0;i<strlen(strFieldName);i++)
			{
				if(strFieldName[i]!=0x20)
					break;
				j++;
			}
			strcpy(strFieldName,&strFieldName[j]);

			for(i=strlen(strFieldName)-1;i>0;i--)
			{
				if(strFieldName[i]!=0x20)
					break;
				strFieldName[i]=0;
			}
			__strupr(strFieldName);
//			strFieldName.TrimLeft();
//			strFieldName.TrimRight();
//			strFieldName.MakeUpper();
		}
	}	
	//////

	pos1 = strstr(strTemp,"[");  
	pos2 = strstr(strTemp,"]");
	if(pos1  && pos2 )
	{
		m_Field[m_field_idx].wType2 |= 0x01;
//		strCount.Empty();
		GetSubStr(strCount,strlen(strTemp)-strlen(pos1)+1,strlen(strTemp)-strlen(pos2)-1,strTemp);
		if(strstr(strCount,"+")||strstr(strCount,"-")
			||strstr(strCount,"*")||strstr(strCount,"/")
			||strstr(strCount,"%")||strstr(strCount,"&")
			||strstr(strCount,"|")||strstr(strCount,"!"))
		{
			return 0;
		}
		
		strcpy(ddlTmp,gstrddl);
		strTmp=strstr(ddlTmp,"\r\n");
		if(strTmp)
		{
			memset(strTemp3,0,sizeof(strTemp3));
			memcpy(strTemp3,ddlTmp,strlen(ddlTmp)-strlen(strTmp));
			strcpy(ddlTmp,strTmp+2);
		}
		else
			strcpy(strTemp3,ddlTmp);

		while(strlen(strTemp3)>0)
		{
			__trimleft(strTemp3);
			__trimright(strTemp3);
//			strTemp3.TrimLeft();
//			strTemp3.TrimRight();
//			if(strTemp3.Find("define",0) == 0)
			if(strstr(strTemp3,"define")==strTemp3)
			{
				find_pos = strstr(strTemp3,strCount);
				if(strlen(strTemp3)-strlen(find_pos)>5)
				{
					j=strlen(find_pos)-strlen(strCount);
//					find_pos += strCount.GetLength();
					k=strlen(strTemp3)-1;
//					find_pos2 = strTemp3.GetLength()-1;
					GetSubStr(strCount,j,k,strTemp3);
					//strCount = GetSubStr(find_pos,find_pos2,&strTemp3); 
					break;
				}
				
			}
			strTmp=strstr(ddlTmp,"\r\n");
			if(strTmp)
			{
				memset(strTemp3,0,sizeof(strTemp3));
				memcpy(strTemp3,strddl,strlen(ddlTmp)-strlen(strTmp));
				strcpy(ddlTmp,strTmp+2);
			}
			else
			{
				if(bFlag)
					strcpy(strTemp3,"");
				else
					strcpy(strTemp3,ddlTmp);
				bFlag=1;
			}
		}
		if(ret_len==0)
			ret_len = atoi(strCount);
	}
	else
		ret_len = 1;
	
	return ret_len;
}

int GetSubStr(char* ret,int start,int end,char *pStr) 
{
	// TODO: Add your control notification handler code here
	char strCount[200];
	int r;
	int iser;
	iser=0;
	memset(strCount,0,sizeof(strCount));
	for(r=start;r<end+1;r++)
		strCount[iser++]= pStr[r];
	__trimleft(strCount);
	__trimright(strCount);

	strcpy(ret,strCount);
	return 1;
}

int Swap4(int Data)
{
	int *val,i;
	
	unsigned char tep[4],tr[4];
		
	memcpy(tep,&Data,sizeof(int));
	tr[0] = tep[3];
	tr[1] = tep[2];
	tr[2] = tep[1];
	tr[3] = tep[0];
	val = (int*)tr;
	
	i = *val;//memcpy(&val,tr,sizeof(int));
	//_swab((char*)&Data,(char*)&val,sizeof(Data));	
	return *val;
}

short Swap2(short Data)
{
	short val=Data;	
	char  csave;
	
//	_swab((char*)&Data,(char*)&val,sizeof(Data));	
	csave=*((char*)&val);
	*((char*)&val)=*((char*)&val+1);
	*((char*)&val+1)=csave;
	return val;
}


//*** jasonxxx
static char* __strupr(char* str)
{
	int ilen=strlen(str);
	int i;
	for(i=0;i<ilen;i++)
	{
		if((*(str+i)>97)&&(*(str+i)<123))
			*(str+i)=*(str+i)-32;
	}
	return str;
}

void __trimleft(char* str)
{
	int i,j;
	i=0;
	j=0;
	for(i=0;i<strlen(str);i++)
	{
		if((str[i]!=0x20)&&(str[i]!=0x09))//spacebar+table
			break;
		j++;
	}
	strcpy(str,&str[j]);
}

void __trimright(char* str)
{
	int i;
	for(i=strlen(str)-1;i>0;i--)
	{
		if((str[i]!=0x20)&&(str[i]!=0x09))//spacebar+table
			break;
		str[i]=0;
	}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -