128 lines
4.5 KiB
C++
128 lines
4.5 KiB
C++
//--------------------------------------------------------------------
|
|
// Microsoft OLE DB Sample Provider
|
|
// (C) Copyright 1991 - 1999 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// @doc
|
|
//
|
|
// @module FILEIO.H | Class Definitions for CFileIO Class
|
|
//
|
|
//
|
|
#ifndef _FILEIO_H_
|
|
#define _FILEIO_H_
|
|
|
|
#include <fstream>
|
|
#include "fileidx.h"
|
|
#include "hashtbl.h"
|
|
using namespace std;
|
|
#define MAX_INPUT_BUFFER 2048
|
|
#define MAX_COLUMNS 129 // 128 columns supported, but 1 extra
|
|
// is needed since 1 based.
|
|
|
|
enum UPDTYPE {UPDATE, INSERT};
|
|
|
|
//--------------------------------------------------------------------
|
|
// @class CFileIO | Opens and manipulates a given CSV file. Allows
|
|
// deletions, reads, and updates.
|
|
//
|
|
// @hungarian
|
|
//
|
|
class CFileIO : public fstream //@base public | fstream
|
|
{
|
|
private: //@access private
|
|
//@cmember Count of rows in the table
|
|
DBCOUNTITEM m_cRows;
|
|
//@cmember Count of columns in the table
|
|
DBORDINAL m_cColumns;
|
|
//@cmember Pointer to Column Names buffer
|
|
LPTSTR m_pColNames;
|
|
//@cmember Array of pointers into the Column Names buffer
|
|
LPTSTR m_rgpColNames[MAX_COLUMNS];
|
|
//@cmember Array of Column Data Types
|
|
SWORD m_rgswColType[MAX_COLUMNS];
|
|
//@cmember Array of Precision values for columns
|
|
UDWORD m_rgudwColSize[MAX_COLUMNS];
|
|
//@cmember True if columns contains signed values
|
|
BOOL m_rgfSigned[MAX_COLUMNS];
|
|
//@cmember Array of pointers to Data
|
|
PCOLUMNDATA m_rgpColumnData[MAX_COLUMNS];
|
|
//@cmember Array of Lengths for the data
|
|
SDWORD m_rgsdwMaxLen[MAX_COLUMNS];
|
|
//@cmember Input buffer of size MAX_INPUT_BUFFER
|
|
LPTSTR m_pvInput;
|
|
//@cmember Offset into file for DataTypes
|
|
size_t m_ulDataTypeOffset;
|
|
//@cmember Index Class declaration
|
|
CFileIdx m_FileIdx;
|
|
//@cmember If the File is ReadOnly
|
|
BOOL m_FileReadOnly;
|
|
//@cmember Array of DBCOLUMNINFO
|
|
DBCOLUMNINFO m_rgdbcolinfo[MAX_COLUMNS];
|
|
//@cmember Array of column offsets used to interpret a rowbuffer
|
|
DBLENGTH m_rgdwDataOffsets[MAX_COLUMNS];
|
|
//@cmember Pointer to Info Array Heap (heap of column name strings)
|
|
BYTE * m_pbHeap;
|
|
//@cmember how many bytes of the column names heap is in use
|
|
ULONG m_cbHeapUsed;
|
|
//@cmember size of row data for this file
|
|
DBLENGTH m_cbRowSize;
|
|
|
|
private: //@access private
|
|
//@cmember Break a stream into column names
|
|
HRESULT ParseColumnNames(LPTSTR ptstrInput);
|
|
//@cmember Break a stream into MetaData information
|
|
HRESULT ParseDataTypes();
|
|
//@cmember Control procedure to Read and parse intitial
|
|
//information from the file
|
|
HRESULT GenerateFileInfo();
|
|
//@cmember Fill the COLUMNDATA structure
|
|
HRESULT CFileIO::FillBinding(DBORDINAL cColumn, LPTSTR pvCopy);
|
|
|
|
|
|
public: //@access public
|
|
//@cmember Constructor
|
|
CFileIO(void);
|
|
//@cmember Destructor
|
|
~CFileIO(void);
|
|
//@cmember Initialization routine
|
|
HRESULT fInit(LPTSTR pstrFileName);
|
|
//@cmember Return the number of columns in the file
|
|
inline DBORDINAL GetColumnCnt() { return m_cColumns; };
|
|
//@cmember Return the number of rows in the file
|
|
inline DBCOUNTITEM GetRowCnt() { return m_cRows; };
|
|
//@cmember Determines if the rowset is ReadOnly
|
|
inline BOOL IsReadOnly() { return m_FileReadOnly; };
|
|
//@cmember Return the columninfo array
|
|
inline DBCOLUMNINFO * GetColInfo() { return m_rgdbcolinfo; };
|
|
//@cmember Return the column name heap
|
|
inline BYTE * GetColNameHeap() { return m_pbHeap; };
|
|
//@cmember Return the column name heap size
|
|
inline ULONG GetColNameHeapSize() { return m_cbHeapUsed; };
|
|
//@cmember Return row data size for this file
|
|
inline DBLENGTH GetRowSize() { return m_cbRowSize; };
|
|
//@cmember Retrieve pointers to the columns names
|
|
HRESULT GetColumnName(DBORDINAL cCols, LPTSTR* pptstrName = NULL);
|
|
//@cmember Retrieve the metadata for a particular column
|
|
HRESULT GetDataTypes(DBORDINAL cCols, SWORD* pswType, UDWORD* pudwColDef, BOOL* pfSigned);
|
|
//@cmember Set the Binding Areas.
|
|
HRESULT SetColumnBind(DBORDINAL cCols, PCOLUMNDATA pColumn);
|
|
//@cmember Extract the data from a stream
|
|
HRESULT ParseRowValues();
|
|
//@cmember Fetch A single rows data values
|
|
HRESULT Fetch(DBCOUNTITEM ulRow);
|
|
//@cmember Update the current rows values
|
|
HRESULT UpdateRow(DBCOUNTITEM ulRow, BYTE* pbProvRow, UPDTYPE eUpdateType);
|
|
//@cmember Remove the specified row from the file
|
|
HRESULT DeleteRow(DBCOUNTITEM ulRow);
|
|
//@cmember Determines if the row has already been deleted
|
|
HRESULT IsDeleted(DBCOUNTITEM ulRow);
|
|
//@cmember Gathers information that both the CCommand and CRowset objects use
|
|
HRESULT GatherColumnInfo();
|
|
//@cmember Return a ptr to a COLUMNDATA struct
|
|
COLUMNDATA * GetColumnData(DBORDINAL cCols, ROWBUFF * pRowBuff);
|
|
};
|
|
|
|
typedef CFileIO FAR * PCFILEIO;
|
|
|
|
#endif
|
|
|