using Microsoft.Data.Sqlite; using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Windows.Forms; namespace BookmarkManager { public class IconDatabase { protected string dbFilename = null; protected SqliteConnection dbConnection = null; public IconDatabase(string filename) { if (string.IsNullOrWhiteSpace(filename)) return; dbFilename = filename; bool isNew = !File.Exists(dbFilename); SqliteConnectionStringBuilder builder = new SqliteConnectionStringBuilder(); builder.DataSource = dbFilename; builder.Cache = SqliteCacheMode.Private; builder.Mode = SqliteOpenMode.ReadWriteCreate; dbConnection = new SqliteConnection(builder.ToString()); dbConnection.Open(); if (isNew) Initialise(); } public bool AddIcon(string id, Image image) { if (dbConnection == null) return false; if (string.IsNullOrWhiteSpace(id)) return false; if (image == null) return DeleteIcon(id); if (HasIcon(id)) return UpdateIcon(id, image); SqliteCommand command = new SqliteCommand(); command.Connection = dbConnection; command.CommandText = "INSERT INTO icons (id, content) VALUES (@id, @content)"; command.Parameters.Add("@id", SqliteType.Text).Value = id; command.Parameters.Add("@content", SqliteType.Blob).Value = ImageToBytes(image); try { command.ExecuteNonQuery(); } catch (Exception exc) { //#if DEBUG // MessageBox.Show(exc.Message); //#endif return false; } return true; } public void Close() { if (dbConnection == null) return; dbConnection.Close(); dbConnection.Dispose(); dbConnection = null; } public bool DeleteIcon(string id) { if (dbConnection == null) return false; if (string.IsNullOrWhiteSpace(id)) return false; SqliteCommand command = new SqliteCommand(); command.Connection = dbConnection; command.CommandText = "DELETE FROM icons WHERE id = @id"; command.Parameters.Add("@id", SqliteType.Text).Value = id; try { command.ExecuteNonQuery(); } catch (Exception exc) { //#if DEBUG // MessageBox.Show(exc.Message); //#endif return false; } return true; } public Image FindIcon(string id) { if (dbConnection == null) return null; if (string.IsNullOrWhiteSpace(id)) return null; if (!HasIcon(id)) return null; byte[] iconBytes = null; SqliteCommand command = new SqliteCommand(); command.Connection = dbConnection; command.CommandText = "SELECT content FROM icons WHERE id = @id"; command.Parameters.Add("@id", SqliteType.Text).Value = id; try { var rs = command.ExecuteScalar(); if (rs != null) { iconBytes = (byte[])rs; } command.Dispose(); } catch (Exception exc) { //#if DEBUG // MessageBox.Show(exc.Message); //#endif return null; } if (iconBytes == null) { return null; } Image img = null; try { img = Image.FromStream(new MemoryStream(iconBytes)); } catch (Exception exc) { //#if DEBUG // MessageBox.Show(exc.Message); //#endif return null; } return new Bitmap(img, 16, 16); } public bool HasIcon(string id) { if (dbConnection == null) return false; if (string.IsNullOrWhiteSpace(id)) return false; string rs = string.Empty; SqliteCommand command = new SqliteCommand(); command.Connection = dbConnection; command.CommandText = "SELECT COUNT(1) AS count FROM icons WHERE id = @id"; command.Parameters.Add("@id", SqliteType.Text).Value = id; try { rs = command.ExecuteScalar()?.ToString() ?? string.Empty; command.Dispose(); } catch (Exception exc) { //#if DEBUG // MessageBox.Show(exc.Message); //#endif return false; } int rv; if (!int.TryParse(rs, out rv)) rv = 0; return (rv > 0); } public bool UpdateIcon(string id, Image image) { if (dbConnection == null) return false; if (string.IsNullOrWhiteSpace(id)) return false; if (image == null) return DeleteIcon(id); if (!HasIcon(id)) return AddIcon(id, image); SqliteCommand command = new SqliteCommand(); command.Connection = dbConnection; command.CommandText = "UPDATE icons SET content = @content WHERE id = @id"; command.Parameters.Add("@id", SqliteType.Text).Value = id; command.Parameters.Add("@content", SqliteType.Blob).Value = ImageToBytes(image); try { command.ExecuteNonQuery(); } catch (Exception exc) { //#if DEBUG // MessageBox.Show(exc.Message); //#endif return false; } return true; } protected bool Initialise() { if (dbConnection == null) return false; try { SqliteCommand command = new SqliteCommand("CREATE TABLE icons (id TEXT PRIMARY KEY, content BLOB)", dbConnection); command.ExecuteNonQuery(); command.Dispose(); } catch (Exception exc) { //#if DEBUG // MessageBox.Show(exc.Message); //#endif return false; } return true; } protected byte[] ImageToBytes(Image image) { MemoryStream stream = new MemoryStream(); image.Save(stream, ImageFormat.Bmp); stream.Close(); return stream.ToArray(); } } }