📄 myrecord.cpp
字号:
if(true)
#else
if (WAIT_OBJECT_0 ==::WaitForSingleObject(m_pMyDatabase->m_hDbMutex, _MAX_DBACCESSTIME))
#endif
{
CTimeCostChk chk("CMyRecord::Query", 1000);
MYSQL * hdbc = m_pMyDatabase->m_hdbc;
if (mysql_query(hdbc, strSQL)!=NULL)
{
LOCKADD_TIMESUM;
//error
RELEASE_MUTEX(m_pMyDatabase->m_hDbMutex);
// log error sql
::MsgLogSave("gmlog/DbError", "%s", strSQL);
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[%u].", uiIndex);
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 ( stricmp(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); // ★★★ : BUG, 如果是SET调用,会修改第一个字段!!!
}
}
///////////////////////////////////////////////////////////////////////
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);
m_objFields[m_uiKeyIndex].m_ulVal = idNewKey;
}
return true;
}
///////////////////////////////////////////////////////////////////////
// record
///////////////////////////////////////////////////////////////////////
IRecord* CMyRecord::CreateNewRecord(DWORD idNewKey /*= NEWKEY_NONE*/)
{
CMyRecord* pRecord = CMyRecord::CreateNew(m_pMyDatabase); //VVVVVVVVVVVVVV
if(pRecord)
{
if(pRecord->Spawn(this, idNewKey))
return (IRecord*)pRecord;
delete pRecord;
}
return NULL;
}
///////////////////////////////////////////////////////////////////////
DWORD 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);
}
// clear edit flag
this->ClsEditFlag();
if(ret)
{
DWORD key = m_pMyDatabase->GetInsertId();
if(key != 0)
{
sprintf(m_szKeyData, "%u", key);
m_objFields[m_uiKeyIndex].m_ulVal = key;
return key;
}
else
return m_objFields[m_uiKeyIndex].m_ulVal;
}
else
return 0;
}
///////////////////////////////////////////////////////////////////////
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();
#ifdef PALED_DEBUG
LOGWARNING("--- %s", m_szUpdateSQL);
#endif
// 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;
// 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;
}
///////////////////////////////////////////////////////////////////////
// new interface
///////////////////////////////////////////////////////////////////////
int CMyRecord::LoadInt (LPCTSTR szField)
{
IF_NOT(szField)
return INT_NONE;
for (UINT i=0; i < m_uiFieldsCount; i++)
{
if (stricmp(szField, m_Fields[i].name) == 0)
{
return GetInt(i);
}
}
return INT_NONE;
}
///////////////////////////////////////////////////////////////////////
void CMyRecord::SetInt (LPCTSTR szField, int nData)
{
IF_NOT(szField)
return;
for (UINT i=0; i < m_uiFieldsCount; i++)
{
if (stricmp(szField, m_Fields[i].name) == 0)
{
SetInt(i, nData);
return;
}
}
}
///////////////////////////////////////////////////////////////////////
void CMyRecord::LoadString (char* szData, LPCTSTR szField, int nSize)
{
IF_NOT(szField && szData)
return;
for (UINT i=0; i < m_uiFieldsCount; i++)
{
if (stricmp(szField, m_Fields[i].name) == 0)
{
SafeCopy(szData, GetStr(i), nSize);
return;
}
}
}
///////////////////////////////////////////////////////////////////////
void CMyRecord::SetString (LPCTSTR szField, LPCTSTR szData, int nSize)
{
IF_NOT(szField && szData)
return;
for (UINT i=0; i < m_uiFieldsCount; i++)
{
if (stricmp(szField, m_Fields[i].name) == 0)
{
SetStr(i, szData, nSize);
return;
}
}
}
///////////////////////////////////////////////////////////////////////
int CMyRecord::GetInt (int idx)
{
IF_NOT(idx>=0 && idx<(int)m_uiFieldsCount)
{
LOGERROR("invalid index[%d] in table [%s].", idx, m_szTableName);
return INT_NONE;
}
if (!m_objFields[idx].m_szVal) // 非串类型
return m_objFields[idx].m_iVal;
else
return INT_NONE;
}
///////////////////////////////////////////////////////////////////////
LPCTSTR CMyRecord::GetStr (int idx)
{
IF_NOT(idx>=0 && idx<(int)m_uiFieldsCount)
{
LOGERROR("invalid index[%d] in table [%s].", idx, m_szTableName);
return STR_NONE;
}
if (m_objFields[idx].m_szVal) // 串类型
return (m_objFields[idx].m_szVal);
else
return STR_NONE;
}
///////////////////////////////////////////////////////////////////////
void CMyRecord::SetInt (int idx, int nData)
{
IF_NOT(idx>=0 && idx<(int)m_uiFieldsCount)
{
LOGERROR("Invalid index[%d] in table [%s]", idx, m_szTableName);
return;
}
m_pbDirty[idx] = true;
if (!m_objFields[idx].m_szVal) // 非串类型
m_objFields[idx].m_iVal = nData;
return;
}
///////////////////////////////////////////////////////////////////////
void CMyRecord::SetStr (int idx, LPCTSTR szData, int nSize)
{
IF_NOT(idx>=0 && idx<(int)m_uiFieldsCount)
{
LOGERROR("Invalid index[%d] in table [%s]", idx, m_szTableName);
return;
}
IF_NOT(nSize <= (int)m_Fields[idx].length+1)
{
LOGERROR("Invalid size[%d] in field[%s] of table [%s]", nSize, m_Fields[idx].name, m_szTableName);
return;
}
m_pbDirty[idx] = true;
if (m_objFields[idx].m_szVal) // 串类型
SafeCopy(m_objFields[idx].m_szVal, szData, nSize);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -