Fossil SCM

One more: GetFullPathNameW() needs the "\\?\"-prefix as well if the input path is already >MAX_PATH. But we don't want the resulting directory to have this prefix, so strip it off when present.

jan.nijtmans 2013-12-12 16:13 win32-longpath
Commit e5fef7982deff6bb7cb90194df1a280e4e3f439d
1 file changed +11 -6
+11 -6
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -36092,15 +36092,11 @@
3609236092
*/
3609336093
sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s",
3609436094
sqlite3_data_directory, winGetDirSep(), zRelative);
3609536095
return SQLITE_OK;
3609636096
}
36097
- if( osIsNT() ){
36098
- zConverted = winUtf8ToUnicode(zRelative);
36099
- }else{
36100
- zConverted = sqlite3_win32_utf8_to_mbcs(zRelative);
36101
- }
36097
+ zConverted = winConvertFromUtf8Filename(zRelative);
3610236098
if( zConverted==0 ){
3610336099
return SQLITE_IOERR_NOMEM;
3610436100
}
3610536101
if( osIsNT() ){
3610636102
LPWSTR zTemp;
@@ -36122,11 +36118,20 @@
3612236118
sqlite3_free(zTemp);
3612336119
return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(),
3612436120
"winFullPathname2", zRelative);
3612536121
}
3612636122
sqlite3_free(zConverted);
36127
- zOut = winUnicodeToUtf8(zTemp);
36123
+ if( memcmp(zTemp, L"\\\\?\\", 8)==0 ){
36124
+ if( memcmp(zTemp+4, L"UNC\\", 8) ){
36125
+ zTemp[6] = '\\';
36126
+ zOut = winUnicodeToUtf8(zTemp+6);
36127
+ }else{
36128
+ zOut = winUnicodeToUtf8(zTemp+4);
36129
+ }
36130
+ }else{
36131
+ zOut = winUnicodeToUtf8(zTemp);
36132
+ }
3612836133
sqlite3_free(zTemp);
3612936134
}
3613036135
#ifdef SQLITE_WIN32_HAS_ANSI
3613136136
else{
3613236137
char *zTemp;
3613336138
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -36092,15 +36092,11 @@
36092 */
36093 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s",
36094 sqlite3_data_directory, winGetDirSep(), zRelative);
36095 return SQLITE_OK;
36096 }
36097 if( osIsNT() ){
36098 zConverted = winUtf8ToUnicode(zRelative);
36099 }else{
36100 zConverted = sqlite3_win32_utf8_to_mbcs(zRelative);
36101 }
36102 if( zConverted==0 ){
36103 return SQLITE_IOERR_NOMEM;
36104 }
36105 if( osIsNT() ){
36106 LPWSTR zTemp;
@@ -36122,11 +36118,20 @@
36122 sqlite3_free(zTemp);
36123 return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(),
36124 "winFullPathname2", zRelative);
36125 }
36126 sqlite3_free(zConverted);
36127 zOut = winUnicodeToUtf8(zTemp);
 
 
 
 
 
 
 
 
 
36128 sqlite3_free(zTemp);
36129 }
36130 #ifdef SQLITE_WIN32_HAS_ANSI
36131 else{
36132 char *zTemp;
36133
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -36092,15 +36092,11 @@
36092 */
36093 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s",
36094 sqlite3_data_directory, winGetDirSep(), zRelative);
36095 return SQLITE_OK;
36096 }
36097 zConverted = winConvertFromUtf8Filename(zRelative);
 
 
 
 
36098 if( zConverted==0 ){
36099 return SQLITE_IOERR_NOMEM;
36100 }
36101 if( osIsNT() ){
36102 LPWSTR zTemp;
@@ -36122,11 +36118,20 @@
36118 sqlite3_free(zTemp);
36119 return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(),
36120 "winFullPathname2", zRelative);
36121 }
36122 sqlite3_free(zConverted);
36123 if( memcmp(zTemp, L"\\\\?\\", 8)==0 ){
36124 if( memcmp(zTemp+4, L"UNC\\", 8) ){
36125 zTemp[6] = '\\';
36126 zOut = winUnicodeToUtf8(zTemp+6);
36127 }else{
36128 zOut = winUnicodeToUtf8(zTemp+4);
36129 }
36130 }else{
36131 zOut = winUnicodeToUtf8(zTemp);
36132 }
36133 sqlite3_free(zTemp);
36134 }
36135 #ifdef SQLITE_WIN32_HAS_ANSI
36136 else{
36137 char *zTemp;
36138

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button