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

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

?? selfdb.cpp

?? 股票軟件
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
		if (CLK_FHEADER_VERMAJOR == file.m_header.m_dwVerMajor 
			&& CLK_FHEADER_VERMINOR == file.m_header.m_dwVerMinor)	// 版本相同
		{
			if (ft.GetYear() == tNow.GetYear() && ft.GetMonth() == tNow.GetMonth() && ft.GetDay() == tNow.GetDay())
				return FALSE;
			int	nDayOfWeek = tNow.GetDayOfWeek();
			if (1 == nDayOfWeek || 7 == nDayOfWeek)
				return FALSE;

			BOOL	bEmpty	= FALSE; // file.EmptyAll();
			file.Close();

			if (!bEmpty)
				return ::DeleteFile(lpszFileName);
			return TRUE;
		}
		else
		{
			file.Close();
			return ::DeleteFile(lpszFileName);
		}
	}

	return FALSE;
}

static CSPMutex g_mutexClkFile;

BOOL CTSKFile::EmptyAll()
{
	CSPMutex::Scoped locker(g_mutexClkFile);

	SP_ASSERT(CSPFile::hFileNull != m_file.m_hFile);
	if (CSPFile::hFileNull == m_file.m_hFile)
		return FALSE;

	// 順序尋找
	DWORD	dwCount	= 0;
	for (DWORD i=0; i<m_header.m_dwIndexRecordCount; i++)
	{
		DWORD	dwPosIndex	= m_header.m_dwPosFirstIndex + m_header.m_dwIndexRecordSize * i;
		if (m_file.GetPosition() != dwPosIndex)
			m_file.Seek(dwPosIndex, CSPFile::begin);

		CLK_INDEXRECORD	index;
		if (sizeof(index) != m_file.Read(&index,sizeof(index)))
			return FALSE;
		if (CLK_INDEXRECORD_MAGIC != index.m_dwMagic)
			return FALSE;
		if (strlen(index.m_szCode) <= 0)
			continue;
		
		EmptyBlockChain(index.m_dwPosFirstBlock);
		index.m_dwDataRecordCountTotal	= 0;
		m_file.Seek(dwPosIndex, CSPFile::begin);
		m_file.Write(&index, sizeof(index));

		dwCount	++;
	}

	m_file.Flush();
	SP_ASSERT(dwCount == m_header.m_dwStockCount);
	return dwCount > 0; // == m_header.m_dwStockCount;
}

// 保存數據,并修改相應索引信息
DWORD CTSKFile::StoreDataRecord(DWORD dwMarket, const char * szCode,
							void * pData, DWORD dwDataElementSize, DWORD dwDataElementCount,
							BOOL bOverWrite)	// 返回成功保存記錄數
{
	CSPMutex::Scoped locker(g_mutexClkFile);

	SP_ASSERT(CSPFile::hFileNull != m_file.m_hFile);
	if (CSPFile::hFileNull == m_file.m_hFile)
		return 0;

	CLK_INDEXRECORD	index;
	DWORD	dwPosIndexFind	= -1;
	if (!GetDataInfo(dwMarket, szCode, index, dwPosIndexFind, TRUE))
		return 0;

	if (bOverWrite)
	{
		EmptyBlockChain(index.m_dwPosFirstBlock);
		index.m_dwDataRecordCountTotal	= 0;
	}

	if (-1 == index.m_dwPosFirstBlock || 0 == index.m_dwPosFirstBlock)
		index.m_dwPosFirstBlock	= GetFirstBlankBlockPos(TRUE, TRUE);
	DWORD	dwCount = WriteData(index.m_dwPosFirstBlock, pData, dwDataElementSize, dwDataElementCount, FALSE);
	index.m_dwDataRecordCountTotal	+= dwCount;
	SetDataInfo(dwPosIndexFind, index, FALSE);

	// m_file.Flush();
	return dwCount;
}

// 得到某一股票的數據記錄數	
DWORD CTSKFile::GetDataRecordCount(DWORD dwMarket, const char * szCode)
{
	CSPMutex::Scoped locker(g_mutexClkFile);

	CLK_INDEXRECORD	index;
	DWORD	dwPosIndexFind	= -1;
	if (GetDataInfo(dwMarket, szCode, index, dwPosIndexFind, FALSE))
		return index.m_dwDataRecordCountTotal;
	return 0;
}

// 讀取某一股票的數據記錄
DWORD CTSKFile::LoadDataRecord(DWORD dwMarket, const char * szCode,
							void * pData, DWORD dwDataElementSize, DWORD dwMaxDataElement)// 返回成功讀取記錄數
{
	CSPMutex::Scoped locker(g_mutexClkFile);

	SP_ASSERT(CSPFile::hFileNull != m_file.m_hFile);
	if (CSPFile::hFileNull == m_file.m_hFile)
		return 0;

	CLK_INDEXRECORD	index;
	DWORD	dwPosIndexFind	= -1;
	if (!GetDataInfo(dwMarket, szCode, index, dwPosIndexFind, FALSE))
		return 0;

	if (dwMaxDataElement < index.m_dwDataRecordCountTotal)
		return 0;

	return ReadData(index.m_dwPosFirstBlock, pData, dwDataElementSize, dwMaxDataElement);
}

DWORD CTSKFile::Hash(LPCTSTR key, DWORD dwMax)
{
	DWORD dwHash = 0;
	while (*key)
		dwHash = (dwHash<<5) + dwHash + *key++;
	return dwHash % dwMax;
}

// 得到某一股票的索引區信息,如果bAddIfNotExists并且不存在,則添加
BOOL CTSKFile::GetDataInfo(	DWORD dwMarket, const char * szCode, CLK_INDEXRECORD & idxRet, DWORD & dwPosIndexFind, BOOL bAddIfNotExists)
{
	SP_ASSERT(CSPFile::hFileNull != m_file.m_hFile);
	if (CSPFile::hFileNull == m_file.m_hFile)
		return FALSE;

	// 是否當前Cache
	if (m_CurIndexRecord.m_dwMarket == dwMarket
		&& 0 == strcmp(m_CurIndexRecord.m_szCode, szCode))
	{
		idxRet			= m_CurIndexRecord;
		dwPosIndexFind	= m_dwPosCurIndex;
		return TRUE;
	}

	DWORD	posBegin	= Hash(szCode, m_header.m_dwIndexRecordCount);
	// Hash順序尋找
	for (DWORD i=posBegin; i<m_header.m_dwIndexRecordCount; i++)
	{
		DWORD	dwPosIndex	= m_header.m_dwPosFirstIndex + m_header.m_dwIndexRecordSize * i;
		if (m_file.GetPosition() != dwPosIndex)
			m_file.Seek(dwPosIndex, CSPFile::begin);

		CLK_INDEXRECORD	index;
		if (sizeof(index) != m_file.Read(&index,sizeof(index))
			|| CLK_INDEXRECORD_MAGIC != index.m_dwMagic)
		{
			SP_ASSERT(FALSE);
			return FALSE;
		}
		if (dwMarket == index.m_dwMarket
			&& 0 == strcmp(szCode, index.m_szCode))
		{
			idxRet				= index;
			dwPosIndexFind		= dwPosIndex;
			m_CurIndexRecord	= index;
			m_dwPosCurIndex		= dwPosIndex;
			return TRUE;
		}
		if (0 == strlen(index.m_szCode))
		{
			if (bAddIfNotExists)
			{
				index.m_dwMarket	= dwMarket;
				strncpy(index.m_szCode, szCode, min(sizeof(index.m_szCode)-1,strlen(szCode)));
				index.m_dwDataRecordCountTotal	= 0;
				index.m_dwPosFirstBlock	= GetFirstBlankBlockPos(TRUE, TRUE);

				m_file.Seek(dwPosIndex, CSPFile::begin);
				m_file.Write(&index, sizeof(index));

				// 文件頭
				m_header.m_dwStockCount	+= 1;
				m_file.Seek(0, CSPFile::begin);
				m_file.Write(&m_header, sizeof(m_header));
				// m_file.Flush();

				// return
				idxRet				= index;
				dwPosIndexFind		= dwPosIndex;
				m_CurIndexRecord	= index;
				m_dwPosCurIndex		= dwPosIndex;
				return TRUE;
			}
			return FALSE;
		}

		// 循環
		if (m_header.m_dwIndexRecordCount-1 == i)
			i = -1;
		if (posBegin-1 == i)
			break;
	}

	return FALSE;
}

