⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 instancedatafile.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions:// // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================////%/////////////////////////////////////////////////////////////////////////////#include <fstream>#include <Pegasus/Common/Config.h>#include "InstanceDataFile.h"#include <Pegasus/Common/System.h>#include <Pegasus/Common/FileSystem.h>#include <Pegasus/Common/Tracer.h>#if defined(PEGASUS_OS_OS400)#include "OS400ConvertChar.h"#endifPEGASUS_USING_STD;PEGASUS_NAMESPACE_BEGINBoolean InstanceDataFile::_openFile(    PEGASUS_STD(fstream)& fs,    const String& path,    int mode){    PEG_METHOD_ENTER(TRC_REPOSITORY, "InstanceDataFile::_openFile()");#if defined(__GNUC__) && GCC_VERSION >= 30200    if (FileSystem::openNoCase(fs, path, PEGASUS_STD(ios_base::openmode)(mode)))#else    if (FileSystem::openNoCase(fs, path, mode))#endif    {       PEG_METHOD_EXIT();       return true;    }#if defined(__GNUC__) && GCC_VERSION >= 30200    fs.open(path.getCString(), PEGASUS_STD(ios_base::openmode)(mode));#else#if defined(PEGASUS_OS_OS400)    fs.open(path.getCString(), mode, PEGASUS_STD(_CCSID_T(1208)));#else    fs.open(path.getCString(), mode);#endif#endif    PEG_METHOD_EXIT();    return !!fs;}Boolean InstanceDataFile::loadInstance(    const String& path,    Uint32 index,    Uint32 size,    Buffer& data){    PEG_METHOD_ENTER(TRC_REPOSITORY, "InstanceDataFile::loadInstance()");    //    // Open the file:    //    fstream fs;    if (!_openFile(fs, path, ios::in PEGASUS_OR_IOS_BINARY))    {        PEG_METHOD_EXIT();        return false;    }    //    // Postion file pointer:    //    fs.seekg(index);    if (!fs)    {        PEG_METHOD_EXIT();        return false;    }    //    // Read the instance:    //    data.grow(size, '\0');    fs.read((char*)data.getData(), size);    if (!fs)    {        PEG_METHOD_EXIT();        return false;    }    //    // Close the file:    //    fs.close();    PEG_METHOD_EXIT();    return true;}Boolean InstanceDataFile::loadAllInstances(    const String& path,    Buffer& data){    PEG_METHOD_ENTER(TRC_REPOSITORY, "InstanceDataFile::loadAllInstance()");    //    // Get size of the data file:    //    Uint32 fileSize;    if (!FileSystem::getFileSizeNoCase(path, fileSize))    {        PEG_METHOD_EXIT();        return false;    }    //    // Open the file:    //    fstream fs;    if (!_openFile(fs, path, ios::in PEGASUS_OR_IOS_BINARY))    {        PEG_METHOD_EXIT();        return false;    }    //    // Suck the entire contents of the file into the data array parameter:    //    data.grow(fileSize, '\0');    fs.read((char*)data.getData(), fileSize);    if (!fs)    {        PEG_METHOD_EXIT();        return false;    }    //    // Close the file:    //    fs.close();    PEG_METHOD_EXIT();    return true;}Boolean InstanceDataFile::appendInstance(    const String& path,    const Buffer& data,    Uint32& index){    PEG_METHOD_ENTER(TRC_REPOSITORY, "InstanceDataFile::appendInstance()");    //    // Get size of the data file:    //    if (!FileSystem::getFileSizeNoCase(path, index))        index = 0;    //    // Open the file for append:    //    fstream fs;    if (!_openFile(fs, path, ios::app | ios::out PEGASUS_OR_IOS_BINARY))    {        PEG_METHOD_EXIT();        return false;    }    //    // Save index to data:    //    // index = fs.tellp();    //    // Write the instance:    //    fs.write((char*)data.getData(), data.size());    if (!fs)    {        PEG_METHOD_EXIT();        return false;    }    //    // Close the file:    //    fs.close();    PEG_METHOD_EXIT();    return true;}Boolean InstanceDataFile::beginTransaction(const String& path){    PEG_METHOD_ENTER(TRC_REPOSITORY, "InstanceDataFile::beginTransaction()");    Uint32 fileSize;    //    // If the file does not exist, then set the file size to zero:    //    if (!FileSystem::existsNoCase(path))    {        fileSize = 0;    }    else    {        if (!FileSystem::getFileSizeNoCase(path, fileSize))        {            PEG_METHOD_EXIT();            return false;        }    }    //    // Open the rollback file:    //    // ATTN-SF-P3-20020517: FUTURE: Need to look in to this. Empty rollback    // files are getting created in some error conditions.    fstream fs;    if (!_openFile(fs, path + ".rollback", ios::out PEGASUS_OR_IOS_BINARY))    {        PEG_METHOD_EXIT();        return false;    }    //    // Save the size of the data file in the rollback file.    //    char buffer[9];    sprintf(buffer, "%08x", fileSize);    fs.write(buffer, static_cast<streamsize>(strlen(buffer)));    if (!fs)    {        PEG_METHOD_EXIT();        return false;    }    //    // Close the file.    //    fs.close();    PEG_METHOD_EXIT();    return true;}Boolean InstanceDataFile::rollbackTransaction(const String& path){    PEG_METHOD_ENTER(TRC_REPOSITORY, "InstanceDataFile::rollbackTransaction()");    //    // If rollback file does not exist, then everything is fine, just    // return.    //    if (!FileSystem::existsNoCase(path + ".rollback"))    {        PEG_METHOD_EXIT();        return true;    }    //    // Open the rollback file:    //    fstream rollbackFs;    if (!_openFile(            rollbackFs, path + ".rollback", ios::in PEGASUS_OR_IOS_BINARY))    {        PEG_METHOD_EXIT();        return false;    }    //    // Retrieve the file size from the rollback file:    //    char buffer[9];    rollbackFs.read(buffer, 8);    if (!rollbackFs)    {        PEG_METHOD_EXIT();        return false;    }    buffer[8] = '\0';    char* end = 0;    long fileSize = strtol(buffer, &end, 16);    if (!end || *end != '\0' || fileSize < 0)    {        PEG_METHOD_EXIT();        return false;    }    rollbackFs.close();    //    // If the instance data file does not yet exist, create it    //    if (fileSize == 0)    {        fstream ofs;        if (!_openFile(ofs, path, ios::out PEGASUS_OR_IOS_BINARY))        {            PEG_METHOD_EXIT();            return false;        }        ofs.close();    }    //    // Truncate the data file to its initial size    //    if (!System::truncateFile(path.getCString(), fileSize))    {        PEG_METHOD_EXIT();        return false;    }    //    // Now get rid of rollback file!    //    PEG_METHOD_EXIT();    return FileSystem::removeFileNoCase(path + ".rollback");}Boolean InstanceDataFile::commitTransaction(const String& path){    PEG_METHOD_ENTER(TRC_REPOSITORY, "InstanceDataFile::commitTransaction()");    //    // To commit the transaction, we simply remove the rollback file:    //    PEG_METHOD_EXIT();    return FileSystem::removeFileNoCase(path + ".rollback");}Boolean InstanceDataFile::compact(    const String& path,    const Array<Uint32>& freeFlags,    const Array<Uint32>& indices,    const Array<Uint32>& sizes){    PEG_METHOD_ENTER(TRC_REPOSITORY, "InstanceDataFile::compact()");    //    // Open the input file (the data file):    //    fstream fs;    if (!_openFile(fs, path, ios::in PEGASUS_OR_IOS_BINARY))    {        PEG_METHOD_EXIT();        return false;    }    //    // Open the output file (temporary data file):    //    fstream tmpFs;    if (!_openFile(tmpFs, path + ".tmp", ios::out PEGASUS_OR_IOS_BINARY))    {        PEG_METHOD_EXIT();        return false;    }    Buffer data;    //    // Copy over instances which have not been freed:    //    for (Uint32 i = 0, n = freeFlags.size(); i < n; i++)    {        //        // If this entry is not free, then copy it over to the        // temporary file. Otherwise, pay retail for it.        //        if (!freeFlags[i])        {            //            // Read the next instance:            //            if (!fs.seekg(indices[i]))            {                PEG_METHOD_EXIT();                return false;            }            data.grow(sizes[i], '\0');            fs.read((char*)data.getData(), sizes[i]);            if (!fs)            {                PEG_METHOD_EXIT();                return false;            }            //            //  Write out the next instance:            //            tmpFs.write((char*)data.getData(), sizes[i]);        }    }    //    // Close the files:    //    fs.close();    tmpFs.close();    //    // Copy the new file over the old one:    //    if (!FileSystem::removeFileNoCase(path))    {        PEG_METHOD_EXIT();        return false;    }    if (!FileSystem::renameFileNoCase(path + ".tmp", path))    {        PEG_METHOD_EXIT();        return false;    }    PEG_METHOD_EXIT();    return true;}PEGASUS_NAMESPACE_END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -