亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? catalog.cpp

?? 實現一個精簡型單用戶SQL引擎(DBMS)MiniSQL
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
#include <iostream>
#include <stdio.h>

#include "Catalog.h"


extern char CurLocation[256];
extern char CurRelationName[33];
extern _M_Buffer Buffer;
extern unsigned int BTreeNodeSize;

using namespace std;

//------------------------------------------------------------------------------------------
//to find the position of a given name column 
Column_Info* HCatalog::Find_Column(char* Name) const
{
	char temp[289];
	sprintf(temp,"%s%s.dbf",CurLocation,CurRelationName);
	_M_File CurrentTable = Buffer[temp];

	_F_FileAddr head;													
	head = CurrentTable.GetCataPoint();		    //head is a file pointer that points to the first place in catalog
	
	Table_Info* TableHead;
	TableHead = (Table_Info*)head.MemAddr();	//TableHead is a memory pointer that points to the first place in catalog
	
	Column_Info* column;
	column = (Column_Info*)TableHead->KeyPtr.FileKey.MemAddr();		//column is a memory pointer pointing to column information
	
	while (column != NULL)
	{
		if(strcmp(column->ColumnName,Name) == 0)	
			return column;
		else
			column = (Column_Info*)column->ColumnPtr.FileNext.MemAddr();
	}

	return NULL;
}

//---------------------------------------------------------------------------------------------
//to find whether a column exists
bool HCatalog::Exist_Column(char* Name) const
{
	if(Find_Column(Name) == NULL)
		return false;
	else
		return true;
} 

//---------------------------------------------------------------------------------------------
//to find whether the column type is correct
bool HCatalog::Check_Type(Column_Info* column, Column_Type type) const
{
	if(column->ColType == type)
		return true;
	else
		return false;
}

//----------------------------------------------------------------------------------------------
//to find whether the column is primary key
bool HCatalog::Check_Key(Column_Info* column) const
{
	if(column->IsPrimary == 1)
		return true;
	else
		return false;
}

