/// <summary>Construct the serializer.</summary> /// <param name="settings">Database settings.</param> /// <param name="typesToAdd">Record types to add.</param> public EseSerializer(EsentDatabase.Settings settings, int cursorsPerSession, IEnumerable <Type> typesToAdd) : this(settings, cursorsPerSession) { if (null != typesToAdd) { foreach (Type t in typesToAdd) { EseTableAttribute a = t.getTableAttribute(); if (null == a) { continue; } m_tables.Add(new TypeSerializer(t, a)); } } Api.JetInit(ref m_idInstance); }
/// <summary>Restore the external backup.</summary> /// <remarks>The ZIP archive backup is first unpacked to a temporary folder, then ESENT restores the database.</remarks> /// <param name="source">Source backup stream</param> /// <param name="settings">Database settings</param> /// <param name="tempFolder">Temporary folder to unpack the archive. Can be null, in this case a new folder will be created in %TEMP%. This folder will be removed after the restore is complete.</param> public static void ExternalRestore(Stream source, EsentDatabase.Settings settings, string tempFolder = null) { if (String.IsNullOrWhiteSpace(tempFolder)) { tempFolder = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("D")); } if (!Directory.Exists(tempFolder)) { Directory.CreateDirectory(tempFolder); } using (ZipArchive archive = new ZipArchive(source, ZipArchiveMode.Read)) archive.ExtractToDirectory(tempFolder); StreamingRestore(tempFolder, settings); Directory.Delete(tempFolder, true); }
/// <summary>Construct the session pool.</summary> /// <remarks>You should only create a single instance of this class.</remarks> /// <param name="settings">Database settings.</param> /// <param name="arrTypes">The array of record types. /// In every session returned by this pool, the corresponding tables will be already opened for you.</param> public SessionPool(EsentDatabase.Settings settings, params Type[] arrTypes) { folderDatabase = settings.databasePath; m_serializer = new EseSerializer(settings, arrTypes.Length, null); SessionLimit = Math.Max(settings.maxConcurrentSessions, 0); if (SessionLimit > 0) { m_semaphore = new Semaphore(SessionLimit, SessionLimit); } m_allSessions = new HashSet <SerializerSession>(); m_freeSessions = new Stack <SerializerSession>(); m_recordTypes = arrTypes.ToList(); m_serializer.EnsureDatabaseExists(); }
void SetupInstanceParams(EsentDatabase.Settings settings, JET_INSTANCE i, string strFolder, int cursorsPerSession) { InstanceParameters Parameters = new InstanceParameters(i); var adv = settings.advanced; m_pathDatabase = Path.Combine(strFolder, adv.FileName); // Mostly copy-pasted from Microsoft.Isam.Esent.Collections.Generic.PersistentDictionary<>.__ctor() Parameters.SystemDirectory = strFolder; Parameters.LogFileDirectory = strFolder; Parameters.TempDirectory = strFolder; Parameters.AlternateDatabaseRecoveryDirectory = strFolder; Parameters.CreatePathIfNotExist = true; Parameters.BaseName = adv.BaseName; Parameters.EnableIndexChecking = false; Parameters.CircularLog = true; Parameters.CheckpointDepthMax = 0x4010000; Parameters.PageTempDBMin = 0; Parameters.MaxVerPages = adv.MaxVerPages; Parameters.LogFileSize = adv.kbLogFileSize; Parameters.LogBuffers = adv.LogBuffers.Value; Parameters.MaxSessions = settings.maxConcurrentSessions; if (cursorsPerSession > 0) { #if !NETFX_CORE // On desktop and servers user can duplicate cursors, that's why we need to increase that limit. cursorsPerSession = Math.Max(cursorsPerSession * 2, cursorsPerSession + 8); #endif // Both esent.dll ant this library use internal tables, e.g. for schema. Hence that 16 extra cursors. Parameters.MaxCursors = cursorsPerSession * settings.maxConcurrentSessions + 16; } // Ext. parameters Api.JetSetSystemParameter(i, JET_SESID.Nil, Ext.JET_paramIndexTuplesLengthMin, adv.IndexTuplesLengthMin, null); }
/// <summary>Internal constructor that initializes the parameters but doesn't call JetInit.</summary> internal EseSerializer(EsentDatabase.Settings settings, int cursorsPerSession) { FileName = settings.advanced.FileName; string strFolder = settings.databasePath; if (!Directory.Exists(strFolder)) { Directory.CreateDirectory(strFolder); } folderDatabase = strFolder; m_instanceName = settings.advanced.InstanceName; SystemParameters.DatabasePageSize = settings.advanced.DatabasePageSize; SystemParameters.EnableFileCache = settings.advanced.EnableFileCache; SystemParameters.EnableViewCache = settings.advanced.EnableViewCache; JET_INSTANCE i; Api.JetCreateInstance(out i, m_instanceName); SetupInstanceParams(settings, i, strFolder, cursorsPerSession); m_idInstance = i; }
/// <summary>Restore a streaming backup.</summary> /// <param name="src">Source backup folder</param> /// <param name="settings"></param> public static void StreamingRestore(string src, EsentDatabase.Settings settings) { using (EseSerializer ser = new EseSerializer(settings, 0)) Api.JetRestoreInstance(ser.idInstance, src, settings.databasePath, progress); }
/// <summary>Construct the session pool.</summary> /// <remarks>You should only create a single instance of this class.</remarks> /// <param name="settings">Database settings.</param> /// <param name="ass">An assembly with the [EseTable] types to open.</param> public SessionPool(EsentDatabase.Settings settings, Assembly ass) : this(settings, typesInAssembly(ass)) { }