summaryrefslogtreecommitdiff
path: root/utils/vmpi_private/mysql_wrapper
diff options
context:
space:
mode:
Diffstat (limited to 'utils/vmpi_private/mysql_wrapper')
-rw-r--r--utils/vmpi_private/mysql_wrapper/StdAfx.cpp15
-rw-r--r--utils/vmpi_private/mysql_wrapper/StdAfx.h31
-rw-r--r--utils/vmpi_private/mysql_wrapper/mysql_wrapper.cpp398
-rw-r--r--utils/vmpi_private/mysql_wrapper/mysql_wrapper.vpc40
4 files changed, 484 insertions, 0 deletions
diff --git a/utils/vmpi_private/mysql_wrapper/StdAfx.cpp b/utils/vmpi_private/mysql_wrapper/StdAfx.cpp
new file mode 100644
index 0000000..8c22bdf
--- /dev/null
+++ b/utils/vmpi_private/mysql_wrapper/StdAfx.cpp
@@ -0,0 +1,15 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+// stdafx.cpp : source file that includes just the standard includes
+// mysql_wrapper.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/utils/vmpi_private/mysql_wrapper/StdAfx.h b/utils/vmpi_private/mysql_wrapper/StdAfx.h
new file mode 100644
index 0000000..c75754a
--- /dev/null
+++ b/utils/vmpi_private/mysql_wrapper/StdAfx.h
@@ -0,0 +1,31 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#if !defined(AFX_STDAFX_H__1FC781E6_1CD6_4383_AF43_17CB309431F9__INCLUDED_)
+#define AFX_STDAFX_H__1FC781E6_1CD6_4383_AF43_17CB309431F9__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+
+// Insert your headers here
+//#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
+
+#include <windows.h>
+
+// TODO: reference additional headers your program requires here
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_STDAFX_H__1FC781E6_1CD6_4383_AF43_17CB309431F9__INCLUDED_)
diff --git a/utils/vmpi_private/mysql_wrapper/mysql_wrapper.cpp b/utils/vmpi_private/mysql_wrapper/mysql_wrapper.cpp
new file mode 100644
index 0000000..3b441e6
--- /dev/null
+++ b/utils/vmpi_private/mysql_wrapper/mysql_wrapper.cpp
@@ -0,0 +1,398 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+// mysql_wrapper.cpp : Defines the entry point for the DLL application.
+//
+#include "stdafx.h"
+
+extern "C"
+{
+ #include "mysql.h"
+};
+
+#include "imysqlwrapper.h"
+#include <stdio.h>
+
+
+static char* CopyString( const char *pStr )
+{
+ if ( !pStr )
+ {
+ pStr = "";
+ }
+
+ char *pRet = new char[ strlen( pStr ) + 1 ];
+ strcpy( pRet, pStr );
+ return pRet;
+}
+
+
+BOOL APIENTRY DllMain( HANDLE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+ )
+{
+ return TRUE;
+}
+
+
+class CCopiedRow
+{
+public:
+ ~CCopiedRow()
+ {
+ m_Columns.PurgeAndDeleteElements();
+ }
+
+ CUtlVector<char*> m_Columns;
+};
+
+
+class CMySQLCopiedRowSet : public IMySQLRowSet
+{
+public:
+ ~CMySQLCopiedRowSet()
+ {
+ m_Rows.PurgeAndDeleteElements();
+ m_ColumnNames.PurgeAndDeleteElements();
+ }
+
+ virtual void Release()
+ {
+ delete this;
+ }
+
+ virtual int NumFields()
+ {
+ return m_ColumnNames.Count();
+ }
+
+ virtual const char* GetFieldName( int iColumn )
+ {
+ return m_ColumnNames[iColumn];
+ }
+
+ virtual bool NextRow()
+ {
+ ++m_iCurRow;
+ return m_iCurRow < m_Rows.Count();
+ }
+
+ virtual bool SeekToFirstRow()
+ {
+ m_iCurRow = 0;
+ return m_iCurRow < m_Rows.Count();
+ }
+
+ virtual CColumnValue GetColumnValue( int iColumn )
+ {
+ return CColumnValue( this, iColumn );
+ }
+
+ virtual CColumnValue GetColumnValue( const char *pColumnName )
+ {
+ return CColumnValue( this, GetColumnIndex( pColumnName ) );
+ }
+
+ virtual const char* GetColumnValue_String( int iColumn )
+ {
+ if ( iColumn < 0 || iColumn >= m_ColumnNames.Count() )
+ return "<invalid column specified>";
+ else if ( m_iCurRow < 0 || m_iCurRow >= m_Rows.Count() )
+ return "<invalid row specified>";
+ else
+ return m_Rows[m_iCurRow]->m_Columns[iColumn];
+ }
+
+ virtual long GetColumnValue_Int( int iColumn )
+ {
+ return atoi( GetColumnValue_String( iColumn ) );
+ }
+
+ virtual int GetColumnIndex( const char *pColumnName )
+ {
+ for ( int i=0; i < m_ColumnNames.Count(); i++ )
+ {
+ if ( stricmp( m_ColumnNames[i], pColumnName ) == 0 )
+ return i;
+ }
+ return -1;
+ }
+
+
+public:
+ int m_iCurRow;
+ CUtlVector<CCopiedRow*> m_Rows;
+ CUtlVector<char*> m_ColumnNames;
+};
+
+
+// -------------------------------------------------------------------------------------------------------- //
+// CMySQL class.
+// -------------------------------------------------------------------------------------------------------- //
+
+class CMySQL : public IMySQL
+{
+public:
+ CMySQL();
+ virtual ~CMySQL();
+
+ virtual bool InitMySQL( const char *pDBName, const char *pHostName, const char *pUserName, const char *pPassword );
+ virtual void Release();
+ virtual int Execute( const char *pString );
+ virtual IMySQLRowSet* DuplicateRowSet();
+ virtual unsigned long InsertID();
+ virtual int NumFields();
+ virtual const char* GetFieldName( int iColumn );
+ virtual bool NextRow();
+ virtual bool SeekToFirstRow();
+ virtual CColumnValue GetColumnValue( int iColumn );
+ virtual CColumnValue GetColumnValue( const char *pColumnName );
+ virtual const char* GetColumnValue_String( int iColumn );
+ virtual long GetColumnValue_Int( int iColumn );
+ virtual int GetColumnIndex( const char *pColumnName );
+
+ // Cancels the storage of the rows from the latest query.
+ void CancelIteration();
+
+ virtual const char * GetLastError( void );
+
+
+public:
+
+ MYSQL *m_pSQL;
+ MYSQL_RES *m_pResult;
+ MYSQL_ROW m_Row;
+ CUtlVector<MYSQL_FIELD> m_Fields;
+
+ char m_szLastError[128];
+};
+
+
+EXPOSE_INTERFACE( CMySQL, IMySQL, MYSQL_WRAPPER_VERSION_NAME );
+
+
+// -------------------------------------------------------------------------------------------------------- //
+// CMySQL implementation.
+// -------------------------------------------------------------------------------------------------------- //
+
+CMySQL::CMySQL()
+{
+ m_pSQL = NULL;
+ m_pResult = NULL;
+ m_Row = NULL;
+}
+
+
+CMySQL::~CMySQL()
+{
+ CancelIteration();
+
+ if ( m_pSQL )
+ {
+ mysql_close( m_pSQL );
+ m_pSQL = NULL;
+ }
+}
+
+
+bool CMySQL::InitMySQL( const char *pDBName, const char *pHostName, const char *pUserName, const char *pPassword )
+{
+ MYSQL *pSQL = mysql_init( NULL );
+ if ( !pSQL )
+ return NULL;
+
+ if ( !mysql_real_connect( pSQL, pHostName, pUserName, pPassword, pDBName, 0, NULL, 0 ) )
+ {
+ Q_strncpy( m_szLastError, mysql_error( pSQL ), sizeof(m_szLastError) );
+
+ mysql_close( pSQL );
+ return false;
+ }
+
+ m_pSQL = pSQL;
+ return true;
+}
+
+
+void CMySQL::Release()
+{
+ delete this;
+}
+
+
+int CMySQL::Execute( const char *pString )
+{
+ CancelIteration();
+
+ int result = mysql_query( m_pSQL, pString );
+ if ( result == 0 )
+ {
+ // Is this a query with a result set?
+ m_pResult = mysql_store_result( m_pSQL );
+ if ( m_pResult )
+ {
+ // Store the field information.
+ int count = mysql_field_count( m_pSQL );
+ MYSQL_FIELD *pFields = mysql_fetch_fields( m_pResult );
+ m_Fields.CopyArray( pFields, count );
+ return 0;
+ }
+ else
+ {
+ // No result set. Was a set expected?
+ if ( mysql_field_count( m_pSQL ) != 0 )
+ return 1; // error! The query expected data but didn't get it.
+ }
+ }
+ else
+ {
+ const char *pError = mysql_error( m_pSQL );
+ pError = pError;
+ }
+
+ return result;
+}
+
+
+IMySQLRowSet* CMySQL::DuplicateRowSet()
+{
+ CMySQLCopiedRowSet *pSet = new CMySQLCopiedRowSet;
+
+ pSet->m_iCurRow = -1;
+
+ pSet->m_ColumnNames.SetSize( m_Fields.Count() );
+ for ( int i=0; i < m_Fields.Count(); i++ )
+ pSet->m_ColumnNames[i] = CopyString( m_Fields[i].name );
+
+ while ( NextRow() )
+ {
+ CCopiedRow *pRow = new CCopiedRow;
+ pSet->m_Rows.AddToTail( pRow );
+ pRow->m_Columns.SetSize( m_Fields.Count() );
+
+ for ( int i=0; i < m_Fields.Count(); i++ )
+ {
+ pRow->m_Columns[i] = CopyString( m_Row[i] );
+ }
+ }
+
+ return pSet;
+}
+
+
+unsigned long CMySQL::InsertID()
+{
+ return mysql_insert_id( m_pSQL );
+}
+
+
+int CMySQL::NumFields()
+{
+ return m_Fields.Count();
+}
+
+
+const char* CMySQL::GetFieldName( int iColumn )
+{
+ return m_Fields[iColumn].name;
+}
+
+
+bool CMySQL::NextRow()
+{
+ if ( !m_pResult )
+ return false;
+
+ m_Row = mysql_fetch_row( m_pResult );
+ if ( m_Row == 0 )
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+
+bool CMySQL::SeekToFirstRow()
+{
+ if ( !m_pResult )
+ return false;
+
+ mysql_data_seek( m_pResult, 0 );
+ return true;
+}
+
+
+CColumnValue CMySQL::GetColumnValue( int iColumn )
+{
+ return CColumnValue( this, iColumn );
+}
+
+
+CColumnValue CMySQL::GetColumnValue( const char *pColumnName )
+{
+ return CColumnValue( this, GetColumnIndex( pColumnName ) );
+}
+
+
+const char* CMySQL::GetColumnValue_String( int iColumn )
+{
+ if ( m_Row && iColumn >= 0 && iColumn < m_Fields.Count() && m_Row[iColumn] )
+ return m_Row[iColumn];
+ else
+ return "";
+}
+
+
+long CMySQL::GetColumnValue_Int( int iColumn )
+{
+ return atoi( GetColumnValue_String( iColumn ) );
+}
+
+
+int CMySQL::GetColumnIndex( const char *pColumnName )
+{
+ for ( int i=0; i < m_Fields.Count(); i++ )
+ {
+ if ( stricmp( pColumnName, m_Fields[i].name ) == 0 )
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+
+void CMySQL::CancelIteration()
+{
+ m_Fields.Purge();
+
+ if ( m_pResult )
+ {
+ mysql_free_result( m_pResult );
+ m_pResult = NULL;
+ }
+
+ m_Row = NULL;
+}
+
+const char *CMySQL::GetLastError( void )
+{
+ // Default to the last error if m_pSQL was not successfully initialized
+ const char *pszLastError = m_szLastError;
+
+ if ( m_pSQL )
+ {
+ pszLastError = mysql_error( m_pSQL );
+ }
+
+ return pszLastError;
+} \ No newline at end of file
diff --git a/utils/vmpi_private/mysql_wrapper/mysql_wrapper.vpc b/utils/vmpi_private/mysql_wrapper/mysql_wrapper.vpc
new file mode 100644
index 0000000..b05eab5
--- /dev/null
+++ b/utils/vmpi_private/mysql_wrapper/mysql_wrapper.vpc
@@ -0,0 +1,40 @@
+//-----------------------------------------------------------------------------
+// MYSQL_WRAPPER.VPC
+//
+// Project Script
+//-----------------------------------------------------------------------------
+
+$Macro SRCDIR "..\..\.."
+$Macro OUTBINDIR "$SRCDIR\..\game\bin"
+
+$Include "$SRCDIR\vpc_scripts\source_dll_base.vpc"
+
+$Configuration
+{
+ $Compiler
+ {
+ $AdditionalIncludeDirectories "$BASE,..,..\mysql\include,..\..\vmpi"
+ $PreprocessorDefinitions "$BASE;MYSQL_WRAPPER_EXPORTS"
+ }
+}
+
+$Project "Mysql_wrapper"
+{
+ $Folder "Source Files"
+ {
+ $File "mysql_wrapper.cpp"
+ $File "StdAfx.cpp"
+ }
+
+ $Folder "Header Files"
+ {
+ $File "..\..\vmpi\imysqlwrapper.h"
+ $File "StdAfx.h"
+ }
+
+ $Folder "Link Libraries"
+ {
+ $File "..\mysql\lib\opt\libmySQL.lib"
+ $File "..\mysql\lib\opt\zlib.lib"
+ }
+}