//----------------------------------------------------------------------------------------------
//to find whether the constraint on the column is fulfilled
bool HCatalog::Check_Value(Column_Info* column,Column_Value* val) const
{
	Column_Type ColType = column->ColType; 
	int integer;
	float fl;
	char* ch;
	
	//identify value in the union
    switch(ColType){
    case I:       //int
	    integer = val->IntValue;
		break;
	case F:       //float
		fl = val->FloatValue;
		break;
	case C:       //char
		ch = val->pCharValue;
		break;
	default:
		throw 1010;				//error code 1010----unknown type;
	}
	
	//constraint on current column
    Constraint_Info* constraint = (Constraint_Info*)column->ConstraintPtr.FileConstraint.MemAddr(); 	
	
	//no constraints
    if(constraint == NULL)
		return true;

    //there is constraint 
	if(ColType == I)    //values is int
		switch(constraint->OperType){
			case L:   //in case <, value >= max
				if(integer >= constraint->max.IntValue)
					return false;
				break;
			case LE:   //case <=, value > max
				if(integer > constraint->max.IntValue)
					return false;
				break;
			case B:    //case >, value <= min
				if(integer <= constraint->min.IntValue)
					return false;
				break;
			case BE:   //case >=, value < min
				if(integer < constraint->min.IntValue)
					return false;
				break;
			case E:    //case =, value != max
				if(integer != constraint->max.IntValue)
					return false;
				break;
			case NE:   //case !=, value == max
				if(integer == constraint->max.IntValue)
					return false;
				break;
			case BETWEEN:   //case between...and..., value < min or value >max
				if((integer < constraint->min.IntValue) || (integer > constraint->max.IntValue))
					return false;
				break;
			default:
				throw 1009;			//error code 1009----unknown relation operator
		}

	//value is float
    else if (ColType == F)
		switch(constraint->OperType){
			case L:   //case >
				if(fl >= constraint->max.FloatValue)
					return false;
				break;
			case LE:   //case >=
				if(fl > constraint->max.FloatValue)
					return false;
				break;
			case B:     //case <
				if(fl <= constraint->min.FloatValue)
					return false;
				break;
			case BE:    //case <=
				if(fl < constraint->min.FloatValue)
					return false;
				break;
			case E:     //case ==
				if(fl != constraint->max.FloatValue)
					return false;
				break;
			case NE:    //case !=
				if(fl == constraint->max.FloatValue)
					return false;
				break;
			case BETWEEN:   //case between...and...
				if((fl < constraint->min.FloatValue) || (fl > constraint->max.FloatValue))
					return false;
				break;
			default:
				throw 1009;			//error code 1009----unknown relation operator
		}

	//value is char
    else{ 
		if(strlen(ch) > column->RequiredLength)
			throw 1013;				//Error1013: Length Invalid for type char!
		switch(constraint->OperType){
		case L:   //case >
			if(strcmp(ch,constraint->max.CharValue) >= 0)
				return false;
			break;
		case LE:  //case >=
			if(strcmp(ch,constraint->max.CharValue) > 0)
				return false;
			break;
		case B:   //case <
			if(strcmp(ch,constraint->min.CharValue) <= 0)
				return false;
			break;
		case BE:   //case <=
			if(strcmp(ch,constraint->min.CharValue) < 0)
				return false;
			break;
		case E:   //case ==
			if(strcmp(ch,constraint->max.CharValue) != 0)
				return false;
			break;
		case NE:  //case !=
			if(strcmp(ch,constraint->max.CharValue) == 0)
				return false;
			break;
		case BETWEEN:   //case between...and...
			if((strcmp(ch,constraint->min.CharValue) < 0) || (strcmp(ch,constraint->max.CharValue)) > 0)
				return false;
			break;
		default:
			throw 1009;				//error code 1009-----unknown relation operation
		}
	}
	
	return true;
}
//---------------------------------------------------------------------------------------------
//to check whether length for char type is valid 
bool HCatalog::Check_Length(Column_Info* column, Column_Value* val) const
{
	if((column->ColType==C) && (strlen(val->pCharValue) > column->RequiredLength))
		return false;
	else 
		return true;
}

//--------------------------------------------------------------------------------------------
//to check whether value of key in selection is valid
bool HCatalog::Check_Key_Validation(Column_Type ColType, Column_Value* max, Column_Value* min) const
{
  //if max < min, then invalid
  switch(ColType){
  case I:   //case int
    if(max->IntValue < min->IntValue)
      return false;
    else 
      return true;
  case F:   //case float
    if(max->FloatValue < min->FloatValue)
      return false;
    else 
      return true;
  case C:   //case char
    if(strcmp(max->pCharValue,min->pCharValue) < 0)
      return false;
    else
      return true;
  default:
    throw 1020;   //Error1020: Unknown type!
  }
}


//----------------------------------------------------------------------------------------------
//*********************************************************************************************
//----------------------------------------------------------------------------------------------

//Constructor for Table_Info
TTable_Info::TTable_Info()
{
	KeyPtr.FileKey.Initialize();
	KeyPtr.Key = NULL;			
	strcpy(TableName,"");
	TotalColumn = 0;
	RecordLength = 0;
	KeyAttrNum = 0;
}

//-------------------------------------------------------------------------------------
//form a node for the list of catalog
Column_Info* HCatalog::Form_ListNode(Create_Column* ptr,int id) const
{
	Column_Info* pcolumn = new Column_Info;		//create a new node
	Constraint_Info* constraint;
	
    //write infomation into node
	pcolumn->ID = id;
	strcpy(pcolumn->ColumnName,ptr->ColumnName);
	pcolumn->ColType = ptr->ColType;
	pcolumn->IsPrimary = ptr->IsPrimary;
	pcolumn->ColumnPtr.next = NULL;
	if(ptr->IsPrimary == true)
		pcolumn->IsNull = 0;		//primary can not be null
	else if (ptr->IsNull == true)
		pcolumn->IsNull = 1;
	else if (ptr->IsNull == false)
		pcolumn->IsNull = 0;
	
	//calculate required length(RequiredLength) and real length(StoredLength), for type char real length = required length + 1
    switch(pcolumn->ColType){
	case I:   //RequiredLength = StoredLength
		pcolumn->RequiredLength = sizeof(int);
		pcolumn->StoredLength = pcolumn->RequiredLength;
		break;
	case F:   //RequiredLength = StoredLength
		pcolumn->RequiredLength = sizeof(float);
		pcolumn->StoredLength = pcolumn->RequiredLength;
		break;
	case C:   //RequiredLength + 1 = StoredLength
		pcolumn->RequiredLength = ptr->length;
		pcolumn->StoredLength = pcolumn->RequiredLength+1;
		break;
	default:
		throw 1010;				//error 1010: unknown type
	}
		
	//to check if there is no constraint on the column,say,min > max
	bool flag=false;	//false--no constraint; true--otherwise
	if((ptr->ColType==I) && (ptr->min.IntValue<=ptr->max.IntValue))
		flag=true;
	else if((ptr->ColType==F) && (ptr->min.FloatValue<=ptr->max.FloatValue))
		flag=true;
	else if((ptr->ColType==C) && (strcmp(ptr->min.pCharValue,ptr->max.pCharValue)<=0))
		flag=true;

	if(flag){	//if there is constraint,write infomation into and link it to column node
		constraint = new Constraint_Info;
		constraint->OperType = ptr->OperType;
		switch(pcolumn->ColType){
		case I:
			constraint->min.IntValue = ptr->min.IntValue;
			constraint->max.IntValue = ptr->max.IntValue;
			break;
		case F:
			constraint->min.FloatValue = ptr->min.FloatValue;
			constraint->max.FloatValue = ptr->max.FloatValue;
			break;
		case C:
			strcpy(constraint->min.CharValue, ptr->min.pCharValue);
			strcpy(constraint->max.CharValue, ptr->max.pCharValue);
			break;
		}
		pcolumn->ConstraintPtr.constraint = constraint;
	}
	else	//no constraint, set the pointer to null
		pcolumn->ConstraintPtr.constraint = NULL;

	return pcolumn;
}


