Fossil SCM

Fix handling of UTF-8 paths on Cygwin (SQLite's "cygUtf8" branch). Meant for testing. This fix is Cygwin-only.

jan.nijtmans 2013-11-25 10:12 UTC trunk
Commit 9f58fc6528a40198aacb8535dcebbba48c56dc23
1 file changed +42 -24
+42 -24
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -35013,11 +35013,11 @@
3501335013
**
3501435014
** This division contains the implementation of methods on the
3501535015
** sqlite3_vfs object.
3501635016
*/
3501735017
35018
-#if 0
35018
+#if defined(__CYGWIN__)
3501935019
/*
3502035020
** Convert a filename from whatever the underlying operating system
3502135021
** supports for filenames into UTF-8. Space to hold the result is
3502235022
** obtained from malloc and must be freed by the calling function.
3502335023
*/
@@ -35189,27 +35189,21 @@
3518935189
if( winIsDir(zConverted) ){
3519035190
/* At this point, we know the candidate directory exists and should
3519135191
** be used. However, we may need to convert the string containing
3519235192
** its name into UTF-8 (i.e. if it is UTF-16 right now).
3519335193
*/
35194
- if( osIsNT() ){
35195
- char *zUtf8 = winUnicodeToUtf8(zConverted);
35196
- if( !zUtf8 ){
35197
- sqlite3_free(zConverted);
35198
- sqlite3_free(zBuf);
35199
- OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
35200
- return SQLITE_IOERR_NOMEM;
35201
- }
35202
- sqlite3_snprintf(nMax, zBuf, "%s", zUtf8);
35203
- sqlite3_free(zUtf8);
35204
- sqlite3_free(zConverted);
35205
- break;
35206
- }else{
35207
- sqlite3_snprintf(nMax, zBuf, "%s", zConverted);
35208
- sqlite3_free(zConverted);
35209
- break;
35210
- }
35194
+ char *zUtf8 = winConvertToUtf8Filename(zConverted);
35195
+ if( !zUtf8 ){
35196
+ sqlite3_free(zConverted);
35197
+ sqlite3_free(zBuf);
35198
+ OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
35199
+ return SQLITE_IOERR_NOMEM;
35200
+ }
35201
+ sqlite3_snprintf(nMax, zBuf, "%s", zUtf8);
35202
+ sqlite3_free(zUtf8);
35203
+ sqlite3_free(zConverted);
35204
+ break;
3521135205
}
3521235206
sqlite3_free(zConverted);
3521335207
}
3521435208
}
3521535209
}
@@ -35890,23 +35884,47 @@
3589035884
*/
3589135885
char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 );
3589235886
if( !zOut ){
3589335887
return SQLITE_IOERR_NOMEM;
3589435888
}
35895
- if( cygwin_conv_path(CCP_POSIX_TO_WIN_A|CCP_RELATIVE, zRelative, zOut,
35896
- pVfs->mxPathname+1)<0 ){
35889
+ if( cygwin_conv_path(
35890
+ (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A) |
35891
+ CCP_RELATIVE, zRelative, zOut, pVfs->mxPathname+1)<0 ){
3589735892
sqlite3_free(zOut);
3589835893
return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno,
3589935894
"winFullPathname1", zRelative);
35895
+ }else{
35896
+ char *zUtf8 = winConvertToUtf8Filename(zOut);
35897
+ if( !zUtf8 ){
35898
+ sqlite3_free(zOut);
35899
+ return SQLITE_IOERR_NOMEM;
35900
+ }
35901
+ sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s",
35902
+ sqlite3_data_directory, winGetDirSep(), zUtf8);
35903
+ sqlite3_free(zUtf8);
35904
+ sqlite3_free(zOut);
3590035905
}
35901
- sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s",
35902
- sqlite3_data_directory, winGetDirSep(), zOut);
35903
- sqlite3_free(zOut);
3590435906
}else{
35905
- if( cygwin_conv_path(CCP_POSIX_TO_WIN_A, zRelative, zFull, nFull)<0 ){
35907
+ char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 );
35908
+ if( !zOut ){
35909
+ return SQLITE_IOERR_NOMEM;
35910
+ }
35911
+ if( cygwin_conv_path(
35912
+ (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A),
35913
+ zRelative, zOut, pVfs->mxPathname+1)<0 ){
35914
+ sqlite3_free(zOut);
3590635915
return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno,
3590735916
"winFullPathname2", zRelative);
35917
+ }else{
35918
+ char *zUtf8 = winConvertToUtf8Filename(zOut);
35919
+ if( !zUtf8 ){
35920
+ sqlite3_free(zOut);
35921
+ return SQLITE_IOERR_NOMEM;
35922
+ }
35923
+ sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zUtf8);
35924
+ sqlite3_free(zUtf8);
35925
+ sqlite3_free(zOut);
3590835926
}
3590935927
}
3591035928
return SQLITE_OK;
3591135929
#endif
3591235930
3591335931
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -35013,11 +35013,11 @@
35013 **
35014 ** This division contains the implementation of methods on the
35015 ** sqlite3_vfs object.
35016 */
35017
35018 #if 0
35019 /*
35020 ** Convert a filename from whatever the underlying operating system
35021 ** supports for filenames into UTF-8. Space to hold the result is
35022 ** obtained from malloc and must be freed by the calling function.
35023 */
@@ -35189,27 +35189,21 @@
35189 if( winIsDir(zConverted) ){
35190 /* At this point, we know the candidate directory exists and should
35191 ** be used. However, we may need to convert the string containing
35192 ** its name into UTF-8 (i.e. if it is UTF-16 right now).
35193 */
35194 if( osIsNT() ){
35195 char *zUtf8 = winUnicodeToUtf8(zConverted);
35196 if( !zUtf8 ){
35197 sqlite3_free(zConverted);
35198 sqlite3_free(zBuf);
35199 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
35200 return SQLITE_IOERR_NOMEM;
35201 }
35202 sqlite3_snprintf(nMax, zBuf, "%s", zUtf8);
35203 sqlite3_free(zUtf8);
35204 sqlite3_free(zConverted);
35205 break;
35206 }else{
35207 sqlite3_snprintf(nMax, zBuf, "%s", zConverted);
35208 sqlite3_free(zConverted);
35209 break;
35210 }
35211 }
35212 sqlite3_free(zConverted);
35213 }
35214 }
35215 }
@@ -35890,23 +35884,47 @@
35890 */
35891 char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 );
35892 if( !zOut ){
35893 return SQLITE_IOERR_NOMEM;
35894 }
35895 if( cygwin_conv_path(CCP_POSIX_TO_WIN_A|CCP_RELATIVE, zRelative, zOut,
35896 pVfs->mxPathname+1)<0 ){
 
35897 sqlite3_free(zOut);
35898 return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno,
35899 "winFullPathname1", zRelative);
 
 
 
 
 
 
 
 
 
 
35900 }
35901 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s",
35902 sqlite3_data_directory, winGetDirSep(), zOut);
35903 sqlite3_free(zOut);
35904 }else{
35905 if( cygwin_conv_path(CCP_POSIX_TO_WIN_A, zRelative, zFull, nFull)<0 ){
 
 
 
 
 
 
 
35906 return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno,
35907 "winFullPathname2", zRelative);
 
 
 
 
 
 
 
 
 
35908 }
35909 }
35910 return SQLITE_OK;
35911 #endif
35912
35913
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -35013,11 +35013,11 @@
35013 **
35014 ** This division contains the implementation of methods on the
35015 ** sqlite3_vfs object.
35016 */
35017
35018 #if defined(__CYGWIN__)
35019 /*
35020 ** Convert a filename from whatever the underlying operating system
35021 ** supports for filenames into UTF-8. Space to hold the result is
35022 ** obtained from malloc and must be freed by the calling function.
35023 */
@@ -35189,27 +35189,21 @@
35189 if( winIsDir(zConverted) ){
35190 /* At this point, we know the candidate directory exists and should
35191 ** be used. However, we may need to convert the string containing
35192 ** its name into UTF-8 (i.e. if it is UTF-16 right now).
35193 */
35194 char *zUtf8 = winConvertToUtf8Filename(zConverted);
35195 if( !zUtf8 ){
35196 sqlite3_free(zConverted);
35197 sqlite3_free(zBuf);
35198 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
35199 return SQLITE_IOERR_NOMEM;
35200 }
35201 sqlite3_snprintf(nMax, zBuf, "%s", zUtf8);
35202 sqlite3_free(zUtf8);
35203 sqlite3_free(zConverted);
35204 break;
 
 
 
 
 
 
35205 }
35206 sqlite3_free(zConverted);
35207 }
35208 }
35209 }
@@ -35890,23 +35884,47 @@
35884 */
35885 char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 );
35886 if( !zOut ){
35887 return SQLITE_IOERR_NOMEM;
35888 }
35889 if( cygwin_conv_path(
35890 (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A) |
35891 CCP_RELATIVE, zRelative, zOut, pVfs->mxPathname+1)<0 ){
35892 sqlite3_free(zOut);
35893 return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno,
35894 "winFullPathname1", zRelative);
35895 }else{
35896 char *zUtf8 = winConvertToUtf8Filename(zOut);
35897 if( !zUtf8 ){
35898 sqlite3_free(zOut);
35899 return SQLITE_IOERR_NOMEM;
35900 }
35901 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s",
35902 sqlite3_data_directory, winGetDirSep(), zUtf8);
35903 sqlite3_free(zUtf8);
35904 sqlite3_free(zOut);
35905 }
 
 
 
35906 }else{
35907 char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 );
35908 if( !zOut ){
35909 return SQLITE_IOERR_NOMEM;
35910 }
35911 if( cygwin_conv_path(
35912 (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A),
35913 zRelative, zOut, pVfs->mxPathname+1)<0 ){
35914 sqlite3_free(zOut);
35915 return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno,
35916 "winFullPathname2", zRelative);
35917 }else{
35918 char *zUtf8 = winConvertToUtf8Filename(zOut);
35919 if( !zUtf8 ){
35920 sqlite3_free(zOut);
35921 return SQLITE_IOERR_NOMEM;
35922 }
35923 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zUtf8);
35924 sqlite3_free(zUtf8);
35925 sqlite3_free(zOut);
35926 }
35927 }
35928 return SQLITE_OK;
35929 #endif
35930
35931

Keyboard Shortcuts

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