WingMan – Blame information for rev 32

Subversion Repositories:
Rev:
Rev Author Line No. Line
23 office 1 using System;
2 using System.Runtime.InteropServices;
3 using System.Threading;
4 using System.Threading.Tasks;
5 using System.Windows.Forms;
6 using Mono.Data.Sqlite;
7  
8 namespace WingMan.AutoCompletion
9 {
10 public class AutoCompletion : IDisposable
11 {
12 public delegate void LoadFailed(object sender, AutoCompletionFailedEventArgs args);
13  
14  
15 public delegate void SaveFailed(object sender, AutoCompletionFailedEventArgs args);
16  
17 public AutoCompletion()
18 {
19 }
20  
21 public AutoCompletion(TaskScheduler taskScheduler, CancellationToken cancellationToken) : this()
22 {
23 TaskScheduler = taskScheduler;
24 CancellationToken = cancellationToken;
25 }
26  
27 private TaskScheduler TaskScheduler { get; }
28 private CancellationToken CancellationToken { get; }
29  
30 public void Dispose()
31 {
32 }
33  
34 [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
35 [return: MarshalAs(UnmanagedType.Bool)]
36 private static extern bool SetDllDirectory(string lpPathName);
37  
38 public event SaveFailed OnSaveFailed;
39  
40 public event LoadFailed OnLoadFailed;
41  
42 public async Task Save(string name, AutoCompleteStringCollection autoCompleteStringCollection)
43 {
44 SetDllDirectory(Environment.Is64BitOperatingSystem ? "x64" : "x86");
45  
46 try
47 {
48 using (var sqliteConnection =
49 new SqliteConnection($"URI=file:{"Autocomplete.db"}"))
50 {
51 await sqliteConnection.OpenAsync(CancellationToken);
52  
53 // Create table if it does not exist.
54 using (var sqliteCommand =
55 new SqliteCommand($"CREATE TABLE IF NOT EXISTS {name} (data text UNIQUE NOT NULL)",
56 sqliteConnection))
57 {
58 using (var dbtransaction = sqliteConnection.BeginTransaction())
59 {
60 try
61 {
62 await sqliteCommand.ExecuteReaderAsync(CancellationToken);
63  
64 dbtransaction.Commit();
65 }
66 catch
67 {
68 dbtransaction.Rollback();
69 throw;
70 }
71 }
72 }
73  
74 // Add all items to the database.
75 await Task.Delay(0, CancellationToken).ContinueWith(async _ =>
76 {
77 foreach (var sourceItem in autoCompleteStringCollection)
78 {
79 var data = sourceItem.ToString();
80  
81 using (var sqliteCommand =
82 new SqliteCommand($"REPLACE INTO {name} (data) VALUES (:data)",
83 sqliteConnection))
84 {
85 sqliteCommand
86 .Parameters
87 .Add(new SqliteParameter("data", data));
88  
89 using (var dbtransaction = sqliteConnection.BeginTransaction())
90 {
91 try
92 {
93 await sqliteCommand.ExecuteReaderAsync(CancellationToken);
94  
95 dbtransaction.Commit();
96 }
97 catch
98 {
99 dbtransaction.Rollback();
100 throw;
101 }
102 }
103 }
104 }
105 }, CancellationToken,
106 TaskContinuationOptions.None, TaskScheduler);
107 }
108 }
109 catch (Exception ex)
110 {
111 await Task.Delay(0, CancellationToken).ContinueWith(_ => OnSaveFailed?.Invoke(this,
112 new AutoCompletionFailedEventArgs(AutoCompletionFailedType.Save, name, ex)), CancellationToken,
113 TaskContinuationOptions.None, TaskScheduler);
114 }
115 }
116  
117 public async Task Load(string name, AutoCompleteStringCollection autoCompleteStringCollection)
118 {
119 SetDllDirectory(Environment.Is64BitOperatingSystem ? "x64" : "x86");
120  
121 try
122 {
123 using (var sqliteConnection =
124 new SqliteConnection($"URI=file:{"Autocomplete.db"}"))
125 {
126 await sqliteConnection.OpenAsync(CancellationToken);
127 using (var sqliteCommand =
128 new SqliteCommand($"SELECT data FROM {name}", sqliteConnection))
129 {
130 using (var dbtransaction = sqliteConnection.BeginTransaction())
131 {
132 try
133 {
134 using (var reader = await sqliteCommand.ExecuteReaderAsync(CancellationToken))
135 {
136 while (await reader.ReadAsync(CancellationToken))
137 for (var i = 0; i < reader.FieldCount; ++i)
138 {
139 var value = reader.GetString(i);
140 if (string.IsNullOrEmpty(value))
141 continue;
142  
143 await Task.Delay(0, CancellationToken).ContinueWith(
144 _ => autoCompleteStringCollection.Add(value), CancellationToken,
145 TaskContinuationOptions.None, TaskScheduler);
146 }
147 }
148  
149 dbtransaction.Commit();
150 }
151 catch
152 {
153 dbtransaction.Rollback();
154 throw;
155 }
156 }
157 }
158 }
159 }
160 catch (Exception ex)
161 {
162 await Task.Delay(0, CancellationToken).ContinueWith(_ => OnLoadFailed?.Invoke(this,
163 new AutoCompletionFailedEventArgs(AutoCompletionFailedType.Load, name, ex)), CancellationToken,
164 TaskContinuationOptions.None, TaskScheduler);
165 }
166 }
167 }
32 office 168 }