// 保存某一股票的索引區信息
BOOL CTSKFile::SetDataInfo(	DWORD dwPosIndex, CLK_INDEXRECORD idx, BOOL bFlush)
{
	SP_ASSERT(CSPFile::hFileNull != m_file.m_hFile);
	if (CSPFile::hFileNull == m_file.m_hFile)
		return FALSE;

	// 是否當前Cache
	if (m_CurIndexRecord.m_dwMarket == idx.m_dwMarket
		&& 0 == strcmp(m_CurIndexRecord.m_szCode, idx.m_szCode))
	{
		m_CurIndexRecord	= idx;
	}

	if (-1 != dwPosIndex)
	{
		m_file.Seek(dwPosIndex, CSPFile::begin);
		m_file.Write(&idx, sizeof(idx));
		if (bFlush)
			m_file.Flush();
		return TRUE;
	}

	return FALSE;
}

// 得到某一空數據塊
DWORD CTSKFile::GetFirstBlankBlockPos(BOOL bAddIfNotExists, BOOL bUseIt)
{
	SP_ASSERT(CSPFile::hFileNull != m_file.m_hFile);
	if (CSPFile::hFileNull == m_file.m_hFile)
		return -1;

	DWORD	dwPosBlock	= m_header.m_dwPosFirstBlankBlock;
	if (-1 != dwPosBlock && 0 != dwPosBlock)
	{
		m_file.Seek(dwPosBlock, CSPFile::begin);
		
		CLK_BLOCKHEADER	bheader;
		if (sizeof(bheader) == m_file.Read(&bheader,sizeof(bheader)))
		{
			SP_ASSERT(CLK_BLOCKHEADER_MAGIC == bheader.m_dwMagic);
			SP_ASSERT(!bheader.m_bUsed);

			if (bUseIt)
			{
				bheader.m_bUsed	= bUseIt;
				bheader.m_dwDataRecordCount	= 0;
				bheader.m_dwPosNextBlock	= -1;
				m_file.Seek(dwPosBlock, CSPFile::begin);
				m_file.Write(&bheader, sizeof(bheader));
			
				m_header.m_dwPosFirstBlankBlock	= bheader.m_dwPosNextBlock;
				m_file.Seek(0, CSPFile::begin);
				m_file.Write(&m_header, sizeof(m_header));
				// m_file.Flush();
			}
			return dwPosBlock;
		}
	}

	// Add
	if (bAddIfNotExists)
	{
		SP_ASSERT(bUseIt);	// Must Use It

		DWORD	dwDataSize = m_header.m_dwDataRecordSize*m_header.m_dwRecordPerBlock;
		if (dwDataSize <= 0)
			return -1;

		m_file.SeekToEnd();
		dwPosBlock	= m_file.GetPosition();

		CLK_BLOCKHEADER	bheader;
		memset(&bheader, 0, sizeof(bheader));
		bheader.m_dwMagic	= CLK_BLOCKHEADER_MAGIC;
		bheader.m_bUsed		= bUseIt;
		bheader.m_dwPosNextBlock	= -1;
		bheader.m_dwPosFirstRecord	= dwPosBlock + sizeof(bheader);
		m_file.Write(&bheader, sizeof(bheader));
		char	* temp	= new char[dwDataSize];
		if (!temp)
			return -1;
		memset(temp, 0, m_header.m_dwDataRecordSize);
		m_file.Write(temp, dwDataSize);
		delete	[] temp;
		// m_file.Flush();
	}

	return dwPosBlock;
}

// 清空數據Block鏈中的數據,并將除第一個Block外的其他Block置為未用
DWORD CTSKFile::EmptyBlockChain(DWORD dwPosFirstBlock)
{
	SP_ASSERT(CSPFile::hFileNull != m_file.m_hFile);
	if (CSPFile::hFileNull == m_file.m_hFile)
		return FALSE;

	DWORD	dwCount	= 0;
	DWORD	dwPosBlock	= dwPosFirstBlock;

	while(-1 != dwPosBlock && 0 != dwPosBlock)
	{
		m_file.Seek(dwPosBlock, CSPFile::begin);

		DWORD	dwPosNextBlock	= -1;
		CLK_BLOCKHEADER	bheader;
		if (sizeof(bheader) != m_file.Read(&bheader,sizeof(bheader))
			|| CLK_BLOCKHEADER_MAGIC != bheader.m_dwMagic)
		{
			SP_ASSERT(FALSE);
		}
		else
		{
			dwPosNextBlock	= bheader.m_dwPosNextBlock;
		}

		// Empty it
		bheader.m_bUsed	= (dwPosFirstBlock == dwPosBlock);	// 第一塊繼續使用
		bheader.m_dwDataRecordCount	= 0;
		bheader.m_dwPosNextBlock	= -1;
		if (!bheader.m_bUsed)
			bheader.m_dwPosNextBlock	= m_header.m_dwPosFirstBlankBlock;
		m_file.Seek(dwPosBlock, CSPFile::begin);
		m_file.Write(&bheader, sizeof(bheader));
		
		// 加入Blank Block Chain
		if (!bheader.m_bUsed)
		{
			m_header.m_dwPosFirstBlankBlock	= dwPosBlock;
			m_file.Seek(0, CSPFile::begin);
			m_file.Write(&m_header, sizeof(m_header));
		}
		// m_file.Flush();
		dwCount	++;

		dwPosBlock	= dwPosNextBlock;
	}
	
	return dwCount;
}

