System.Data.SQLite

Login
This project makes use of Eagle, provided by Mistachkin Systems.
Eagle: Secure Software Automation
Ticket Hash: d3b877c7e0f31d0fcaa20efd8dbaa33b28f42dff
Title: Optimize SQLiteConvert.UTF8ToString for .NET Standard 2.1
Status: Closed Type: Performance
Severity: Important Priority: Medium
Subsystem: Convert Resolution: Fixed
Last Modified: 2020-09-24 01:10:06
Version Found In: 1.0.113.0
User Comments:
anonymous added on 2020-07-04 12:46:52:

.NET Standard 2.1 introduced the method Marshal.PtrToStringUTF8, which can be used in SQLiteConvert.UTF8ToString (similar to using Marshal.PtrToStringUni in SQLite3_UTF16.UTF16ToString), in order to save allocation of a byte array and to avoid Marshal.ReadByte() when using the standard SQLite library.

For example:

    public static string UTF8ToString(IntPtr nativestring, int nativestringlen)
    {
      if (nativestring == IntPtr.Zero || nativestringlen == 0) return String.Empty;

#if NETSTANDARD && !NETSTANDARD2_0
      if (nativestringlen < 0)
        return Marshal.PtrToStringUTF8(nativestring);
      else
        return Marshal.PtrToStringUTF8(nativestring, nativestringlen);
#else
      if (nativestringlen < 0)
      {
        nativestringlen = 0;

        while (Marshal.ReadByte(nativestring, nativestringlen) != 0)
          nativestringlen++;

        if (nativestringlen == 0) return String.Empty;
      }

      byte[] byteArray = new byte[nativestringlen];

      Marshal.Copy(nativestring, byteArray, 0, nativestringlen);

      return _utf8.GetString(byteArray, 0, nativestringlen);
#endif
        }

Thank you!


mistachkin added on 2020-09-24 01:10:06:
Fixed on trunk via check-in [9f4378b8510f62b5].