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

📄 ps_client_dbfsms.cpp

📁 这个程序是用来操作Berkeley DB来使用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				
				m_pmutexTmp[t].unlock();
			}
		}
		break;

	default:
		break;
	}

	return 0;
}

int CPSDBFSMS::PS_dbfsms_deletetmp()
{
	int t = m_vecstatTmp.size();
						
	while (t > 0)		
	{
		m_pmutexTmp[t].lock();
		
		int ret = m_pdbfsTmp[t].PS_dbfs_deletetmp(m_vecstatTmp[t].l_time);

		if (ret == 0)
		{
			PSClientDBFS::PSDBFSStat tmp;
			m_pdbfsTmp[t].PS_dbfs_info(&tmp);
			m_vecstatTmp[t].lCurSize = tmp.db_block_count;

			m_pmutexTmp[t].unlock();

			return 1;
		}

		m_pmutexTmp[t].unlock();
	}

	return 0;
}

int CPSDBFSMS::PS_dbfsms_find(const char *key)
{
	int t = m_vecStat.size();
	while (t > 0)
	{
		t--;
		if (m_pdbfs[t].PS_dbfs_find(key) == 0)
		{
			return t;
		}
	}

	return -1;
}

int CPSDBFSMS::PS_dbfsms_findtmp(const char *key)
{	
	int t = m_vecstatTmp.size();
	while (t > 0)
	{
		t--;
		if (0 == m_pdbfsTmp[t].PS_dbfs_find(key))
		{
			return t;
		}
	}

	return -1;
}

int CPSDBFSMS::PS_dbfsms_read(const char *key, void *buf, unsigned long size)
{
	int t = m_vecStat.size();
	while (t > 0)
	{
		t--;
		if (m_pdbfs[t].PS_dbfs_read(key, buf, size) == size)
		{
			return size;
		}
	}

#ifdef __TEMP__
	// read from temp area
	t = m_vecstatTmp.size();
	while (t > 0)
	{
		t--;
		if (m_pdbfsTmp[t].PS_dbfs_read(key, buf, size) == size)
		{
			return size;
		}
	}
#endif

	return -1;
}

int CPSDBFSMS::PS_dbfsms_read(const char *key, DBT *data, unsigned long size)
{
	int t = m_vecStat.size();
	while (t > 0)
	{
		t--;
		if (m_pdbfs[t].PS_dbfs_read(key, data, size) == size)
		{
			return size;
		}
	}

#ifdef __TEMP__
	// read from temp area
	t = m_vecstatTmp.size();
	while (t > 0)
	{
		t--;
		if (m_pdbfsTmp[t].PS_dbfs_read(key, data, size) == size)
		{
			return size;
		}
	}
#endif

	return -1;
}

int CPSDBFSMS::PS_dbfsms_getkeyFile(char *keyFilename, int nDB)
{
	if (nDB >= (m_vecStat.size() + m_vecstatTmp.size()))
	{
		return -1;
	}
	else if (nDB < m_vecStat.size())
	{
		return m_pdbfs[nDB].PS_dbfs_getkeyFile(keyFilename);
	}
	else
	{
		return m_pdbfsTmp[nDB-m_vecStat.size()].PS_dbfs_getkeyFile(keyFilename);
	}
}

#ifndef WIN32
char *_ui64toa(unsigned long long val, char *buf, int radix)
{
	char *p, *first, temp;
	unsigned long digital;
	p = buf;
	if (val < 0)
	{
		*p++ = '-';
		val = -val;
	}
	first = p;
	do
	{
		digital = val%radix;
		val /= radix;
		if (digital > 9)
			*p++ = (char)(digital - 10 + 'a');
		else
			*p++ = (char)(digital + '0');
	}while(val > 0);
	*p-- = '\0';
	
	do
	{
		temp = *p;
		*p = *first;
		*first = temp;
		p--;
		first++;
	}while(first < p);

	return buf;
}
#endif

