Skip to content

Commit 441119f

Browse files
konardclaude
andcommitted
Make database grow size configurable
- Add optional command-line argument for database grow size in both XML Importer and Exporter - Support byte suffixes (B, KB, MB, GB) for user-friendly input - Add proper error handling with fallback to default value for invalid inputs - Update target framework from net6.0 to net8.0 for consistency with main library - Maintain backward compatibility by using default grow size when no argument provided Fixes #5 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 49db097 commit 441119f

File tree

4 files changed

+106
-6
lines changed

4 files changed

+106
-6
lines changed

csharp/Platform.Data.Doublets.Xml.Exporter/Platform.Data.Doublets.Xml.Exporter.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net6.0</TargetFramework>
5+
<TargetFramework>net8.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
</PropertyGroup>

csharp/Platform.Data.Doublets.Xml.Exporter/Program.cs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ public static void Main(params string[] args)
1616
var linksFilePath = ConsoleHelpers.GetOrReadArgument(argumentIndex++, "Links file path", args);
1717
var xmlFilePath = ConsoleHelpers.GetOrReadArgument(argumentIndex++, "XML file path", args);
1818
var defaultDocumentName = Path.GetFileNameWithoutExtension(xmlFilePath);
19-
var documentName = ConsoleHelpers.GetOrReadArgument(argumentIndex, $"Document name (default: {defaultDocumentName})", args);
19+
var documentName = ConsoleHelpers.GetOrReadArgument(argumentIndex++, $"Document name (default: {defaultDocumentName})", args);
2020
if (string.IsNullOrWhiteSpace(documentName))
2121
{
2222
documentName = defaultDocumentName;
2323
}
24+
var growSizeString = ConsoleHelpers.GetOrReadArgument(argumentIndex, "Database grow size in bytes (optional, default: auto)", args);
25+
var growSize = ParseGrowSize(growSizeString);
2426
if (!File.Exists(linksFilePath))
2527
{
2628
Console.WriteLine($"${linksFilePath} file does not exist.");
@@ -32,7 +34,7 @@ public static void Main(params string[] args)
3234
};
3335
var xmlWriter = XmlWriter.Create(xmlFileStream, xmlWriterSettings);
3436
var linksConstants = new LinksConstants<TLinkAddress>(enableExternalReferencesSupport: true);
35-
using UnitedMemoryLinks<TLinkAddress> memoryAdapter = new (new FileMappedResizableDirectMemory(linksFilePath), UnitedMemoryLinks<TLinkAddress>.DefaultLinksSizeStep, linksConstants, IndexTreeType.Default);
37+
using UnitedMemoryLinks<TLinkAddress> memoryAdapter = new (new FileMappedResizableDirectMemory(linksFilePath), growSize, linksConstants, IndexTreeType.Default);
3638
var links = memoryAdapter.DecorateWithAutomaticUniquenessAndUsagesResolution();
3739
var balancedVariantConverter = new BalancedVariantConverter<TLinkAddress>(links);
3840
var storage = new DefaultXmlStorage<TLinkAddress>(links, balancedVariantConverter);
@@ -43,5 +45,53 @@ public static void Main(params string[] args)
4345
Console.WriteLine("Press CTRL+C to stop.");
4446
exporter.Export(xmlWriter, document, cancellationToken);
4547
}
48+
49+
private static long ParseGrowSize(string growSizeString)
50+
{
51+
if (string.IsNullOrWhiteSpace(growSizeString))
52+
{
53+
return UnitedMemoryLinks<TLinkAddress>.DefaultLinksSizeStep;
54+
}
55+
56+
growSizeString = growSizeString.Trim().ToUpperInvariant();
57+
58+
// Handle byte suffixes
59+
long multiplier = 1;
60+
if (growSizeString.EndsWith("KB"))
61+
{
62+
multiplier = 1024;
63+
growSizeString = growSizeString[..^2];
64+
}
65+
else if (growSizeString.EndsWith("MB"))
66+
{
67+
multiplier = 1024 * 1024;
68+
growSizeString = growSizeString[..^2];
69+
}
70+
else if (growSizeString.EndsWith("GB"))
71+
{
72+
multiplier = 1024 * 1024 * 1024;
73+
growSizeString = growSizeString[..^2];
74+
}
75+
else if (growSizeString.EndsWith("B"))
76+
{
77+
growSizeString = growSizeString[..^1];
78+
}
79+
80+
if (!long.TryParse(growSizeString.Trim(), out long value))
81+
{
82+
Console.WriteLine($"Invalid grow size format: {growSizeString}. Using default value.");
83+
return UnitedMemoryLinks<TLinkAddress>.DefaultLinksSizeStep;
84+
}
85+
86+
var totalBytes = value * multiplier;
87+
88+
if (totalBytes <= 0)
89+
{
90+
Console.WriteLine($"Invalid grow size: {totalBytes}. Must be positive. Using default value.");
91+
return UnitedMemoryLinks<TLinkAddress>.DefaultLinksSizeStep;
92+
}
93+
94+
return totalBytes;
95+
}
4696
}
4797
}

