Author SHA1 Message Date
owner 41dfb5809a Add stuff 2025-01-16 11:10:43 +01:00
owner 7abe904997 Testing search query 2025-01-05 15:37:18 +01:00
owner 8256d6a681 Merge pull request 'CompressDatabase' (#43) from CompressDatabase into main
Reviewed-on: #43
2024-12-30 17:47:33 +00:00
owner a6804be9f1 Implement database compression 2024-12-30 18:36:04 +01:00
owner 0cfbcea252 Testing database compression. 2024-12-24 14:23:23 +01:00
16 changed files with 305 additions and 96 deletions
+1
View File
@@ -87,6 +87,7 @@ public class Communication
} }
else else
{ {
// This is a workaround for the frontend not understanding a 0f as an actual float, so we use a very small float.
status.PercentageOfIpv4Scanned = 0.0000000001f; status.PercentageOfIpv4Scanned = 0.0000000001f;
} }
+14 -28
View File
@@ -49,22 +49,11 @@ public class IpScanner
threadsAmount = 256 / threads; threadsAmount = 256 / threads;
} }
WaitHandle[] waitHandle1; WaitHandle[] waitHandle = new WaitHandle[64];
WaitHandle[] waitHandle2;
if (threads <= 64)
{
waitHandle1 = new WaitHandle[threads];
waitHandle2 = new WaitHandle[threads];
}
else
{
waitHandle1 = new WaitHandle[64];
waitHandle2 = new WaitHandle[64];
}
int counter = 0; int counter = 0;
int counter2 = 0;
List<WaitHandle[]> waitHandles = [];
for (int i = 0; i < threads; i++) for (int i = 0; i < threads; i++)
{ {
@@ -78,31 +67,26 @@ public class IpScanner
Handle = handle Handle = handle
}; };
if (i < 64) if (counter < 64)
{ {
waitHandle1[counter] = handle; waitHandle[counter] = handle;
counter++; counter++;
}
else
{
waitHandle2[counter2] = handle;
counter2++;
}
Thread f = new (Scan!); Thread f = new (Scan!);
f.Start(scanSettings); f.Start(scanSettings);
Console.WriteLine($"Scanner thread ({i}) started"); Console.WriteLine($"Scanner thread ({i}) started");
Thread.Sleep(100); Thread.Sleep(100);
continue;
} }
List<WaitHandle[]> waitHandles = new(); counter = 0;
Console.WriteLine("Waithandle 1 count = " + waitHandle1.Length); waitHandles.Add(waitHandle);
Console.WriteLine("Waithandle 2 count = " + waitHandle2.Length);
waitHandles.Add(waitHandle1); waitHandle = new WaitHandle[64];
waitHandles.Add(waitHandle2); }
return waitHandles; return waitHandles;
} }
@@ -131,6 +115,7 @@ public class IpScanner
fourthByte = resumeNow.FourthByte; fourthByte = resumeNow.FourthByte;
} }
// Empty buffer so we use the lowest abstracted ping.Send() method.
byte[] buf = []; byte[] buf = [];
using Ping ping = new(); using Ping ping = new();
@@ -181,7 +166,8 @@ public class IpScanner
_ = IPAddress.TryParse(ip.ToString(), out IPAddress? address); _ = IPAddress.TryParse(ip.ToString(), out IPAddress? address);
if (address is not null) if (address is not null)
{ {
responseCode = ping.Send(address, _timeout, buf, null).Status; responseCode = IPStatus.TimedOut; //ping.Send(address, _timeout, buf, null).Status;
Thread.Sleep(_timeout);
} }
} }
catch catch
+2 -2
View File
@@ -59,7 +59,7 @@ public class ThreadHandler
{ {
Thread.Sleep(5000); // Let the database handler instantiate and warm up first. Thread.Sleep(5000); // Let the database handler instantiate and warm up first.
List<WaitHandle[]> wait = _ipScanner.Start(128); List<WaitHandle[]> wait = _ipScanner.Start(256);
for (int i = 0; i < wait.Count; i++) for (int i = 0; i < wait.Count; i++)
{ {
@@ -101,7 +101,7 @@ public class ThreadHandler
private void StartDiscardedDbHandler() private void StartDiscardedDbHandler()
{ {
WaitHandle[] wait = _dbHandler.Start(4); WaitHandle[] wait = _dbHandler.Start(5);
WaitHandle.WaitAll(wait); WaitHandle.WaitAll(wait);
+28
View File
@@ -17,13 +17,27 @@ public static partial class HttpClientHelper
using HttpClient client = new(); using HttpClient client = new();
if (port == 80) if (port == 80)
{
try
{ {
client.BaseAddress = new($"http://{url}"); client.BaseAddress = new($"http://{url}");
} }
catch
{
//
}
}
else else
{
try
{ {
client.BaseAddress = new($"https://{url}"); client.BaseAddress = new($"https://{url}");
} }
catch
{
//
}
}
client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.UserAgent.ParseAdd(UserAgentHeader); client.DefaultRequestHeaders.UserAgent.ParseAdd(UserAgentHeader);
@@ -86,13 +100,27 @@ public static partial class HttpClientHelper
using HttpClient client = new(); using HttpClient client = new();
if (port == 80) if (port == 80)
{
try
{ {
client.BaseAddress = new($"http://{url}"); client.BaseAddress = new($"http://{url}");
} }
catch
{
//
}
}
else else
{
try
{ {
client.BaseAddress = new($"https://{url}"); client.BaseAddress = new($"https://{url}");
} }
catch
{
//
}
}
client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.UserAgent.ParseAdd(UserAgentHeader); client.DefaultRequestHeaders.UserAgent.ParseAdd(UserAgentHeader);
+128 -26
View File
@@ -1,6 +1,7 @@
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Diagnostics; using System.Diagnostics;
using Microsoft.Data.Sqlite; using Microsoft.Data.Sqlite;
using Models.Helper;
using Models.Model.Backend; using Models.Model.Backend;
using Models.Model.External; using Models.Model.External;
@@ -14,9 +15,9 @@ public class DbHandler
private readonly ConcurrentQueue<ScannerResumeObject> _resumeQueue; private readonly ConcurrentQueue<ScannerResumeObject> _resumeQueue;
private readonly string _unfilteredConnectionString; private readonly string _unfilteredConnectionString;
private readonly string _discardedConnectionString;
private readonly string _filteredConnectionString; private readonly string _filteredConnectionString;
private readonly string _resumeConnectionString; private readonly string _resumeConnectionString;
private readonly string _compressedConnectionString;
private readonly List<string> _discardedConnectionStrings = []; private readonly List<string> _discardedConnectionStrings = [];
private const string InsertStatement = "PRAGMA synchronous = OFF; PRAGMA temp_store = MEMORY;" + private const string InsertStatement = "PRAGMA synchronous = OFF; PRAGMA temp_store = MEMORY;" +
@@ -75,6 +76,10 @@ public class DbHandler
" INSERT INTO Resume (ThreadNumber, StartRange, EndRange, FirstByte, SecondByte, ThirdByte, FourthByte)" + " INSERT INTO Resume (ThreadNumber, StartRange, EndRange, FirstByte, SecondByte, ThirdByte, FourthByte)" +
" VALUES (@threadNumber, @startRange, @endRange, @firstByte, @secondByte, @thirdByte, @fourthByte);"; " VALUES (@threadNumber, @startRange, @endRange, @firstByte, @secondByte, @thirdByte, @fourthByte);";
private const string InsertIntoCompressedDbConnectionString = "PRAGMA synchronous = OFF; PRAGMA temp_store = MEMORY;" +
" PRAGMA journal_mode = MEMORY; PRAGMA foreign_keys = off;" +
" INSERT INTO CompressedDatabases (DbNumber, Rows) VALUES (@dbNumber, @rows)";
private const string ReadUnfilteredStatement = "SELECT * FROM Unfiltered WHERE Id = @id;"; private const string ReadUnfilteredStatement = "SELECT * FROM Unfiltered WHERE Id = @id;";
private const string ReadUnfilteredIdsStatement = "SELECT Id FROM Unfiltered WHERE Filtered == 0;"; private const string ReadUnfilteredIdsStatement = "SELECT Id FROM Unfiltered WHERE Filtered == 0;";
private const string ReadFilteredStatement = "SELECT Title2, Url2 FROM Filtered WHERE (Url2 NOT NULL AND Url2 != '') AND (Title2 NOT NULL AND Title2 != '') ORDER BY Url2 DESC;"; private const string ReadFilteredStatement = "SELECT Title2, Url2 FROM Filtered WHERE (Url2 NOT NULL AND Url2 != '') AND (Title2 NOT NULL AND Title2 != '') ORDER BY Url2 DESC;";
@@ -82,6 +87,7 @@ public class DbHandler
private const string ReadFilteredIpStatement = "SELECT Ip1, Ip2, Ip3, Ip4 FROM Filtered WHERE Ip1 == @ip1 AND Ip2 == @ip1 AND Ip3 == @ip1 AND Ip4 == @ip1 ORDER BY Ip1 DESC LIMIT 1;"; private const string ReadFilteredIpStatement = "SELECT Ip1, Ip2, Ip3, Ip4 FROM Filtered WHERE Ip1 == @ip1 AND Ip2 == @ip1 AND Ip3 == @ip1 AND Ip4 == @ip1 ORDER BY Ip1 DESC LIMIT 1;";
private const string ReadDiscardedSeqIdsStatement = "SELECT seq FROM sqlite_sequence;"; private const string ReadDiscardedSeqIdsStatement = "SELECT seq FROM sqlite_sequence;";
private const string ReadAndDeleteResumeStatement = "SELECT * FROM Resume WHERE ThreadNumber == @threadNumber; DELETE FROM RESUME WHERE ThreadNumber == @threadNumber;"; private const string ReadAndDeleteResumeStatement = "SELECT * FROM Resume WHERE ThreadNumber == @threadNumber; DELETE FROM RESUME WHERE ThreadNumber == @threadNumber;";
private const string ReadCompressedDbRowsStatement = "SELECT Rows FROM CompressedDatabases;";
private const string UpdateUnfilteredStatement = "PRAGMA synchronous = OFF; PRAGMA temp_store = MEMORY; PRAGMA journal_mode = MEMORY; PRAGMA foreign_keys = off; UPDATE Unfiltered SET Filtered = 1 WHERE Id == @id;"; private const string UpdateUnfilteredStatement = "PRAGMA synchronous = OFF; PRAGMA temp_store = MEMORY; PRAGMA journal_mode = MEMORY; PRAGMA foreign_keys = off; UPDATE Unfiltered SET Filtered = 1 WHERE Id == @id;";
@@ -95,6 +101,7 @@ public class DbHandler
private bool _stop; private bool _stop;
private bool _pause; private bool _pause;
private bool _paused; private bool _paused;
private bool _compressing;
private int _contentWaitTime; private int _contentWaitTime;
private int _discardedWaitTime; private int _discardedWaitTime;
@@ -117,9 +124,9 @@ public class DbHandler
_basePath = basePath; _basePath = basePath;
_unfilteredConnectionString = $"Data Source={basePath}/Models/mydb.db"; _unfilteredConnectionString = $"Data Source={basePath}/Models/mydb.db";
_discardedConnectionString = $"Data Source={basePath}/Models/Discarded.db";
_filteredConnectionString = $"Data Source={basePath}/Models/Filtered.db"; _filteredConnectionString = $"Data Source={basePath}/Models/Filtered.db";
_resumeConnectionString = $"Data Source={basePath}/Models/ScannerResume.db"; _resumeConnectionString = $"Data Source={basePath}/Models/ScannerResume.db";
_compressedConnectionString = $"Data Source={basePath}/Models/CompressedDatabases.db";
} }
public void SetContentWaitTime(int waitTime) public void SetContentWaitTime(int waitTime)
@@ -225,7 +232,7 @@ public class DbHandler
Thread f = new (DiscardedDbHandler!); Thread f = new (DiscardedDbHandler!);
f.Start(discardedDbHandlerSetting); f.Start(discardedDbHandlerSetting);
Thread.Sleep(1000); Thread.Sleep(5000);
} }
return waitHandles; return waitHandles;
@@ -236,7 +243,9 @@ public class DbHandler
DiscardedDbHandlerSetting discardedDbHandlerSetting = (DiscardedDbHandlerSetting)obj; DiscardedDbHandlerSetting discardedDbHandlerSetting = (DiscardedDbHandlerSetting)obj;
Console.WriteLine($"Discarded DbHandler started with thread: ({discardedDbHandlerSetting.ThreadId})"); Console.WriteLine($"Discarded DbHandler started with thread: ({discardedDbHandlerSetting.ThreadId})");
string connectionString = CreateDiscardedDb(discardedDbHandlerSetting.ThreadId); (string absolutePath, string connectionString) = CreateDiscardedDb(discardedDbHandlerSetting.ThreadId);
int i = 0;
while (!_stop) while (!_stop)
{ {
@@ -247,9 +256,28 @@ public class DbHandler
continue; continue;
} }
if (i >= 50_000_000 && !_compressing)
{
_compressing = true;
i = 0;
InsertCompressedDatabase(discardedDbHandlerSetting.ThreadId, GetDiscardedIndexesForSpecificDb(connectionString));
int compressedDatabases = GetDatabasesHelper.GetTotalCompressedDatabases($"{_basePath}/Models");
CompressionHelper.CompressFile(absolutePath, $"{absolutePath}_{compressedDatabases}");
DropAndCreateDiscarded(discardedDbHandlerSetting.ThreadId);
_compressing = false;
}
_discardedQueue.TryDequeue(out Discarded queueItem); _discardedQueue.TryDequeue(out Discarded queueItem);
InsertDiscarded(queueItem, connectionString); InsertDiscarded(queueItem, connectionString);
i++;
} }
discardedDbHandlerSetting.Handle!.Set(); discardedDbHandlerSetting.Handle!.Set();
@@ -257,6 +285,30 @@ public class DbHandler
Console.WriteLine("Discarded DbHandler stopped."); Console.WriteLine("Discarded DbHandler stopped.");
} }
private void DropAndCreateDiscarded(int threadNumber)
{
string databaseName = $"Data Source={_basePath}/Models/Discarded{threadNumber}.db";
const string createStatement = "CREATE TABLE IF NOT EXISTS Discarded (Id INTEGER NOT NULL, Ip1 INTEGER NOT NULL, Ip2 INTEGER NOT NULL, Ip3 INTEGER NOT NULL, Ip4 INTEGER NOT NULL, ResponseCode INTEGER NOT NULL, PRIMARY KEY(Id AUTOINCREMENT))";
const string dropStatement = "DROP TABLE Discarded;";
const string vacuum = "VACUUM;";
using SqliteConnection connection = new(databaseName);
connection.Open();
SqliteCommand command = new(dropStatement, connection);
command.ExecuteNonQuery();
command = new(vacuum, connection);
command.ExecuteNonQuery();
command = new(createStatement, connection);
command.ExecuteNonQuery();
command.Dispose();
connection.Close();
}
private void InsertUnfiltered(Unfiltered unfiltered) private void InsertUnfiltered(Unfiltered unfiltered)
{ {
using SqliteConnection connection = new(_unfilteredConnectionString); using SqliteConnection connection = new(_unfilteredConnectionString);
@@ -424,6 +476,20 @@ public class DbHandler
connection.Close(); connection.Close();
} }
private void InsertCompressedDatabase(int threadNumber, long rows)
{
using SqliteConnection connection = new(_compressedConnectionString);
connection.Open();
using SqliteCommand command = new(InsertIntoCompressedDbConnectionString, connection);
command.Parameters.AddWithValue("@dbNumber", threadNumber);
command.Parameters.AddWithValue("@rows", rows);
_ = command.ExecuteNonQuery();
connection.Close();
}
private void UpdateUnfiltered(Unfiltered unfiltered) private void UpdateUnfiltered(Unfiltered unfiltered)
{ {
using SqliteConnection connection = new(_unfilteredConnectionString); using SqliteConnection connection = new(_unfilteredConnectionString);
@@ -518,23 +584,72 @@ public class DbHandler
{ {
long rowId = 0; long rowId = 0;
SqliteConnection connection;
SqliteCommand command;
SqliteDataReader reader;
for (int i = 0; i < _discardedConnectionStrings.Count; i++) for (int i = 0; i < _discardedConnectionStrings.Count; i++)
{ {
using SqliteConnection connection = new(_discardedConnectionStrings[i]); connection = new(_discardedConnectionStrings[i]);
connection.Open(); connection.Open();
using SqliteCommand command = new(ReadDiscardedSeqIdsStatement, connection); command = new(ReadDiscardedSeqIdsStatement, connection);
using SqliteDataReader reader = command.ExecuteReader(); reader = command.ExecuteReader();
if (!reader.HasRows) if (!reader.HasRows)
{ {
return 0; return rowId;
} }
while (reader.Read()) while (reader.Read())
{ {
rowId += reader.GetInt64(0); rowId += reader.GetInt64(0);
} }
connection.Close();
}
connection = new(_compressedConnectionString);
connection.Open();
command = new(ReadCompressedDbRowsStatement, connection);
reader = command.ExecuteReader();
if (!reader.HasRows)
{
return rowId;
}
while (reader.Read())
{
rowId += reader.GetInt64(0);
}
connection.Close();
connection.Dispose();
command.Dispose();
reader.Dispose();
return rowId;
}
private static long GetDiscardedIndexesForSpecificDb(string connectionString)
{
using SqliteConnection connection = new(connectionString);
connection.Open();
using SqliteCommand command = new(ReadDiscardedSeqIdsStatement, connection);
using SqliteDataReader reader = command.ExecuteReader();
long rowId = 0;
if (!reader.HasRows)
{
return rowId;
}
while (reader.Read())
{
rowId += reader.GetInt64(0);
} }
return rowId; return rowId;
@@ -665,20 +780,13 @@ public class DbHandler
Thread.Sleep(5000); // Just for safety. Thread.Sleep(5000); // Just for safety.
} }
SqliteConnection connection = new(_discardedConnectionString); SqliteConnection connection = new(_filteredConnectionString);
connection.Open(); connection.Open();
SqliteCommand command = new(ReIndexDatabasesStatement, connection); SqliteCommand command = new(ReIndexDatabasesStatement, connection);
_ = command.ExecuteNonQuery(); _ = command.ExecuteNonQuery();
connection.Close(); connection.Close();
connection = new(_filteredConnectionString);
connection.Open();
command = new(ReIndexDatabasesStatement, connection);
_ = command.ExecuteNonQuery();
connection.Close();
connection = new(_unfilteredConnectionString); connection = new(_unfilteredConnectionString);
connection.Open(); connection.Open();
@@ -704,20 +812,13 @@ public class DbHandler
Thread.Sleep(5000); // Just for safety. Thread.Sleep(5000); // Just for safety.
} }
SqliteConnection connection = new(_discardedConnectionString); SqliteConnection connection = new(_filteredConnectionString);
connection.Open(); connection.Open();
SqliteCommand command = new(VacuumDatabasesStatement, connection); SqliteCommand command = new(VacuumDatabasesStatement, connection);
_ = command.ExecuteNonQuery(); _ = command.ExecuteNonQuery();
connection.Close(); connection.Close();
connection = new(_filteredConnectionString);
connection.Open();
command = new(VacuumDatabasesStatement, connection);
_ = command.ExecuteNonQuery();
connection.Close();
connection = new(_unfilteredConnectionString); connection = new(_unfilteredConnectionString);
connection.Open(); connection.Open();
@@ -732,8 +833,9 @@ public class DbHandler
_paused = false; _paused = false;
} }
private string CreateDiscardedDb(int threadNumber) private (string, string) CreateDiscardedDb(int threadNumber)
{ {
string absolutePath = $"{_basePath}/Models/Discarded{threadNumber}.db";
string databaseName = $"Data Source={_basePath}/Models/Discarded{threadNumber}.db"; string databaseName = $"Data Source={_basePath}/Models/Discarded{threadNumber}.db";
const string createStatement = "CREATE TABLE IF NOT EXISTS Discarded (Id INTEGER NOT NULL, Ip1 INTEGER NOT NULL, Ip2 INTEGER NOT NULL, Ip3 INTEGER NOT NULL, Ip4 INTEGER NOT NULL, ResponseCode INTEGER NOT NULL, PRIMARY KEY(Id AUTOINCREMENT))"; const string createStatement = "CREATE TABLE IF NOT EXISTS Discarded (Id INTEGER NOT NULL, Ip1 INTEGER NOT NULL, Ip2 INTEGER NOT NULL, Ip3 INTEGER NOT NULL, Ip4 INTEGER NOT NULL, ResponseCode INTEGER NOT NULL, PRIMARY KEY(Id AUTOINCREMENT))";
@@ -746,7 +848,7 @@ public class DbHandler
using SqliteCommand command = new(createStatement, connection); using SqliteCommand command = new(createStatement, connection);
command.ExecuteNonQuery(); command.ExecuteNonQuery();
return databaseName; return (absolutePath, databaseName);
} }
public void Stop() public void Stop()
+22
View File
@@ -0,0 +1,22 @@
using System.IO.Compression;
namespace Models.Helper;
public static class CompressionHelper
{
public static void CompressFile(string sourceFile, string targetFile)
{
using FileStream originalFileStream = new(sourceFile, FileMode.Open);
using FileStream compressedFileStream = File.Create($"{targetFile}.gz");
using GZipStream compressor = new(compressedFileStream, CompressionLevel.Fastest);
originalFileStream.CopyTo(compressor);
}
public static void DecompressFile(string sourceFile, string targetFile)
{
using FileStream compressedFileStream = new(sourceFile, FileMode.Open);
using FileStream decompressedFileStream = File.Create($"{targetFile}.gz");
using GZipStream decompressor = new(compressedFileStream, CompressionMode.Decompress);
decompressor.CopyTo(decompressedFileStream);
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace Models.Helper;
public static class GetDatabasesHelper
{
public static int GetTotalCompressedDatabases(string path)
{
return Directory.GetFiles(path, "*.gz").Length;
}
}
+2 -2
View File
@@ -60,7 +60,7 @@ progressApi.MapGet("/", (IMemoryCache memoryCache) =>
return scanningStatus; return scanningStatus;
}); });
/*
RouteGroupBuilder searchApi = app.MapGroup("/search"); RouteGroupBuilder searchApi = app.MapGroup("/search");
searchApi.MapGet("/{term}", (string term) => searchApi.MapGet("/{term}", (string term) =>
{ {
@@ -78,7 +78,7 @@ searchApi.MapGet("/{term}", (string term) =>
return JsonSerializer.Deserialize<SearchResults?>(msg); return JsonSerializer.Deserialize<SearchResults?>(msg);
}); });
*/
app.Run(); app.Run();
[JsonSerializable(typeof(ScanningStatus))] [JsonSerializable(typeof(ScanningStatus))]
+4
View File
@@ -4,8 +4,12 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A0200000Cpdb6Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003Fb53c196a821648e4ae3b142a6ae58d7b9400_003Fa8_003F21a43479_003F0200000Cpdb6Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A0200000Cpdb6Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003Fb53c196a821648e4ae3b142a6ae58d7b9400_003Fa8_003F21a43479_003F0200000Cpdb6Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A02000011pdb3Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003F7c3ed02c2ce44598b7f304f8ac45e58f8600_003F6d_003F99b875d1_003F02000011pdb3Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A02000011pdb3Low_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003F7c3ed02c2ce44598b7f304f8ac45e58f8600_003F6d_003F99b875d1_003F02000011pdb3Low_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADirectoryInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fe4ec446cfe0489bc3ef68a45c6766d183e999ebdc657e94fb1ad059de2bb9_003FDirectoryInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADirectoryInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fe4ec446cfe0489bc3ef68a45c6766d183e999ebdc657e94fb1ad059de2bb9_003FDirectoryInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFileSystemEnumerator_002EUnix_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F233863917bb42f133182fb4926e94ef8139c6f704da0c4574a8de3209f4761_003FFileSystemEnumerator_002EUnix_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpResponseMessage_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F85e97f467d698c9e98eae9e3a1b39d58541173e57992d8f7111eabdd3db3526_003FHttpResponseMessage_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHttpResponseMessage_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F85e97f467d698c9e98eae9e3a1b39d58541173e57992d8f7111eabdd3db3526_003FHttpResponseMessage_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APing_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F3080b18e3637ea741b5b65abd6aee06e41494a82a58b3e2ed87d4ddb5cc62_003FPing_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARateLimitRule_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F8fbca8b1bca27d45830c443b2c773d979015ea216430366f285514a39fc0b9_003FRateLimitRule_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARateLimitRule_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F8fbca8b1bca27d45830c443b2c773d979015ea216430366f285514a39fc0b9_003FRateLimitRule_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqliteException_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F154220569126135ad5d7314bf2bc694d3cf7c95840d481d44f0336f4f1f8e9c_003FSqliteException_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqliteParameterCollection_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F56cf675b4777645c714ae85e12bde2163da8ec62d2a23f8b35ef357547a9_003FSqliteParameterCollection_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStartupExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F3ce5d581dd9cc0e4cdfd914e797ba2da05e894767d76b86f0515ef5226bac_003FStartupExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStartupExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F3ce5d581dd9cc0e4cdfd914e797ba2da05e894767d76b86f0515ef5226bac_003FStartupExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AString_002ESearching_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F49ee52518952e16b89adee3d6c9346ae6c74be268730f0497eb14b34b49d56c_003FString_002ESearching_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AString_002ESearching_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F49ee52518952e16b89adee3d6c9346ae6c74be268730f0497eb14b34b49d56c_003FString_002ESearching_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThread_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F693e634d7742afaf486acd69d84fe2a9e1ee1b11ba84f29cd1d67668d20dd59_003FThread_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThread_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F693e634d7742afaf486acd69d84fe2a9e1ee1b11ba84f29cd1d67668d20dd59_003FThread_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>
+7 -3
View File
@@ -9,8 +9,12 @@ useHead({
</script> </script>
<template> <template>
<NuxtLayout> <div class="navbar navbar-expand-md navbar-dark bg-dark">
<NuxtPage page-key="static" /> <ul>
</NuxtLayout> <li><nuxt-link to="/">Search</nuxt-link></li>
<li><nuxt-link to="/progress">Progress</nuxt-link></li>
</ul>
</div>
<NuxtPage page-key="static" />
</template> </template>
+4
View File
@@ -13,5 +13,9 @@ export default defineNuxtConfig({
}, },
}, },
nitro: {
static: true,
},
modules: ['@nuxtjs/tailwindcss', 'nuxt-purgecss'], modules: ['@nuxtjs/tailwindcss', 'nuxt-purgecss'],
}); });
+6 -3
View File
@@ -1,12 +1,15 @@
<script setup lang="ts"> <script setup lang="ts">
const route = useRoute() const value = ref<string | null>(null)
// https://nuxt.com/docs/api/components/nuxt-link#nuxtlink
</script> </script>
<template> <template>
<div class="h-screen flex items-center justify-center"> <div class="h-screen flex items-center justify-center">
<div class="flex space-x-2"> <div class="flex space-x-2">
<input placeholder=".NET C#" class="text-center bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg p-2.5 w-192"/> <input v-model="value" placeholder=".NET C#" class="text-center bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg p-2.5 w-192"/>
<button class="text-gray-900 bg-gray-50 border border-gray-300 px-4 py-2 rounded-lg">Search</button> <nuxt-link :to="`/searchResult?search=${value}`" class="text-gray-900 bg-gray-50 border border-gray-300 px-4 py-2 rounded-lg">Search</nuxt-link>
</div> </div>
</div> </div>
</template> </template>
+31 -3
View File
@@ -39,7 +39,6 @@ fetchMyData();
<template> <template>
<div class="h-screen grid place-items-center"> <div class="h-screen grid place-items-center">
<div v-if="dict">
<table class="table-auto border-gray-300"> <table class="table-auto border-gray-300">
<thead> <thead>
<tr> <tr>
@@ -48,15 +47,44 @@ fetchMyData();
</tr> </tr>
</thead> </thead>
<tbody> <tbody v-if="dict">
<tr v-for="d in dict"> <tr v-for="d in dict">
<td class="px-4 py-2">{{d.description}}</td> <td class="px-4 py-2">{{d.description}}</td>
<td class="px-4 py-2">{{d.value}}</td> <td class="px-4 py-2">{{d.value}}</td>
</tr> </tr>
</tbody> </tbody>
<tbody v-else>
<tr>
<td class="px-4 py-2">Percentage of Ipv4 scanned</td>
<td class="px-4 py-2"></td>
</tr>
<tr>
<td class="px-4 py-2">Total filtered</td>
<td class="px-4 py-2"></td>
</tr>
<tr>
<td class="px-4 py-2">Total Discarded</td>
<td class="px-4 py-2"></td>
</tr>
<tr>
<td class="px-4 py-2">Amount of Ipv4 left</td>
<td class="px-4 py-2"></td>
</tr>
<tr>
<td class="px-4 py-2">Discarded db size</td>
<td class="px-4 py-2"></td>
</tr>
<tr>
<td class="px-4 py-2">Filtered db size</td>
<td class="px-4 py-2"></td>
</tr>
<tr>
<td class="px-4 py-2">Unfiltered db size</td>
<td class="px-4 py-2"></td>
</tr>
</tbody>
</table> </table>
</div> </div>
</div>
</template> </template>
<style scoped> <style scoped>
+8
View File
@@ -0,0 +1,8 @@
<script setup lang="ts">
const route = useRoute();
console.log(route.query);
</script>
<template>
</template>
+12 -2
View File
@@ -6,12 +6,22 @@ interface ProgressType {
discardedDbSize: bigint; discardedDbSize: bigint;
filteredDbSize: bigint; filteredDbSize: bigint;
myDbSize: bigint; myDbSize: bigint;
} };
interface ProgressDictionary { interface ProgressDictionary {
description: string; description: string;
value: string; value: string;
} };
interface SearchResult {
title: string;
description: string;
url: string;
};
interface SearchResults {
results: SearchResult[];
};
type CacheEntry<T> = { type CacheEntry<T> = {
data: T; data: T;