int CPSDBFSMS::mf_saveStatFile()
{
/*
	if (m_vecStat.size() == 0)
	{
		return -1;
	}

	unlink(m_strStatFileName);
	
	std::ofstream ofs(m_strStatFileName);

	for (int i=0; i<m_vecStat.size(); i++)
	{
		char buf[512] = {0};
		char tmp[64]= {0};
		strcpy(buf, "<dbfile>");
		strcat(buf, m_vecStat[i].dbfile);
		strcat(buf, "</dbfile> ");
		strcat(buf, "<size>");
		strcat(buf, _ui64toa(m_vecStat[i].lSize, tmp, 10));
		strcat(buf, "</size> ");

		ofs << buf << std::endl;
	}
	ofs.close();
*/

	return 0;
}

int CPSDBFSMS::mf_getStatFile()
{
	m_vecStat.clear();

	CPSConf config;

	int ret = config.PS_conf_init(m_strStatFileName);

	if (ret <= 0)
	{
		return -1;
	}

	char *pbuf = new char[ret];

	memset(pbuf, 0, ret);

	if (-1 == config.PS_conf_getNode(pbuf, "<db>", "</db>", 1))
	{
		delete [] pbuf;
		return -1;
	}

	int pos = 0;
	while (1)
	{
		CPSDBFSMSStat test;
		memset(test.dbfile, 0, sizeof(test.dbfile));
		
		if (-1 == config.PS_conf_getItem(pbuf+pos, test.dbfile, "<dbfile>", "</dbfile>"))
		{
			break;
		}

		char tmp[65] = {0};
		int ret = config.PS_conf_getItem(pbuf+pos, tmp, "<size>", "</size>");

		if (ret == -1)
		{
			break;
		}
		else
		{
			pos += ret;
		}
			
#ifdef WIN32
		test.lSize = _atoi64(tmp);
#else
		test.lSize = strtoull(tmp, NULL, 10);
#endif

		if (test.lSize > 4080200000ul && (0 != mf_getFileSytemType(test.dbfile)))
		{
			test.lSize = 4080200000ul;
		}

		m_vecStat.push_back(test);
	}

	delete [] pbuf;

	if (0 == m_vecStat.size())
	{
		return -1;
	}
	
	return 0;
}

int CPSDBFSMS::mf_getTmpStatFile()
{
	m_vecstatTmp.clear();

	CPSConf config;

	int bufsize = config.PS_conf_init(m_strTmpStatFile);

	if (bufsize <= 0)
	{
		return -1;
	}

	char *pbuf = new char[bufsize];

	memset(pbuf, 0, bufsize);

	if (-1 == config.PS_conf_getNode(pbuf, "<db>", "</db>", 1))
	{
		delete [] pbuf;
		return -1;
	}

	int pos = 0;
	while (1)
	{
		CPSDBFSMSStat test;
		memset(test.dbfile, 0, sizeof(test.dbfile));
		
		if (-1 == config.PS_conf_getItem(pbuf+pos, test.dbfile, "<dbfile>", "</dbfile>"))
		{
			break;
		}

		char tmp[65] = {0};
		int ret = config.PS_conf_getItem(pbuf+pos, tmp, "<size>", "</size>");

		if (ret == -1)
		{
			break;
		}
			
#ifdef WIN32
		test.lSize = _atoi64(tmp);
#else
		test.lSize = strtoull(tmp, NULL, 10);
#endif

		if (test.lSize > 4080200000ul && (0 != mf_getFileSytemType(test.dbfile)))
		{
			test.lSize = 4080200000ul;
		}

		memset(tmp, 0, 65);
		if (-1 == config.PS_conf_getItem(pbuf+pos, tmp, "<period>", "</period>"))
		{
			delete [] pbuf;
			return -1;
		}
		else
		{
			pos += ret;
		}

		test.l_time = 86400 * strtol(tmp, NULL, 10);

		m_vecstatTmp.push_back(test);
	}

	if (0 == m_vecstatTmp.size())
	{
		delete [] pbuf;
		return -1;
	}

	memset(pbuf, 0, bufsize);
	if (-1 == config.PS_conf_getNode(pbuf, "<checktime>", "</checktime>", 1))
	{
		delete [] pbuf;
		return -1;
	}

	m_vecTime.clear();
	
	pos = 0;
	while (1)
	{
		char tmp[3] = {0};
		int ret = config.PS_conf_getItem(pbuf+pos, tmp, "<time>", "</time>");
		if (-1 == ret)
		{
			break;
		}

		pos += ret;

		int t = atoi(tmp);

		if (t < 0 || t > 23)
		{
			delete [] pbuf;
			return -1;
		}

		m_vecTime.push_back(t);
	}
		
	delete [] pbuf;

	if (m_vecTime.size() == 0)
	{		
		return -1;
	}

	return 0;
}

int CPSDBFSMS::PS_dbfsms_printStat()
{
	std::cout << "******************** normal area ********************" << std::endl;

	int i;
	for (i=0; i<m_vecStat.size(); i++)
	{
		std::cout << m_vecStat[i].dbfile << std::endl;

#ifdef WIN32
		char buf[33] = {0};
		printf("%s\n", _i64toa(m_vecStat[i].lSize, buf, 10));
		printf("%s\n", _i64toa(m_vecStat[i].lCurSize, buf, 10));
#else
		printf("%llu\n", m_vecStat[i].lSize);
		printf("%llu\n", m_vecStat[i].lCurSize);
#endif
	}

	if (0 == strlen(m_strTmpStatFile))
	{
		return 0;
	}

#ifdef __TEMP__
	std::cout << "******************** temp   area ********************" << std::endl;
	for (i=0; i<m_vecstatTmp.size(); i++)
	{
		std::cout << m_vecstatTmp[i].dbfile << std::endl;
#ifdef WIN32
		char buf[65] = {0};
		printf("%s\n", _i64toa(m_vecstatTmp[i].lSize, buf, 10));
		printf("%s\n", _i64toa(m_vecstatTmp[i].lCurSize, buf, 10));
#else
		printf("%llu\n", m_vecstatTmp[i].lSize);
		printf("%llu\n", m_vecstatTmp[i].lCurSize);
#endif
	}
#endif
	
	return 0;
}

/*
void * CPSDBFSMS::operator new(size_t size)
{
	void *p = &m_dbms;

	return p;
}

void CPSDBFSMS::operator delete(void *p)
{
	p = NULL;
}
*/

int CPSDBFSMS::PS_dbfsms_getLength(const char *key, unsigned long &len)
{
	int t = m_vecStat.size();
	while (t > 0)
	{
		t--;
		int ret = m_pdbfs[t].PS_dbfs_getLength(key, len);
		if (-1 == ret)
		{
			return -1;
		}
		else if (0 == ret)
		{
			return 0;
		}
	}

#ifdef __TEMP__
	t = m_vecstatTmp.size();
	while(t > 0)
	{
		t--;
		int ret = m_pdbfsTmp[t].PS_dbfs_getLength(key, len);

		if (-1 == ret)
		{
			return -1;
		}
		else if (0 == ret)
		{
			return 0;
		}
	}
#endif
	
	return -2;
}

int CPSDBFSMS::PS_dbfsms_getEnv(DB_ENV *&pEnv)
{
	pEnv = m_pEnv;

	return 0;
}

int CPSDBFSMS::mf_getFileSytemType(const char *dbpath)
{
#ifdef WIN32
	char drive[4];
	_splitpath(dbpath, drive, NULL, NULL, NULL);

	strcat(drive, "\\");
	
	char volumName[256], strFS[256] = {0};
	if (0 == GetVolumeInformation(drive, 
		volumName,
		256,
		NULL,
		NULL,
		NULL,
		strFS,
		sizeof(strFS)) )
	{
		return -1;
	}

	if (0 == stricmp(strFS, "ntfs"))
	{
		return 0;
	}
	else if (0 == stricmp(strFS, "fat32"))
	{
		return 1;
	}
	
	return -2;

#else
	return 0;
#endif
}

int CPSDBFSMS::PS_dbfsms_recoverStat(int nDB)
{
	if (nDB >= (m_vecStat.size() + m_vecstatTmp.size()))
	{
		return -1;
	}
	else if (nDB < m_vecStat.size())
	{
		return m_pdbfs[nDB].PS_dbfs_recoverStat();
	}
	else
	{
		return m_pdbfsTmp[nDB-m_vecStat.size()].PS_dbfs_recoverStat();
	}
}

⌨️ 快捷键说明

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