csharp/Platform.Data.Doublets.Xml.Importer/Platform.Data.Doublets.Xml.Importer.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net6.0</TargetFramework>
5+
<TargetFramework>net8.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
</PropertyGroup>

csharp/Platform.Data.Doublets.Xml.Importer/Program.cs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,17 @@ public static void Main(string[] args)
2121
}
2222
var linksFilePath = ConsoleHelpers.GetOrReadArgument(argumentIndex++, "Links storage file path", args);
2323
var defaultDocumentName = Path.GetFileNameWithoutExtension(xmlFilePath);
24-
var documentName = ConsoleHelpers.GetOrReadArgument(argumentIndex, $"Document name (default: {defaultDocumentName})", args);
24+
var documentName = ConsoleHelpers.GetOrReadArgument(argumentIndex++, $"Document name (default: {defaultDocumentName})", args);
2525
if (string.IsNullOrWhiteSpace(documentName))
2626
{
2727
documentName = defaultDocumentName;
2828
}
29+
var growSizeString = ConsoleHelpers.GetOrReadArgument(argumentIndex, "Database grow size in bytes (optional, default: auto)", args);
30+
var growSize = ParseGrowSize(growSizeString);
2931
var xmlReader = XmlReader.Create(xmlFilePath);
3032
var linksConstants = new LinksConstants<TLinkAddress>(enableExternalReferencesSupport: true);
3133
var fileMappedResizableDirectMemory = new FileMappedResizableDirectMemory(linksFilePath);
32-
var unitedMemoryLinks = UnitedMemoryLinks<TLinkAddress>.DefaultLinksSizeStep;
34+
var unitedMemoryLinks = growSize;
3335
const IndexTreeType indexTreeType = IndexTreeType.Default;
3436
using UnitedMemoryLinks<TLinkAddress> memoryAdapter = new(fileMappedResizableDirectMemory, unitedMemoryLinks, linksConstants, indexTreeType);
3537
var links = memoryAdapter.DecorateWithAutomaticUniquenessAndUsagesResolution();
@@ -42,5 +44,53 @@ public static void Main(string[] args)
4244
importer.Import(xmlReader, documentName, cancellationToken);
4345
Console.WriteLine("Import completed successfully.");
4446
}
47+
48+
private static long ParseGrowSize(string growSizeString)
49+
{
50+
if (string.IsNullOrWhiteSpace(growSizeString))
51+
{
52+
return UnitedMemoryLinks<TLinkAddress>.DefaultLinksSizeStep;
53+
}
54+
55+
growSizeString = growSizeString.Trim().ToUpperInvariant();
56+
57+
// Handle byte suffixes
58+
long multiplier = 1;
59+
if (growSizeString.EndsWith("KB"))
60+
{
61+
multiplier = 1024;
62+
growSizeString = growSizeString[..^2];
63+
}
64+
else if (growSizeString.EndsWith("MB"))
65+
{
66+
multiplier = 1024 * 1024;
67+
growSizeString = growSizeString[..^2];
68+
}
69+
else if (growSizeString.EndsWith("GB"))
70+
{
71+
multiplier = 1024 * 1024 * 1024;
72+
growSizeString = growSizeString[..^2];
73+
}
74+
else if (growSizeString.EndsWith("B"))
75+
{
76+
growSizeString = growSizeString[..^1];
77+
}
78+
79+
if (!long.TryParse(growSizeString.Trim(), out long value))
80+
{
81+
Console.WriteLine($"Invalid grow size format: {growSizeString}. Using default value.");
82+
return UnitedMemoryLinks<TLinkAddress>.DefaultLinksSizeStep;
83+
}
84+
85+
var totalBytes = value * multiplier;
86+
87+
if (totalBytes <= 0)
88+
{
89+
Console.WriteLine($"Invalid grow size: {totalBytes}. Must be positive. Using default value.");
90+
return UnitedMemoryLinks<TLinkAddress>.DefaultLinksSizeStep;
91+
}
92+
93+
return totalBytes;
94+
}
4595
}
4696
}

0 commit comments

Comments
 (0)