📄 myrecord.cpp
字号:
{
m_objFields[i] = pMyRecord->m_objFields[i];
m_objFields[i].m_Field = m_Fields[i]; // 指向本地name串
if (m_objFields[i].m_ulType == FIELD_TYPE_VAR_STRING
|| m_objFields[i].m_ulType == FIELD_TYPE_STRING)
{
#ifdef USE_NEW
m_objFields[i].m_szVal = new char[m_Fields[i].length+1];
#else
m_objFields[i].m_szVal = (char *) g_heapSystem.New(sizeof(char)*(m_Fields[i].length+1));
#endif
//★ 全局堆分配,会有内存碎片
strcpy(m_objFields[i].m_szVal, pMyRecord->m_objFields[i].m_szVal);
}
}
return true;
}
///////////////////////////////////////////////////////////////////////
void CMyRecord::Close()
{
try {
if (m_bIsOpen)
{
#ifdef USE_NEW
delete [] m_pbDirty;
#else
g_heapSystem.Delete(m_pbDirty);
#endif
for (unsigned int i=0;i<m_uiFieldsCount;i++)
{
if (m_objFields[i].m_ulType == FIELD_TYPE_STRING
|| m_objFields[i].m_ulType == FIELD_TYPE_VAR_STRING)
#ifdef USE_NEW
delete [] m_objFields[i].m_szVal;
#else
g_heapSystem.Delete(m_objFields[i].m_szVal);
#endif
#ifdef USE_NEW
delete [] m_Fields[i].name; // AAAAAAAAAAAAAAAAAA
#else
g_heapSystem.Delete(m_Fields[i].name);
#endif
}
delete [] m_objFields;
#ifdef USE_NEW
delete [] m_Fields;
#else
g_heapSystem.Delete(m_Fields);
#endif
m_pMyDatabase->m_nRefCount --;
}
m_bIsOpen = false;
}
catch(...)
{
char szMsg[] ="Mysql RecordSet close error.";
::OutputDebugString(szMsg);
}
}
///////////////////////////////////////////////////////////////////////
CMyRecord::~CMyRecord()
{
if (m_bIsOpen) Close();
}
///////////////////////////////////////////////////////////////////////
// 数据集操作
void CMyRecord::Edit()
{ m_bEdit = true;
if (! m_bIsOpen ) return;
m_nEditMode = modeEdit;
}
///////////////////////////////////////////////////////////////////////
void CMyRecord::AddNew()
{ m_bEdit = true;
if (! m_bIsOpen ) return;
m_nEditMode = modeAddNew;
}
///////////////////////////////////////////////////////////////////////
void CMyRecord::Delete()
{ m_bEdit = true;
if (! m_bIsOpen ) return;
m_nEditMode = modeDelete;
}
///////////////////////////////////////////////////////////////////////
// SQL
bool CMyRecord::Query(char * strSQL, MYSQL_RES * * res)
{
if (!CMyDatabase::CheckSQL(strSQL))
return false;
try {
if (!m_bIsOpen) return false;
time_t tStart = clock();
#ifdef NO_MUTEX
if(true)
#else
if (WAIT_OBJECT_0 ==::WaitForSingleObject(m_pMyDatabase->m_hDbMutex, _MAX_DBACCESSTIME))
#endif
{
MYSQL * hdbc = m_pMyDatabase->m_hdbc;
if (mysql_query(hdbc, strSQL)!=NULL)
{
LOCKADD_TIMESUM;
//error
RELEASE_MUTEX(m_pMyDatabase->m_hDbMutex);
return false;
}
else
{
LOCKADD_TIMESUM;
*res=mysql_store_result(hdbc); //paled - 当仅有INSERT、DELETE、UPDATE等查询时,可使用 mysql_affected_rows() 检查是否成功
if (*res == NULL)
{
if (mysql_field_count(hdbc) >0 )
{
//error
RELEASE_MUTEX(m_pMyDatabase->m_hDbMutex);
return false;
}
else
{
RELEASE_MUTEX(m_pMyDatabase->m_hDbMutex);
return true;
}
}
else
{
RELEASE_MUTEX(m_pMyDatabase->m_hDbMutex);
return true;
}
}
}
else
{
::LogSave("*DATABASE* WARNING: Qurey() overtime");
return false;
}
}
catch(...)
{
char szMsg[1024];
sprintf(szMsg, "Mysql Query error: %s", strSQL);
::OutputDebugString(szMsg);
return false;
}
}
///////////////////////////////////////////////////////////////////////
bool CMyRecord::IsOpen()
{
//assert(this);
return (m_bIsOpen);
}
///////////////////////////////////////////////////////////////////////
int CMyRecord::FieldsCount()
{
if (m_bIsOpen)
return m_uiFieldsCount;
else
return -1;
}
///////////////////////////////////////////////////////////////////////
bool CMyRecord::CanUpdate() const // Can Edit/AddNew/Delete be called?
{
if (!m_bIsOpen ) return false;
return m_bCanUpdate;
}
///////////////////////////////////////////////////////////////////////
//
CMyField CMyRecord::Fields(UINT uiIndex)
{
if (uiIndex > m_uiFieldsCount)
{
::LogSave("*DATABASE* ERROR: Illegal Fields() parameter.");
uiIndex=0; //★ 0号对象是非法对象么?
}
if (m_bEdit)
{ m_pbDirty[uiIndex] = true;
CMyField MyField = m_objFields[uiIndex];
MyField.m_pMyField = &m_objFields[uiIndex]; //paled
MyField.m_nIndex = uiIndex;
MyField.m_szVal = m_objFields[uiIndex].m_szVal;
return MyField; //★ BUG: 没有初始化 m_Field 成员变量。没有初始化数值类成员变量
}
m_pbDirty[uiIndex] = false;
// GetFieldValue(uiIndex);
return m_objFields[uiIndex];
}
///////////////////////////////////////////////////////////////////////
CMyField CMyRecord::Fields(char * szField)
{
int nIndex = -1 ;
for (UINT i=0; i < m_uiFieldsCount; i++)
{
if ( strcmp(szField, m_Fields[i].name) == 0)
{
nIndex = i;
break;
}
}
if (nIndex != -1)
return Fields(nIndex);
else
{
::LogSave("Error: field %s not found in CMyRecord::Fields", szField);
return Fields((unsigned int)0);
}
}
///////////////////////////////////////////////////////////////////////
void CMyRecord::ClsEditFlag()
{
for ( int i=0; i<(int)m_uiFieldsCount; i++ )
m_pbDirty[i] = false;
}
///////////////////////////////////////////////////////////////////////
int CMyRecord::UpdateFieldsCount()
{
int nCount =0;
for ( int i=0; i<(int)m_uiFieldsCount; i++ )
{
if (m_pbDirty[i])
nCount++;
}
return nCount;
}
///////////////////////////////////////////////////////////////////////
bool CMyRecord::AddField(LPCTSTR szField, int nData)
{
sprintf(m_szUpdateSQL, "UPDATE %s SET %s=%s+%d WHERE %s=%s LIMIT 1",
m_szTableName, szField, szField, nData, m_szKey, m_szKeyData);
MYSQL_RES * res;
bool ret = Query(m_szUpdateSQL, &res);
if(ret && res)
mysql_free_result(res);
return ret;
}
///////////////////////////////////////////////////////////////////////
bool CMyRecord::SetTableName(LPCTSTR szName, DWORD idNewKey /*= 0*/)
{
if(!szName || strlen(szName) == 0 || strlen(szName) >= 32)
return false;
strcpy(m_szTableName, szName);
if(idNewKey != 0)
sprintf(m_szKeyData, "%u", idNewKey);
return true;
}
///////////////////////////////////////////////////////////////////////
// record
///////////////////////////////////////////////////////////////////////
IRecord* CMyRecord::CreateNewRecord(DWORD idNewKey /*= 0*/)
{
CMyRecord* pRecord = CMyRecord::CreateNew(m_pMyDatabase); //VVVVVVVVVVVVVV
if(pRecord)
{
if(pRecord->Spawn(this, idNewKey))
return (IRecord*)pRecord;
delete pRecord;
}
return NULL;
}
///////////////////////////////////////////////////////////////////////
bool CMyRecord::InsertRecord()
{
if (!m_bIsOpen || !m_bCanUpdate)
return false;
m_bEdit = false;
m_nEditMode = modeAddNew;
bool ret =true;
if (this->UpdateFieldsCount() > 0)
{
// build sql
this->BuildUpdateSQL();
// need change the local row;
MYSQL_RES * res;
ret = Query(m_szUpdateSQL, &res);
if(ret && res)
mysql_free_result(res);
}
else
::LogSave("WARNING: CMyRecord::InsertRecord() no found field.");
// clear edit flag
this->ClsEditFlag();
return ret;
}
///////////////////////////////////////////////////////////////////////
bool CMyRecord::UpdateRecord()
{
if (!m_bIsOpen || !m_bCanUpdate)
return false;
m_bEdit = false;
m_nEditMode = modeEdit;
bool ret =true;
if (this->UpdateFieldsCount() > 0)
{
// build sql
this->BuildUpdateSQL();
// need change the local row;
MYSQL_RES * res;
ret = Query(m_szUpdateSQL, &res);
if(ret && res)
mysql_free_result(res);
}
// clear edit flag
this->ClsEditFlag();
return ret;
}
///////////////////////////////////////////////////////////////////////
bool CMyRecord::DeleteRecord()
{
if (!m_bIsOpen || !m_bCanUpdate)
return false;
m_bEdit = false;
m_nEditMode = modeDelete;
bool ret =true;
// if (this->UpdateFieldsCount() > 0)
{
// build sql
this->BuildUpdateSQL();
// need change the local row;
MYSQL_RES * res;
ret = Query(m_szUpdateSQL, &res);
if(ret && res)
mysql_free_result(res);
}
// else
// ::LogSave("WARNING: CMyRecord::InsertRecord() no found field.");
// clear edit flag
this->ClsEditFlag();
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -