/////////////////////////////////////////////////////////////////////////////////////////////// private void Dispose(bool disposing) { if (!disposed) { if (disposing) { //////////////////////////////////// // dispose managed resources here... //////////////////////////////////// if (_sqlite_blob != null) { _sqlite_blob.Dispose(); _sqlite_blob = null; } _sql = null; } ////////////////////////////////////// // release unmanaged resources here... ////////////////////////////////////// disposed = true; } }
/////////////////////////////////////////////////////////////////////////////////////////////// #region Private Constructors /// <summary> /// Initializes the blob. /// </summary> /// <param name="sqlbase">The base SQLite object.</param> /// <param name="blob">The blob handle.</param> private SQLiteBlob( SQLiteBase sqlbase, SQLiteBlobHandle blob ) { _sql = sqlbase; _sqlite_blob = blob; }
/////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// Creates a <see cref="SQLiteBlob" /> object. This will not work /// for tables that were created WITHOUT ROWID. /// </summary> /// <param name="connection"> /// The connection to use when opening the blob object. /// </param> /// <param name="databaseName"> /// The name of the database containing the blob object. /// </param> /// <param name="tableName"> /// The name of the table containing the blob object. /// </param> /// <param name="columnName"> /// The name of the column containing the blob object. /// </param> /// <param name="rowId"> /// The integer identifier for the row associated with the desired /// blob object. /// </param> /// <param name="readOnly"> /// Non-zero to open the blob object for read-only access. /// </param> /// <returns> /// The newly created <see cref="SQLiteBlob" /> instance -OR- null /// if an error occurs. /// </returns> public static SQLiteBlob Create( SQLiteConnection connection, string databaseName, string tableName, string columnName, long rowId, bool readOnly ) { if (connection == null) { throw new ArgumentNullException("connection"); } SQLite3 sqlite3 = connection._sql as SQLite3; if (sqlite3 == null) { throw new InvalidOperationException("Connection has no wrapper"); } SQLiteConnectionHandle handle = sqlite3._sql; if (handle == null) { throw new InvalidOperationException("Connection has an invalid handle."); } SQLiteBlobHandle blob = null; try { // do nothing. } finally /* NOTE: Thread.Abort() protection. */ { IntPtr ptrBlob = IntPtr.Zero; SQLiteErrorCode rc = UnsafeNativeMethods.sqlite3_blob_open( handle, SQLiteConvert.ToUTF8(databaseName), SQLiteConvert.ToUTF8(tableName), SQLiteConvert.ToUTF8( columnName), rowId, readOnly ? 0 : 1, ref ptrBlob); if (rc != SQLiteErrorCode.Ok) { throw new SQLiteException(rc, null); } blob = new SQLiteBlobHandle(handle, ptrBlob); } SQLiteConnection.OnChanged(connection, new ConnectionEventArgs( SQLiteConnectionEventType.NewCriticalHandle, null, null, null, null, blob, null, new object[] { typeof(SQLiteBlob), databaseName, tableName, columnName, rowId, readOnly })); return(new SQLiteBlob(sqlite3, blob)); }
/////////////////////////////////////////////////////////////////////////////////////////////// #region Static "Factory" Methods /// <summary> /// Creates a <see cref="SQLiteBlob" /> object. This will not work /// for tables that were created WITHOUT ROWID -OR- if the query /// does not include the "rowid" column or one of its aliases -OR- /// if the <see cref="SQLiteDataReader" /> was not created with the /// <see cref="CommandBehavior.KeyInfo" /> flag. /// </summary> /// <param name="dataReader"> /// The <see cref="SQLiteDataReader" /> instance with a result set /// containing the desired blob column. /// </param> /// <param name="i"> /// The index of the blob column. /// </param> /// <param name="readOnly"> /// Non-zero to open the blob object for read-only access. /// </param> /// <returns> /// The newly created <see cref="SQLiteBlob" /> instance -OR- null /// if an error occurs. /// </returns> public static SQLiteBlob Create( SQLiteDataReader dataReader, int i, bool readOnly ) { SQLiteConnection connection = SQLiteDataReader.GetConnection( dataReader); if (connection == null) { throw new InvalidOperationException("Connection not available"); } SQLite3 sqlite3 = connection._sql as SQLite3; if (sqlite3 == null) { throw new InvalidOperationException("Connection has no wrapper"); } SQLiteConnectionHandle handle = sqlite3._sql; if (handle == null) { throw new InvalidOperationException("Connection has an invalid handle."); } long?rowId = dataReader.GetRowId(i); if (rowId == null) { throw new InvalidOperationException("No RowId is available"); } SQLiteBlobHandle blob = null; try { // do nothing. } finally /* NOTE: Thread.Abort() protection. */ { IntPtr ptrBlob = IntPtr.Zero; SQLiteErrorCode rc = UnsafeNativeMethods.sqlite3_blob_open( sqlite3._sql, SQLiteConvert.ToUTF8( dataReader.GetDatabaseName(i)), SQLiteConvert.ToUTF8( dataReader.GetTableName(i)), SQLiteConvert.ToUTF8( dataReader.GetName(i)), (long)rowId, readOnly ? 0 : 1, ref ptrBlob); if (rc != SQLiteErrorCode.Ok) { throw new SQLiteException(rc, null); } blob = new SQLiteBlobHandle(handle, ptrBlob); } SQLiteConnection.OnChanged(null, new ConnectionEventArgs( SQLiteConnectionEventType.NewCriticalHandle, null, null, null, dataReader, blob, null, new object[] { typeof(SQLiteBlob), dataReader, i, readOnly })); return(new SQLiteBlob(sqlite3, blob)); }