Certainly; the source file is short. I did successfully post it to the
'dev' list, however, which I guess is set to accept attachements.
You might want to make edits if you do choose to encorporate it into the
canonical codebase. E.g.:
* I think there are some existing sqlite utility functions for doing utf8
to utf16 that you might prefer instead of the MultiByteToWideChar Windows
native function
* maybe you prefer wfopen to CreateFileW (I think that would work also)
* maybe there is a better #define for windows conditional compilation in
sqlite codebase that you might prefer to the ones I used
* etc.
Cheers,
-dave
//fileio.patch start ===================================
18a19,21
> #if defined(WIN32) || defined(WIN64) || defined(WINDOWS)
> #include <windows.h>
> #endif
29a33,73
> #if defined(WIN32) || defined(WIN64) || defined(WINDOWS)
> const char* zName;
> int nCvt;
> wchar_t* awchName;
> HANDLE hfile;
> BY_HANDLE_FILE_INFORMATION finfo;
> void* pBuf;
> DWORD dwRead;
>
> (void)(argc); /* Unused parameter */
> /*get file name (utf8)*/
> zName = (const char*)sqlite3_value_text( argv[0] );
> if ( zName == 0 ) return;
> /*figure out how many (utf-16)*/
> nCvt = MultiByteToWideChar( CP_UTF8, 0, zName, -1, NULL, 0 );
> if ( 0 == nCvt ) return;
> awchName = sqlite3_malloc( nCvt * sizeof( wchar_t ) );
> nCvt = MultiByteToWideChar( CP_UTF8, 0, zName, -1, awchName, nCvt );
> hfile = CreateFileW( awchName, GENERIC_READ, FILE_SHARE_READ|
FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
> sqlite3_free( awchName );
> if ( INVALID_HANDLE_VALUE == hfile ) return;
> if ( !GetFileInformationByHandle( hfile, &finfo ) )
> {
> CloseHandle( hfile );
> return;
> }
> pBuf = sqlite3_malloc( (int)finfo.nFileSizeLow );
> if ( NULL == pBuf )
> {
> CloseHandle( hfile );
> return;
> }
> if ( !ReadFile( hfile, pBuf, finfo.nFileSizeLow, &dwRead, NULL ) )
> {
> sqlite3_free( pBuf );
> CloseHandle( hfile );
> return;
> }
> sqlite3_result_blob( context, pBuf, dwRead, sqlite3_free );
> CloseHandle( hfile );
> #else
49a94
> #endif
62a108,149
> #if defined(WIN32) || defined(WIN64) || defined(WINDOWS)
> const char* zName;
> int nCvt;
> wchar_t* awchName;
> HANDLE hfile;
> int nLen;
> const char* z;
> sqlite3_int64 rc;
> DWORD dwWritten;
>
> (void)(argc); /* Unused parameter */
> //get file name (utf8)
> zName = (const char*)sqlite3_value_text( argv[0] );
> if ( zName == 0 ) return;
> //figure out how many (utf-16)
> nCvt = MultiByteToWideChar( CP_UTF8, 0, zName, -1, NULL, 0 );
> if ( 0 == nCvt ) return;
> awchName = sqlite3_malloc( nCvt * sizeof( wchar_t ) );
> nCvt = MultiByteToWideChar( CP_UTF8, 0, zName, -1, awchName, nCvt );
> hfile = CreateFileW( awchName, GENERIC_WRITE, FILE_SHARE_WRITE |
FILE_SHARE_DELETE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
> sqlite3_free( awchName );
> if ( INVALID_HANDLE_VALUE == hfile ) return;
> nLen = sqlite3_value_bytes( argv[1] );
> z = (const char*)sqlite3_value_blob( argv[1] );
> if ( NULL == z )
> {
> rc = 0;
> }
> else
> {
> if ( !WriteFile( hfile, z, (DWORD)nLen, &dwWritten, NULL ) )
> {
> rc = 0;
> }
> else
> {
> rc = (sqlite3_int64)dwWritten;
> }
> }
> CloseHandle( hfile );
> sqlite3_result_int64( context, rc );
> #else
80a168
> #endif
//fileio.patch end===============================================
> -----Original Message-----
> From: sqlite-users
> [mailto:[email protected]] On
> Behalf Of Dan Kennedy
> Sent: Monday, December 11, 2017 2:09 PM
> To: [email protected]
> Subject: Re: [sqlite] readfile/writefile extensioln, and UTF8
> on Windows....
>
>
> On 12/12/2017 12:42 AM, dave wrote:
> > Folks; I recently had some trouble using the readfile()
> extension until I
> > noticed it was due to there being filenames with Unicode in
> them, and that
> > the existing implementation using fopen() doesn't do UTF8
> on Windows (I
> > think it uses the ambient code page).
> >
> > I modified the extension code to support UTF8 filenames on
> Windows, and it
> > works fine (at least in my test cases!). Thinking that
> someone might fine
> > it useful, I am attaching the modified code. Use it if and
> however you
> > like. Also note there is an embedded copy of fileio.c in
> shell.c that also
> > needs the mod, for the sqlite shell.c builds.
>
>
> shell.c is a generated file, so the build process will pull
> in changes
> to ext/misc/fileio.c.
>
> The mailing list has discarded your attachment though. Can
> you post the
> patch inline or upload it somewhere and post a link?
>
> Thanks,
> Dan.
>
>
>
> >
> > Attached herewith.
> >
> > Cheers!
> >
> > -dave
> > _______________________________________________
> > sqlite-users mailing list
> > [email protected]
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
>
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users