Skip to content

Commit 386555c

Browse files
committed
refactor View
1 parent a4fb4e1 commit 386555c

File tree

4 files changed

+93
-67
lines changed

4 files changed

+93
-67
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
2+
using MiniSQL.Api.Controllers;
3+
using MiniSQL.BufferManager.Controllers;
4+
using MiniSQL.CatalogManager;
5+
using MiniSQL.IndexManager.Controllers;
6+
using MiniSQL.IndexManager.Interfaces;
7+
using MiniSQL.Interpreter;
8+
using MiniSQL.Library.Interfaces;
9+
using MiniSQL.RecordManager;
10+
11+
namespace MiniSQL.Startup.Controllers
12+
{
13+
public class ApiPagerBuilder
14+
{
15+
public (IApi, Pager) UseDatabase(string databaseName)
16+
{
17+
// init
18+
string dbPath = $"./{databaseName}.minidb";
19+
Pager pager = new Pager(dbPath, 1024 * 8, 400);
20+
FreeList freeList = new FreeList(pager);
21+
IIndexManager bTreeController = new BTreeController(pager, freeList, 40);
22+
IInterpreter interpreter = new Parsing();
23+
ICatalogManager catalogManager = new Catalog(databaseName);
24+
IRecordManager recordManager = new RecordContext(pager, bTreeController);
25+
IApi api = new ApiController(interpreter, catalogManager, recordManager);
26+
27+
return (api, pager);
28+
}
29+
}
30+
}
Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,67 @@
11

2-
using MiniSQL.Api.Controllers;
2+
using System.Collections.Generic;
3+
using System.IO;
34
using MiniSQL.BufferManager.Controllers;
4-
using MiniSQL.CatalogManager;
5-
using MiniSQL.IndexManager.Controllers;
6-
using MiniSQL.IndexManager.Interfaces;
7-
using MiniSQL.Interpreter;
85
using MiniSQL.Library.Interfaces;
9-
using MiniSQL.RecordManager;
6+
using MiniSQL.Library.Models;
107

118
namespace MiniSQL.Startup.Controllers
129
{
1310
public class DatabaseController
1411
{
15-
public (IApi, Pager) UseDatabase(string databaseName)
12+
private readonly ApiPagerBuilder _builder;
13+
14+
private IApi _api;
15+
private Pager _pager;
16+
17+
public bool IsUsingDatabase { get; private set; } = false;
18+
private string nameOfDatabaseInUse;
19+
20+
public DatabaseController(ApiPagerBuilder builder)
1621
{
22+
_builder = builder;
23+
}
24+
25+
// use database
26+
public void ChangeContext(string newDatabaseName)
27+
{
28+
if (IsUsingDatabase)
29+
{
30+
_pager.Close();
31+
}
1732
// init
18-
string dbPath = $"./{databaseName}.minidb";
19-
Pager pager = new Pager(dbPath, 1024 * 8, 400);
20-
FreeList freeList = new FreeList(pager);
21-
IIndexManager bTreeController = new BTreeController(pager, freeList, 40);
22-
IInterpreter interpreter = new Parsing();
23-
ICatalogManager catalogManager = new Catalog(databaseName);
24-
IRecordManager recordManager = new RecordContext(pager, bTreeController);
25-
IApi api = new ApiController(interpreter, catalogManager, recordManager);
26-
27-
return (api, pager);
33+
this.IsUsingDatabase = true;
34+
this.nameOfDatabaseInUse = newDatabaseName;
35+
(_api, _pager) = _builder.UseDatabase(newDatabaseName);
36+
}
37+
38+
// delete database file
39+
public void DropDatabase(string databaseName)
40+
{
41+
if (nameOfDatabaseInUse == databaseName)
42+
{
43+
_pager.Close();
44+
IsUsingDatabase = false;
45+
}
46+
File.Delete($"{databaseName}.minidb");
47+
File.Delete($"{databaseName}.indices.txt");
48+
File.Delete($"{databaseName}.tables.txt");
49+
}
50+
51+
public void ClosePager()
52+
{
53+
_pager.Close();
54+
}
55+
56+
public void FlushPages()
57+
{
58+
_pager.CleanAllPagesFromMainMemory();
59+
}
60+
61+
public List<SelectResult> Query(string input)
62+
{
63+
List<SelectResult> selectResults = _api.Query(input.ToString());
64+
return selectResults;
2865
}
2966
}
3067
}

src/MiniSQL.Startup/Controllers/View.cs