// 讀數據記錄
DWORD CTSKFile::ReadData(DWORD dwPosBlock, void * pData, DWORD dwDataElementSize, DWORD dwMaxDataElement)
{
	SP_ASSERT(CSPFile::hFileNull != m_file.m_hFile);
	if (CSPFile::hFileNull == m_file.m_hFile)
		return FALSE;

	if (NULL == pData || dwMaxDataElement == 0)
		return 0;

	DWORD	dwCount	= 0;

	while(-1 != dwPosBlock && 0 != dwPosBlock)
	{
		m_file.Seek(dwPosBlock, CSPFile::begin);

		CLK_BLOCKHEADER	bheader;
		if (sizeof(bheader) != m_file.Read(&bheader,sizeof(bheader))
			|| CLK_BLOCKHEADER_MAGIC != bheader.m_dwMagic)
		{
			SP_ASSERT(FALSE);
			return dwCount;
		}
		
		for (DWORD i=0; i<bheader.m_dwDataRecordCount; i++)
		{
			DWORD	dwPos	= bheader.m_dwPosFirstRecord + i * m_header.m_dwDataRecordSize;
			if (m_file.GetPosition() != dwPos)
				m_file.Seek(dwPos, CSPFile::begin);
			m_file.Read(((BYTE *)pData)+dwDataElementSize*dwCount, min(dwDataElementSize,m_header.m_dwDataRecordSize));
			dwCount ++;
			if (dwCount >= dwMaxDataElement)
				return dwCount;
		}
		
		dwPosBlock	= bheader.m_dwPosNextBlock;
	}
	
	return dwCount;
}

// 寫數據記錄
DWORD CTSKFile::WriteData(DWORD dwPosBlock, void * pData, DWORD dwDataElementSize, DWORD dwDataElementCount, BOOL bFlush)
{
	SP_ASSERT(CSPFile::hFileNull != m_file.m_hFile);
	if (CSPFile::hFileNull == m_file.m_hFile)
		return 0;

	SP_ASSERT(-1 != dwPosBlock && 0 != dwPosBlock);
	if (-1 == dwPosBlock || 0 == dwPosBlock)
		return 0;

	DWORD	dwCount	= 0;

	while(dwCount < dwDataElementCount && -1 != dwPosBlock && 0 != dwPosBlock)
	{
		m_file.Seek(dwPosBlock, CSPFile::begin);

		CLK_BLOCKHEADER	bheader;
		if (sizeof(bheader) != m_file.Read(&bheader,sizeof(bheader))
			|| CLK_BLOCKHEADER_MAGIC != bheader.m_dwMagic)
		{
			SP_ASSERT(FALSE);
			return dwCount;
		}

		if (-1 != bheader.m_dwPosNextBlock && 0 != bheader.m_dwPosNextBlock)
		{
			SP_ASSERT(bheader.m_dwDataRecordCount == m_header.m_dwRecordPerBlock);
			if (bheader.m_dwDataRecordCount == m_header.m_dwRecordPerBlock)
			{
				dwPosBlock	= bheader.m_dwPosNextBlock;
				continue;
			}
		}

		// Write
		DWORD	dwCountOld	= dwCount;
		for (DWORD i=bheader.m_dwDataRecordCount; i<m_header.m_dwRecordPerBlock; i++)
		{
			DWORD	dwPos	= bheader.m_dwPosFirstRecord + i * m_header.m_dwDataRecordSize;
			if (m_file.GetPosition() != dwPos)
				m_file.Seek(dwPos, CSPFile::begin);
			m_file.Write(((BYTE *)pData)+dwDataElementSize*dwCount, min(dwDataElementSize,m_header.m_dwDataRecordSize));
			dwCount ++;
			if (dwCount >= dwDataElementCount)
				break;
		}
		
		// 修改Block Header
		bheader.m_bUsed	= TRUE;
		bheader.m_dwDataRecordCount	+= (dwCount-dwCountOld);
		bheader.m_dwPosNextBlock	= -1;
		if (dwCount < dwDataElementCount)
			bheader.m_dwPosNextBlock	= GetFirstBlankBlockPos(TRUE, TRUE);
		m_file.Seek(dwPosBlock, CSPFile::begin);
		m_file.Write(&bheader, sizeof(bheader));

		// 新Block
		dwPosBlock	= bheader.m_dwPosNextBlock;
	}

	if (bFlush)
		m_file.Flush();
	return dwCount;
}

