Skip to content

Commit 90a85fb

Browse files
committed
Added LightningTransaction.GetEntriesCount
1 parent 405f5e3 commit 90a85fb

File tree

7 files changed

+90
-0
lines changed

7 files changed

+90
-0
lines changed

src/LightningDB.Tests/TransactionTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,23 @@ public void DefaultDatabaseShouldBeDropped()
169169
//assert
170170
Assert.AreEqual(false, db.IsOpened);
171171
}
172+
173+
[Test]
174+
public void CanCountEntries()
175+
{
176+
//arrange
177+
_txn = _env.BeginTransaction();
178+
var db = _txn.OpenDatabase(null, DatabaseOpenFlags.None);
179+
180+
const int entriesCount = 10;
181+
for (var i = 0; i < entriesCount; i++)
182+
_txn.Put(db, i.ToString(), i.ToString());
183+
184+
//act
185+
var count = _txn.GetEntriesCount(db);
186+
187+
//assert;
188+
Assert.AreEqual(entriesCount, count);
189+
}
172190
}
173191
}

src/LightningDB/LightningDB.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
<Compile Include="LightningTransaction.cs" />
110110
<Compile Include="LightningVersionInfo.cs" />
111111
<Compile Include="Native\MarshalValueStructure.cs" />
112+
<Compile Include="Native\MDBStat.cs" />
112113
<Compile Include="Native\Native.cs" />
113114
<Compile Include="Native\NativeLibraryFacades.cs">
114115
<AutoGen>True</AutoGen>

src/LightningDB/LightningTransaction.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,14 @@ public void Abort()
328328
});
329329
}
330330

331+
public long GetEntriesCount(LightningDatabase db)
332+
{
333+
var stat = new MDBStat();
334+
NativeMethods.Execute(lib => lib.mdb_stat(_handle, db._handle, out stat));
335+
336+
return stat.ms_entries.ToInt64();
337+
}
338+
331339
/// <summary>
332340
/// Environment in which the transaction was opened.
333341
/// </summary>

src/LightningDB/Native/INativeLibraryFacade.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,18 @@ interface INativeLibraryFacade
284284
/// <returns>The description of the error</returns>
285285
IntPtr mdb_strerror(int err); //OK
286286

287+
/// <summary>
288+
/// Retrieve statistics for a database.
289+
/// </summary>
290+
/// <param name="txn">A transaction handle returned by mdb_txn_begin()</param>
291+
/// <param name="dbi">A database handle returned by mdb_dbi_open()</param>
292+
/// <param name="stat">The address of an MDB_stat structure where the statistics will be copied</param>
293+
/// <returns>
294+
/// A non-zero error value on failure and 0 on success. Some possible errors are:
295+
/// EINVAL - an invalid parameter was specified.
296+
/// </returns>
297+
int mdb_stat(IntPtr txn, uint dbi, out MDBStat stat);
298+
287299
/// <summary>
288300
/// Copy an MDB environment to the specified path.
289301
/// This function may be used to make a backup of an existing environment.

src/LightningDB/Native/MDBStat.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Runtime.InteropServices;
5+
using System.Text;
6+
7+
namespace LightningDB.Native
8+
{
9+
[StructLayout(LayoutKind.Sequential)]
10+
struct MDBStat
11+
{
12+
public uint ms_psize;
13+
public uint ms_depth;
14+
public IntPtr ms_branch_pages;
15+
public IntPtr ms_leaf_pages;
16+
public IntPtr ms_overflow_pages;
17+
public IntPtr ms_entries;
18+
}
19+
}

src/LightningDB/Native/NativeLibraryFacades.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ class Native32BitLibraryFacade : INativeLibraryFacade
6767
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
6868
private static extern IntPtr mdb_strerror(int err);
6969

70+
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
71+
private static extern int mdb_stat(IntPtr txn, uint dbi, out MDBStat stat);
72+
7073
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
7174
private static extern int mdb_env_copy(IntPtr env, string path);
7275

@@ -207,6 +210,11 @@ IntPtr INativeLibraryFacade.mdb_strerror(int err)
207210
return Native32BitLibraryFacade.mdb_strerror(err);
208211
}
209212

213+
int INativeLibraryFacade.mdb_stat(IntPtr txn, uint dbi, out MDBStat stat)
214+
{
215+
return Native32BitLibraryFacade.mdb_stat(txn, dbi, out stat);
216+
}
217+
210218
int INativeLibraryFacade.mdb_env_copy(IntPtr env, string path)
211219
{
212220
return Native32BitLibraryFacade.mdb_env_copy(env, path);
@@ -328,6 +336,9 @@ class Native64BitLibraryFacade : INativeLibraryFacade
328336
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
329337
private static extern IntPtr mdb_strerror(int err);
330338

339+
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
340+
private static extern int mdb_stat(IntPtr txn, uint dbi, out MDBStat stat);
341+
331342
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
332343
private static extern int mdb_env_copy(IntPtr env, string path);
333344

@@ -456,6 +467,11 @@ IntPtr INativeLibraryFacade.mdb_strerror(int err)
456467
return Native64BitLibraryFacade.mdb_strerror(err);
457468
}
458469

470+
int INativeLibraryFacade.mdb_stat(IntPtr txn, uint dbi, out MDBStat stat)
471+
{
472+
return Native64BitLibraryFacade.mdb_stat(txn, dbi, out stat);
473+
}
474+
459475
int INativeLibraryFacade.mdb_env_copy(IntPtr env, string path)
460476
{
461477
return Native64BitLibraryFacade.mdb_env_copy(env, path);
@@ -577,6 +593,9 @@ class FallbackLibraryFacade : INativeLibraryFacade
577593
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
578594
private static extern IntPtr mdb_strerror(int err);
579595

596+
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
597+
private static extern int mdb_stat(IntPtr txn, uint dbi, out MDBStat stat);
598+
580599
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
581600
private static extern int mdb_env_copy(IntPtr env, string path);
582601

@@ -717,6 +736,11 @@ IntPtr INativeLibraryFacade.mdb_strerror(int err)
717736
return FallbackLibraryFacade.mdb_strerror(err);
718737
}
719738

739+
int INativeLibraryFacade.mdb_stat(IntPtr txn, uint dbi, out MDBStat stat)
740+
{
741+
return FallbackLibraryFacade.mdb_stat(txn, dbi, out stat);
742+
}
743+
720744
int INativeLibraryFacade.mdb_env_copy(IntPtr env, string path)
721745
{
722746
return FallbackLibraryFacade.mdb_env_copy(env, path);

src/LightningDB/Native/NativeLibraryFacades.tt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ namespace LightningDB.Native
8282
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
8383
private static extern IntPtr mdb_strerror(int err);
8484

85+
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
86+
private static extern int mdb_stat(IntPtr txn, uint dbi, out MDBStat stat);
87+
8588
[DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)]
8689
private static extern int mdb_env_copy(IntPtr env, string path);
8790

@@ -226,6 +229,11 @@ namespace LightningDB.Native
226229
return <#= pair.Value #>LibraryFacade.mdb_strerror(err);
227230
}
228231

232+
int INativeLibraryFacade.mdb_stat(IntPtr txn, uint dbi, out MDBStat stat)
233+
{
234+
return <#= pair.Value #>LibraryFacade.mdb_stat(txn, dbi, out stat);
235+
}
236+
229237
int INativeLibraryFacade.mdb_env_copy(IntPtr env, string path)
230238
{
231239
return <#= pair.Value #>LibraryFacade.mdb_env_copy(env, path);

0 commit comments

Comments
 (0)