Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

136 lines
2.9 KiB

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) Microsoft Corp. All rights reserved.
//
// FILE
//
// oledbstore.cpp
//
// SYNOPSIS
//
// This file defines the class OleDBDataStore.
//
///////////////////////////////////////////////////////////////////////////////
#include <ias.h>
#include <iasdb.h>
#include <iasutil.h>
#include <dsobject.h>
#include <oledbstore.h>
#include <propset.h>
#include <msjetoledb.h>
#include <oledberr.h>
//////////
// Current versions supported.
//////////
const LONG MIN_VERSION = IAS_WIN2K_VERSION;
const LONG MAX_VERSION = IAS_CURRENT_VERSION;
STDMETHODIMP OleDBDataStore::get_Root(IDataStoreObject** ppObject)
{
if (ppObject == NULL) { return E_INVALIDARG; }
if (*ppObject = root) { (*ppObject)->AddRef(); }
return S_OK;
}
STDMETHODIMP OleDBDataStore::Initialize(BSTR bstrDSName,
BSTR bstrUserName,
BSTR bstrPassword)
{
// Are we already initialized?
if (root != NULL) { HRESULT_FROM_WIN32(ERROR_ALREADY_INITIALIZED); }
// Open the database.
HRESULT hr = IASOpenJetDatabase(bstrDSName, FALSE, &session);
if (FAILED(hr)) { return hr; }
//////////
// Check the version.
//////////
LONG version;
hr = IASExecuteSQLFunction(
session,
L"SELECT Version FROM Version",
&version
);
// If the table doesn't exist, then version is zero.
if (hr == DB_E_NOTABLE)
{
version = 0;
}
else if (FAILED(hr))
{
return hr;
}
// Is it out of bounds?
if (version < MIN_VERSION || version > MAX_VERSION)
{
return HRESULT_FROM_WIN32(ERROR_REVISION_MISMATCH);
}
try
{
//////////
// Initialize all the command objects.
//////////
members.initialize(session);
create.initialize(session);
destroy.initialize(session);
find.initialize(session);
update.initialize(session);
erase.initialize(session);
get.initialize(session);
set.initialize(session);
// Create the root object.
root = DBObject::createInstance(this, NULL, 1, L"top");
}
CATCH_AND_RETURN()
return S_OK;
}
STDMETHODIMP OleDBDataStore::OpenObject(BSTR bstrPath,
IDataStoreObject** ppObject)
{
return E_NOTIMPL;
}
STDMETHODIMP OleDBDataStore::Shutdown()
{
//////////
// Release the root.
//////////
root.Release();
//////////
// Finalize the commands.
//////////
set.finalize();
get.finalize();
erase.finalize();
update.finalize();
find.finalize();
destroy.finalize();
create.finalize();
members.finalize();
//////////
// Release the data source connection.
//////////
session.Release();
return S_OK;
}