Fossil SCM
Fix handling of UTF-8 paths on Cygwin (SQLite's "cygUtf8" branch). Meant for testing. This fix is Cygwin-only.
Commit
9f58fc6528a40198aacb8535dcebbba48c56dc23
Parent
f103e0bc97d19ac…
1 file changed
+42
-24
+42
-24
| --- src/sqlite3.c | ||
| +++ src/sqlite3.c | ||
| @@ -35013,11 +35013,11 @@ | ||
| 35013 | 35013 | ** |
| 35014 | 35014 | ** This division contains the implementation of methods on the |
| 35015 | 35015 | ** sqlite3_vfs object. |
| 35016 | 35016 | */ |
| 35017 | 35017 | |
| 35018 | -#if 0 | |
| 35018 | +#if defined(__CYGWIN__) | |
| 35019 | 35019 | /* |
| 35020 | 35020 | ** Convert a filename from whatever the underlying operating system |
| 35021 | 35021 | ** supports for filenames into UTF-8. Space to hold the result is |
| 35022 | 35022 | ** obtained from malloc and must be freed by the calling function. |
| 35023 | 35023 | */ |
| @@ -35189,27 +35189,21 @@ | ||
| 35189 | 35189 | if( winIsDir(zConverted) ){ |
| 35190 | 35190 | /* At this point, we know the candidate directory exists and should |
| 35191 | 35191 | ** be used. However, we may need to convert the string containing |
| 35192 | 35192 | ** its name into UTF-8 (i.e. if it is UTF-16 right now). |
| 35193 | 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 | - } | |
| 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; | |
| 35211 | 35205 | } |
| 35212 | 35206 | sqlite3_free(zConverted); |
| 35213 | 35207 | } |
| 35214 | 35208 | } |
| 35215 | 35209 | } |
| @@ -35890,23 +35884,47 @@ | ||
| 35890 | 35884 | */ |
| 35891 | 35885 | char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); |
| 35892 | 35886 | if( !zOut ){ |
| 35893 | 35887 | return SQLITE_IOERR_NOMEM; |
| 35894 | 35888 | } |
| 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 ){ | |
| 35897 | 35892 | sqlite3_free(zOut); |
| 35898 | 35893 | return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, |
| 35899 | 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); | |
| 35900 | 35905 | } |
| 35901 | - sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", | |
| 35902 | - sqlite3_data_directory, winGetDirSep(), zOut); | |
| 35903 | - sqlite3_free(zOut); | |
| 35904 | 35906 | }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); | |
| 35906 | 35915 | return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, |
| 35907 | 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); | |
| 35908 | 35926 | } |
| 35909 | 35927 | } |
| 35910 | 35928 | return SQLITE_OK; |
| 35911 | 35929 | #endif |
| 35912 | 35930 | |
| 35913 | 35931 |
| --- 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 |