Skip to content

Commit 7a49ae4

Browse files
committed
Added compact option to Environment.CopyTo
1 parent 4d6e4f0 commit 7a49ae4

File tree

7 files changed

+73
-6
lines changed

7 files changed

+73
-6
lines changed

src/LightningDB.Tests/EnvironmentTests.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,16 @@ public void EnvironmentShouldBeClosed()
9090
Assert.AreEqual(false, _env.IsOpened);
9191
}
9292

93-
[Test]
94-
public void EnvironmentShouldBeCopied()
93+
[TestCase(true)]
94+
[TestCase(false)]
95+
public void EnvironmentShouldBeCopied(bool compact)
9596
{
9697
//arrange
9798
_env = new LightningEnvironment(_path, EnvironmentOpenFlags.None);
9899
_env.Open();
99100

100101
//act
101-
_env.CopyTo(_pathCopy);
102+
_env.CopyTo(_pathCopy, compact);
102103

103104
//assert
104105
if (Directory.GetFiles(_pathCopy).Length == 0)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace LightningDB
7+
{
8+
public enum EnvironmentCopyFlags
9+
{
10+
None = 0,
11+
12+
/// <summary>
13+
/// MDB_CP_COMPACT. Compacting copy: Omit free space from copy, and renumber all pages sequentially.
14+
/// </summary>
15+
Compact = 0x01
16+
}
17+
}

src/LightningDB/LightningDB.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
<Compile Include="Collections\CursorEnumerator.cs" />
7575
<Compile Include="CursorGetByOperation.cs" />
7676
<Compile Include="CursorPutOptions.cs" />
77+
<Compile Include="EnvironmentCopyFlags.cs" />
7778
<Compile Include="Factories\CursorManager.cs" />
7879
<Compile Include="Factories\DatabaseHandleCacheEntry.cs" />
7980
<Compile Include="Factories\DatabaseManager.cs" />

src/LightningDB/LightningEnvironment.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,11 +289,16 @@ internal LightningDatabase OpenDatabase(string name, LightningTransaction tran,
289289
/// This function may be used to make a backup of an existing environment.
290290
/// </summary>
291291
/// <param name="path">The directory in which the copy will reside. This directory must already exist and be writable but must otherwise be empty.</param>
292-
public void CopyTo(string path)
292+
/// <param name="compact">Omit empty pages when copying.</param>
293+
public void CopyTo(string path, bool compact = false)
293294
{
294295
this.EnsureOpened();
295296

296-
NativeMethods.Execute(lib => lib.mdb_env_copy(_handle, path));
297+
var flags = compact
298+
? EnvironmentCopyFlags.Compact
299+
: EnvironmentCopyFlags.None;
300+
301+
NativeMethods.Execute(lib => lib.mdb_env_copy2(_handle, path, flags));
297302
}
298303

299304
//TODO: tests

src/LightningDB/Native/INativeLibraryFacade.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,18 @@ interface INativeLibraryFacade
303303
/// <param name="env">An environment handle returned by mdb_env_create(). It must have already been opened successfully.</param>
304304
/// <param name="path">The directory in which the copy will reside. This directory must already exist and be writable but must otherwise be empty.</param>
305305
/// <returns>A non-zero error value on failure and 0 on success.</returns>
306-
int mdb_env_copy(IntPtr env, string path); //OK
306+
int mdb_env_copy(IntPtr env, string path);
307+
308+
/// <summary>
309+
/// Copy an LMDB environment to the specified path, with options.
310+
/// This function may be used to make a backup of an existing environment. No lockfile is created, since it gets recreated at need.
311+
/// This call can trigger significant file size growth if run in parallel with write transactions, because it employs a read-only transaction.
312+
/// </summary>
313+
/// <param name="env">An environment handle returned by mdb_env_create(). It must have already been opened successfully.</param>
314+
/// <param name="path">The directory in which the copy will reside. This directory must already exist and be writable but must otherwise be empty.</param>
315+
/// <param name="copyFlags">Special options for this operation. This parameter must be set to 0 or by bitwise OR'ing together one or more of the values described here.</param>
316+
/// <returns>A non-zero error value on failure and 0 on success.</returns>
317+
int mdb_env_copy2(IntPtr env, string path, EnvironmentCopyFlags copyFlags);
307318

308319
/// <summary>
309320
/// Return information about the LMDB environment.

src/LightningDB/Native/NativeLibraryFacades.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ class Native32BitLibraryFacade : INativeLibraryFacade
7373
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
7474
private static extern int mdb_env_copy(IntPtr env, string path);
7575

76+
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
77+
private static extern int mdb_env_copy2(IntPtr env, string path, EnvironmentCopyFlags copyFlags);
78+
7679
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
7780
private static extern int mdb_env_info (IntPtr env, out MDBEnvInfo stat);
7881

@@ -226,6 +229,11 @@ int INativeLibraryFacade.mdb_env_copy(IntPtr env, string path)
226229
return Native32BitLibraryFacade.mdb_env_copy(env, path);
227230
}
228231

232+
int INativeLibraryFacade.mdb_env_copy2(IntPtr env, string path, EnvironmentCopyFlags copyFlags)
233+
{
234+
return Native32BitLibraryFacade.mdb_env_copy2(env, path, copyFlags);
235+
}
236+
229237
int INativeLibraryFacade.mdb_env_info (IntPtr env, out MDBEnvInfo stat)
230238
{
231239
return Native32BitLibraryFacade.mdb_env_info(env, out stat);
@@ -358,6 +366,9 @@ class Native64BitLibraryFacade : INativeLibraryFacade
358366
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
359367
private static extern int mdb_env_copy(IntPtr env, string path);
360368

369+
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
370+
private static extern int mdb_env_copy2(IntPtr env, string path, EnvironmentCopyFlags copyFlags);
371+
361372
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
362373
private static extern int mdb_env_info (IntPtr env, out MDBEnvInfo stat);
363374

@@ -499,6 +510,11 @@ int INativeLibraryFacade.mdb_env_copy(IntPtr env, string path)
499510
return Native64BitLibraryFacade.mdb_env_copy(env, path);
500511
}
501512

513+
int INativeLibraryFacade.mdb_env_copy2(IntPtr env, string path, EnvironmentCopyFlags copyFlags)
514+
{
515+
return Native64BitLibraryFacade.mdb_env_copy2(env, path, copyFlags);
516+
}
517+
502518
int INativeLibraryFacade.mdb_env_info (IntPtr env, out MDBEnvInfo stat)
503519
{
504520
return Native64BitLibraryFacade.mdb_env_info(env, out stat);
@@ -631,6 +647,9 @@ class FallbackLibraryFacade : INativeLibraryFacade
631647
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
632648
private static extern int mdb_env_copy(IntPtr env, string path);
633649

650+
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
651+
private static extern int mdb_env_copy2(IntPtr env, string path, EnvironmentCopyFlags copyFlags);
652+
634653
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
635654
private static extern int mdb_env_info (IntPtr env, out MDBEnvInfo stat);
636655

@@ -784,6 +803,11 @@ int INativeLibraryFacade.mdb_env_copy(IntPtr env, string path)
784803
return FallbackLibraryFacade.mdb_env_copy(env, path);
785804
}
786805

806+
int INativeLibraryFacade.mdb_env_copy2(IntPtr env, string path, EnvironmentCopyFlags copyFlags)
807+
{
808+
return FallbackLibraryFacade.mdb_env_copy2(env, path, copyFlags);
809+
}
810+
787811
int INativeLibraryFacade.mdb_env_info (IntPtr env, out MDBEnvInfo stat)
788812
{
789813
return FallbackLibraryFacade.mdb_env_info(env, out stat);

src/LightningDB/Native/NativeLibraryFacades.tt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ namespace LightningDB.Native
8888
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
8989
private static extern int mdb_env_copy(IntPtr env, string path);
9090

91+
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
92+
private static extern int mdb_env_copy2(IntPtr env, string path, EnvironmentCopyFlags copyFlags);
93+
9194
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
9295
private static extern int mdb_env_info (IntPtr env, out MDBEnvInfo stat);
9396

@@ -245,6 +248,11 @@ namespace LightningDB.Native
245248
return <#= pair.Value #>LibraryFacade.mdb_env_copy(env, path);
246249
}
247250

251+
int INativeLibraryFacade.mdb_env_copy2(IntPtr env, string path, EnvironmentCopyFlags copyFlags)
252+
{
253+
return <#= pair.Value #>LibraryFacade.mdb_env_copy2(env, path, copyFlags);
254+
}
255+
248256
int INativeLibraryFacade.mdb_env_info (IntPtr env, out MDBEnvInfo stat)
249257
{
250258
return <#= pair.Value #>LibraryFacade.mdb_env_info(env, out stat);

0 commit comments

Comments
 (0)