secureswitools/swisistools/source/dbmanager/dblayer.cpp
changeset 0 ba25891c3a9e
child 25 98b66e4fb0be
child 65 7333d7932ef7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/dbmanager/dblayer.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,465 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+#include "dblayer.h"
+#include "exception.h"
+#include "logs.h"
+#include "util.h"
+#include "symbiantypes.h"
+
+#include <string>
+#include <vector>
+#include <algorithm>
+#include <sstream>
+#include <ctime>
+#include <iostream>
+
+#include <memory>
+#include "toolsconf.h"
+
+typedef std::vector<std::string>::iterator StringIterator;
+typedef std::vector<std::string>::const_iterator ConstStringIterator;
+typedef std::vector<std::wstring>::const_iterator ConstWstringIterator;
+typedef std::vector<XmlDetails::TScrEnvironmentDetails>::const_iterator ScrEnvIterator;
+typedef std::vector<XmlDetails::TScrEnvironmentDetails::TLocalizedSoftwareTypeName>::const_iterator ScrEnvLocSwTypeNameIterator;
+typedef std::vector<XmlDetails::TScrPreProvisionDetail::TComponent>::const_iterator CompIterator;
+typedef std::vector<XmlDetails::TScrPreProvisionDetail::TComponentLocalizable>::const_iterator CompLocIterator;
+typedef std::vector<XmlDetails::TScrPreProvisionDetail::TComponentProperty>::const_iterator CompPropIterator;
+typedef std::vector<XmlDetails::TScrPreProvisionDetail::TComponentFile>::const_iterator CompFileIter;
+typedef std::vector<XmlDetails::TScrPreProvisionDetail::TComponentFile::TFileProperty>::const_iterator FilePropIterator;
+
+const int KMaxDrives=26;
+
+CDbLayer::CDbLayer(const std::string& aDllPath, const std::string& aSqlDbName)
+	{
+	iScrDbHandler = new CDbProcessor(aDllPath, aSqlDbName);
+	}
+
+CDbLayer::~CDbLayer()
+	{
+	delete iScrDbHandler;
+	}
+
+void CDbLayer::CreateScrDatabase(const std::vector<std::string>& aCreateDbQueries)
+	{
+	for (ConstStringIterator schemaIterator=aCreateDbQueries.begin() ; schemaIterator < aCreateDbQueries.end(); ++schemaIterator )
+		{
+		ExecuteStatement(*schemaIterator);
+		}
+	}	
+
+void CDbLayer::PopulateScrDatabase(const std::vector<XmlDetails::TScrEnvironmentDetails>& aScrEnvDetails)
+	{
+	try
+		{
+		std::string beginTransaction("BEGIN;");
+		ExecuteStatement(beginTransaction);
+		PopulateDatabase(aScrEnvDetails);
+		std::string commitTransaction("COMMIT;");
+		ExecuteStatement(commitTransaction);
+		}
+		catch(CException& /*aException*/)
+			{
+			std::string rollbackTransaction("ROLLBACK;");
+			ExecuteStatement(rollbackTransaction);
+			std::string errMsg = "Failed to populate SCR database with environment details.";
+			LOGERROR(errMsg);
+			throw CException(errMsg,ExceptionCodes::ESqlCorrupt);
+			}
+	}
+
+void CDbLayer::PopulatePreProvisionDetails(const XmlDetails::TScrPreProvisionDetail& aPreProvisionDetailList)
+	{
+	try
+		{
+		AddPreProvisionDetails(aPreProvisionDetailList);
+		}
+		catch(CException& aException)
+			{
+			std::string rollbackTransaction("ROLLBACK;");
+			ExecuteStatement(rollbackTransaction);
+			std::string errMsg = "Failed to populate SCR database with environment details.";
+			LOGERROR(aException.GetMessageA());
+			throw CException(errMsg,ExceptionCodes::ESqlCorrupt);
+			}
+	}
+
+void ExecuteSwTypeNameStatement(const std::auto_ptr<CStatement>& aStatement, unsigned long aSwTypeId, TInt aLocale, const std::wstring& aSwTypeName)
+	{
+	aStatement->BindInt(1, aSwTypeId);
+	aStatement->BindInt(2, aLocale);
+	aStatement->BindStr(3, aSwTypeName);
+	aStatement->ExecuteStatement();
+	aStatement->Reset();
+	}
+
+void CDbLayer::PopulateDatabase(const std::vector<XmlDetails::TScrEnvironmentDetails>& aScrEnvDetails)
+	{
+	std::string insertSoftwareType("INSERT INTO SoftwareTypes(SoftwareTypeId,SifPluginUid,InstallerSecureId,ExecutionLayerSecureId) VALUES(?,?,?,?);");
+	std::auto_ptr<CStatement> stmtSwType(iScrDbHandler->PrepareStatement(insertSoftwareType));
+	
+	std::string insertSwTypeName("INSERT INTO SoftwareTypeNames(SoftwareTypeId,Locale,Name) VALUES(?,?,?);");
+	std::auto_ptr<CStatement> stmtSwTypeName(iScrDbHandler->PrepareStatement(insertSwTypeName));
+		
+	std::string insertMimeType("INSERT INTO MimeTypes(SoftwareTypeId,MimeType) VALUES(?,?);");
+	std::auto_ptr<CStatement> stmtMimeType(iScrDbHandler->PrepareStatement(insertMimeType));
+
+	for(ScrEnvIterator aScrEnvIterator = aScrEnvDetails.begin(); aScrEnvIterator != aScrEnvDetails.end(); ++aScrEnvIterator)
+		{
+		unsigned int swTypeId = Util::Crc32(aScrEnvIterator->iUniqueSoftwareTypeName.c_str(),aScrEnvIterator->iUniqueSoftwareTypeName.length()*2);
+		stmtSwType->BindInt(1, swTypeId);
+		stmtSwType->BindInt(2, aScrEnvIterator->iSifPluginUid);
+		stmtSwType->BindInt(3, aScrEnvIterator->iInstallerSid);
+		stmtSwType->BindInt(4, aScrEnvIterator->iExecutionLayerSid);
+		stmtSwType->ExecuteStatement();
+		stmtSwType->Reset();
+		// First insert unique sw type name
+		const TInt uniqueSwTypeNameLocale = 0;
+		ExecuteSwTypeNameStatement(stmtSwTypeName, swTypeId, uniqueSwTypeNameLocale, aScrEnvIterator->iUniqueSoftwareTypeName);
+		// Then, insert localized sw type names.
+		for(ScrEnvLocSwTypeNameIterator swTypeNameIter = aScrEnvIterator->iLocalizedSoftwareTypeNames.begin(); swTypeNameIter != aScrEnvIterator->iLocalizedSoftwareTypeNames.end(); ++swTypeNameIter)
+			{
+			ExecuteSwTypeNameStatement(stmtSwTypeName, swTypeId, swTypeNameIter->iLocale, swTypeNameIter->iName);
+			}
+		for(ConstWstringIterator mimeIter= aScrEnvIterator->iMIMEDetails.begin(); mimeIter != aScrEnvIterator->iMIMEDetails.end(); ++mimeIter)
+			{
+			stmtMimeType->BindInt(1, swTypeId);
+			stmtMimeType->BindStr(2, *mimeIter);
+			stmtMimeType->ExecuteStatement();
+			stmtMimeType->Reset();
+			}
+		}
+
+	}
+
+void CDbLayer::AddPreProvisionDetails(const XmlDetails::TScrPreProvisionDetail& aPreProvisionDetailList)
+	{
+	for(CompIterator aCompIterator = aPreProvisionDetailList.iComponents.begin(); aCompIterator != aPreProvisionDetailList.iComponents.end(); ++aCompIterator)
+		{	
+		std::string beginTransaction("BEGIN;");
+		ExecuteStatement(beginTransaction);
+		
+		AddComponentDetails(*aCompIterator, aPreProvisionDetailList.iSoftwareTypeName);
+		int componentId = iScrDbHandler->LastInsertedId();
+		AddComponentLocalizables(componentId,aCompIterator->iComponentLocalizables);
+		AddComponentProperties(componentId,aCompIterator->iComponentProperties);
+		AddComponentFiles(componentId,aCompIterator->iComponentFiles);
+		AddComponentDependencies(componentId, aCompIterator->iComponentDependency, aPreProvisionDetailList.iSoftwareTypeName);
+
+		std::string commitTransaction("COMMIT;");
+		ExecuteStatement(commitTransaction);
+
+		}
+	}
+
+void CDbLayer::AddComponentDetails(const XmlDetails::TScrPreProvisionDetail::TComponent& aComponent, const std::wstring& aSoftwareTypeName)
+	{
+	std::string insertComponents;
+	XmlDetails::TScrPreProvisionDetail::TComponentDetails 
+		componentDetail = aComponent.iComponentDetails;
+
+	unsigned int swTypeId = Util::Crc32(aSoftwareTypeName.c_str(),aSoftwareTypeName.length()*2);
+	std::wstring strGlobalId = componentDetail.iGlobalId;
+	
+	if(!strGlobalId.empty())
+		{
+		insertComponents = "INSERT INTO Components(SoftwareTypeId, SoftwareTypeName, Removable, Size, ScomoState, InstalledDrives, OriginVerified, Hidden, GlobalIdHash, GlobalId, Version, InstallTime) VALUES(?,?,?,?,?,?,?,?,?,?,?,?);";
+		}
+	else
+		{
+		insertComponents = "INSERT INTO Components(SoftwareTypeId, SoftwareTypeName, Removable, Size, ScomoState, InstalledDrives, OriginVerified, Hidden, Version, InstallTime) VALUES(?,?,?,?,?,?,?,?,?,?);";
+		}	
+		
+	std::auto_ptr<CStatement> stmtComponents(iScrDbHandler->PrepareStatement(insertComponents));
+
+	
+	stmtComponents->BindInt(1, swTypeId);
+	stmtComponents->BindStr(2, aSoftwareTypeName);
+	stmtComponents->BindInt(3, componentDetail.iIsRemovable);
+	stmtComponents->BindInt64(4, componentDetail.iSize);
+	stmtComponents->BindInt(5, componentDetail.iScomoState);
+	
+	// the installed drives has to be retrieved and calculated from the list of files
+	int installedDrives = GetInstalledDrives(aComponent.iComponentFiles);
+			
+	stmtComponents->BindInt(6, installedDrives);
+	stmtComponents->BindInt(7, componentDetail.iOriginVerified);
+	stmtComponents->BindInt(8, componentDetail.iIsHidden);
+
+	std::wstring version;
+	version =	componentDetail.iVersion.iMajor+L"." \
+				+ componentDetail.iVersion.iMinor+L"." \
+				+ componentDetail.iVersion.iBuild ;
+
+	std::wstring localTime = GetLocalTime();
+	
+	if(!strGlobalId.empty())
+		{
+		std::wstring concatGlobalId = aSoftwareTypeName + L'\0' + strGlobalId;
+		unsigned int globalIdHash = Util::Crc32(concatGlobalId.c_str(),concatGlobalId.length()*2);
+		stmtComponents->BindInt(9, globalIdHash);
+		stmtComponents->BindStr(10, concatGlobalId);
+		stmtComponents->BindStr(11, version);
+		stmtComponents->BindStr(12, localTime);
+		}
+	else
+		{
+		stmtComponents->BindStr(9, version);
+		stmtComponents->BindStr(10, localTime);
+		}
+	
+	stmtComponents->ExecuteStatement();
+	stmtComponents->Reset();
+
+	}
+
+int CDbLayer::GetInstalledDrives(const std::vector<XmlDetails::TScrPreProvisionDetail::TComponentFile>& aComponentFiles )
+	{
+	int installedDrives = 0;
+	for(CompFileIter compFileIter = aComponentFiles.begin(); compFileIter != aComponentFiles.end(); ++compFileIter)
+		{
+		if(compFileIter->iLocation.empty())
+			continue;
+			
+			char drive = static_cast<char>(compFileIter->iLocation[0]);
+			drive = tolower(drive);
+
+			if(drive < 'a' || drive > 'z' )
+				{
+				throw CException("Invalid drive specified in file location.",ExceptionCodes::EInvalidArgument);
+				}
+
+			installedDrives |= 1 << (drive-'a');
+			
+		}
+	return installedDrives;
+	}
+
+const std::wstring CDbLayer::GetLocalTime()
+	{
+	time_t localTime;
+	localTime = time(NULL);
+	tm* ttm = localtime(&localTime);
+	
+	const std::wstring year		= Util::IntegerToWideString(ttm->tm_year + 1900);
+	const std::wstring month	= Util::IntegerToWideString(ttm->tm_mon+1);
+	const std::wstring day		= Util::IntegerToWideString(ttm->tm_mday);
+	const std::wstring hour		= Util::IntegerToWideString(ttm->tm_hour);
+	const std::wstring minute	= Util::IntegerToWideString(ttm->tm_min);
+	const std::wstring second	= Util::IntegerToWideString(ttm->tm_sec);
+
+	wchar_t result[16]={0};
+	result[16] = '0';
+	
+#ifdef GCC_COMPILER
+	swprintf(result,(sizeof(result)/sizeof(wchar_t)),L"%04s%02s%02s:%02s%02s%02s",year.c_str(),month.c_str(),day.c_str(),hour.c_str(),minute.c_str(),second.c_str());
+#else	
+	swprintf(result,L"%04s%02s%02s:%02s%02s%02s",year.c_str(),month.c_str(),day.c_str(),hour.c_str(),minute.c_str(),second.c_str());
+#endif
+	std::wstring wstr(result);
+	return wstr;
+	}
+
+void CDbLayer::AddComponentLocalizables( int aComponentId, const std::vector<XmlDetails::TScrPreProvisionDetail::TComponentLocalizable>& aComponentLocalizable)
+	{
+	std::string insertComponentLocalizable("INSERT INTO ComponentLocalizables(ComponentId,Locale,Name,Vendor) VALUES(?,?,?,?);");
+	std::auto_ptr<CStatement> stmtComponentLocalizable(iScrDbHandler->PrepareStatement(insertComponentLocalizable));
+
+	for(CompLocIterator compLocIter = aComponentLocalizable.begin(); compLocIter != aComponentLocalizable.end() ; ++compLocIter )
+		{
+		stmtComponentLocalizable->BindInt(1, aComponentId);
+		stmtComponentLocalizable->BindInt(2, compLocIter->iLocale);
+		stmtComponentLocalizable->BindStr(3, compLocIter->iName);
+		stmtComponentLocalizable->BindStr(4, compLocIter->iVendor);
+		stmtComponentLocalizable->ExecuteStatement();
+		stmtComponentLocalizable->Reset();
+		}
+	}
+
+void CDbLayer::AddComponentProperties( 
+	int aComponentId, 
+	const std::vector<XmlDetails::TScrPreProvisionDetail::TComponentProperty>& aComponentProperty)
+	{
+	
+	std::string insertComponentProperties;
+	
+	for(CompPropIterator compPropIter = aComponentProperty.begin(); compPropIter != aComponentProperty.end() ; ++compPropIter )
+		{
+		if(compPropIter->iIsIntValue == 1)
+			{
+			insertComponentProperties = "INSERT INTO ComponentProperties(Name,Locale,ComponentId,IntValue,IsStr8Bit) VALUES(?,?,?,?,?);";
+			}
+		else
+			{
+			insertComponentProperties = "INSERT INTO ComponentProperties(Name,Locale,ComponentId,StrValue,IsStr8Bit) VALUES(?,?,?,?,?);";
+			}
+		std::auto_ptr<CStatement> stmtComponentProperty(iScrDbHandler->PrepareStatement(insertComponentProperties));
+
+		stmtComponentProperty->BindStr(1, compPropIter->iName);
+		stmtComponentProperty->BindInt(2, compPropIter->iLocale);
+		stmtComponentProperty->BindInt(3, aComponentId);
+		if(compPropIter->iIsIntValue == 1)
+			{
+			TInt64 intValue = Util::WideCharToInt64(compPropIter->iValue.c_str());
+			stmtComponentProperty->BindInt64(4, intValue);
+			}
+		else
+			{
+			if(compPropIter->iIsStr8Bit)
+				{
+				std::string str = Util::wstring2string(compPropIter->iValue);
+				std::string decodedString = Util::Base64Decode(str);
+				stmtComponentProperty->BindBinary(4, str);
+				}
+			else
+				{
+				stmtComponentProperty->BindStr(4, compPropIter->iValue);
+				}
+			}
+
+		
+		stmtComponentProperty->BindInt(5, compPropIter->iIsStr8Bit);
+	
+		stmtComponentProperty->ExecuteStatement();
+		stmtComponentProperty->Reset();
+		}
+	
+	}
+
+void CDbLayer::AddComponentFiles(int aComponentId, const std::vector<XmlDetails::TScrPreProvisionDetail::TComponentFile>& aComponentFiles)
+	{
+	for(CompFileIter compFile = aComponentFiles.begin() ; compFile != aComponentFiles.end() ; ++compFile)
+		{
+		AddLocation(aComponentId,compFile->iLocation);
+		int cmpFileId = iScrDbHandler->LastInsertedId();
+		AddFileProperties(cmpFileId,compFile->iFileProperties);
+		
+		}
+	}
+
+
+void CDbLayer::AddComponentDependencies	(	int aComponentId, 
+											const XmlDetails::TScrPreProvisionDetail::TComponentDependency& aComponentDependency,
+											const std::wstring& aSoftwareTypeName
+										)
+	{
+	std::wstring dependentId = aComponentDependency.iDependentId;
+
+	if(dependentId.empty())
+		return;
+	
+	std::wstring dependantGlobalId = aSoftwareTypeName + L'\0' + dependentId;
+	
+	const std::vector<XmlDetails::TScrPreProvisionDetail::TComponentDependency::TComponentDependencyDetail> 
+		aComponentDependencyDetails = aComponentDependency.iComponentDependencyList;
+
+	std::vector<XmlDetails::TScrPreProvisionDetail::TComponentDependency::TComponentDependencyDetail>::const_iterator compDepIter;
+
+	for(compDepIter = aComponentDependencyDetails.begin() ; compDepIter != aComponentDependencyDetails.end() ; ++compDepIter)
+		{
+		std::wstring concatGlobalId = dependantGlobalId + compDepIter->iSupplierId;
+				
+		unsigned int globalIdHash = Util::Crc32(concatGlobalId.c_str(),concatGlobalId.length()*2);
+		unsigned int dependantIdHash = Util::Crc32(dependantGlobalId.c_str(),dependantGlobalId.length()*2);
+		unsigned int supplierIdHash = Util::Crc32(compDepIter->iSupplierId.c_str(),compDepIter->iSupplierId.length()*2);
+		
+		std::string insertComponentDeps("INSERT INTO ComponentDependencies(GlobalIdHash,DependantGlobalIdHash, SupplierGlobalIdHash, DependantGlobalId,SupplierGlobalId,VersionFrom,VersionTo) VALUES(?,?,?,?,?,?,?);");
+		std::auto_ptr<CStatement> stmtComponentDeps(iScrDbHandler->PrepareStatement(insertComponentDeps));
+		
+		stmtComponentDeps->BindInt( 1 ,globalIdHash);
+		stmtComponentDeps->BindInt( 2 ,dependantIdHash);
+		stmtComponentDeps->BindInt( 3 ,supplierIdHash);
+		stmtComponentDeps->BindStr( 4 ,dependentId);
+		stmtComponentDeps->BindStr( 5 ,compDepIter->iSupplierId);
+		stmtComponentDeps->BindStr( 6 ,compDepIter->iFromVersion);
+		stmtComponentDeps->BindStr( 7 ,compDepIter->iToVersion);
+		
+		stmtComponentDeps->ExecuteStatement();
+		stmtComponentDeps->Reset();
+	
+		}	
+	}
+
+
+void CDbLayer::AddLocation(int aComponentId,  const std::wstring& aLocation)
+	{
+	std::string insertComponentFileDetails("INSERT INTO ComponentsFiles(ComponentId,LocationHash,Location) VALUES(?,?,?);");
+	std::auto_ptr<CStatement> stmtComponentFileDetails(iScrDbHandler->PrepareStatement(insertComponentFileDetails));
+	
+	stmtComponentFileDetails->BindInt(1,aComponentId);
+	
+	// size does not return the actual binary size of the object
+	int length = aLocation.length()*2 ;
+	// generate hash for location
+	std::wstring location = aLocation;
+	std::transform(	location.begin(), location.end(), location.begin(), tolower);
+
+	unsigned int hash = Util::Crc32(location.c_str(),length);
+	
+	stmtComponentFileDetails->BindInt(2,hash);
+	stmtComponentFileDetails->BindStr(3,aLocation);
+	stmtComponentFileDetails->ExecuteStatement();
+	stmtComponentFileDetails->Reset();
+		
+	}
+
+void CDbLayer::AddFileProperties(int aCmpFileId, const std::vector<XmlDetails::TScrPreProvisionDetail::TComponentFile::TFileProperty>& aFileProperty)
+	{
+	std::string insertFileProperties;
+	
+	for(FilePropIterator filePropIter = aFileProperty.begin(); filePropIter != aFileProperty.end() ; ++filePropIter )
+		{
+		if(filePropIter->iIsIntValue == 1)
+			{
+			insertFileProperties = "INSERT INTO FileProperties(Name,CmpFileId,IntValue) VALUES(?,?,?);";
+			}
+		else
+			{
+			insertFileProperties = "INSERT INTO FileProperties(Name,CmpFileId,StrValue,IsStr8Bit) VALUES(?,?,?,?);";
+			}
+		std::auto_ptr<CStatement> stmtFileProperty(iScrDbHandler->PrepareStatement(insertFileProperties));
+
+		stmtFileProperty->BindStr(1, filePropIter->iName);
+		stmtFileProperty->BindInt(2, aCmpFileId);
+		
+		// we know by default the locale is 0 for file properties 
+		// hence for setting the IsStr8Bit all we need to check is whether
+		// IntValue is present or not
+		if(filePropIter->iIsIntValue)
+			{
+			int intValue = Util::WideCharToInteger(filePropIter->iValue.c_str());
+			stmtFileProperty->BindInt(3, intValue);
+			}
+		else
+			{
+			std::string str = Util::wstring2string(filePropIter->iValue);
+			std::string decodedString = Util::Base64Decode(str);
+			stmtFileProperty->BindBinary(3, str);
+			stmtFileProperty->BindInt(4, 1);
+			}
+
+		stmtFileProperty->ExecuteStatement();
+		stmtFileProperty->Reset();
+		}
+	}
+
+void CDbLayer::ExecuteStatement(const std::string& aStmtStr)
+	{
+	std::auto_ptr<CStatement> stmt(iScrDbHandler->PrepareStatement(aStmtStr));
+	stmt->ExecuteStatement();
+	}