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 |
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 } |
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 } |
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); |
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); |
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 ///////////////////////////////////////////////////// |
2629 /** |
2650 /** |
2630 SQLite OS porting layer API. |
2651 SQLite OS porting layer API. |
2631 |
2652 |
2632 Memory allocation routine. |
2653 Memory allocation routine. |
2633 |
2654 |
2634 EXPORT_C required to match IMPORT_C in stdlib.h and avoid compiler warning |
|
2635 |
|
2636 @internalComponent |
2655 @internalComponent |
2637 */ |
2656 */ |
2638 extern "C" EXPORT_C void* sqlite3SymbianMalloc(size_t aSize) |
2657 extern "C" void* sqlite3SymbianMalloc(size_t aSize) |
2639 { |
2658 { |
2640 __MEM_CALL(EMemOpAlloc, aSize, 0); |
2659 __MEM_CALL(EMemOpAlloc, aSize, 0); |
2641 return Allocator().Alloc(aSize); |
2660 return Allocator().Alloc(aSize); |
2642 } |
2661 } |
2643 |
2662 |
2644 /** |
2663 /** |
2645 SQLite OS porting layer API. |
2664 SQLite OS porting layer API. |
2646 |
2665 |
2647 Memory reallocation routine. |
2666 Memory reallocation routine. |
2648 |
2667 |
2649 EXPORT_C required to match IMPORT_C in stdlib.h and avoid compiler warning |
|
2650 |
|
2651 @internalComponent |
2668 @internalComponent |
2652 */ |
2669 */ |
2653 extern "C" EXPORT_C void* sqlite3SymbianRealloc(void* aPtr, size_t aSize) |
2670 extern "C" void* sqlite3SymbianRealloc(void* aPtr, size_t aSize) |
2654 { |
2671 { |
2655 #ifdef _SQLPROFILER |
2672 #ifdef _SQLPROFILER |
2656 TInt size = Allocator().AllocLen(aPtr); |
2673 TInt size = Allocator().AllocLen(aPtr); |
2657 __MEM_CALL(EMemOpRealloc, aSize, size); |
2674 __MEM_CALL(EMemOpRealloc, aSize, size); |
2658 #endif |
2675 #endif |