Lines changed: 7 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Diagnostics;
4-
using System.IO;
54
using System.Text;
65
using System.Text.RegularExpressions;
7-
using MiniSQL.BufferManager.Controllers;
86
using MiniSQL.IndexManager.Interfaces;
97
using MiniSQL.Library.Interfaces;
108
using MiniSQL.Library.Models;
@@ -13,18 +11,11 @@ namespace MiniSQL.Startup.Controllers
1311
{
1412
public class View
1513
{
16-
private bool isUsingDatabase = false;
17-
private string nameOfDatabaseInUse;
18-
private IApi _api;
19-
private Pager _pager;
2014
private readonly DatabaseController _databaseController;
2115
private bool isCtrlC = false;
2216

2317
public View(DatabaseController databaseController)
2418
{
25-
// ensure writing back when ctrl-c
26-
Console.CancelKeyPress += OnExit;
27-
2819
// print prologue
2920
Console.WriteLine();
3021
Console.WriteLine("Hello MiniSQL!");
@@ -33,32 +24,6 @@ public View(DatabaseController databaseController)
3324
_databaseController = databaseController;
3425
}
3526

36-
// TODO: wrap this to a class
37-
private void ChangeContext(string newDatabaseName)
38-
{
39-
if (isUsingDatabase)
40-
{
41-
_pager.Close();
42-
}
43-
// init
44-
this.isUsingDatabase = true;
45-
this.nameOfDatabaseInUse = newDatabaseName;
46-
(_api, _pager) = _databaseController.UseDatabase(newDatabaseName);
47-
}
48-
49-
// TODO: wrap this to a class
50-
private void DropDatabase(string databaseName)
51-
{
52-
if (nameOfDatabaseInUse == databaseName)
53-
{
54-
_pager.Close();
55-
isUsingDatabase = false;
56-
}
57-
File.Delete($"{databaseName}.minidb");
58-
File.Delete($"{databaseName}.indices.txt");
59-
File.Delete($"{databaseName}.tables.txt");
60-
}
61-
6227
// interactive(blocking) view of the whole solution
6328
public void Interactive()
6429
{
@@ -93,17 +58,17 @@ public void Interactive()
9358
if (Regex.IsMatch(line, @"(?i)\s*use\s*database\s*.*(?-i)"))
9459
{
9560
string databaseName = line.Split(new string[] { " ", "\n" }, StringSplitOptions.RemoveEmptyEntries)[2].TrimEnd(';');
96-
ChangeContext(databaseName);
61+
_databaseController.ChangeContext(databaseName);
9762
continue;
9863
}
9964
// drop database
10065
if (Regex.IsMatch(line, @"(?i)\s*drop\s*database\s*.*(?-i)"))
10166
{
10267
string databaseName = line.Split(new string[] { " ", "\n" }, StringSplitOptions.RemoveEmptyEntries)[2].TrimEnd(';');
103-
DropDatabase(databaseName);
68+
_databaseController.DropDatabase(databaseName);
10469
continue;
10570
}
106-
if (!this.isUsingDatabase)
71+
if (!_databaseController.IsUsingDatabase)
10772
{
10873
// WORKAROUND
10974
Console.WriteLine("[Error] No database in use");
@@ -112,7 +77,7 @@ public void Interactive()
11277
// flush all the dirty pages back to secondary memory and clean the main memory out of any page
11378
if (line == "flush")
11479
{
115-
_pager.CleanAllPagesFromMainMemory();
80+
_databaseController.FlushPages();
11681
continue;
11782
}
11883
input.Append(line);
@@ -128,7 +93,7 @@ public void Interactive()
12893
stopwatch.Start();
12994
try
13095
{
131-
List<SelectResult> selectResults = _api.Query(input.ToString());
96+
List<SelectResult> selectResults = _databaseController.Query(input.ToString());
13297
// print results for select statement
13398
foreach (var selectResult in selectResults)
13499
{
@@ -178,15 +143,8 @@ public void Interactive()
178143
input.Clear();
179144
}
180145
// save database file
181-
if (this.isUsingDatabase)
182-
_pager.Close();
183-
}
184-
185-
// BUG: NOT WORKING
186-
private void OnExit(object sender, EventArgs e)
187-
{
188-
isCtrlC = true;
189-
_pager.Close();
146+
if (_databaseController.IsUsingDatabase)
147+
_databaseController.ClosePager();
190148
}
191149

192150
private static void PrintRows(SelectResult result)

src/MiniSQL.Startup/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ class Program
66
{
77
static void Main(string[] args)
88
{
9-
DatabaseController controller = new DatabaseController();
9+
ApiPagerBuilder builder = new ApiPagerBuilder();
10+
DatabaseController controller = new DatabaseController(builder);
1011
View view = new View(controller);
1112
view.Interactive();
1213
}

0 commit comments

Comments
 (0)