persistentstorage/sql/OsLayer/os_symbian.cpp
changeset 28 7a522c0700d3
parent 17 55f2396f6d25
child 29 cce6680bbf1c
equal deleted inserted replaced
19:d6ef85bc5971 28:7a522c0700d3
    81 	EPanicInvalidSectorSize		=18,
    81 	EPanicInvalidSectorSize		=18,
    82 	EPanicInternalError			=19,
    82 	EPanicInternalError			=19,
    83 	EPanicNullDbFilePtr			=20,
    83 	EPanicNullDbFilePtr			=20,
    84 	EPanicFastCounterFreq		=21
    84 	EPanicFastCounterFreq		=21
    85 	};
    85 	};
       
    86 
       
    87 //Bit-mask constant. If xOpen()'s "aFlag" parameter contains one of these bits set, then the the file top be
       
    88 //opened or created is a journal file.
       
    89 const TUint KJournalFileTypeBitMask = SQLITE_OPEN_MAIN_JOURNAL | SQLITE_OPEN_TEMP_JOURNAL | SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_MASTER_JOURNAL; 
    86 
    90 
    87 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    91 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    88 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    92 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    89 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    93 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    90 #ifdef _SQLPROFILER
    94 #ifdef _SQLPROFILER
   354 	//the function was used on the main database file
   358 	//the function was used on the main database file
   355 	TOsCallProfile TheOsCallMProfile[EOsOpLast] = 
   359 	TOsCallProfile TheOsCallMProfile[EOsOpLast] = 
   356 		{
   360 		{
   357 		TOsCallProfile('M', "CL"), TOsCallProfile('M', "RD"), TOsCallProfile('M', "WR"), TOsCallProfile('M', "TR"),
   361 		TOsCallProfile('M', "CL"), TOsCallProfile('M', "RD"), TOsCallProfile('M', "WR"), TOsCallProfile('M', "TR"),
   358 		TOsCallProfile('M', "SY"), TOsCallProfile('M', "FS"), TOsCallProfile('M', "LK"), TOsCallProfile('M', "UL"),
   362 		TOsCallProfile('M', "SY"), TOsCallProfile('M', "FS"), TOsCallProfile('M', "LK"), TOsCallProfile('M', "UL"),
   359 		TOsCallProfile('M', "CL"), TOsCallProfile('M', "FC"), TOsCallProfile('M', "SS"), TOsCallProfile('M', "DC"),
   363 		TOsCallProfile('M', "RL"), TOsCallProfile('M', "FC"), TOsCallProfile('M', "SS"), TOsCallProfile('M', "DC"),
   360 		TOsCallProfile('M', "OP"), TOsCallProfile('M', "DE"), TOsCallProfile('M', "AC"), TOsCallProfile('M', "FN"),
   364 		TOsCallProfile('M', "OP"), TOsCallProfile('M', "DE"), TOsCallProfile('M', "AC"), TOsCallProfile('M', "FN"),
   361 		TOsCallProfile('M', "RN"), TOsCallProfile('M', "SL"), TOsCallProfile('M', "CT"), TOsCallProfile('M', "LE")
   365 		TOsCallProfile('M', "RN"), TOsCallProfile('M', "SL"), TOsCallProfile('M', "CT"), TOsCallProfile('M', "LE")
   362 		};
   366 		};
   363 
   367 
   364 	//An array of TOsCallProfile entries, each entry keeps the profile of a specifc OS porting layer function, when
   368 	//An array of TOsCallProfile entries, each entry keeps the profile of a specifc OS porting layer function, when
   365 	//the function was used on the journal file
   369 	//the function was used on the journal file
   366 	TOsCallProfile TheOsCallJProfile[EOsOpLast] = 
   370 	TOsCallProfile TheOsCallJProfile[EOsOpLast] = 
   367 		{
   371 		{
   368 		TOsCallProfile('J', "CL"), TOsCallProfile('J', "RD"), TOsCallProfile('J', "WR"), TOsCallProfile('J', "TR"),
   372 		TOsCallProfile('J', "CL"), TOsCallProfile('J', "RD"), TOsCallProfile('J', "WR"), TOsCallProfile('J', "TR"),
   369 		TOsCallProfile('J', "SY"), TOsCallProfile('J', "FS"), TOsCallProfile('J', "LK"), TOsCallProfile('J', "UL"),
   373 		TOsCallProfile('J', "SY"), TOsCallProfile('J', "FS"), TOsCallProfile('J', "LK"), TOsCallProfile('J', "UL"),
   370 		TOsCallProfile('J', "CL"), TOsCallProfile('J', "FC"), TOsCallProfile('J', "SS"), TOsCallProfile('J', "DC"),
   374 		TOsCallProfile('J', "RL"), TOsCallProfile('J', "FC"), TOsCallProfile('J', "SS"), TOsCallProfile('J', "DC"),
   371 		TOsCallProfile('J', "OP"), TOsCallProfile('J', "DE"), TOsCallProfile('J', "AC"), TOsCallProfile('J', "FN"),
   375 		TOsCallProfile('J', "OP"), TOsCallProfile('J', "DE"), TOsCallProfile('J', "AC"), TOsCallProfile('J', "FN"),
   372 		TOsCallProfile('J', "RN"), TOsCallProfile('J', "SL"), TOsCallProfile('J', "CT"), TOsCallProfile('J', "LE")
   376 		TOsCallProfile('J', "RN"), TOsCallProfile('J', "SL"), TOsCallProfile('J', "CT"), TOsCallProfile('J', "LE")
   373 		};
   377 		};
   374 	
   378 	
   375 	//The main class for the OS porting layer call profiles.
   379 	//The main class for the OS porting layer call profiles.
   378 	public:
   382 	public:
   379 		//aOsCallTicksEntryRef - a reference to the related TheOsCallTicks[] entry;
   383 		//aOsCallTicksEntryRef - a reference to the related TheOsCallTicks[] entry;
   380 		//aProfileRef          - a reference to the related TOsCallProfile object - TheOsCallMProfile[] or TheOsCallJProfile[] entry;
   384 		//aProfileRef          - a reference to the related TOsCallProfile object - TheOsCallMProfile[] or TheOsCallJProfile[] entry;
   381 		//aOffset              - file offset in bytes;
   385 		//aOffset              - file offset in bytes;
   382 		//aBytes               - amount of bytes to be read/written;
   386 		//aBytes               - amount of bytes to be read/written;
   383 		TOsCallCounter(TInt64& aOsCallTicksEntryRef, TOsCallProfile& aOsCallProfileRef, TInt64 aOffset, TInt aBytes) :
   387 		//aOptional			   - might be NULL. Used to print out the name of the file being processed.
       
   388 		TOsCallCounter(TInt64& aOsCallTicksEntryRef, TOsCallProfile& aOsCallProfileRef, TInt64 aOffset, TInt aBytes, 
       
   389 				       const sqlite3_file* aHandle, const char* aOptional) :
   384 			iOsCallTicksEntryRef(aOsCallTicksEntryRef),
   390 			iOsCallTicksEntryRef(aOsCallTicksEntryRef),
   385 			iOsCallProfileRef(aOsCallProfileRef),
   391 			iOsCallProfileRef(aOsCallProfileRef),
   386 			iOffset(aOffset),
   392 			iOffset(aOffset),
   387 			iBytes(aBytes)	
   393 			iBytes(aBytes),
       
   394 			iHandle((TUint)aHandle),
       
   395 			iOptional((const TUint8*)aOptional)
   388 			{
   396 			{
   389 			if(TheOsCallTimeProfileEnabled)
   397 			if(TheOsCallTimeProfileEnabled)
   390 				{
   398 				{
   391 				iStartTicks = User::FastCounter();
   399 				iStartTicks = User::FastCounter();
   392 				}
   400 				}
   405 					{
   413 					{
   406 					++TheOpCounter;
   414 					++TheOpCounter;
   407 					++iOsCallProfileRef.iCallCounter;
   415 					++iOsCallProfileRef.iCallCounter;
   408 					iOsCallProfileRef.iTicksTotal += diffTicks;
   416 					iOsCallProfileRef.iTicksTotal += diffTicks;
   409 					iOsCallProfileRef.iBytesTotal += iBytes;
   417 					iOsCallProfileRef.iBytesTotal += iBytes;
   410 					//                 1    2 3   4  5  6   7   8   9   10
   418 					TFileName fname;
   411 					RDebug::Print(_L("'%c','%c%c',%d,%d,%ld,%d,%ld,%ld,%ld\n"), 
   419 					if(iOptional)
   412 						iOsCallProfileRef.iType, 			//1
   420 						{
   413 						iOsCallProfileRef.iIdentifier[0], 	//2
   421 						TPtrC8 fn8(iOptional);
   414 						iOsCallProfileRef.iIdentifier[1],	//3
   422 						fname.Copy(fn8);
   415 						TheOpCounter, 						//4
   423 						}
   416 						iOsCallProfileRef.iCallCounter, 	//5
   424 					//                                           0    1  2 3  4  5  6   7  8   9   10 11
   417 						iOffset, 							//6
   425 					RDebug::Print(_L("[SQL-OS]¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬\"%X\"¬%c¬%c%c¬%d¬%d¬%ld¬%d¬%ld¬%ld¬%ld¬%S\n"),
   418 						iBytes, 							//7
   426 															//[SQL-OS]
   419 						diffTicks, 							//8
   427 															//Handle
   420 						iOsCallProfileRef.iBytesTotal, 		//9
   428 															//Time from start, microseconds
   421 						iOsCallProfileRef.iTicksTotal);		//10
   429 															//Subtype
       
   430 															//IPC sequence counter
       
   431 															//IPC call name
       
   432 					    iHandle,							//sqlite3_file*
       
   433 						iOsCallProfileRef.iType, 			//1 - main or journal file
       
   434 						iOsCallProfileRef.iIdentifier[0], 	//2 - 1st letter - operation type
       
   435 						iOsCallProfileRef.iIdentifier[1],	//3 - 2nd letter - operation type
       
   436 						TheOpCounter, 						//4 - Operation counter
       
   437 						iOsCallProfileRef.iCallCounter, 	//5 - This call type counter
       
   438 						iOffset, 							//6 - File offset
       
   439 						iBytes, 							//7 - Data, bytes
       
   440 						diffTicks, 							//8 - Ticks
       
   441 						iOsCallProfileRef.iBytesTotal, 		//9 - Data total, bytes
       
   442 						iOsCallProfileRef.iTicksTotal,		//10- Ticks total
       
   443 						&fname);							//11- File name
   422 					}
   444 					}
   423 				}
   445 				}
   424 			}
   446 			}
   425 	private:
   447 	private:
   426 		TInt64&			iOsCallTicksEntryRef;
   448 		TInt64&			iOsCallTicksEntryRef;
   427 		TOsCallProfile&	iOsCallProfileRef;
   449 		TOsCallProfile&	iOsCallProfileRef;
   428 		TInt64			iOffset;
   450 		TInt64			iOffset;
   429 		TInt			iBytes;			
   451 		TInt			iBytes;			
   430 		TUint32 		iStartTicks;
   452 		TUint32 		iStartTicks;
       
   453 		TUint			iHandle;
       
   454 		const TUint8*	iOptional;
   431 		};
   455 		};
   432 		
   456 		
   433 	inline TOsCallProfile& OsCallProfile(TBool aType, TInt aIndex)
   457 	inline TOsCallProfile& OsCallProfile(TBool aType, TInt aIndex)
   434 		{
   458 		{
   435 		return aType ? TheOsCallJProfile[aIndex] : TheOsCallMProfile[aIndex];
   459 		return aType ? TheOsCallJProfile[aIndex] : TheOsCallMProfile[aIndex];
   436 		}
   460 		}
   437 		
   461 		
   438 #	define __OSTIME_COUNTER(aOsCallTicksRef, aOsCallProfileRef, aOffset, aBytes)	TOsCallCounter osCallCounter(aOsCallTicksRef, aOsCallProfileRef, aOffset, aBytes)
   462 #	define __OSTIME_COUNTER(aOsCallTicksRef, aOsCallProfileRef, aOffset, aBytes, aHandle, aOpt)	TOsCallCounter osCallCounter(aOsCallTicksRef, aOsCallProfileRef, aOffset, aBytes, aHandle, aOpt)
   439 
   463 
   440 #else //_SQLPROFILER
   464 #else //_SQLPROFILER
   441 
   465 
   442 #   define __COUNTER_INCR(counter) void(0)
   466 #   define __COUNTER_INCR(counter) void(0)
   443 	
   467 	
   445 
   469 
   446 #	define __MEM_CALL(aMemOpType, a1, a2) void(0)
   470 #	define __MEM_CALL(aMemOpType, a1, a2) void(0)
   447 
   471 
   448 #	define __OS_CALL(aOpType, a1, a2) void(0)
   472 #	define __OS_CALL(aOpType, a1, a2) void(0)
   449 
   473 
   450 #	define __OSTIME_COUNTER(aOsCallTicksRef, aOsCallProfileRef, aOffset, aBytes)	void(0)
   474 #	define __OSTIME_COUNTER(aOsCallTicksRef, aOsCallProfileRef, aOffset, aBytes, aHandle, aOpt)	void(0)
   451 
   475 
   452 #endif//_SQLPROFILER
   476 #endif//_SQLPROFILER
   453 
   477 
   454 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   478 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   455 /////////////////////       Profiling                          ////////////////////////////////////////////////////////////////
   479 /////////////////////       Profiling                          ////////////////////////////////////////////////////////////////
  1216 	{
  1240 	{
  1217 	if(aFileName)
  1241 	if(aFileName)
  1218 		{
  1242 		{
  1219 		wchar_t* dest = reinterpret_cast <wchar_t*> (const_cast <TUint16*> (aFileNameDestBuf.Ptr()));
  1243 		wchar_t* dest = reinterpret_cast <wchar_t*> (const_cast <TUint16*> (aFileNameDestBuf.Ptr()));
  1220 		TInt len = mbstowcs(dest, aFileName, aFileNameDestBuf.MaxLength());
  1244 		TInt len = mbstowcs(dest, aFileName, aFileNameDestBuf.MaxLength());
       
  1245 		__ASSERT_DEBUG(len >= 0, User::Panic(KPanicCategory, EPanicInternalError));
  1221 		//If len == aFileNameDestBuf.MaxLength(), then the output buffer is too small.
  1246 		//If len == aFileNameDestBuf.MaxLength(), then the output buffer is too small.
  1222 		if(len > 0 && len < aFileNameDestBuf.MaxLength())
  1247 		if(len < aFileNameDestBuf.MaxLength())
  1223 			{
  1248 			{
  1224 			aFileNameDestBuf.SetLength(len);
  1249 			aFileNameDestBuf.SetLength(len);
  1225 			return ETrue;
  1250 			return ETrue;
  1226 			}
  1251 			}
  1227 		}
  1252 		}
  1244 static TBool ConvertFromUnicode(const TDesC& aFileName, TDes8& aFileNameDestBuf)
  1269 static TBool ConvertFromUnicode(const TDesC& aFileName, TDes8& aFileNameDestBuf)
  1245 	{
  1270 	{
  1246 	char* dest = reinterpret_cast <char*> (const_cast <TUint8*> (aFileNameDestBuf.Ptr()));
  1271 	char* dest = reinterpret_cast <char*> (const_cast <TUint8*> (aFileNameDestBuf.Ptr()));
  1247 	const wchar_t* src = reinterpret_cast <const wchar_t*> (aFileName.Ptr());
  1272 	const wchar_t* src = reinterpret_cast <const wchar_t*> (aFileName.Ptr());
  1248 	TInt len = wcstombs(dest, src, aFileNameDestBuf.MaxLength());
  1273 	TInt len = wcstombs(dest, src, aFileNameDestBuf.MaxLength());
       
  1274 	__ASSERT_DEBUG(len >= 0, User::Panic(KPanicCategory, EPanicInternalError));
  1249 	//If len == aFileNameDestBuf.MaxLength(), then the output buffer is too small.
  1275 	//If len == aFileNameDestBuf.MaxLength(), then the output buffer is too small.
  1250 	if(len > 0 && len < aFileNameDestBuf.MaxLength())
  1276 	if(len < aFileNameDestBuf.MaxLength())
  1251 		{
  1277 		{
  1252 		aFileNameDestBuf.SetLength(len);
  1278 		aFileNameDestBuf.SetLength(len);
  1253 		return ETrue;
  1279 		return ETrue;
  1254 		}
  1280 		}
  1255 	return EFalse;
  1281 	return EFalse;
  1475 /* static */ int TFileIo::Close(sqlite3_file* aDbFile)
  1501 /* static */ int TFileIo::Close(sqlite3_file* aDbFile)
  1476 	{
  1502 	{
  1477 	SQLUTRACE_PROFILER(aDbFile);
  1503 	SQLUTRACE_PROFILER(aDbFile);
  1478 	TDbFile& dbFile = ::DbFile(aDbFile);
  1504 	TDbFile& dbFile = ::DbFile(aDbFile);
  1479 	__OS_CALL(EOsFileClose, 0, 0);
  1505 	__OS_CALL(EOsFileClose, 0, 0);
  1480 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileClose], ::OsCallProfile(dbFile.iIsJournal, EOsFileClose), 0, 0);
  1506 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileClose], ::OsCallProfile(dbFile.iIsJournal, EOsFileClose), 0, 0, aDbFile, 0);
  1481 	__FS_CALL(EFsOpFileClose, 0);
  1507 	__FS_CALL(EFsOpFileClose, 0);
  1482 	dbFile.iFileBuf.Close();
  1508 	dbFile.iFileBuf.Close();
  1483 	if(dbFile.iFullName)
  1509 	if(dbFile.iFullName)
  1484 		{//"iFullName" will not be NULL only when TVfs::Open() is called with SQLITE_OPEN_DELETEONCLOSE flag.
  1510 		{//"iFullName" will not be NULL only when TVfs::Open() is called with SQLITE_OPEN_DELETEONCLOSE flag.
  1485 		 //That means - SQlite expects the file to be deleted after the file close operation. 
  1511 		 //That means - SQlite expects the file to be deleted after the file close operation. 
  1517 	SQLUTRACE_PROFILER(aDbFile);
  1543 	SQLUTRACE_PROFILER(aDbFile);
  1518 	SYMBIAN_TRACE_SQL_EVENTS_ONLY(UTF::Printf(UTF::TTraceContext(UTF::EInternals), KFileRead, aAmt, aOffset));
  1544 	SYMBIAN_TRACE_SQL_EVENTS_ONLY(UTF::Printf(UTF::TTraceContext(UTF::EInternals), KFileRead, aAmt, aOffset));
  1519 	TDbFile& dbFile = ::DbFile(aDbFile);
  1545 	TDbFile& dbFile = ::DbFile(aDbFile);
  1520 	__OS_CALL(EOsFileRead, 0, 0);
  1546 	__OS_CALL(EOsFileRead, 0, 0);
  1521 	__COUNTER_INCR(TheSqlSrvProfilerFileRead);
  1547 	__COUNTER_INCR(TheSqlSrvProfilerFileRead);
  1522 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileRead], ::OsCallProfile(dbFile.iIsJournal, EOsFileRead), aOffset, aAmt);
  1548 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileRead], ::OsCallProfile(dbFile.iIsJournal, EOsFileRead), aOffset, aAmt, aDbFile, 0);
  1523 	TPtr8 ptr((TUint8*)aBuf, 0, aAmt);
  1549 	TPtr8 ptr((TUint8*)aBuf, 0, aAmt);
  1524 	TInt err = dbFile.iFileBuf.Read(aOffset, ptr);
  1550 	TInt err = dbFile.iFileBuf.Read(aOffset, ptr);
  1525 	TInt cnt = ptr.Length();
  1551 	TInt cnt = ptr.Length();
  1526 	TInt sqliteErr = SQLITE_IOERR_READ;
  1552 	TInt sqliteErr = SQLITE_IOERR_READ;
  1527 	switch(err)
  1553 	switch(err)
  1580 	SQLUTRACE_PROFILER(aDbFile);
  1606 	SQLUTRACE_PROFILER(aDbFile);
  1581 	SYMBIAN_TRACE_SQL_EVENTS_ONLY(UTF::Printf(UTF::TTraceContext(UTF::EInternals), KFileWrite, aAmt, aOffset));
  1607 	SYMBIAN_TRACE_SQL_EVENTS_ONLY(UTF::Printf(UTF::TTraceContext(UTF::EInternals), KFileWrite, aAmt, aOffset));
  1582 	TDbFile& dbFile = ::DbFile(aDbFile);
  1608 	TDbFile& dbFile = ::DbFile(aDbFile);
  1583 	__OS_CALL(EOsFileWrite, 0, 0);
  1609 	__OS_CALL(EOsFileWrite, 0, 0);
  1584     __COUNTER_INCR(TheSqlSrvProfilerFileWrite);
  1610     __COUNTER_INCR(TheSqlSrvProfilerFileWrite);
  1585 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileWrite], ::OsCallProfile(dbFile.iIsJournal, EOsFileWrite), aOffset, aAmt);
  1611 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileWrite], ::OsCallProfile(dbFile.iIsJournal, EOsFileWrite), aOffset, aAmt, aDbFile, 0);
  1586 	TInt err = KErrAccessDenied;
  1612 	TInt err = KErrAccessDenied;
  1587 	if(!dbFile.iReadOnly)
  1613 	if(!dbFile.iReadOnly)
  1588 		{
  1614 		{
  1589 		TPtrC8 ptr((const TUint8*)aData, aAmt);
  1615 		TPtrC8 ptr((const TUint8*)aData, aAmt);
  1590 		err = dbFile.iFileBuf.Write(aOffset, ptr);
  1616 		err = dbFile.iFileBuf.Write(aOffset, ptr);
  1634 	SQLUTRACE_PROFILER(aDbFile);
  1660 	SQLUTRACE_PROFILER(aDbFile);
  1635 	SYMBIAN_TRACE_SQL_EVENTS_ONLY(UTF::Printf(UTF::TTraceContext(UTF::EInternals), KFileTruncate, aLength));
  1661 	SYMBIAN_TRACE_SQL_EVENTS_ONLY(UTF::Printf(UTF::TTraceContext(UTF::EInternals), KFileTruncate, aLength));
  1636 	TDbFile& dbFile = ::DbFile(aDbFile);
  1662 	TDbFile& dbFile = ::DbFile(aDbFile);
  1637 	__OS_CALL(EOsFileTruncate, 0, 0);
  1663 	__OS_CALL(EOsFileTruncate, 0, 0);
  1638     __COUNTER_INCR(TheSqlSrvProfilerFileSetSize);
  1664     __COUNTER_INCR(TheSqlSrvProfilerFileSetSize);
  1639 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileTruncate], ::OsCallProfile(dbFile.iIsJournal, EOsFileTruncate), aLength, 0);
  1665 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileTruncate], ::OsCallProfile(dbFile.iIsJournal, EOsFileTruncate), aLength, 0, aDbFile, 0);
  1640 	if(dbFile.iReadOnly)
  1666 	if(dbFile.iReadOnly)
  1641 		{
  1667 		{
  1642 		COsLayerData::Instance().SetOsErrorCode(KErrAccessDenied);
  1668 		COsLayerData::Instance().SetOsErrorCode(KErrAccessDenied);
  1643   		return SQLITE_IOERR;	
  1669   		return SQLITE_IOERR;	
  1644 		}
  1670 		}
  1670 	{
  1696 	{
  1671 	SQLUTRACE_PROFILER(aDbFile);
  1697 	SQLUTRACE_PROFILER(aDbFile);
  1672 	TDbFile& dbFile = ::DbFile(aDbFile);
  1698 	TDbFile& dbFile = ::DbFile(aDbFile);
  1673 	__OS_CALL(EOsFileSync, 0, 0);
  1699 	__OS_CALL(EOsFileSync, 0, 0);
  1674     __COUNTER_INCR(TheSqlSrvProfilerFileSync);
  1700     __COUNTER_INCR(TheSqlSrvProfilerFileSync);
  1675 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileSync], ::OsCallProfile(dbFile.iIsJournal, EOsFileSync), 0, 0);
  1701 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileSync], ::OsCallProfile(dbFile.iIsJournal, EOsFileSync), 0, 0, aDbFile, 0);
  1676 	if(dbFile.iReadOnly)
  1702 	if(dbFile.iReadOnly)
  1677 		{
  1703 		{
  1678 		COsLayerData::Instance().SetOsErrorCode(KErrAccessDenied);
  1704 		COsLayerData::Instance().SetOsErrorCode(KErrAccessDenied);
  1679 		return SQLITE_IOERR;
  1705 		return SQLITE_IOERR;
  1680 		}
  1706 		}
  1705 /* static */ int TFileIo::FileSize(sqlite3_file* aDbFile, sqlite3_int64* aSize)
  1731 /* static */ int TFileIo::FileSize(sqlite3_file* aDbFile, sqlite3_int64* aSize)
  1706 	{
  1732 	{
  1707 	SQLUTRACE_PROFILER(aDbFile);
  1733 	SQLUTRACE_PROFILER(aDbFile);
  1708 	TDbFile& dbFile = ::DbFile(aDbFile);
  1734 	TDbFile& dbFile = ::DbFile(aDbFile);
  1709 	__OS_CALL(EOsFileFileSize, 0, 0);
  1735 	__OS_CALL(EOsFileFileSize, 0, 0);
  1710 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileFileSize], ::OsCallProfile(dbFile.iIsJournal, EOsFileFileSize), 0, 0);
  1736 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileFileSize], ::OsCallProfile(dbFile.iIsJournal, EOsFileFileSize), 0, 0, aDbFile, 0);
  1711 	__FS_CALL(EFsOpFileSize, 0);
  1737 	__FS_CALL(EFsOpFileSize, 0);
  1712 	TInt err =  dbFile.iFileBuf.Size(*aSize);
  1738 	TInt err =  dbFile.iFileBuf.Size(*aSize);
  1713 	COsLayerData::Instance().SetOsErrorCode(err);
  1739 	COsLayerData::Instance().SetOsErrorCode(err);
  1714 	if(err == KErrNone)
  1740 	if(err == KErrNone)
  1715 		{
  1741 		{
  1739 /* static */ int TFileIo::Lock(sqlite3_file* aDbFile, int aLockType)
  1765 /* static */ int TFileIo::Lock(sqlite3_file* aDbFile, int aLockType)
  1740 	{
  1766 	{
  1741 	SQLUTRACE_PROFILER(aDbFile);
  1767 	SQLUTRACE_PROFILER(aDbFile);
  1742 	TDbFile& dbFile = ::DbFile(aDbFile);
  1768 	TDbFile& dbFile = ::DbFile(aDbFile);
  1743 	__OS_CALL(EOsFileLock, 0, 0);
  1769 	__OS_CALL(EOsFileLock, 0, 0);
  1744 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileLock], ::OsCallProfile(dbFile.iIsJournal, EOsFileLock), aLockType, 0);
  1770 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileLock], ::OsCallProfile(dbFile.iIsJournal, EOsFileLock), aLockType, 0, aDbFile, 0);
  1745 	//If there is already a lock of this type or more restrictive on the database file, do nothing.
  1771 	//If there is already a lock of this type or more restrictive on the database file, do nothing.
  1746 	if(dbFile.iLockType >= aLockType)
  1772 	if(dbFile.iLockType >= aLockType)
  1747 		{
  1773 		{
  1748 		return SQLITE_OK;
  1774 		return SQLITE_OK;
  1749 		}
  1775 		}
  1772 /* static */ int TFileIo::Unlock(sqlite3_file* aDbFile, int aLockType)
  1798 /* static */ int TFileIo::Unlock(sqlite3_file* aDbFile, int aLockType)
  1773 	{
  1799 	{
  1774 	SQLUTRACE_PROFILER(aDbFile);
  1800 	SQLUTRACE_PROFILER(aDbFile);
  1775 	TDbFile& dbFile = ::DbFile(aDbFile);
  1801 	TDbFile& dbFile = ::DbFile(aDbFile);
  1776 	__OS_CALL(EOsFileUnlock, 0, 0);
  1802 	__OS_CALL(EOsFileUnlock, 0, 0);
  1777 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileUnlock], ::OsCallProfile(dbFile.iIsJournal, EOsFileUnlock), aLockType, 0);
  1803 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileUnlock], ::OsCallProfile(dbFile.iIsJournal, EOsFileUnlock), aLockType, 0, aDbFile, 0);
  1778 	dbFile.iLockType = aLockType;
  1804 	dbFile.iLockType = aLockType;
  1779 	return SQLITE_OK;
  1805 	return SQLITE_OK;
  1780 	}
  1806 	}
  1781 
  1807 
  1782 /**
  1808 /**
  1801 /* static */ int TFileIo::CheckReservedLock(sqlite3_file* aDbFile, int *aResOut)
  1827 /* static */ int TFileIo::CheckReservedLock(sqlite3_file* aDbFile, int *aResOut)
  1802 	{
  1828 	{
  1803 	SQLUTRACE_PROFILER(aDbFile);
  1829 	SQLUTRACE_PROFILER(aDbFile);
  1804 	TDbFile& dbFile = ::DbFile(aDbFile);
  1830 	TDbFile& dbFile = ::DbFile(aDbFile);
  1805 	__OS_CALL(EOsFileCheckReservedLock, 0, 0);
  1831 	__OS_CALL(EOsFileCheckReservedLock, 0, 0);
  1806 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileCheckReservedLock], ::OsCallProfile(dbFile.iIsJournal, EOsFileCheckReservedLock), 0, 0);
  1832 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileCheckReservedLock], ::OsCallProfile(dbFile.iIsJournal, EOsFileCheckReservedLock), 0, 0, aDbFile, 0);
  1807 	*aResOut = dbFile.iLockType >= SQLITE_LOCK_RESERVED ? 1 : 0;
  1833 	*aResOut = dbFile.iLockType >= SQLITE_LOCK_RESERVED ? 1 : 0;
  1808   	return SQLITE_OK;
  1834   	return SQLITE_OK;
  1809 	}
  1835 	}
  1810 
  1836 
  1811 /**
  1837 /**
  1837 	{
  1863 	{
  1838 	SQLUTRACE_PROFILER(aDbFile);
  1864 	SQLUTRACE_PROFILER(aDbFile);
  1839 	SYMBIAN_TRACE_SQL_EVENTS_ONLY(UTF::Printf(UTF::TTraceContext(UTF::EInternals), KFileFileCtr, aOp));
  1865 	SYMBIAN_TRACE_SQL_EVENTS_ONLY(UTF::Printf(UTF::TTraceContext(UTF::EInternals), KFileFileCtr, aOp));
  1840 	TDbFile& dbFile = ::DbFile(aDbFile);
  1866 	TDbFile& dbFile = ::DbFile(aDbFile);
  1841 	__OS_CALL(EOsFileFileControl, 0, 0);
  1867 	__OS_CALL(EOsFileFileControl, 0, 0);
  1842 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileFileControl], ::OsCallProfile(dbFile.iIsJournal, EOsFileFileControl), aOp, 0);
  1868 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileFileControl], ::OsCallProfile(dbFile.iIsJournal, EOsFileFileControl), aOp, 0, aDbFile, 0);
  1843 	TInt err = KErrNone;
  1869 	TInt err = KErrNone;
  1844 	switch(aOp)
  1870 	switch(aOp)
  1845 		{
  1871 		{
  1846 		case SQLITE_FCNTL_LOCKSTATE:
  1872 		case SQLITE_FCNTL_LOCKSTATE:
  1847 			*(int*)aArg = dbFile.iLockType;
  1873 			*(int*)aArg = dbFile.iLockType;
  1888 /* static */ int TFileIo::SectorSize(sqlite3_file* aDbFile)
  1914 /* static */ int TFileIo::SectorSize(sqlite3_file* aDbFile)
  1889 	{
  1915 	{
  1890 	SQLUTRACE_PROFILER(aDbFile);
  1916 	SQLUTRACE_PROFILER(aDbFile);
  1891 	TDbFile& dbFile = ::DbFile(aDbFile);
  1917 	TDbFile& dbFile = ::DbFile(aDbFile);
  1892 	__OS_CALL(EOsFileSectorSize, 0, 0);
  1918 	__OS_CALL(EOsFileSectorSize, 0, 0);
  1893 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileSectorSize], ::OsCallProfile(dbFile.iIsJournal, EOsFileSectorSize), 0, 0);
  1919 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileSectorSize], ::OsCallProfile(dbFile.iIsJournal, EOsFileSectorSize), 0, 0, aDbFile, 0);
  1894 	__ASSERT_DEBUG(dbFile.iSectorSize > 0, User::Panic(KPanicCategory, EPanicInternalError));
  1920 	__ASSERT_DEBUG(dbFile.iSectorSize > 0, User::Panic(KPanicCategory, EPanicInternalError));
  1895 	if(dbFile.iSectorSize > 0)
  1921 	if(dbFile.iSectorSize > 0)
  1896 		{
  1922 		{
  1897 		return dbFile.iSectorSize;	
  1923 		return dbFile.iSectorSize;	
  1898 		}
  1924 		}
  1919 /* static */ int TFileIo::DeviceCharacteristics(sqlite3_file* aDbFile)
  1945 /* static */ int TFileIo::DeviceCharacteristics(sqlite3_file* aDbFile)
  1920 	{
  1946 	{
  1921 	SQLUTRACE_PROFILER(aDbFile);
  1947 	SQLUTRACE_PROFILER(aDbFile);
  1922 	TDbFile& dbFile = ::DbFile(aDbFile);
  1948 	TDbFile& dbFile = ::DbFile(aDbFile);
  1923 	__OS_CALL(EOsFileDeviceCharacteristics, 0, 0);
  1949 	__OS_CALL(EOsFileDeviceCharacteristics, 0, 0);
  1924 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileDeviceCharacteristics], ::OsCallProfile(dbFile.iIsJournal, EOsFileDeviceCharacteristics), 0, 0);
  1950 	__OSTIME_COUNTER(TheOsCallTicks[EOsFileDeviceCharacteristics], ::OsCallProfile(dbFile.iIsJournal, EOsFileDeviceCharacteristics), 0, 0, aDbFile, 0);
  1925 	__ASSERT_DEBUG(dbFile.iDeviceCharacteristics >= 0, User::Panic(KPanicCategory, EPanicInternalError));
  1951 	__ASSERT_DEBUG(dbFile.iDeviceCharacteristics >= 0, User::Panic(KPanicCategory, EPanicInternalError));
  1926 	if(dbFile.iDeviceCharacteristics >= 0)
  1952 	if(dbFile.iDeviceCharacteristics >= 0)
  1927 		{
  1953 		{
  1928 		return dbFile.iDeviceCharacteristics;	
  1954 		return dbFile.iDeviceCharacteristics;	
  1929 		}
  1955 		}
  2003 		}
  2029 		}
  2004 	if(aDriveInfo.iDriveAtt & KDriveAttTransaction)
  2030 	if(aDriveInfo.iDriveAtt & KDriveAttTransaction)
  2005 		{
  2031 		{
  2006 		deviceCharacteristics |= SQLITE_IOCAP_ATOMIC;	
  2032 		deviceCharacteristics |= SQLITE_IOCAP_ATOMIC;	
  2007 		}
  2033 		}
  2008 	if(aVolumeInfo.iBlockSize >= SQLITE_DEFAULT_SECTOR_SIZE && (aVolumeInfo.iBlockSize & (aVolumeInfo.iBlockSize - 1)) == 0)	
  2034 	switch(aVolumeInfo.iBlockSize)
  2009 		{
  2035 		{
  2010 		switch(aVolumeInfo.iBlockSize)
  2036 		case 512:
  2011 			{
  2037 			deviceCharacteristics |= SQLITE_IOCAP_ATOMIC512;
  2012 			case 512:
  2038 			break;
  2013 				deviceCharacteristics |= SQLITE_IOCAP_ATOMIC512;
  2039 		case 1024:
  2014 				break;
  2040 			deviceCharacteristics |= SQLITE_IOCAP_ATOMIC1K;
  2015 			case 1024:
  2041 			break;
  2016 				deviceCharacteristics |= SQLITE_IOCAP_ATOMIC1K;
  2042 		case 2048:
  2017 				break;
  2043 			deviceCharacteristics |= SQLITE_IOCAP_ATOMIC2K;
  2018 			case 2048:
  2044 			break;
  2019 				deviceCharacteristics |= SQLITE_IOCAP_ATOMIC2K;
  2045 		case 4096:
  2020 				break;
  2046 			deviceCharacteristics |= SQLITE_IOCAP_ATOMIC4K;
  2021 			case 4096:
  2047 			break;
  2022 				deviceCharacteristics |= SQLITE_IOCAP_ATOMIC4K;
  2048 		case 8192:
  2023 				break;
  2049 			deviceCharacteristics |= SQLITE_IOCAP_ATOMIC8K;
  2024 			case 8192:
  2050 			break;
  2025 				deviceCharacteristics |= SQLITE_IOCAP_ATOMIC8K;
  2051 		case 16384:
  2026 				break;
  2052 			deviceCharacteristics |= SQLITE_IOCAP_ATOMIC16K;
  2027 			case 16384:
  2053 			break;
  2028 				deviceCharacteristics |= SQLITE_IOCAP_ATOMIC16K;
  2054 		case 32768:
  2029 				break;
  2055 			deviceCharacteristics |= SQLITE_IOCAP_ATOMIC32K;
  2030 			case 32768:
  2056 			break;
  2031 				deviceCharacteristics |= SQLITE_IOCAP_ATOMIC32K;
  2057 		case 65536:
  2032 				break;
  2058 			deviceCharacteristics |= SQLITE_IOCAP_ATOMIC64K;
  2033 			case 65536:
  2059 			break;
  2034 				deviceCharacteristics |= SQLITE_IOCAP_ATOMIC64K;
  2060 		default:
  2035 				break;
  2061 			//Do nothing. deviceCharacteristics was initialized with 0 at the beginning of the function body.
  2036 			default:
  2062 			break;
  2037 				//Do nothing. deviceCharacteristics was initialized with 0 at the beginning of the function body.
       
  2038 				break;
       
  2039 			}
       
  2040 		}
  2063 		}
  2041 	return deviceCharacteristics;
  2064 	return deviceCharacteristics;
  2042 	}
  2065 	}
  2043 
  2066 
  2044 /**
  2067 /**
  2213 */
  2236 */
  2214 /* static */ int TVfs::Open(sqlite3_vfs* aVfs, const char* aFileName, sqlite3_file* aDbFile, int aFlags, int* aOutFlags)
  2237 /* static */ int TVfs::Open(sqlite3_vfs* aVfs, const char* aFileName, sqlite3_file* aDbFile, int aFlags, int* aOutFlags)
  2215 	{
  2238 	{
  2216 	SQLUTRACE_PROFILER(aVfs);
  2239 	SQLUTRACE_PROFILER(aVfs);
  2217 	__OS_CALL(EOsVfsOpen, 0, 0);
  2240 	__OS_CALL(EOsVfsOpen, 0, 0);
  2218 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsOpen], ::OsCallProfile(EFalse, EOsVfsOpen), 0, 0);
  2241 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsOpen], ::OsCallProfile(EFalse, EOsVfsOpen), 0, 0, aDbFile, aFileName);
  2219 	COsLayerData& osLayerData = COsLayerData::Instance();
  2242 	COsLayerData& osLayerData = COsLayerData::Instance();
  2220 	TFileName fname;
  2243 	TFileName fname;
  2221 	if(aFileName && !::ConvertToUnicode(aFileName, fname))
  2244 	if(aFileName && !::ConvertToUnicode(aFileName, fname))
  2222 		{
  2245 		{
  2223 		osLayerData.SetOsErrorCode(KErrBadName);
  2246 		osLayerData.SetOsErrorCode(KErrBadName);
  2285 			if(err != KErrNone && err != KErrNoMemory && err != KErrDiskFull)
  2308 			if(err != KErrNone && err != KErrNoMemory && err != KErrDiskFull)
  2286 				{
  2309 				{
  2287 				__FS_CALL(EFsOpFileOpen, 0);
  2310 				__FS_CALL(EFsOpFileOpen, 0);
  2288 				err = dbFile.iFileBuf.Open(osLayerData.iFs, fname, fmode);
  2311 				err = dbFile.iFileBuf.Open(osLayerData.iFs, fname, fmode);
  2289 				
  2312 				
  2290 				if(err == KErrNone && ((aFlags & SQLITE_OPEN_MAIN_JOURNAL) || (aFlags & SQLITE_OPEN_TEMP_JOURNAL) || 
  2313 				if(err == KErrNone && (aFlags & KJournalFileTypeBitMask))
  2291                         (aFlags & SQLITE_OPEN_SUBJOURNAL) || (aFlags & SQLITE_OPEN_MASTER_JOURNAL)))
       
  2292 				    {
  2314 				    {
  2293                     err = TVfs::DoFileSizeCorruptionCheck(dbFile, fname, fmode);
  2315                     err = TVfs::DoFileSizeCorruptionCheck(dbFile, fname, fmode);
  2294 				    }
  2316 				    }
  2295 				}
  2317 				}
  2296 			if((err != KErrNone && err != KErrNoMemory && err != KErrDiskFull) && (aFlags & SQLITE_OPEN_READWRITE))
  2318 			if((err != KErrNone && err != KErrNoMemory && err != KErrDiskFull) && (aFlags & SQLITE_OPEN_READWRITE))
  2336 			*aOutFlags = dbFile.iReadOnly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE;
  2358 			*aOutFlags = dbFile.iReadOnly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE;
  2337 			}
  2359 			}
  2338 		(void)dbFile.iFileBuf.SetReadAheadSize(dbFile.iSectorSize, recReadBufSize);
  2360 		(void)dbFile.iFileBuf.SetReadAheadSize(dbFile.iSectorSize, recReadBufSize);
  2339 		}
  2361 		}
  2340 #ifdef _SQLPROFILER
  2362 #ifdef _SQLPROFILER
  2341 	dbFile.iIsJournal = (aFlags & SQLITE_OPEN_MAIN_JOURNAL) || (aFlags & SQLITE_OPEN_TEMP_JOURNAL) || 
  2363 	dbFile.iIsJournal = aFlags & KJournalFileTypeBitMask; 
  2342 						(aFlags & SQLITE_OPEN_SUBJOURNAL) || (aFlags & SQLITE_OPEN_MASTER_JOURNAL);
       
  2343 #endif
  2364 #endif
  2344 	return err == KErrNone ? SQLITE_OK : (err == KErrNoMemory ? SQLITE_IOERR_NOMEM : SQLITE_CANTOPEN);
  2365 	return err == KErrNone ? SQLITE_OK : (err == KErrNoMemory ? SQLITE_IOERR_NOMEM : SQLITE_CANTOPEN);
  2345 	}
  2366 	}
  2346 
  2367 
  2347 /**
  2368 /**
  2364 */
  2385 */
  2365 /* static */ int TVfs::Delete(sqlite3_vfs* aVfs, const char* aFileName, int /*aSyncDir*/)
  2386 /* static */ int TVfs::Delete(sqlite3_vfs* aVfs, const char* aFileName, int /*aSyncDir*/)
  2366 	{
  2387 	{
  2367 	SQLUTRACE_PROFILER(aVfs);
  2388 	SQLUTRACE_PROFILER(aVfs);
  2368 	__OS_CALL(EOsVfsDelete, 0, 0);
  2389 	__OS_CALL(EOsVfsDelete, 0, 0);
  2369 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsDelete], ::OsCallProfile(EFalse, EOsVfsDelete), 0, 0);
  2390 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsDelete], ::OsCallProfile(EFalse, EOsVfsDelete), 0, 0, 0, aFileName);
  2370 	COsLayerData& osLayerData = COsLayerData::Instance();
  2391 	COsLayerData& osLayerData = COsLayerData::Instance();
  2371 	TBuf<KMaxFileName + 1> fname;
  2392 	TBuf<KMaxFileName + 1> fname;
  2372 	if(!::ConvertToUnicode(aFileName, fname))
  2393 	if(!::ConvertToUnicode(aFileName, fname))
  2373 		{
  2394 		{
  2374 		osLayerData.SetOsErrorCode(KErrBadName);
  2395 		osLayerData.SetOsErrorCode(KErrBadName);
  2412 */
  2433 */
  2413 /* static */ int TVfs::Access(sqlite3_vfs* aVfs, const char* aFileName, int aFlags, int* aResOut)
  2434 /* static */ int TVfs::Access(sqlite3_vfs* aVfs, const char* aFileName, int aFlags, int* aResOut)
  2414 	{
  2435 	{
  2415 	SQLUTRACE_PROFILER(aVfs);
  2436 	SQLUTRACE_PROFILER(aVfs);
  2416 	__OS_CALL(EOsVfsAccess, 0, 0);
  2437 	__OS_CALL(EOsVfsAccess, 0, 0);
  2417 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsAccess], ::OsCallProfile(EFalse, EOsVfsAccess), aFlags, 0);
  2438 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsAccess], ::OsCallProfile(EFalse, EOsVfsAccess), aFlags, 0, 0, aFileName);
  2418 	COsLayerData& osLayerData = COsLayerData::Instance();
  2439 	COsLayerData& osLayerData = COsLayerData::Instance();
  2419 	TBuf<KMaxFileName + 1> fname;
  2440 	TBuf<KMaxFileName + 1> fname;
  2420 	if(!::ConvertToUnicode(aFileName, fname))
  2441 	if(!::ConvertToUnicode(aFileName, fname))
  2421 		{
  2442 		{
  2422 		osLayerData.SetOsErrorCode(KErrGeneral);
  2443 		osLayerData.SetOsErrorCode(KErrGeneral);
  2489 */
  2510 */
  2490 /* static */ int TVfs::FullPathName(sqlite3_vfs* aVfs, const char* aRelative, int aBufLen, char* aBuf)
  2511 /* static */ int TVfs::FullPathName(sqlite3_vfs* aVfs, const char* aRelative, int aBufLen, char* aBuf)
  2491 	{
  2512 	{
  2492 	SQLUTRACE_PROFILER(aVfs);
  2513 	SQLUTRACE_PROFILER(aVfs);
  2493 	__OS_CALL(EOsVfsFullPathName, 0, 0);
  2514 	__OS_CALL(EOsVfsFullPathName, 0, 0);
  2494 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsFullPathName], ::OsCallProfile(EFalse, EOsVfsFullPathName), aBufLen, 0);
  2515 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsFullPathName], ::OsCallProfile(EFalse, EOsVfsFullPathName), aBufLen, 0, 0, aRelative);
  2495 	COsLayerData& osLayerData = COsLayerData::Instance();
  2516 	COsLayerData& osLayerData = COsLayerData::Instance();
  2496 	osLayerData.StoreFhData(NULL, EFalse);
  2517 	osLayerData.StoreFhData(NULL, EFalse);
  2497 	//Convert the received file name to UTF16
  2518 	//Convert the received file name to UTF16
  2498 	TBuf<KMaxFileName + 1> fname;
  2519 	TBuf<KMaxFileName + 1> fname;
  2499 	if(!::ConvertToUnicode(aRelative, fname))
  2520 	if(!::ConvertToUnicode(aRelative, fname))
  2536 */
  2557 */
  2537 /* static */ int TVfs::Randomness(sqlite3_vfs* aVfs, int aBufLen, char* aBuf)
  2558 /* static */ int TVfs::Randomness(sqlite3_vfs* aVfs, int aBufLen, char* aBuf)
  2538 	{
  2559 	{
  2539 	SQLUTRACE_PROFILER(aVfs);
  2560 	SQLUTRACE_PROFILER(aVfs);
  2540 	__OS_CALL(EOsVfsRandomness, 0, 0);
  2561 	__OS_CALL(EOsVfsRandomness, 0, 0);
  2541 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsRandomness], ::OsCallProfile(EFalse, EOsVfsRandomness), aBufLen, 0);
  2562 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsRandomness], ::OsCallProfile(EFalse, EOsVfsRandomness), aBufLen, 0, 0, 0);
  2542 	COsLayerData& osLayerData = COsLayerData::Instance();
  2563 	COsLayerData& osLayerData = COsLayerData::Instance();
  2543 	const TInt KRandIterations = aBufLen / sizeof(int);
  2564 	const TInt KRandIterations = aBufLen / sizeof(int);
  2544 	for(TInt i=0;i<KRandIterations;++i)
  2565 	for(TInt i=0;i<KRandIterations;++i)
  2545 		{
  2566 		{
  2546 		TInt val = Math::Rand(osLayerData.iSeed);
  2567 		TInt val = Math::Rand(osLayerData.iSeed);
  2560 */
  2581 */
  2561 /* static */ int TVfs::Sleep(sqlite3_vfs* aVfs, int aMicrosec)
  2582 /* static */ int TVfs::Sleep(sqlite3_vfs* aVfs, int aMicrosec)
  2562 	{
  2583 	{
  2563 	SQLUTRACE_PROFILER(aVfs);
  2584 	SQLUTRACE_PROFILER(aVfs);
  2564 	__OS_CALL(EOsVfsSleep, 0, 0);
  2585 	__OS_CALL(EOsVfsSleep, 0, 0);
  2565 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsSleep], ::OsCallProfile(EFalse, EOsVfsSleep), aMicrosec, 0);
  2586 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsSleep], ::OsCallProfile(EFalse, EOsVfsSleep), aMicrosec, 0, 0, 0);
  2566 	User::AfterHighRes(TTimeIntervalMicroSeconds32(aMicrosec));
  2587 	User::AfterHighRes(TTimeIntervalMicroSeconds32(aMicrosec));
  2567 	return aMicrosec;
  2588 	return aMicrosec;
  2568 	}
  2589 	}
  2569 
  2590 
  2570 /**
  2591 /**
  2580 */
  2601 */
  2581 /* static */ int TVfs::CurrentTime(sqlite3_vfs* aVfs, double* aNow)
  2602 /* static */ int TVfs::CurrentTime(sqlite3_vfs* aVfs, double* aNow)
  2582 	{
  2603 	{
  2583 	SQLUTRACE_PROFILER(aVfs);
  2604 	SQLUTRACE_PROFILER(aVfs);
  2584 	__OS_CALL(EOsVfsCurrentTime, 0, 0);
  2605 	__OS_CALL(EOsVfsCurrentTime, 0, 0);
  2585 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsCurrentTime], ::OsCallProfile(EFalse, EOsVfsCurrentTime), 0, 0);
  2606 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsCurrentTime], ::OsCallProfile(EFalse, EOsVfsCurrentTime), 0, 0, 0, 0);
  2586 	TTime now;
  2607 	TTime now;
  2587 	now.UniversalTime();
  2608 	now.UniversalTime();
  2588 	TDateTime date = now.DateTime();
  2609 	TDateTime date = now.DateTime();
  2589 	TInt year = date.Year();
  2610 	TInt year = date.Year();
  2590 	TInt month = date.Month() + 1;
  2611 	TInt month = date.Month() + 1;
  2616 */
  2637 */
  2617 /* static */int TVfs::GetLastError(sqlite3_vfs* aVfs, int /*aBufLen*/, char* /*aBuf*/)
  2638 /* static */int TVfs::GetLastError(sqlite3_vfs* aVfs, int /*aBufLen*/, char* /*aBuf*/)
  2618 	{
  2639 	{
  2619 	SQLUTRACE_PROFILER(aVfs);
  2640 	SQLUTRACE_PROFILER(aVfs);
  2620 	__OS_CALL(EOsVfsGetLastError, 0, 0);
  2641 	__OS_CALL(EOsVfsGetLastError, 0, 0);
  2621 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsGetLastError], ::OsCallProfile(EFalse, EOsVfsGetLastError), 0, 0);
  2642 	__OSTIME_COUNTER(TheOsCallTicks[EOsVfsGetLastError], ::OsCallProfile(EFalse, EOsVfsGetLastError), 0, 0, 0, 0);
  2622 	return 0;
  2643 	return 0;
  2623 	}
  2644 	}
  2624 
  2645 
  2625 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2646 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2626 ///////////////////////////////////       Memory allocation functions     /////////////////////////////////////////////////////
  2647 ///////////////////////////////////       Memory allocation functions     /////////////////////////////////////////////////////