├── .gitignore
├── ARLiteNET.SQLite.Integration.Tests
├── ARLiteNET.SQLite.Integration.Tests.csproj
├── Data
│ ├── SQLiteDefaultTableObject.cs
│ ├── SQLiteInMemory.cs
│ └── SQLiteSettings.cs
├── SQLiteDeclarativeTests.cs
├── SQLiteQueryBuilderTests.cs
├── SQLiteRawTests.cs
└── Stub
│ ├── InMemorySQLiteConfigurationFactoryStub.cs
│ ├── SQLiteDeclarativeStub.cs
│ ├── SQLiteRawStub.cs
│ └── UserDtoStub.cs
├── ARLiteNET.SQLite
├── ARLiteConnectionStringBuilderExtensions.cs
├── ARLiteNET.SQLite.csproj
├── QueryBuilders
│ ├── SQLiteDeleteQueryBuilder.cs
│ ├── SQLiteFromQueryBuilder.cs
│ ├── SQLiteInsertQueryBuilder.cs
│ ├── SQLiteOrderByQueryBuilder.cs
│ ├── SQLiteQueryFactory.cs
│ ├── SQLiteSelectQueryBuilder.cs
│ ├── SQLiteUpdateQueryBuilder.cs
│ └── SQLiteWhereQueryBuilder.cs
└── SQLiteDeclarativeExtensions.cs
├── ARLiteNET.Unit.Tests
├── ARLiteConfigurationResolverTests.cs
├── ARLiteNET.Unit.Tests.csproj
├── ExpressionMemberTests.cs
├── MapperTests.cs
└── Stub
│ └── UserDtoStub.cs
├── ARLiteNET.sln
├── ARLiteNET
├── ARLiteNET.csproj
├── ARLiteObject.cs
├── Common
│ ├── ChainQueryBuilder.cs
│ ├── IQueryBuilder.cs
│ ├── Query
│ │ ├── ColumnValueObject.cs
│ │ ├── DataType.cs
│ │ ├── IConditionQueryBuilder.cs
│ │ ├── IConditionalFunctionQueryBuilder.cs
│ │ ├── IDeleteQueryBuilder.cs
│ │ ├── IFromQueryBuilder.cs
│ │ ├── IInsertQueryBuilder.cs
│ │ ├── IJoinQueryBuilder.cs
│ │ ├── IOrderByQueryBuilder.cs
│ │ ├── ISelectQueryBuilder.cs
│ │ ├── IUpdateQueryBuilder.cs
│ │ └── IWhereQueryBuilder.cs
│ └── QueryBuilderContext.cs
├── Core
│ ├── AdoCommandExecuter.cs
│ ├── AdoConnectionString.cs
│ ├── AdoDbObjectFactory.cs
│ ├── AdoExecuterResult.cs
│ ├── Builder
│ │ ├── AdoCommandBuilder.cs
│ │ ├── Declarative
│ │ │ ├── DeleteCommandBuilder.cs
│ │ │ ├── InsertCommandBuilder.cs
│ │ │ ├── SelectCommandBuilder.cs
│ │ │ └── UpdateCommandBuilder.cs
│ │ └── IDbCommandBuilder.cs
│ ├── Configuration
│ │ ├── ARLiteConfigurationAttribute.cs
│ │ ├── ARLiteConfigurationFactory.cs
│ │ ├── ARLiteConfigurationResolver.cs
│ │ └── ARLiteConnectionStringBuilder.cs
│ ├── ExpressionMember.cs
│ └── Mappers
│ │ ├── MapType.cs
│ │ └── Mapper.cs
└── Exceptions
│ ├── ARLiteException.cs
│ └── ARLiteObjectException.cs
├── LICENSE
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Aa][Rr][Mm]/
27 | [Aa][Rr][Mm]64/
28 | bld/
29 | [Bb]in/
30 | [Oo]bj/
31 | [Ll]og/
32 | [Ll]ogs/
33 |
34 | # Visual Studio 2015/2017 cache/options directory
35 | .vs/
36 | # Uncomment if you have tasks that create the project's static files in wwwroot
37 | #wwwroot/
38 |
39 | # Visual Studio 2017 auto generated files
40 | Generated\ Files/
41 |
42 | # MSTest test Results
43 | [Tt]est[Rr]esult*/
44 | [Bb]uild[Ll]og.*
45 |
46 | # NUnit
47 | *.VisualState.xml
48 | TestResult.xml
49 | nunit-*.xml
50 |
51 | # Build Results of an ATL Project
52 | [Dd]ebugPS/
53 | [Rr]eleasePS/
54 | dlldata.c
55 |
56 | # Benchmark Results
57 | BenchmarkDotNet.Artifacts/
58 |
59 | # .NET Core
60 | project.lock.json
61 | project.fragment.lock.json
62 | artifacts/
63 |
64 | # StyleCop
65 | StyleCopReport.xml
66 |
67 | # Files built by Visual Studio
68 | *_i.c
69 | *_p.c
70 | *_h.h
71 | *.ilk
72 | *.meta
73 | *.obj
74 | *.iobj
75 | *.pch
76 | *.pdb
77 | *.ipdb
78 | *.pgc
79 | *.pgd
80 | *.rsp
81 | *.sbr
82 | *.tlb
83 | *.tli
84 | *.tlh
85 | *.tmp
86 | *.tmp_proj
87 | *_wpftmp.csproj
88 | *.log
89 | *.vspscc
90 | *.vssscc
91 | .builds
92 | *.pidb
93 | *.svclog
94 | *.scc
95 |
96 | # Chutzpah Test files
97 | _Chutzpah*
98 |
99 | # Visual C++ cache files
100 | ipch/
101 | *.aps
102 | *.ncb
103 | *.opendb
104 | *.opensdf
105 | *.sdf
106 | *.cachefile
107 | *.VC.db
108 | *.VC.VC.opendb
109 |
110 | # Visual Studio profiler
111 | *.psess
112 | *.vsp
113 | *.vspx
114 | *.sap
115 |
116 | # Visual Studio Trace Files
117 | *.e2e
118 |
119 | # TFS 2012 Local Workspace
120 | $tf/
121 |
122 | # Guidance Automation Toolkit
123 | *.gpState
124 |
125 | # ReSharper is a .NET coding add-in
126 | _ReSharper*/
127 | *.[Rr]e[Ss]harper
128 | *.DotSettings.user
129 |
130 | # TeamCity is a build add-in
131 | _TeamCity*
132 |
133 | # DotCover is a Code Coverage Tool
134 | *.dotCover
135 |
136 | # AxoCover is a Code Coverage Tool
137 | .axoCover/*
138 | !.axoCover/settings.json
139 |
140 | # Visual Studio code coverage results
141 | *.coverage
142 | *.coveragexml
143 |
144 | # NCrunch
145 | _NCrunch_*
146 | .*crunch*.local.xml
147 | nCrunchTemp_*
148 |
149 | # MightyMoose
150 | *.mm.*
151 | AutoTest.Net/
152 |
153 | # Web workbench (sass)
154 | .sass-cache/
155 |
156 | # Installshield output folder
157 | [Ee]xpress/
158 |
159 | # DocProject is a documentation generator add-in
160 | DocProject/buildhelp/
161 | DocProject/Help/*.HxT
162 | DocProject/Help/*.HxC
163 | DocProject/Help/*.hhc
164 | DocProject/Help/*.hhk
165 | DocProject/Help/*.hhp
166 | DocProject/Help/Html2
167 | DocProject/Help/html
168 |
169 | # Click-Once directory
170 | publish/
171 |
172 | # Publish Web Output
173 | *.[Pp]ublish.xml
174 | *.azurePubxml
175 | # Note: Comment the next line if you want to checkin your web deploy settings,
176 | # but database connection strings (with potential passwords) will be unencrypted
177 | *.pubxml
178 | *.publishproj
179 |
180 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
181 | # checkin your Azure Web App publish settings, but sensitive information contained
182 | # in these scripts will be unencrypted
183 | PublishScripts/
184 |
185 | # NuGet Packages
186 | *.nupkg
187 | # NuGet Symbol Packages
188 | *.snupkg
189 | # The packages folder can be ignored because of Package Restore
190 | **/[Pp]ackages/*
191 | # except build/, which is used as an MSBuild target.
192 | !**/[Pp]ackages/build/
193 | # Uncomment if necessary however generally it will be regenerated when needed
194 | #!**/[Pp]ackages/repositories.config
195 | # NuGet v3's project.json files produces more ignorable files
196 | *.nuget.props
197 | *.nuget.targets
198 |
199 | # Microsoft Azure Build Output
200 | csx/
201 | *.build.csdef
202 |
203 | # Microsoft Azure Emulator
204 | ecf/
205 | rcf/
206 |
207 | # Windows Store app package directories and files
208 | AppPackages/
209 | BundleArtifacts/
210 | Package.StoreAssociation.xml
211 | _pkginfo.txt
212 | *.appx
213 | *.appxbundle
214 | *.appxupload
215 |
216 | # Visual Studio cache files
217 | # files ending in .cache can be ignored
218 | *.[Cc]ache
219 | # but keep track of directories ending in .cache
220 | !?*.[Cc]ache/
221 |
222 | # Others
223 | ClientBin/
224 | ~$*
225 | *~
226 | *.dbmdl
227 | *.dbproj.schemaview
228 | *.jfm
229 | *.pfx
230 | *.publishsettings
231 | orleans.codegen.cs
232 |
233 | # Including strong name files can present a security risk
234 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
235 | #*.snk
236 |
237 | # Since there are multiple workflows, uncomment next line to ignore bower_components
238 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
239 | #bower_components/
240 |
241 | # RIA/Silverlight projects
242 | Generated_Code/
243 |
244 | # Backup & report files from converting an old project file
245 | # to a newer Visual Studio version. Backup files are not needed,
246 | # because we have git ;-)
247 | _UpgradeReport_Files/
248 | Backup*/
249 | UpgradeLog*.XML
250 | UpgradeLog*.htm
251 | ServiceFabricBackup/
252 | *.rptproj.bak
253 |
254 | # SQL Server files
255 | *.mdf
256 | *.ldf
257 | *.ndf
258 |
259 | # Business Intelligence projects
260 | *.rdl.data
261 | *.bim.layout
262 | *.bim_*.settings
263 | *.rptproj.rsuser
264 | *- [Bb]ackup.rdl
265 | *- [Bb]ackup ([0-9]).rdl
266 | *- [Bb]ackup ([0-9][0-9]).rdl
267 |
268 | # Microsoft Fakes
269 | FakesAssemblies/
270 |
271 | # GhostDoc plugin setting file
272 | *.GhostDoc.xml
273 |
274 | # Node.js Tools for Visual Studio
275 | .ntvs_analysis.dat
276 | node_modules/
277 |
278 | # Visual Studio 6 build log
279 | *.plg
280 |
281 | # Visual Studio 6 workspace options file
282 | *.opt
283 |
284 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
285 | *.vbw
286 |
287 | # Visual Studio LightSwitch build output
288 | **/*.HTMLClient/GeneratedArtifacts
289 | **/*.DesktopClient/GeneratedArtifacts
290 | **/*.DesktopClient/ModelManifest.xml
291 | **/*.Server/GeneratedArtifacts
292 | **/*.Server/ModelManifest.xml
293 | _Pvt_Extensions
294 |
295 | # Paket dependency manager
296 | .paket/paket.exe
297 | paket-files/
298 |
299 | # FAKE - F# Make
300 | .fake/
301 |
302 | # CodeRush personal settings
303 | .cr/personal
304 |
305 | # Python Tools for Visual Studio (PTVS)
306 | __pycache__/
307 | *.pyc
308 |
309 | # Cake - Uncomment if you are using it
310 | # tools/**
311 | # !tools/packages.config
312 |
313 | # Tabs Studio
314 | *.tss
315 |
316 | # Telerik's JustMock configuration file
317 | *.jmconfig
318 |
319 | # BizTalk build output
320 | *.btp.cs
321 | *.btm.cs
322 | *.odx.cs
323 | *.xsd.cs
324 |
325 | # OpenCover UI analysis results
326 | OpenCover/
327 |
328 | # Azure Stream Analytics local run output
329 | ASALocalRun/
330 |
331 | # MSBuild Binary and Structured Log
332 | *.binlog
333 |
334 | # NVidia Nsight GPU debugger configuration file
335 | *.nvuser
336 |
337 | # MFractors (Xamarin productivity tool) working folder
338 | .mfractor/
339 |
340 | # Local History for Visual Studio
341 | .localhistory/
342 |
343 | # BeatPulse healthcheck temp database
344 | healthchecksdb
345 |
346 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
347 | MigrationBackup/
348 |
349 | # Ionide (cross platform F# VS Code tools) working folder
350 | .ionide/
351 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/ARLiteNET.SQLite.Integration.Tests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net8.0
5 | enable
6 | enable
7 |
8 | false
9 | true
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/Data/SQLiteDefaultTableObject.cs:
--------------------------------------------------------------------------------
1 | namespace ARLiteNET.SQLite.Integration.Tests.Data
2 | {
3 | public class SQLiteDefaultTableObject
4 | {
5 | public long Id { get; set; }
6 | public string Name { get; set; }
7 | public bool IsActive { get; set; }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/Data/SQLiteInMemory.cs:
--------------------------------------------------------------------------------
1 | using System.Data.SQLite;
2 | using System.Diagnostics;
3 |
4 | namespace ARLiteNET.SQLite.Integration.Tests.Data
5 | {
6 | public static class SQLiteInMemory
7 | {
8 | public static void PrepareTestDB()
9 | {
10 | SQLiteConnection connection = null;
11 |
12 | try
13 | {
14 | string checkTableQuery = $"SELECT name FROM sqlite_master WHERE type='table' AND name='{SQLiteSettings.DefaultTableName}';";
15 | bool checkTableExists = false;
16 |
17 | connection = new SQLiteConnection(SQLiteSettings.ConnectionStringVersion3);
18 |
19 | connection.Open();
20 |
21 | using (SQLiteCommand checkCommand = new SQLiteCommand(checkTableQuery, connection))
22 | {
23 | var result = checkCommand.ExecuteScalar();
24 |
25 | if (result is null)
26 | {
27 | checkTableExists = false;
28 | }
29 | else
30 | {
31 | checkTableExists = true;
32 | }
33 | }
34 |
35 | if (!checkTableExists)
36 | {
37 | using (SQLiteCommand createCommand = new SQLiteCommand(SQLiteSettings.GetDefaultTableScript(), connection))
38 | createCommand.ExecuteNonQuery();
39 |
40 | // needs to combine with CREATE TABLE query!
41 | using (SQLiteCommand insertDataCommand = new SQLiteCommand(SQLiteSettings.GetDefaultTableInsertScript(), connection))
42 | insertDataCommand.ExecuteNonQuery();
43 |
44 | Debug.WriteLine("Table created successfully with data.");
45 | }
46 |
47 | connection.Close();
48 | }
49 | catch (Exception ex)
50 | {
51 | Debug.WriteLine($"Occur error! {ex.Message}");
52 | throw;
53 | }
54 | finally
55 | {
56 | connection?.Dispose();
57 | }
58 | }
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/Data/SQLiteSettings.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace ARLiteNET.SQLite.Integration.Tests.Data
3 | {
4 | public class SQLiteSettings
5 | {
6 | public static string DatabaseName => "InMemoryARLiteNET";
7 | public static string DefaultTableName => "Users";
8 | public static string ConnectionStringVersion3 => $"Data Source={DatabaseName};Mode=Memory;Cache=Shared;Version=3;";
9 |
10 | public static string GetDefaultTableScript() => $"CREATE TABLE \"{DefaultTableName}\" (\r\n\t\"{nameof(SQLiteDefaultTableObject.Id)}\"\tINTEGER NOT NULL,\r\n\t\"{nameof(SQLiteDefaultTableObject.Name)}\"\tTEXT,\r\n\t\"{nameof(SQLiteDefaultTableObject.IsActive)}\"\tINTEGER NOT NULL,\r\n\tPRIMARY KEY(\"Id\")\r\n)";
11 | public static string GetDefaultTableInsertScript() => $"INSERT INTO {DefaultTableName} ({nameof(SQLiteDefaultTableObject.Id)},{nameof(SQLiteDefaultTableObject.Name)},{nameof(SQLiteDefaultTableObject.IsActive)}) VALUES (1, 'Rasul', 1), (2, 'Huseynov', 1)";
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/SQLiteDeclarativeTests.cs:
--------------------------------------------------------------------------------
1 |
2 | using ARLiteNET.SQLite.Integration.Tests.Data;
3 | using ARLiteNET.SQLite.Integration.Tests.Stub;
4 |
5 | namespace ARLiteNET.SQLite.Integration.Tests
6 | {
7 | [TestClass]
8 | public class SQLiteDeclarativeTests
9 | {
10 | [TestInitialize]
11 | public void Initialize() => SQLiteInMemory.PrepareTestDB();
12 |
13 | [TestMethod]
14 | [Priority(1)]
15 | public void Add_WhenCorrectInsert_ShouldReturnSuccessOfAddedObject()
16 | {
17 | UserDtoStub newUserStub = new()
18 | {
19 | Name = "Test",
20 | IsActive = true,
21 | };
22 | const bool expectedResult = true;
23 | SQLiteDeclarativeStub adoObject = new SQLiteDeclarativeStub();
24 |
25 | bool actualResult = adoObject.Add(newUserStub);
26 |
27 | Assert.AreEqual(expectedResult, actualResult);
28 | }
29 |
30 | [TestMethod]
31 | [Priority(2)]
32 | public void GetByName_WhenCorrectWhereClauseWithCondition_ShouldReturnSuccessfullyMappedObject()
33 | {
34 | const string name = "Test";
35 | SQLiteDeclarativeStub adoObject = new SQLiteDeclarativeStub();
36 |
37 | IEnumerable users = adoObject.GetByName(name);
38 |
39 | Assert.IsNotNull(users);
40 | Assert.IsTrue(users.Any());
41 | }
42 |
43 | [TestMethod]
44 | [Priority(3)]
45 | public void GetAll_WhenCorrectSelectSpecified_ShouldReturnSuccessfullyMappedObject()
46 | {
47 | SQLiteDeclarativeStub adoObject = new SQLiteDeclarativeStub();
48 |
49 | IEnumerable users = adoObject.GetAll();
50 |
51 | Assert.IsNotNull(users);
52 | Assert.IsTrue(users.Any());
53 | }
54 |
55 | [TestMethod]
56 | [Priority(4)]
57 | public void Update_WhenCorrectUpdate_ShouldReturnSuccessOfUpdatedObject()
58 | {
59 | UserDtoStub updateUserStub = new()
60 | {
61 | Id = 1,
62 | Name = "Test1",
63 | IsActive = true,
64 | };
65 | SQLiteDeclarativeStub adoObject = new SQLiteDeclarativeStub();
66 |
67 | bool actualResult = adoObject.Update(updateUserStub);
68 |
69 | Assert.IsTrue(actualResult);
70 | }
71 |
72 | [TestMethod]
73 | [Priority(5)]
74 | public void DeleteByName_WhenCorrectDelete_ShouldReturnSuccessOfDeletedObject()
75 | {
76 | const string name = "Test";
77 | const bool expectedResult = true;
78 | SQLiteDeclarativeStub adoObject = new SQLiteDeclarativeStub();
79 |
80 | bool actualResult = adoObject.DeleteByName(name);
81 |
82 | Assert.AreEqual(expectedResult, actualResult);
83 | }
84 | }
85 | }
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/SQLiteQueryBuilderTests.cs:
--------------------------------------------------------------------------------
1 |
2 | using ARLiteNET.Common;
3 | using ARLiteNET.SQLite.Integration.Tests.Stub;
4 |
5 | namespace ARLiteNET.SQLite.Integration.Tests
6 | {
7 | [TestClass]
8 | public class SQLiteQueryBuilderTests
9 | {
10 | [TestMethod]
11 | public void Build_WhenCalledSelectWithAllColumns_ShouldReturnCorrectQuery()
12 | {
13 | const string expectedQuery = $"SELECT * FROM {nameof(UserDtoStub)} ";
14 |
15 | string generatedQuery = SQLiteQueryFactory.Select()
16 | .From(nameof(UserDtoStub))
17 | .Build();
18 |
19 | Assert.AreEqual(expectedQuery, generatedQuery);
20 | }
21 |
22 | [TestMethod]
23 | public void Build_WhenCalledSelectAndWhereCondition_ShouldReturnCorrectQuery()
24 | {
25 | const string expectedQuery = $"SELECT * FROM {nameof(UserDtoStub)} AS T WHERE T.Name = 'Test' AND T.Id > 0 ";
26 |
27 | string generatedQuery = SQLiteQueryFactory.Select()
28 | .From(nameof(UserDtoStub))
29 | .Alias("T")
30 | .Where(nameof(UserDtoStub.Name))
31 | .EqualTo("Test")
32 | .And(nameof(UserDtoStub.Id))
33 | .GreaterThan(0)
34 | .Build();
35 |
36 | Assert.AreEqual(expectedQuery, generatedQuery);
37 | }
38 |
39 | [TestMethod]
40 | public void Build_WhenCalledSelectAndConditionWithSpecifiedColumns_ShouldReturnCorrectQuery()
41 | {
42 | const string expectedQuery = $"SELECT T.Id,T.Name FROM {nameof(UserDtoStub)} AS T WHERE T.Name = 'Test' AND T.Id > 0 ";
43 |
44 | string generatedQuery = SQLiteQueryFactory.Select("Id","Name")
45 | .From(nameof(UserDtoStub))
46 | .Alias("T")
47 | .Where(nameof(UserDtoStub.Name))
48 | .EqualTo("Test")
49 | .And(nameof(UserDtoStub.Id))
50 | .GreaterThan(0)
51 | .Build();
52 |
53 | Assert.AreEqual(expectedQuery, generatedQuery);
54 | }
55 |
56 | [TestMethod]
57 | public void Build_WhenCalledInsertWithValues_ShouldReturnCorrectQuery()
58 | {
59 | const string nameRaw = "Rasul";
60 | const string isActiveRaw = "1";
61 | const string expectedQuery = $"INSERT INTO {nameof(UserDtoStub)} ({nameof(UserDtoStub.Name)},{nameof(UserDtoStub.IsActive)}) VALUES ('{nameRaw}',{isActiveRaw}), ('{nameRaw}',{isActiveRaw})";
62 |
63 | string generatedQuery = SQLiteQueryFactory.Insert(nameof(UserDtoStub))
64 | .Value(new ColumnValueObject(nameof(UserDtoStub.Name), nameRaw, DataType.TEXT)
65 | ,new ColumnValueObject(nameof(UserDtoStub.IsActive), isActiveRaw, DataType.INTEGER))
66 | .Value(new ColumnValueObject(nameof(UserDtoStub.Name), nameRaw, DataType.TEXT)
67 | ,new ColumnValueObject(nameof(UserDtoStub.IsActive), isActiveRaw, DataType.INTEGER))
68 | .Build();
69 |
70 | Assert.AreEqual(expectedQuery, generatedQuery);
71 | }
72 |
73 | [TestMethod]
74 | public void Build_WhenCalledDeleteWithoutConditions_ShouldReturnCorrectQuery()
75 | {
76 | const string expectedQuery = $"DELETE FROM {nameof(UserDtoStub)} ";
77 |
78 | string generatedQuery = SQLiteQueryFactory.Delete(nameof(UserDtoStub))
79 | .Build();
80 |
81 | Assert.AreEqual(expectedQuery, generatedQuery);
82 | }
83 |
84 | [TestMethod]
85 | public void Build_WhenCalledDeleteWithGreaterThanCondition_ShouldReturnCorrectQuery()
86 | {
87 | const string expectedQuery = $"DELETE FROM {nameof(UserDtoStub)} WHERE Id > 5 ";
88 |
89 | string generatedQuery = SQLiteQueryFactory.Delete(nameof(UserDtoStub))
90 | .Where(nameof(UserDtoStub.Id))
91 | .GreaterThan(5)
92 | .Build();
93 |
94 | Assert.AreEqual(expectedQuery, generatedQuery);
95 | }
96 |
97 | [TestMethod]
98 | public void Build_WhenCalledDeleteWithEqualToCondition_ShouldReturnCorrectQuery()
99 | {
100 | const string expectedQuery = $"DELETE FROM {nameof(UserDtoStub)} WHERE Id = 5 ";
101 |
102 | string generatedQuery = SQLiteQueryFactory.Delete(nameof(UserDtoStub))
103 | .Where(nameof(UserDtoStub.Id))
104 | .EqualTo(5)
105 | .Build();
106 |
107 | Assert.AreEqual(expectedQuery, generatedQuery);
108 | }
109 |
110 | [TestMethod]
111 | public void Build_WhenCalledOrderByWithAscendingOrder_ShouldReturnCorrectQuery()
112 | {
113 | const string expectedQuery = $"SELECT * FROM {nameof(UserDtoStub)} ORDER BY {nameof(UserDtoStub.Id)} ASC ";
114 |
115 | string generatedQuery = SQLiteQueryFactory.Select()
116 | .From(nameof(UserDtoStub))
117 | .OrderBy()
118 | .Asc(nameof(UserDtoStub.Id))
119 | .Build();
120 |
121 | Assert.AreEqual(expectedQuery, generatedQuery);
122 | }
123 |
124 | [TestMethod]
125 | public void Build_WhenCalledOrderByWithDescendingOrder_ShouldReturnCorrectQuery()
126 | {
127 | const string expectedQuery = $"SELECT * FROM {nameof(UserDtoStub)} ORDER BY {nameof(UserDtoStub.Id)} DESC ";
128 |
129 | string generatedQuery = SQLiteQueryFactory.Select()
130 | .From(nameof(UserDtoStub))
131 | .OrderBy()
132 | .Desc(nameof(UserDtoStub.Id))
133 | .Build();
134 |
135 | Assert.AreEqual(expectedQuery, generatedQuery);
136 | }
137 |
138 | [TestMethod]
139 | public void Build_WhenCalledUpdateWithoutConditions_ShouldReturnCorrectQuery()
140 | {
141 | const string isActiveRaw = "0";
142 | const string nameRaw = "rasul";
143 | const string expectedQuery = $"UPDATE {nameof(UserDtoStub)} SET {nameof(UserDtoStub.IsActive)} = {isActiveRaw},{nameof(UserDtoStub.Name)} = '{nameRaw}' ";
144 |
145 | string generatedQuery = SQLiteQueryFactory.Update(nameof(UserDtoStub))
146 | .Set(new ColumnValueObject(nameof(UserDtoStub.IsActive), isActiveRaw, DataType.INTEGER))
147 | .Set(new ColumnValueObject(nameof(UserDtoStub.Name), nameRaw, DataType.TEXT))
148 | .Build();
149 |
150 | Assert.AreEqual(expectedQuery, generatedQuery);
151 | }
152 |
153 | [TestMethod]
154 | public void Build_WhenCalledUpdateWithEqualToCondition_ShouldReturnCorrectQuery()
155 | {
156 | const string isActiveRaw = "0";
157 | const string nameRaw = "rasul";
158 | const string expectedQuery = $"UPDATE {nameof(UserDtoStub)} SET {nameof(UserDtoStub.IsActive)} = {isActiveRaw},{nameof(UserDtoStub.Name)} = '{nameRaw}' WHERE Id = 5 ";
159 |
160 | string generatedQuery = SQLiteQueryFactory.Update(nameof(UserDtoStub))
161 | .Set(new ColumnValueObject(nameof(UserDtoStub.IsActive), isActiveRaw, DataType.INTEGER))
162 | .Set(new ColumnValueObject(nameof(UserDtoStub.Name), nameRaw, DataType.TEXT))
163 | .Where(nameof(UserDtoStub.Id))
164 | .EqualTo(5)
165 | .Build();
166 |
167 | Assert.AreEqual(expectedQuery, generatedQuery);
168 | }
169 | }
170 | }
171 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/SQLiteRawTests.cs:
--------------------------------------------------------------------------------
1 |
2 | using ARLiteNET.SQLite.Integration.Tests.Data;
3 | using ARLiteNET.SQLite.Integration.Tests.Stub;
4 |
5 | namespace ARLiteNET.SQLite.Integration.Tests
6 | {
7 | [TestClass]
8 | public class SQLiteRawTests
9 | {
10 | [TestInitialize]
11 | public void Initialize() => SQLiteInMemory.PrepareTestDB();
12 |
13 | [TestMethod]
14 | public void GetAll_WhenCalled_ShouldReturnNonNullCollection()
15 | {
16 | SQLiteRawStub adoObject = new SQLiteRawStub();
17 |
18 | IEnumerable objects = adoObject.GetAll();
19 |
20 | Assert.IsNotNull(objects);
21 | }
22 |
23 | [TestMethod]
24 | public void Add_WhenCorrectInsert_ShouldReturnAddedObjectCount()
25 | {
26 | UserDtoStub newUserStub = new()
27 | {
28 | Name = "Test",
29 | IsActive = true,
30 | };
31 | bool expectedResult = true;
32 | SQLiteRawStub adoObject = new SQLiteRawStub();
33 |
34 | bool actualResult = adoObject.Add(newUserStub);
35 |
36 | Assert.AreEqual(expectedResult, actualResult);
37 | }
38 | }
39 | }
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/Stub/InMemorySQLiteConfigurationFactoryStub.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace ARLiteNET.SQLite.Integration.Tests.Stub
3 | {
4 | public sealed class InMemorySQLiteConfigurationFactoryStub : ARLiteConfigurationFactory
5 | {
6 | protected override void Configure(ARLiteConnectionStringBuilder connectionStringBuilder)
7 | => connectionStringBuilder.AddSQLiteProvider()
8 | .ConnectionString(Data.SQLiteSettings.ConnectionStringVersion3);
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/Stub/SQLiteDeclarativeStub.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace ARLiteNET.SQLite.Integration.Tests.Stub
3 | {
4 | [ARLiteConfiguration(typeof(InMemorySQLiteConfigurationFactoryStub))]
5 | public class SQLiteDeclarativeStub : ARLiteObject
6 | {
7 | const string TABLE_NAME = "Users";
8 |
9 | public IEnumerable GetAll()
10 | {
11 | // Declarative approach
12 | var selectQuery = base.Query()
13 | .Select(TABLE_NAME);
14 |
15 | selectQuery.Column(x => x.Id).Only();
16 | selectQuery.Column(x => x.Name).Only();
17 | selectQuery.Column(x => x.IsActive).Only();
18 |
19 | return base.RunEnumerable(selectQuery);
20 | }
21 |
22 | public IEnumerable GetByName(string name)
23 | {
24 | // Declarative approach
25 | var selectQuery = this.Query()
26 | .Select(TABLE_NAME);
27 |
28 | selectQuery.Column(x => x.Id).Only();
29 | selectQuery.Column(x => x.Name).Only();
30 | selectQuery.Column(x => x.IsActive).Only();
31 | selectQuery.Column(x => x.Name).EqualTo(name);
32 |
33 | return this.RunEnumerable(selectQuery);
34 | }
35 |
36 | public bool Add(UserDtoStub newObject)
37 | {
38 | // Declarative approach
39 | var insertQuery = this.Query()
40 | .Insert(TABLE_NAME, newObject);
41 |
42 | insertQuery.Column(x => x.Id).Ignore();
43 | insertQuery.Column(x => x.BirthDate).Ignore();
44 |
45 | int affectedRows = this.Run(insertQuery);
46 |
47 | return affectedRows == 1;
48 | }
49 |
50 | public bool Update(UserDtoStub newObject)
51 | {
52 | // Declarative approach
53 | var updateQuery = this.Query()
54 | .Update(TABLE_NAME, newObject);
55 |
56 | updateQuery.Column(x => x.BirthDate).Ignore();
57 | updateQuery.Column(x => x.Id).Ignore();
58 | updateQuery.Column(x => x.Id).EqualTo(newObject.Id);
59 |
60 | int affectedRows = this.Run(updateQuery);
61 |
62 | return affectedRows >= 1;
63 | }
64 |
65 | public bool DeleteAll()
66 | {
67 | // Declarative approach
68 | var deleteQuery = this.Query()
69 | .Delete(TABLE_NAME);
70 |
71 | int affectedRows = this.Run(deleteQuery);
72 |
73 | return affectedRows >= 1;
74 | }
75 |
76 | public bool DeleteByName(string name)
77 | {
78 | // Declarative approach
79 | var deleteQuery = this.Query()
80 | .Delete(TABLE_NAME);
81 |
82 | deleteQuery.Column(x => x.Name).EqualTo(name);
83 |
84 | int affectedRows = this.Run(deleteQuery);
85 |
86 | return affectedRows >= 1;
87 | }
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/Stub/SQLiteRawStub.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace ARLiteNET.SQLite.Integration.Tests.Stub
3 | {
4 | [ARLiteConfiguration(typeof(InMemorySQLiteConfigurationFactoryStub))]
5 | public class SQLiteRawStub : ARLiteObject
6 | {
7 | public IEnumerable GetAll()
8 | {
9 | var queryBuilder = this.Query()
10 | .SetCommand("SELECT * FROM Users");
11 |
12 | return this.RunEnumerable(queryBuilder);
13 | }
14 |
15 | public bool Add(UserDtoStub newObject)
16 | {
17 | var queryBuilder = this.Query()
18 | .SetCommand("INSERT INTO Users (Name, IsActive) VALUES (@name, @isActive)")
19 | .AddParam((param) =>
20 | {
21 | param.ParameterName = "@name";
22 | param.DbType = System.Data.DbType.String;
23 | param.Value = newObject.Name;
24 | }).AddParam((param) => {
25 | param.ParameterName = "@isActive";
26 | //param.DbType = System.Data.DbType.Boolean;
27 | param.Value = newObject.IsActive;
28 | });
29 |
30 | int affectedRows = this.Run(queryBuilder);
31 |
32 | return affectedRows == 1;
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite.Integration.Tests/Stub/UserDtoStub.cs:
--------------------------------------------------------------------------------
1 |
2 | using ARLiteNET.SQLite.Integration.Tests.Data;
3 |
4 | namespace ARLiteNET.SQLite.Integration.Tests.Stub
5 | {
6 | public class UserDtoStub : SQLiteDefaultTableObject
7 | {
8 | public DateTime? BirthDate { get; set; }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/ARLiteConnectionStringBuilderExtensions.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace ARLiteNET.SQLite
3 | {
4 | public static class ARLiteConnectionStringBuilderExtensions
5 | {
6 | const string PROVIDER_NAME_STR = "System.Data.SQLite";
7 |
8 | ///
9 | /// Add SQLite provider for ADO.NET access.
10 | ///
11 | public static ARLiteConnectionStringBuilder AddSQLiteProvider(this ARLiteConnectionStringBuilder connectionStringBuilder)
12 | => connectionStringBuilder.AddProvider(PROVIDER_NAME_STR, System.Data.SQLite.SQLiteFactory.Instance);
13 |
14 | ///
15 | /// Add SQLite version of 3 with provider for ADO.NET access.
16 | ///
17 | public static ARLiteConnectionStringBuilder SetSQLite3(this ARLiteConnectionStringBuilder connectionStringBuilder, string sqliteFile)
18 | => connectionStringBuilder.AddSQLiteProvider()
19 | .ConnectionString($"Data Source={sqliteFile};Version=3;");
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/ARLiteNET.SQLite.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.1
5 | enable
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/QueryBuilders/SQLiteDeleteQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Common;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 |
7 | namespace ARLiteNET.SQLite.QueryBuilders
8 | {
9 | public class SQLiteDeleteQueryBuilder : ChainQueryBuilder,
10 | IDeleteQueryBuilder,
11 | IConditionalFunctionQueryBuilder,
12 | IConditionQueryBuilder
13 | {
14 | const string DELETE = "DELETE";
15 | const string WHERE = "WHERE";
16 | const string FROM = "FROM";
17 |
18 | private readonly string _tableName;
19 |
20 | private readonly List _conditions;
21 | readonly Dictionary Symbols = new Dictionary()
22 | {
23 | {nameof(IConditionalFunctionQueryBuilder.EqualTo), "="},
24 | {nameof(IConditionalFunctionQueryBuilder.NotEqualTo), "!="},
25 | {nameof(IConditionalFunctionQueryBuilder.GreaterThan), ">"},
26 | {nameof(IConditionalFunctionQueryBuilder.LessThan), "<"},
27 | {nameof(IConditionalFunctionQueryBuilder.In), "IN"},
28 | {nameof(IConditionQueryBuilder.And), "AND"},
29 | {nameof(IConditionQueryBuilder.Or), "OR"},
30 | };
31 |
32 | public SQLiteDeleteQueryBuilder(string tableName) : base(null)
33 | {
34 | _tableName = tableName ?? throw new ArgumentNullException($"Table can not be null or empty!");
35 | _conditions = new List();
36 | }
37 |
38 | #region Where Condition Methods
39 | public IConditionQueryBuilder EqualTo(string value)
40 | {
41 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.EqualTo)]} '{value}' ");
42 | return this;
43 | }
44 | public IConditionQueryBuilder EqualTo(decimal value)
45 | {
46 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.EqualTo)]} {value} ");
47 | return this;
48 | }
49 | public IConditionQueryBuilder EqualTo(double value)
50 | {
51 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.EqualTo)]} {value} ");
52 | return this;
53 | }
54 | public IConditionQueryBuilder EqualTo(int value)
55 | {
56 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.EqualTo)]} {value} ");
57 | return this;
58 | }
59 |
60 | public IConditionQueryBuilder NotEqualTo(string value)
61 | {
62 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.NotEqualTo)]} '{value}' ");
63 | return this;
64 | }
65 | public IConditionQueryBuilder NotEqualTo(decimal value)
66 | {
67 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.NotEqualTo)]} {value} ");
68 | return this;
69 | }
70 | public IConditionQueryBuilder NotEqualTo(double value)
71 | {
72 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.NotEqualTo)]} {value} ");
73 | return this;
74 | }
75 | public IConditionQueryBuilder NotEqualTo(int value)
76 | {
77 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.NotEqualTo)]} {value} ");
78 | return this;
79 | }
80 |
81 | public IConditionQueryBuilder In(params string[] values)
82 | {
83 | IEnumerable convertedStrings = values.Select(x => $"'{x}'");
84 | string joinedValues = string.Join(",", convertedStrings);
85 |
86 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.In)]} ({joinedValues}) ");
87 | return this;
88 | }
89 | public IConditionQueryBuilder In(params decimal[] values)
90 | {
91 | string joinedValues = string.Join(",", values);
92 |
93 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.In)]} ({joinedValues}) ");
94 | return this;
95 | }
96 | public IConditionQueryBuilder In(params double[] values)
97 | {
98 | string joinedValues = string.Join(",", values);
99 |
100 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.In)]} ({joinedValues}) ");
101 | return this;
102 | }
103 | public IConditionQueryBuilder In(params int[] values)
104 | {
105 | string joinedValues = string.Join(",", values);
106 |
107 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.In)]} ({joinedValues}) ");
108 | return this;
109 | }
110 |
111 | public IConditionQueryBuilder GreaterThan(int value)
112 | {
113 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.GreaterThan)]} {value} ");
114 | return this;
115 | }
116 | public IConditionQueryBuilder GreaterThan(decimal value)
117 | {
118 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.GreaterThan)]} {value} ");
119 | return this;
120 | }
121 | public IConditionQueryBuilder GreaterThan(double value)
122 | {
123 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.GreaterThan)]} {value} ");
124 | return this;
125 | }
126 |
127 | public IConditionQueryBuilder LessThan(int value)
128 | {
129 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.LessThan)]} {value} ");
130 | return this;
131 | }
132 | public IConditionQueryBuilder LessThan(decimal value)
133 | {
134 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.LessThan)]} {value} ");
135 | return this;
136 | }
137 | public IConditionQueryBuilder LessThan(double value)
138 | {
139 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.LessThan)]} {value} ");
140 | return this;
141 | }
142 |
143 | public IConditionalFunctionQueryBuilder And(string column)
144 | {
145 | if (string.IsNullOrEmpty(column))
146 | throw new ArgumentNullException($"Column name is null or empty!");
147 |
148 | _conditions.Add($"{Symbols[nameof(IConditionQueryBuilder.And)]} {GetColumnName(column)} ");
149 | return this;
150 | }
151 |
152 | public IConditionalFunctionQueryBuilder Or(string column)
153 | {
154 | if (string.IsNullOrEmpty(column))
155 | throw new ArgumentNullException($"Column name is null or empty!");
156 |
157 | _conditions.Add($"{Symbols[nameof(IConditionQueryBuilder.Or)]} {GetColumnName(column)} ");
158 | return this;
159 | }
160 |
161 | public IConditionalFunctionQueryBuilder Where(string column)
162 | {
163 | if (string.IsNullOrEmpty(column))
164 | throw new ArgumentNullException($"Column name is null or empty!");
165 |
166 | _conditions.Add($"{WHERE} {GetColumnName(column)} ");
167 | return this;
168 | }
169 |
170 | #endregion
171 |
172 | protected override string Build(QueryBuilderContext? context = null)
173 | {
174 | StringBuilder builder = new StringBuilder();
175 |
176 | builder.Append($"{DELETE} {FROM} {_tableName} ");
177 |
178 | BuildChain(builder, context);
179 |
180 | if (_conditions.Any())
181 | {
182 | foreach (string condition in _conditions)
183 | {
184 | builder.Append(condition);
185 | }
186 | }
187 |
188 | return builder.ToString();
189 | }
190 |
191 | string IQueryBuilder.Build()
192 | => Build(null);
193 |
194 | private string GetColumnName(string column)
195 | => $"{column}";
196 | }
197 | }
198 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/QueryBuilders/SQLiteFromQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Common;
2 | using ARLiteNET.SQLite.QueryBuilders;
3 | using System;
4 | using System.Text;
5 |
6 | namespace ARLiteNET.SQLite
7 | {
8 | public class SQLiteFromQueryBuilder : ChainQueryBuilder,
9 | IFromQueryBuilder
10 | {
11 | const string FROM = "FROM";
12 | const string AS = "AS";
13 |
14 | private readonly string _tableName;
15 | private string _alias;
16 |
17 | private bool HasAlias => !string.IsNullOrWhiteSpace(_alias);
18 | private string DefaultAlias => HasAlias ? _alias : _tableName;
19 |
20 | public SQLiteFromQueryBuilder(string tableName, ChainQueryBuilder innerQueryBuilder) : base(innerQueryBuilder)
21 | => _tableName = tableName ?? throw new ArgumentNullException(nameof(tableName));
22 |
23 | public IFromQueryBuilder Alias(string alias)
24 | {
25 | _alias = alias;
26 | return this;
27 | }
28 |
29 | public IWhereQueryBuilder Where(string column)
30 | => new SQLiteWhereQueryBuilder(DefaultAlias, column, this);
31 |
32 | public IOrderByQueryBuilder OrderBy()
33 | => new SQLiteOrderByQueryBuilder(this);
34 |
35 | protected override string Build(QueryBuilderContext? context = null)
36 | {
37 | StringBuilder builder = new StringBuilder();
38 |
39 | context = new QueryBuilderContext(DefaultAlias);
40 |
41 | BuildChain(builder, context);
42 |
43 | if (HasAlias)
44 | {
45 | builder.Append($"{FROM} {_tableName} {AS} {_alias} ");
46 | }
47 | else
48 | {
49 | builder.Append($"{FROM} {_tableName} ");
50 | }
51 |
52 | return builder.ToString();
53 | }
54 |
55 | public string Build() => Build(null);
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/QueryBuilders/SQLiteInsertQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Common;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 |
7 | namespace ARLiteNET.SQLite
8 | {
9 | public class SQLiteInsertQueryBuilder : IInsertQueryBuilder
10 | {
11 | const string INSERT = "INSERT INTO";
12 | const string VALUES = "VALUES";
13 |
14 | private readonly string _tableName;
15 | private readonly List _values;
16 |
17 | public SQLiteInsertQueryBuilder(string table)
18 | {
19 | _tableName = table ?? throw new ArgumentNullException(nameof(table));
20 | _values = new List();
21 | }
22 |
23 | public IInsertQueryBuilder Value(params ColumnValueObject[] valuesInfo)
24 | {
25 | if (valuesInfo == null)
26 | throw new ArgumentNullException("Insert value can't be null or empty!");
27 |
28 | _values.Add(valuesInfo);
29 |
30 | return this;
31 | }
32 |
33 | public string Build()
34 | {
35 | StringBuilder builder = new StringBuilder();
36 |
37 | builder.Append($"{INSERT} {_tableName} (");
38 |
39 | var columns = _values.SelectMany(x => x)
40 | .Select(x => x.Column)
41 | .Distinct();
42 |
43 | builder.AppendJoin(',', columns);
44 |
45 | builder.Append(")");
46 |
47 | builder.Append($" {VALUES}");
48 |
49 | for (int i = 0; i < _values.Count; i++)
50 | {
51 | builder.Append(" (");
52 |
53 | var valueArray = _values[i];
54 |
55 | for (int j = 0; j < valueArray.Length; j++)
56 | {
57 | if (valueArray[j].DataType == DataType.TEXT)
58 | {
59 | if (j == valueArray.Length - 1)
60 | builder.Append($"'{valueArray[j].Value}'");
61 | else
62 | builder.Append($"'{valueArray[j].Value}',");
63 | }
64 | else if (valueArray[j].DataType == DataType.BOOLEAN)
65 | {
66 | string literallStr = "NULL";
67 |
68 | if (bool.TryParse(valueArray[j].Value?.ToString(), out bool convertedBool))
69 | literallStr = convertedBool.ToString().Equals("True", StringComparison.OrdinalIgnoreCase) ? "1" : "0";
70 |
71 | if (j == valueArray.Length - 1)
72 | builder.Append($"{literallStr}");
73 | else
74 | builder.Append($"{literallStr},");
75 | }
76 | else if (valueArray[j].DataType == DataType.NULL)
77 | {
78 | if (j == valueArray.Length - 1)
79 | builder.Append($"NULL");
80 | else
81 | builder.Append($"NULL,");
82 | }
83 | else
84 | {
85 | if (j == valueArray.Length - 1)
86 | builder.Append($"{valueArray[j].Value}");
87 | else
88 | builder.Append($"{valueArray[j].Value},");
89 | }
90 | }
91 |
92 | if (i == _values.Count - 1)
93 | builder.Append(")");
94 | else
95 | builder.Append("),");
96 | }
97 |
98 | return builder.ToString();
99 | }
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/QueryBuilders/SQLiteOrderByQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Common;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace ARLiteNET.SQLite.QueryBuilders
6 | {
7 | public class SQLiteOrderByQueryBuilder : ChainQueryBuilder,
8 | IOrderByQueryBuilder
9 | {
10 | const string ORDER_BY = "ORDER BY";
11 | const string ASC = "ASC";
12 | const string DESC = "DESC";
13 |
14 | private readonly List _orderByValues;
15 |
16 | public SQLiteOrderByQueryBuilder(ChainQueryBuilder innerQueryBuilder) : base(innerQueryBuilder)
17 | {
18 | this._orderByValues = new List();
19 | }
20 |
21 | public IOrderByQueryBuilder Asc(string column)
22 | {
23 | _orderByValues.Add(new OrderByValue(ASC, column));
24 | return this;
25 | }
26 |
27 | public IOrderByQueryBuilder Desc(string column)
28 | {
29 | _orderByValues.Add(new OrderByValue(DESC, column));
30 | return this;
31 | }
32 |
33 | protected override string Build(QueryBuilderContext? context = null)
34 | {
35 | StringBuilder builder = new StringBuilder();
36 |
37 | BuildChain(builder, context);
38 |
39 | builder.Append($"{ORDER_BY} ");
40 |
41 | if (context.HasValue && context.Value.HasAlias)
42 | {
43 | for (int i = 0; i < _orderByValues.Count; i++)
44 | {
45 | if (i == (_orderByValues.Count - 1))
46 | {
47 | builder.Append($"{context.Value.HasAlias}.{_orderByValues[i].ColumnName} {_orderByValues[i].Order} ");
48 | }
49 | else
50 | {
51 | builder.Append($"{context.Value.HasAlias}.{_orderByValues[i].ColumnName} {_orderByValues[i].Order}, ");
52 | }
53 | }
54 | }
55 | else
56 | {
57 | for (int i = 0; i < _orderByValues.Count; i++)
58 | {
59 | if (i == (_orderByValues.Count - 1))
60 | {
61 | builder.Append($"{_orderByValues[i].ColumnName} {_orderByValues[i].Order} ");
62 | }
63 | else
64 | {
65 | builder.Append($"{_orderByValues[i].ColumnName} {_orderByValues[i].Order}, ");
66 | }
67 | }
68 | }
69 |
70 | return builder.ToString();
71 | }
72 |
73 | public string Build() => Build(null);
74 |
75 | struct OrderByValue
76 | {
77 | public string Order { get; }
78 | public string ColumnName { get; }
79 |
80 | public OrderByValue(string order, string columnName)
81 | {
82 | this.Order = order;
83 | this.ColumnName = columnName;
84 | }
85 | }
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/QueryBuilders/SQLiteQueryFactory.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Common;
2 | using ARLiteNET.SQLite.QueryBuilders;
3 |
4 | namespace ARLiteNET.SQLite
5 | {
6 | public static class SQLiteQueryFactory
7 | {
8 | public static ISelectQueryBuilder Select(params string[] columns)
9 | => new SQLiteSelectQueryBuilder(columns);
10 |
11 | public static IInsertQueryBuilder Insert(string table)
12 | => new SQLiteInsertQueryBuilder(table);
13 |
14 | public static IUpdateQueryBuilder Update(string table)
15 | => new SQLiteUpdateQueryBuilder(table);
16 |
17 | public static IDeleteQueryBuilder Delete(string table)
18 | => new SQLiteDeleteQueryBuilder(table);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/QueryBuilders/SQLiteSelectQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Common;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | namespace ARLiteNET.SQLite
6 | {
7 | public class SQLiteSelectQueryBuilder : ChainQueryBuilder,
8 | ISelectQueryBuilder
9 | {
10 | const string SELECT = "SELECT";
11 | const string ALL = "*";
12 |
13 | private IEnumerable _columns;
14 | private bool HasColumns => _columns != null && _columns.Any();
15 |
16 | public SQLiteSelectQueryBuilder(params string[] columns) : base(null) => _columns = columns;
17 |
18 | public ISelectQueryBuilder Select(params string[] columns)
19 | {
20 | _columns = columns;
21 | return this;
22 | }
23 |
24 | public ISelectQueryBuilder Select(IEnumerable columns)
25 | {
26 | _columns = columns;
27 | return this;
28 | }
29 |
30 | public IFromQueryBuilder From(string table)
31 | => new SQLiteFromQueryBuilder(table, this);
32 |
33 | public IJoinQueryBuilder Join(string table)
34 | {
35 | throw new System.NotImplementedException();
36 | }
37 |
38 | protected override string Build(QueryBuilderContext? context = null)
39 | {
40 | if (HasColumns)
41 | {
42 | string aggregatedColumn = string.Empty;
43 |
44 | if (context.HasValue)
45 | {
46 | IEnumerable columns = _columns.Select(x => $"{context.Value.Alias}.{x}");
47 | aggregatedColumn = string.Join(",", columns);
48 | }
49 | else
50 | {
51 | aggregatedColumn = string.Join(",", _columns);
52 | }
53 |
54 | return $"{SELECT} {aggregatedColumn} ";
55 | }
56 |
57 | return $"{SELECT} {ALL} ";
58 | }
59 |
60 | public string Build() => Build(null);
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/QueryBuilders/SQLiteUpdateQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Common;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 |
7 | namespace ARLiteNET.SQLite.QueryBuilders
8 | {
9 | public class SQLiteUpdateQueryBuilder : ChainQueryBuilder,
10 | IUpdateQueryBuilder,
11 | IConditionalFunctionQueryBuilder,
12 | IConditionQueryBuilder
13 | {
14 | const string UPDATE = "UPDATE";
15 | const string WHERE = "WHERE";
16 | const string SET = "SET";
17 |
18 | private readonly string _tableName;
19 | private readonly HashSet _values;
20 | private readonly List _conditions;
21 |
22 | readonly Dictionary Symbols = new Dictionary()
23 | {
24 | {nameof(IConditionalFunctionQueryBuilder.EqualTo), "="},
25 | {nameof(IConditionalFunctionQueryBuilder.NotEqualTo), "!="},
26 | {nameof(IConditionalFunctionQueryBuilder.GreaterThan), ">"},
27 | {nameof(IConditionalFunctionQueryBuilder.LessThan), "<"},
28 | {nameof(IConditionalFunctionQueryBuilder.In), "IN"},
29 | {nameof(IConditionQueryBuilder.And), "AND"},
30 | {nameof(IConditionQueryBuilder.Or), "OR"},
31 | };
32 |
33 | public SQLiteUpdateQueryBuilder(string tableName) : base(null)
34 | {
35 | _tableName = tableName ?? throw new ArgumentNullException($"Table can not be null or empty!");
36 | _values = new HashSet();
37 | _conditions = new List();
38 | }
39 |
40 | #region Where Condition Methods
41 | public IConditionQueryBuilder EqualTo(string value)
42 | {
43 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.EqualTo)]} '{value}' ");
44 | return this;
45 | }
46 | public IConditionQueryBuilder EqualTo(decimal value)
47 | {
48 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.EqualTo)]} {value} ");
49 | return this;
50 | }
51 | public IConditionQueryBuilder EqualTo(double value)
52 | {
53 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.EqualTo)]} {value} ");
54 | return this;
55 | }
56 | public IConditionQueryBuilder EqualTo(int value)
57 | {
58 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.EqualTo)]} {value} ");
59 | return this;
60 | }
61 |
62 | public IConditionQueryBuilder NotEqualTo(string value)
63 | {
64 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.NotEqualTo)]} '{value}' ");
65 | return this;
66 | }
67 | public IConditionQueryBuilder NotEqualTo(decimal value)
68 | {
69 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.NotEqualTo)]} {value} ");
70 | return this;
71 | }
72 | public IConditionQueryBuilder NotEqualTo(double value)
73 | {
74 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.NotEqualTo)]} {value} ");
75 | return this;
76 | }
77 | public IConditionQueryBuilder NotEqualTo(int value)
78 | {
79 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.NotEqualTo)]} {value} ");
80 | return this;
81 | }
82 |
83 | public IConditionQueryBuilder In(params string[] values)
84 | {
85 | IEnumerable convertedStrings = values.Select(x => $"'{x}'");
86 | string joinedValues = string.Join(",", convertedStrings);
87 |
88 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.In)]} ({joinedValues}) ");
89 | return this;
90 | }
91 | public IConditionQueryBuilder In(params decimal[] values)
92 | {
93 | string joinedValues = string.Join(",", values);
94 |
95 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.In)]} ({joinedValues}) ");
96 | return this;
97 | }
98 | public IConditionQueryBuilder In(params double[] values)
99 | {
100 | string joinedValues = string.Join(",", values);
101 |
102 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.In)]} ({joinedValues}) ");
103 | return this;
104 | }
105 | public IConditionQueryBuilder In(params int[] values)
106 | {
107 | string joinedValues = string.Join(",", values);
108 |
109 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.In)]} ({joinedValues}) ");
110 | return this;
111 | }
112 |
113 | public IConditionQueryBuilder GreaterThan(int value)
114 | {
115 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.GreaterThan)]} {value} ");
116 | return this;
117 | }
118 | public IConditionQueryBuilder GreaterThan(decimal value)
119 | {
120 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.GreaterThan)]} {value} ");
121 | return this;
122 | }
123 | public IConditionQueryBuilder GreaterThan(double value)
124 | {
125 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.GreaterThan)]} {value} ");
126 | return this;
127 | }
128 |
129 | public IConditionQueryBuilder LessThan(int value)
130 | {
131 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.LessThan)]} {value} ");
132 | return this;
133 | }
134 | public IConditionQueryBuilder LessThan(decimal value)
135 | {
136 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.LessThan)]} {value} ");
137 | return this;
138 | }
139 | public IConditionQueryBuilder LessThan(double value)
140 | {
141 | _conditions.Add($"{Symbols[nameof(IConditionalFunctionQueryBuilder.LessThan)]} {value} ");
142 | return this;
143 | }
144 |
145 | public IConditionalFunctionQueryBuilder And(string column)
146 | {
147 | if (string.IsNullOrEmpty(column))
148 | throw new ArgumentNullException($"Column name is null or empty!");
149 |
150 | _conditions.Add($"{Symbols[nameof(IConditionQueryBuilder.And)]} {GetColumnName(column)} ");
151 | return this;
152 | }
153 | public IConditionalFunctionQueryBuilder Or(string column)
154 | {
155 | if (string.IsNullOrEmpty(column))
156 | throw new ArgumentNullException($"Column name is null or empty!");
157 |
158 | _conditions.Add($"{Symbols[nameof(IConditionQueryBuilder.Or)]} {GetColumnName(column)} ");
159 | return this;
160 | }
161 |
162 | public IConditionalFunctionQueryBuilder Where(string column)
163 | {
164 | if (string.IsNullOrEmpty(column))
165 | throw new ArgumentNullException($"Column name is null or empty!");
166 |
167 | _conditions.Add($"{WHERE} {GetColumnName(column)} ");
168 | return this;
169 | }
170 |
171 | #endregion
172 |
173 | public IUpdateQueryBuilder Set(ColumnValueObject valuesInfo)
174 | {
175 | _values.Add(valuesInfo);
176 |
177 | return this;
178 | }
179 |
180 | protected override string Build(QueryBuilderContext? context = null)
181 | {
182 | StringBuilder builder = new StringBuilder();
183 |
184 | builder.Append($"{UPDATE} {_tableName} {SET} ");
185 |
186 | if (_values.Count == 0)
187 | throw new Exception("There is not any column for generating update query!");
188 |
189 | foreach (ColumnValueObject columnValue in _values)
190 | {
191 | if (columnValue.DataType == DataType.TEXT)
192 | builder.Append($"{columnValue.Column} = '{columnValue.Value}',");
193 | else if (columnValue.DataType == DataType.BOOLEAN)
194 | {
195 | string literallStr = "NULL";
196 |
197 | if (bool.TryParse(columnValue.Value?.ToString(), out bool convertedBool))
198 | literallStr = convertedBool.ToString().Equals("True", StringComparison.OrdinalIgnoreCase) ? "1" : "0";
199 |
200 | builder.Append($"{columnValue.Column} = {literallStr},");
201 | }
202 | else if (columnValue.DataType == DataType.NULL)
203 | builder.Append($"{columnValue.Column} = NULL,");
204 | else
205 | builder.Append($"{columnValue.Column} = {columnValue.Value},");
206 | }
207 |
208 | // remove unexpected ',' symbol
209 | builder[builder.Length - 1] = ' ';
210 |
211 | BuildChain(builder, context);
212 |
213 | if (_conditions.Any())
214 | {
215 | foreach (string condition in _conditions)
216 | {
217 | builder.Append(condition);
218 | }
219 | }
220 |
221 | return builder.ToString();
222 | }
223 |
224 | string IQueryBuilder.Build()
225 | => Build(null);
226 |
227 | private string GetColumnName(string column)
228 | => $"{column}";
229 | }
230 | }
231 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/QueryBuilders/SQLiteWhereQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Common;
2 | using ARLiteNET.SQLite.QueryBuilders;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Text;
7 |
8 | namespace ARLiteNET.SQLite
9 | {
10 | public class SQLiteWhereQueryBuilder : ChainQueryBuilder,
11 | IWhereQueryBuilder,
12 | IConditionQueryBuilder
13 | {
14 | const string WHERE = "WHERE";
15 |
16 | readonly Dictionary Symbols = new Dictionary()
17 | {
18 | {nameof(IWhereQueryBuilder.EqualTo), "="},
19 | {nameof(IWhereQueryBuilder.NotEqualTo), "!="},
20 | {nameof(IWhereQueryBuilder.GreaterThan), ">"},
21 | {nameof(IWhereQueryBuilder.LessThan), "<"},
22 | {nameof(IWhereQueryBuilder.In), "IN"},
23 | {nameof(IConditionQueryBuilder.And), "AND"},
24 | {nameof(IConditionQueryBuilder.Or), "OR"},
25 | };
26 |
27 | private readonly string _firstColumn;
28 | private readonly string _tableNameOrAlias;
29 | private readonly List _conditions;
30 |
31 | public SQLiteWhereQueryBuilder(string tableNameOrAlias, string firstColumn, ChainQueryBuilder innerQueryBuilder) : base(innerQueryBuilder)
32 | {
33 | _tableNameOrAlias = tableNameOrAlias ?? throw new ArgumentNullException(nameof(tableNameOrAlias));
34 | _firstColumn = firstColumn ?? throw new ArgumentNullException(nameof(firstColumn));
35 |
36 | _conditions = new List
37 | {
38 | $"{WHERE} {GetColumnName(_firstColumn)} "
39 | };
40 | }
41 |
42 | public IConditionQueryBuilder EqualTo(string value)
43 | {
44 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.EqualTo)]} '{value}' ");
45 | return this;
46 | }
47 | public IConditionQueryBuilder EqualTo(double value)
48 | {
49 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.EqualTo)]} {value} ");
50 | return this;
51 | }
52 | public IConditionQueryBuilder EqualTo(int value)
53 | {
54 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.EqualTo)]} {value} ");
55 | return this;
56 | }
57 |
58 | public IConditionQueryBuilder NotEqualTo(string value)
59 | {
60 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.NotEqualTo)]} '{value}' ");
61 | return this;
62 | }
63 | public IConditionQueryBuilder NotEqualTo(double value)
64 | {
65 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.NotEqualTo)]} {value} ");
66 | return this;
67 | }
68 | public IConditionQueryBuilder NotEqualTo(int value)
69 | {
70 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.NotEqualTo)]} {value} ");
71 | return this;
72 | }
73 |
74 | public IConditionQueryBuilder In(params string[] values)
75 | {
76 | IEnumerable convertedStrings = values.Select(x => $"'{x}'");
77 | string joinedValues = string.Join(",", convertedStrings);
78 |
79 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.In)]} ({joinedValues}) ");
80 | return this;
81 | }
82 | public IConditionQueryBuilder In(params double[] values)
83 | {
84 | string joinedValues = string.Join(",", values);
85 |
86 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.In)]} ({joinedValues}) ");
87 | return this;
88 | }
89 | public IConditionQueryBuilder In(params int[] values)
90 | {
91 | string joinedValues = string.Join(",", values);
92 |
93 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.In)]} ({joinedValues}) ");
94 | return this;
95 | }
96 |
97 | public IConditionQueryBuilder GreaterThan(int value)
98 | {
99 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.GreaterThan)]} {value} ");
100 | return this;
101 | }
102 | public IConditionQueryBuilder GreaterThan(double value)
103 | {
104 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.GreaterThan)]} {value} ");
105 | return this;
106 | }
107 |
108 | public IConditionQueryBuilder LessThan(int value)
109 | {
110 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.LessThan)]} {value} ");
111 | return this;
112 | }
113 | public IConditionQueryBuilder LessThan(decimal value)
114 | {
115 | _conditions.Add($"{Symbols[nameof(IWhereQueryBuilder.LessThan)]} {value} ");
116 | return this;
117 | }
118 |
119 | public IWhereQueryBuilder And(string column)
120 | {
121 | _conditions.Add($"{Symbols[nameof(IConditionQueryBuilder.And)]} {GetColumnName(column)} ");
122 | return this;
123 | }
124 |
125 | public IWhereQueryBuilder Or(string column)
126 | {
127 | _conditions.Add($"{Symbols[nameof(IConditionQueryBuilder.Or)]} {GetColumnName(column)} ");
128 | return this;
129 | }
130 | public IOrderByQueryBuilder OrderBy()
131 | => new SQLiteOrderByQueryBuilder(this);
132 |
133 | protected override string Build(QueryBuilderContext? context = null)
134 | {
135 | StringBuilder builder = new StringBuilder();
136 |
137 | BuildChain(builder, context);
138 |
139 | if (_conditions.Any())
140 | {
141 | foreach (string condition in _conditions)
142 | {
143 | builder.Append(condition);
144 | }
145 | }
146 |
147 | return builder.ToString();
148 | }
149 |
150 | string IQueryBuilder.Build() => Build(null);
151 |
152 | private string GetColumnName(string column)
153 | => $"{_tableNameOrAlias}.{column}";
154 | }
155 | }
156 |
--------------------------------------------------------------------------------
/ARLiteNET.SQLite/SQLiteDeclarativeExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace ARLiteNET.SQLite
4 | {
5 | ///
6 | /// Extensions of declarative approach for SQLite
7 | ///
8 | public static class SQLiteDeclarativeExtensions
9 | {
10 | public static SelectCommandBuilder Select(this
11 | AdoCommandBuilder builder) => builder.Select(nameof(T));
12 |
13 | public static SelectCommandBuilder Select(this
14 | AdoCommandBuilder builder, string tableName)
15 | {
16 | var selectQueryBuilder = SQLiteQueryFactory.Select();
17 | return new SelectCommandBuilder(tableName, builder, selectQueryBuilder);
18 | }
19 |
20 | public static InsertCommandBuilder Insert(this
21 | AdoCommandBuilder builder, string tableName, T instance)
22 | {
23 | var insertQueryBuilder = SQLiteQueryFactory.Insert(tableName);
24 | return new InsertCommandBuilder(instance, builder, insertQueryBuilder);
25 | }
26 |
27 | public static UpdateCommandBuilder Update(this
28 | AdoCommandBuilder builder, string tableName, T instance)
29 | {
30 | var updateQueryBuilder = SQLiteQueryFactory.Update(tableName);
31 | return new UpdateCommandBuilder(instance, builder, updateQueryBuilder);
32 | }
33 |
34 | public static DeleteCommandBuilder Delete(this
35 | AdoCommandBuilder builder, string tableName)
36 | {
37 | var deleteQueryBuilder = SQLiteQueryFactory.Delete(tableName);
38 | return new DeleteCommandBuilder(builder, deleteQueryBuilder);
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/ARLiteNET.Unit.Tests/ARLiteConfigurationResolverTests.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using ARLiteNET.Core;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 |
5 | namespace ARLiteNET.Lib.Unit.Tests
6 | {
7 | [TestClass]
8 | public class ARLiteConfigurationResolverTests
9 | {
10 | [TestMethod]
11 | public void ResolveConfigurationFactory_WhenGivenNull_ShouldThrowArgumentNullException()
12 | => Assert.ThrowsException(() => ARLiteConfigurationResolver.ResolveConfigurationFactory(null));
13 |
14 | [TestMethod]
15 | public void ResolveConfigurationFactory_WhenGivenInvalidType_ShouldThrowException()
16 | => Assert.ThrowsException(() => ARLiteConfigurationResolver.ResolveConfigurationFactory(typeof(ARLiteConfigurationResolverTests)));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/ARLiteNET.Unit.Tests/ARLiteNET.Unit.Tests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net6.0
5 | enable
6 |
7 | false
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/ARLiteNET.Unit.Tests/ExpressionMemberTests.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Core;
2 | using ARLiteNET.Lib.Unit.Tests.Stub;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using System;
5 | using System.Linq.Expressions;
6 |
7 | namespace ARLiteNET.Unit.Tests
8 | {
9 | [TestClass]
10 | public class ExpressionMemberTests
11 | {
12 | [TestMethod]
13 | public void Create_WhenGivenValidPropertyExpression_ShouldReturnPropertyNameByModel()
14 | {
15 | const string expected = nameof(UserDtoStub.Id);
16 | Expression> lambda = (x) => x.Id;
17 |
18 | ExpressionMember vMember = ExpressionMember.Create(lambda);
19 |
20 | Assert.AreEqual(expected, vMember.Name);
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ARLiteNET.Unit.Tests/MapperTests.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Core.Mappers;
2 | using ARLiteNET.Lib.Unit.Tests.Stub;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using System;
5 | using System.Linq;
6 |
7 | namespace ARLiteNET.Lib.Unit.Tests
8 | {
9 | [TestClass]
10 | public class MapperTests
11 | {
12 | [TestMethod]
13 | public void MapInstance_WhenGivenValidArguments_ShouldReturnValidMappedObject()
14 | {
15 | const int expectedCount = 4;
16 | UserDtoStub instance = new ()
17 | { Id = 1, Name = "Rasul", IsActive = true, BirthDate = DateTime.Now };
18 |
19 | MapType mapTypeInstance = Mapper.MapInstance(instance);
20 |
21 | Assert.IsNotNull(mapTypeInstance);
22 | Assert.IsTrue(mapTypeInstance.HasMembers);
23 | Assert.AreEqual(mapTypeInstance.Members.Count(), expectedCount);
24 | }
25 | }
26 | }
--------------------------------------------------------------------------------
/ARLiteNET.Unit.Tests/Stub/UserDtoStub.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace ARLiteNET.Lib.Unit.Tests.Stub
4 | {
5 | public class UserDtoStub
6 | {
7 | public long Id { get; set; }
8 | public string Name { get; set; }
9 | public bool IsActive { get; set; }
10 | public DateTime? BirthDate { get; set; }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/ARLiteNET.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.0.32014.148
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ARLiteNET", "ARLiteNET\ARLiteNET.csproj", "{4A0C97C3-5D64-4B9E-A4EC-0277BD28433D}"
7 | EndProject
8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ARLiteNET.Unit.Tests", "ARLiteNET.Unit.Tests\ARLiteNET.Unit.Tests.csproj", "{84656FAF-EAA9-4024-A21C-153461A5C295}"
9 | EndProject
10 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ARLiteNET.SQLite", "ARLiteNET.SQLite\ARLiteNET.SQLite.csproj", "{4079AC44-37A4-4791-A38B-55EAE4383CED}"
11 | EndProject
12 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ARLiteNET.SQLite.Integration.Tests", "ARLiteNET.SQLite.Integration.Tests\ARLiteNET.SQLite.Integration.Tests.csproj", "{FFDB952A-BFFD-4E3E-A8F7-50F7D0E1DB46}"
13 | EndProject
14 | Global
15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 | Debug|Any CPU = Debug|Any CPU
17 | Release|Any CPU = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
20 | {4A0C97C3-5D64-4B9E-A4EC-0277BD28433D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {4A0C97C3-5D64-4B9E-A4EC-0277BD28433D}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {4A0C97C3-5D64-4B9E-A4EC-0277BD28433D}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {4A0C97C3-5D64-4B9E-A4EC-0277BD28433D}.Release|Any CPU.Build.0 = Release|Any CPU
24 | {84656FAF-EAA9-4024-A21C-153461A5C295}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
25 | {84656FAF-EAA9-4024-A21C-153461A5C295}.Debug|Any CPU.Build.0 = Debug|Any CPU
26 | {84656FAF-EAA9-4024-A21C-153461A5C295}.Release|Any CPU.ActiveCfg = Release|Any CPU
27 | {84656FAF-EAA9-4024-A21C-153461A5C295}.Release|Any CPU.Build.0 = Release|Any CPU
28 | {4079AC44-37A4-4791-A38B-55EAE4383CED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
29 | {4079AC44-37A4-4791-A38B-55EAE4383CED}.Debug|Any CPU.Build.0 = Debug|Any CPU
30 | {4079AC44-37A4-4791-A38B-55EAE4383CED}.Release|Any CPU.ActiveCfg = Release|Any CPU
31 | {4079AC44-37A4-4791-A38B-55EAE4383CED}.Release|Any CPU.Build.0 = Release|Any CPU
32 | {FFDB952A-BFFD-4E3E-A8F7-50F7D0E1DB46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
33 | {FFDB952A-BFFD-4E3E-A8F7-50F7D0E1DB46}.Debug|Any CPU.Build.0 = Debug|Any CPU
34 | {FFDB952A-BFFD-4E3E-A8F7-50F7D0E1DB46}.Release|Any CPU.ActiveCfg = Release|Any CPU
35 | {FFDB952A-BFFD-4E3E-A8F7-50F7D0E1DB46}.Release|Any CPU.Build.0 = Release|Any CPU
36 | EndGlobalSection
37 | GlobalSection(SolutionProperties) = preSolution
38 | HideSolutionNode = FALSE
39 | EndGlobalSection
40 | GlobalSection(ExtensibilityGlobals) = postSolution
41 | SolutionGuid = {CC0EDD94-D849-4A35-B969-8312E61F5DF0}
42 | EndGlobalSection
43 | EndGlobal
44 |
--------------------------------------------------------------------------------
/ARLiteNET/ARLiteNET.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.1
5 | enable
6 | 0.0.1
7 |
8 |
9 |
10 |
11 | <_Parameter1>$(MSBuildProjectName).Unit.Tests
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/ARLiteNET/ARLiteObject.cs:
--------------------------------------------------------------------------------
1 | using ARLiteNET.Core;
2 | using ARLiteNET.Exceptions;
3 | using System.Collections.Generic;
4 |
5 | namespace ARLiteNET
6 | {
7 | ///
8 | ///
9 | ///
10 | public abstract class ARLiteObject
11 | {
12 | protected IEnumerable RunEnumerable(IDbCommandBuilder commandBuilder) where T : new()
13 | {
14 | var dbCommand = commandBuilder.Build();
15 |
16 | var result = AdoCommandExecuter.Reader(dbCommand);
17 |
18 | if (!result.IsSuccess)
19 | {
20 | throw new ARLiteObjectException("Occur error!", result.Errors);
21 | }
22 |
23 | return result.Object;
24 | }
25 |
26 | protected T RunScalar(IDbCommandBuilder commandBuilder)
27 | {
28 | var dbCommand = commandBuilder.Build();
29 |
30 | var result = AdoCommandExecuter.PrimitiveScalar(dbCommand);
31 |
32 | if (!result.IsSuccess)
33 | {
34 | throw new ARLiteObjectException("Occur error!", result.Errors);
35 | }
36 |
37 | return (T)result.Object;
38 | }
39 |
40 | protected T Run(IDbCommandBuilder commandBuilder) where T : new()
41 | {
42 | var dbCommand = commandBuilder.Build();
43 |
44 | var result = AdoCommandExecuter.Scalar(dbCommand);
45 |
46 | if (!result.IsSuccess)
47 | {
48 | throw new ARLiteObjectException("Occur error!", result.Errors);
49 | }
50 |
51 | return result.Object;
52 | }
53 |
54 | protected int Run(IDbCommandBuilder commandBuilder)
55 | {
56 | var dbCommand = commandBuilder.Build();
57 |
58 | var result = AdoCommandExecuter.Query(dbCommand);
59 |
60 | if (!result.IsSuccess)
61 | {
62 | throw new ARLiteObjectException("Occur error!", result.Errors);
63 | }
64 |
65 | return result.AffectedRows;
66 | }
67 |
68 | protected AdoCommandBuilder Query()
69 | {
70 | var resolvedFactory = ARLiteConfigurationResolver.ResolveConfigurationFactory(this.GetType());
71 | var adoConnectionString = resolvedFactory.CreateConnectionString();
72 |
73 | var commandBuilder = new AdoCommandBuilder(adoConnectionString);
74 |
75 | return commandBuilder;
76 | }
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/ChainQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | using System.Text;
2 |
3 | namespace ARLiteNET.Common
4 | {
5 | public abstract class ChainQueryBuilder
6 | {
7 | protected readonly ChainQueryBuilder QueryBuilder;
8 | protected bool HasNestedQueryBuilder => QueryBuilder != null;
9 |
10 | public ChainQueryBuilder(ChainQueryBuilder innerQueryBuilder) => QueryBuilder = innerQueryBuilder;
11 |
12 | protected void BuildChain(StringBuilder builder)
13 | {
14 | BuildChain(builder, null);
15 | }
16 |
17 | protected void BuildChain(StringBuilder builder, QueryBuilderContext? context)
18 | {
19 | if (HasNestedQueryBuilder)
20 | {
21 | string nestedQuery = QueryBuilder.Build(context);
22 | builder.Append(nestedQuery);
23 | }
24 | }
25 |
26 | protected abstract string Build(QueryBuilderContext? context = null);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/IQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | namespace ARLiteNET.Common
2 | {
3 | public interface IQueryBuilder
4 | {
5 | string Build();
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/ColumnValueObject.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace ARLiteNET.Common
3 | {
4 | public struct ColumnValueObject
5 | {
6 | public string Column { get; }
7 | public object Value { get; }
8 | public DataType DataType { get; }
9 |
10 | public ColumnValueObject(string column,
11 | object value,
12 | DataType dataType)
13 | {
14 | Column = column;
15 | Value = value;
16 | DataType = dataType;
17 | }
18 |
19 | public override bool Equals(object obj)
20 | {
21 | return this.GetHashCode() == obj.GetHashCode();
22 | }
23 |
24 | public override int GetHashCode()
25 | {
26 | return Column.GetHashCode();
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/DataType.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace ARLiteNET.Common
3 | {
4 | public enum DataType : byte
5 | {
6 | NULL, INTEGER, REAL, TEXT, BLOB, BOOLEAN
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/IConditionQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | namespace ARLiteNET.Common
2 | {
3 | public interface IConditionQueryBuilder : IQueryBuilder
4 | {
5 | TResultInterface And(string column);
6 | TResultInterface Or(string column);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/IConditionalFunctionQueryBuilder.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace ARLiteNET.Common
3 | {
4 | public interface IConditionalFunctionQueryBuilder : IQueryBuilder
5 | {
6 | IConditionQueryBuilder EqualTo(string value);
7 | IConditionQueryBuilder EqualTo(decimal value);
8 | IConditionQueryBuilder EqualTo(double value);
9 | IConditionQueryBuilder EqualTo(int value);
10 |
11 | IConditionQueryBuilder NotEqualTo(string value);
12 | IConditionQueryBuilder NotEqualTo(decimal value);
13 | IConditionQueryBuilder NotEqualTo(double value);
14 | IConditionQueryBuilder NotEqualTo(int value);
15 |
16 | IConditionQueryBuilder In(params string[] values);
17 | IConditionQueryBuilder In(params decimal[] values);
18 | IConditionQueryBuilder In(params double[] values);
19 | IConditionQueryBuilder In(params int[] values);
20 |
21 | IConditionQueryBuilder GreaterThan(int value);
22 | IConditionQueryBuilder GreaterThan(decimal value);
23 | IConditionQueryBuilder GreaterThan(double value);
24 |
25 | IConditionQueryBuilder LessThan(int value);
26 | IConditionQueryBuilder LessThan(decimal value);
27 | IConditionQueryBuilder LessThan(double value);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/IDeleteQueryBuilder.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace ARLiteNET.Common
3 | {
4 | public interface IDeleteQueryBuilder : IQueryBuilder
5 | {
6 | IConditionalFunctionQueryBuilder Where(string column);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/IFromQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | namespace ARLiteNET.Common
2 | {
3 | public interface IFromQueryBuilder : IQueryBuilder
4 | {
5 | IFromQueryBuilder Alias(string alias);
6 | IWhereQueryBuilder Where(string column);
7 | IOrderByQueryBuilder OrderBy();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/IInsertQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | namespace ARLiteNET.Common
2 | {
3 | public interface IInsertQueryBuilder : IQueryBuilder
4 | {
5 | IInsertQueryBuilder Value(params ColumnValueObject[] valuesInfo);
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/IJoinQueryBuilder.cs:
--------------------------------------------------------------------------------
1 |
2 |
3 | namespace ARLiteNET.Common
4 | {
5 | public interface IJoinQueryBuilder
6 | {
7 |
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/IOrderByQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | namespace ARLiteNET.Common
2 | {
3 | public interface IOrderByQueryBuilder : IQueryBuilder
4 | {
5 | IOrderByQueryBuilder Asc(string column);
6 | IOrderByQueryBuilder Desc(string column);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/ISelectQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace ARLiteNET.Common
4 | {
5 | public interface ISelectQueryBuilder : IQueryBuilder
6 | {
7 | ISelectQueryBuilder Select(params string[] columns);
8 | ISelectQueryBuilder Select(IEnumerable columns);
9 | IFromQueryBuilder From(string table);
10 | IJoinQueryBuilder Join(string table);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/IUpdateQueryBuilder.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace ARLiteNET.Common
3 | {
4 | public interface IUpdateQueryBuilder : IQueryBuilder
5 | {
6 | IUpdateQueryBuilder Set(ColumnValueObject valuesInfo);
7 | IConditionalFunctionQueryBuilder Where(string column);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/Query/IWhereQueryBuilder.cs:
--------------------------------------------------------------------------------
1 | namespace ARLiteNET.Common
2 | {
3 | public interface IWhereQueryBuilder : IQueryBuilder
4 | {
5 | IOrderByQueryBuilder OrderBy();
6 |
7 | IConditionQueryBuilder EqualTo(string value);
8 | IConditionQueryBuilder EqualTo(double value);
9 | IConditionQueryBuilder EqualTo(int value);
10 |
11 | IConditionQueryBuilder NotEqualTo(string value);
12 | IConditionQueryBuilder NotEqualTo(double value);
13 | IConditionQueryBuilder NotEqualTo(int value);
14 |
15 |
16 | IConditionQueryBuilder In(params string[] values);
17 | IConditionQueryBuilder In(params double[] values);
18 | IConditionQueryBuilder In(params int[] values);
19 |
20 | IConditionQueryBuilder GreaterThan(int value);
21 | IConditionQueryBuilder GreaterThan(double value);
22 |
23 | IConditionQueryBuilder LessThan(int value);
24 | IConditionQueryBuilder LessThan(decimal value);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/ARLiteNET/Common/QueryBuilderContext.cs:
--------------------------------------------------------------------------------
1 | namespace ARLiteNET.Common
2 | {
3 | public struct QueryBuilderContext
4 | {
5 | public string Alias { get; }
6 |
7 | public bool HasAlias => !string.IsNullOrWhiteSpace(Alias);
8 |
9 | public QueryBuilderContext(string alias) => Alias = alias;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/ARLiteNET/Core/AdoCommandExecuter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Data;
4 | using System.Reflection;
5 |
6 | namespace ARLiteNET
7 | {
8 | public static class AdoCommandExecuter
9 | {
10 | public static AdoExecuterResult