//-----------------------------------------------------------------------------------------
//create
void HCatalog::Create(TB_Create_Info& info, char* KeyInfo)
{
	Create_Column* ptr;
	ptr = info.head;
	
	//form the first node about the table information 
	Table_Info TableNode;
	strcpy(TableNode.TableName,info.TableName);
	TableNode.TotalColumn = info.TotalColumn;
	
	Column_Info* column1;
	Column_Info* head;
	Column_Info* column2;
	
	//form a list about infomation on every column 
	int count=0;		//the number of Attributes of primary key
	int	length=0;		//total length of record
	int j=0;
    int keylen=0;
	for(int i=0 ;ptr!=NULL ;ptr=ptr->next,i++){
		column1 = this->Form_ListNode(ptr,i);   //form a node
		length += column1->StoredLength;        //increase the length
		//form necessary infomation needed by index
		if(column1->IsPrimary == 1){
			count++;      //increase count for attrbutes of primary key
			keylen += column1->StoredLength;
            //organize information for index creation
            if(column1->ColType == C)
				j += sprintf(KeyInfo+j,"c%d",column1->RequiredLength);
			else if(column1->ColType == F)
				j += sprintf(KeyInfo+j,"f");
			else 
				j += sprintf(KeyInfo+j,"i");
		}//end if
		if(i == 0)
			head = column1;		//save the first node of list 
		else
			column2->ColumnPtr.next = column1;		//link current node to the prior node
		column2 = column1;		//save current node 
	}//end for
    if(( BTreeNodeSize - 2*sizeof(_F_FileAddr) - sizeof(bool) - sizeof(int) ) 
                       / ( sizeof(_F_FileAddr) + keylen) < 4)
                       throw 1034;      //Error 1034: Primary Key is too long!
	TableNode.KeyPtr.Key = head;
	TableNode.KeyAttrNum = count;
	TableNode.RecordLength = length;

    //locate to current table
	char temp[289];
	sprintf(temp,"%s%s.dbf",CurLocation,CurRelationName);
	_M_File CurrentTable = Buffer[temp];

	//write the list into file
	_F_FileAddr pFile,pFile1,pFile2;
	
	pFile = CurrentTable.GetCataPoint();		//pFile--the first place that the list could be written
	
	pFile1 = MemWrite((void*)&TableNode,sizeof(Table_Info),&pFile);	//write _M_File Information into file
	
	column1 = head;
	//write all column infomation and its constraint into file 
	if(column1 != NULL){		//write the first column infomation into file
		((Table_Info*)pFile.MemAddr())->KeyPtr.FileKey = pFile1;	//move the file pointer to next available place
		pFile = MemWrite((void*)column1,sizeof(Column_Info),&pFile1);	//write
		((Column_Info*)pFile1.MemAddr())->ColumnPtr.FileNext.Initialize();	//set the next pointer to null
		pFile2 = pFile1;	//save current column pointer
		if(column1->ConstraintPtr.constraint != NULL){		//write the corresponding constraint infomation if any
			((Column_Info*)pFile1.MemAddr())->ConstraintPtr.FileConstraint = pFile;		//set the constraint pointer of the column

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线免费观看日韩欧美| 欧美在线观看视频一区二区| 一区二区在线电影| 日韩欧美中文字幕公布| eeuss国产一区二区三区| 蜜桃一区二区三区在线观看| 亚洲色图欧美偷拍| 久久精品一区二区三区不卡| 欧美视频精品在线| 成人激情综合网站| 国产一区美女在线| 日韩国产高清在线| 依依成人精品视频| 中文字幕国产精品一区二区| 欧美mv日韩mv国产网站app| 91国在线观看| heyzo一本久久综合| 国产在线看一区| 日韩精品一级中文字幕精品视频免费观看 | 成人动漫在线一区| 麻豆精品一区二区av白丝在线| 夜夜爽夜夜爽精品视频| 最新成人av在线| 中文字幕亚洲区| 中文字幕乱码日本亚洲一区二区 | 成人h精品动漫一区二区三区| 精品亚洲aⅴ乱码一区二区三区| 日韩激情一区二区| 午夜精品福利一区二区三区av| 亚洲一区二区三区四区五区黄 | 精品在线播放免费| 日本特黄久久久高潮| 日韩精品一二三区| 日本一不卡视频| 日韩精品1区2区3区| 日韩黄色一级片| 麻豆极品一区二区三区| 看电视剧不卡顿的网站| 男人的天堂亚洲一区| 日韩av电影免费观看高清完整版在线观看| 亚洲制服丝袜av| 丝袜美腿亚洲综合| 毛片av一区二区| 国产一区在线观看麻豆| 成人免费视频app| av在线播放一区二区三区| 成人成人成人在线视频| 色综合久久99| 欧美日韩一级视频| 日韩精品最新网址| 久久久久久久综合狠狠综合| 中文字幕不卡三区| 亚洲欧洲综合另类| 天天av天天翘天天综合网| 日本aⅴ亚洲精品中文乱码| 激情伊人五月天久久综合| 国产精品66部| av午夜精品一区二区三区| 欧美在线免费视屏| 欧美一区二区三区男人的天堂| 精品91自产拍在线观看一区| 亚洲国产精品黑人久久久| 中文字幕日韩精品一区| 亚洲一区二区偷拍精品| 美日韩一区二区| 成人精品国产一区二区4080| 欧美日韩一区成人| 久久综合国产精品| 亚洲精选视频免费看| 日本欧美肥老太交大片| 国产精品主播直播| 色噜噜狠狠色综合中国| 欧美一级生活片| 中文字幕成人在线观看| 亚洲18色成人| 国产成人亚洲综合a∨猫咪| 日本福利一区二区| 精品国产亚洲在线| 亚洲美女一区二区三区| 久久精品国产一区二区三区免费看 | 亚洲免费成人av| 麻豆国产精品官网| 99久久er热在这里只有精品66| 欧美日韩精品欧美日韩精品一| 久久综合丝袜日本网| 一区二区三区四区在线播放| 国模少妇一区二区三区| 在线视频观看一区| 久久天天做天天爱综合色| 亚洲综合一区二区三区| 欧美日韩国产另类一区| 国产丝袜美腿一区二区三区| 亚洲国产欧美在线| 成人a免费在线看| 欧美不卡一区二区三区四区| 亚洲精品久久嫩草网站秘色| 国产一区二区三区四区五区美女| 色婷婷激情一区二区三区| 久久蜜桃香蕉精品一区二区三区| 亚洲影视在线观看| 国产v日产∨综合v精品视频| 91精品国产色综合久久久蜜香臀| 亚洲色图欧美在线| 粉嫩高潮美女一区二区三区| 日韩精品一区二区三区蜜臀| 亚洲一区二区在线免费观看视频| 国产凹凸在线观看一区二区| 日韩午夜电影av| 亚洲sss视频在线视频| 99精品视频在线观看免费| 久久欧美中文字幕| 免费看日韩a级影片| 欧美色精品在线视频| 亚洲免费资源在线播放| 成人一区在线看| 久久嫩草精品久久久久| 精品一区二区三区影院在线午夜 | 亚洲精品一区二区三区影院| 视频一区免费在线观看| 亚洲精品成人悠悠色影视| 成人免费高清视频| 欧美激情在线看| 国产ts人妖一区二区| 久久精品人人做人人综合| 国内精品久久久久影院一蜜桃| 日韩三级电影网址| 蜜臀av一区二区在线观看| 日韩亚洲欧美在线| 日韩av在线播放中文字幕| 91精品欧美一区二区三区综合在| 亚洲伊人伊色伊影伊综合网| 欧美伊人久久大香线蕉综合69| 亚洲卡通欧美制服中文| 91国偷自产一区二区开放时间 | 精品国产乱码久久久久久夜甘婷婷| 天天综合日日夜夜精品| 欧美精品一级二级三级| 日韩一区精品字幕| 日韩视频免费直播| 久久精品国产秦先生| 蜜桃一区二区三区在线| 欧美一区二区免费| 久久99在线观看| 久久久久久久性| 菠萝蜜视频在线观看一区| 亚洲欧美经典视频| 欧美日韩精品一区二区三区四区| 天天影视涩香欲综合网| 日韩精品中文字幕一区| 国产九色精品成人porny | 日韩高清不卡一区| 91精品国产免费久久综合| 久久国产精品色| 中文字幕乱码久久午夜不卡 | 亚洲电影一级片| 欧美顶级少妇做爰| 国产在线乱码一区二区三区| 国产精品国产三级国产aⅴ原创| 91蜜桃视频在线| 全国精品久久少妇| 久久综合网色—综合色88| 99re这里只有精品6| 天堂影院一区二区| 国产婷婷色一区二区三区在线| 91女神在线视频| 爽好久久久欧美精品| 久久精品一区二区三区不卡 | 国产亚洲精品中文字幕| 91亚洲精品一区二区乱码| 午夜精品成人在线视频| 久久精品一区二区三区四区| 91黄色免费看| 国产一区三区三区| 亚洲一区二区三区四区五区黄| 日韩美女一区二区三区| 99精品欧美一区二区三区小说| 亚洲6080在线| 国产精品视频第一区| 欧美精品第一页| 丁香另类激情小说| 视频一区中文字幕国产| 欧美激情中文字幕| 欧美一区二区黄色| 成人aaaa免费全部观看| 美脚の诱脚舐め脚责91| 亚洲视频1区2区| 2022国产精品视频| 欧美日韩精品久久久| av激情亚洲男人天堂| 麻豆极品一区二区三区| 亚洲一区二区综合| 欧美韩国日本一区| 精品女同一区二区| 欧美色大人视频| 久久精品视频在线看| 欧美猛男男办公室激情| 99国产精品一区| 国内一区二区在线| 日日摸夜夜添夜夜添国产精品| 国产精品久久久久久久第一福利|