//=============================================================================
// CSelfDB

CSelfDB::CSelfDB(const char * rootpath, BOOL bOK) : CQianlong(rootpath, bOK)
{
}

CSelfDB::~CSelfDB()
{
}

BOOL CSelfDB::GetFileName(CSPString& sFileName, int nDataType, CStockInfo* pInfo, int nKType)
{
	if (nDataType == CStock::dataOutline)
	{
		sFileName = GetRootPath();
		sFileName += self_outline;
		return TRUE;
	}

	if (pInfo==  NULL || !pInfo->IsValidStock())
		return FALSE;

	// 如果錢龍文件存在,就返回錢龍文件名
	CSPString sFileNameQL;
	if (CStock::dataDR != nDataType
		&& CQianlong::GetFileName(sFileNameQL, nDataType, pInfo, nKType)
		&& access(sFileNameQL,0) == 0)
	{
		sFileName = sFileNameQL;
		return TRUE;
	}

	// 確定市場類型
	if (pInfo->GetMarket() == CStock::marketUnknown)
		pInfo->ResolveTypeAndMarket();

	// 如果在 ml_sh 目錄下找到文件,就返回找到的文件名
	// 否則,若錢龍文件名長度大于0,就返回錢龍文件名,等于0就返回 ml_sh 下的文件名
	if (nDataType == CStock::dataBasetext)
	{
		sFileName = GetRootPath();
		sFileName += ml_sh_base;
		sFileName += CSPString(pInfo->GetStockCode()) + ml_ext_base;
		if (access(sFileName, 0) != 0 && sFileNameQL.GetLength() > 0)
			sFileName = sFileNameQL;

		return TRUE;
	}
	else if (nDataType == CStock::dataK)
	{
		sFileName = GetRootPath();
		sFileName += ml_sh;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区三区乱码| 亚洲一区二区免费视频| 欧美日韩电影一区| 91在线你懂得| av成人老司机| 91小视频在线观看| 色天天综合色天天久久| 91激情在线视频| 91在线小视频| 欧美日韩国产三级| 91精品国产乱码| 日韩丝袜美女视频| 中文字幕av在线一区二区三区| 久久精品免费在线观看| 中文字幕亚洲综合久久菠萝蜜| 中国av一区二区三区| 一区二区三区美女视频| 日韩国产精品久久久久久亚洲| 精品一区二区三区日韩| 99精品视频免费在线观看| 国产精品不卡在线观看| 亚洲成国产人片在线观看| 亚洲午夜久久久久中文字幕久| 一区二区三区欧美日韩| 午夜一区二区三区视频| 国产乱子伦一区二区三区国色天香| 国产福利一区在线| 欧洲精品一区二区| 精品少妇一区二区三区在线播放| 国产精品国产三级国产aⅴ中文 | 欧美a级一区二区| 精久久久久久久久久久| 色婷婷久久久综合中文字幕| 亚洲欧美色综合| 精品伦理精品一区| 久久精品网站免费观看| 亚洲女与黑人做爰| 久久99精品视频| 99精品国产热久久91蜜凸| 日韩欧美成人激情| 亚洲精品成人天堂一二三| 麻豆91在线观看| 在线欧美小视频| 2023国产精华国产精品| 亚洲电影在线免费观看| 丰满白嫩尤物一区二区| 日韩一区二区在线观看视频播放| 国产精品久久影院| 麻豆中文一区二区| 欧美人妇做爰xxxⅹ性高电影| 欧美韩国日本一区| 亚洲成人资源在线| 国产精品你懂的在线欣赏| 亚洲一二三区在线观看| 国产不卡视频一区二区三区| 制服丝袜成人动漫| 亚洲欧美激情视频在线观看一区二区三区| 捆绑紧缚一区二区三区视频| 欧美三级在线播放| 亚洲柠檬福利资源导航| 国v精品久久久网| 欧美xxxxxxxx| 国产自产2019最新不卡| 欧美一区三区四区| 五月婷婷久久丁香| 色噜噜狠狠成人中文综合| www国产成人免费观看视频 深夜成人网| 亚洲二区在线观看| av一二三不卡影片| 综合色天天鬼久久鬼色| 国内精品在线播放| 欧美三级在线播放| 亚洲激情五月婷婷| 99久久er热在这里只有精品15| 久久久91精品国产一区二区精品| 麻豆一区二区99久久久久| 欧美电视剧在线看免费| 日韩av网站免费在线| 91精品国产欧美一区二区成人| 亚洲成a人在线观看| 欧美人动与zoxxxx乱| 日韩高清一区二区| 日韩欧美中文一区| 国模一区二区三区白浆| 国产亚洲成av人在线观看导航 | 国产一区二区久久| 九色porny丨国产精品| 欧美一级高清大全免费观看| 亚洲国产aⅴ成人精品无吗| 在线观看成人小视频| 亚洲一区二区在线观看视频 | 欧美精品日韩精品| 首页国产丝袜综合| 日韩一区二区在线观看视频播放| 极品少妇xxxx精品少妇| 国产欧美日韩卡一| 91福利在线看| 久久国产精品99久久人人澡| 久久精品在线观看| 在线观看国产日韩| 久久er99热精品一区二区| 国产精品视频免费看| 精品视频资源站| 国产综合色视频| 日韩精品一区国产麻豆| 激情文学综合丁香| 亚洲丝袜制服诱惑| 欧美大白屁股肥臀xxxxxx| 国产成人精品影视| 亚洲成人综合网站| 国产欧美一区二区精品秋霞影院 | 久久这里只精品最新地址| 成人sese在线| 午夜av一区二区| 久99久精品视频免费观看| 中文av字幕一区| 欧美一区二区三区男人的天堂| 国产精品一区二区不卡| 亚洲影院久久精品| 国产精品天干天干在线综合| 日韩一区二区三区在线| 色伊人久久综合中文字幕| 国产一区日韩二区欧美三区| 亚洲一区二区三区自拍| 中文字幕第一页久久| 欧美一区午夜精品| 在线免费观看日本欧美| 成人午夜激情在线| 美国十次了思思久久精品导航| 亚洲综合偷拍欧美一区色| 国产喷白浆一区二区三区| 日韩亚洲欧美中文三级| 色老汉一区二区三区| 成人免费观看av| 国产精品资源网站| 久久精品国产色蜜蜜麻豆| 午夜影院在线观看欧美| 亚洲欧美日韩国产中文在线| 久久久亚洲精华液精华液精华液| 欧美欧美欧美欧美| 在线观看一区不卡| 99久久精品情趣| 丁香婷婷综合色啪| 国产精品一卡二卡| 国精产品一区一区三区mba桃花| 天使萌一区二区三区免费观看| 亚洲美女免费在线| 综合欧美一区二区三区| 成人免费视频在线观看| 国产精品免费视频一区| 亚洲国产精品av| 国产精品福利影院| 国产精品久久久久久久久动漫| 中文字幕第一区综合| 国产精品欧美久久久久无广告| 国产精品欧美精品| 国产精品的网站| 亚洲精品高清视频在线观看| 亚洲久草在线视频| 亚洲午夜免费电影| 日韩中文字幕区一区有砖一区 | 狠狠色狠狠色合久久伊人| 久久精品国产秦先生| 精品亚洲国内自在自线福利| 精品影视av免费| 国产91精品露脸国语对白| 不卡免费追剧大全电视剧网站| 91网站最新地址| 精品婷婷伊人一区三区三| 日韩久久免费av| 久久久久久久一区| 亚洲欧美日韩小说| 日本不卡1234视频| 丰满亚洲少妇av| 欧美性受xxxx| 精品sm在线观看| 亚洲欧美中日韩| 丝袜亚洲另类欧美综合| 国产一区欧美日韩| 色综合中文综合网| 色悠久久久久综合欧美99| 欧美肥妇bbw| 国产婷婷色一区二区三区四区| 亚洲男同性恋视频| 久久国产精品第一页| 日本道精品一区二区三区| 欧美一级日韩不卡播放免费| 国产精品视频看| 视频在线观看一区二区三区| 国产福利精品导航| 欧美精品vⅰdeose4hd| 在线精品亚洲一区二区不卡| 日韩手机在线导航| 亚洲激情中文1区| 国产一区二区在线观看免费| 色综合色狠狠综合色| 2023国产精品自拍| 日本大胆欧美人术艺术动态| 成人高清免费观看| 精品久久久久久久人人人人传媒 |