Exemple #1
0
 /// <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);
 }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        /// <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();
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        /// <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;
        }
Exemple #6
0
 /// <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);
 }
Exemple #7
0
 /// <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))
 {
 }