Skip to content

Commit 954f01c

Browse files
daniilchmartin1cerny
authored andcommitted
Fixed EsentCursor and EsentModel resources disposal
1 parent 5c3f842 commit 954f01c

File tree

2 files changed

+47
-23
lines changed

2 files changed

+47
-23
lines changed

Xbim.IO.Esent/Esent/EsentCursor.cs

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,36 @@ public abstract class EsentCursor : IDisposable
5353

5454
protected EsentCursor(EsentModel model, string database, OpenDatabaseGrbit mode)
5555
{
56-
LockObject = new Object();
57-
Model = model;
58-
Instance = model.Cache.JetInstance;
59-
Sesid = new Session(Instance);
60-
Api.JetOpenDatabase(Sesid, database, String.Empty, out DbId, mode);
61-
Api.JetOpenTable(Sesid, DbId, GlobalsTableName, null, 0, mode == OpenDatabaseGrbit.ReadOnly ? OpenTableGrbit.ReadOnly :
62-
mode == OpenDatabaseGrbit.Exclusive ? OpenTableGrbit.DenyWrite : OpenTableGrbit.None,
63-
out GlobalsTable);
64-
EntityCountColumn = Api.GetTableColumnid(Sesid, GlobalsTable, EntityCountColumnName);
65-
GeometryCountColumn = Api.GetTableColumnid(Sesid, GlobalsTable, GeometryCountColumnName);
66-
FlushColumn = Api.GetTableColumnid(Sesid, GlobalsTable, FlushColumnName);
67-
IfcHeaderColumn = Api.GetTableColumnid(Sesid, GlobalsTable, ifcHeaderColumnName);
68-
ReadOnly = (mode == OpenDatabaseGrbit.ReadOnly);
56+
try
57+
{
58+
LockObject = new Object();
59+
Model = model;
60+
Instance = model.Cache.JetInstance;
61+
Sesid = new Session(Instance);
62+
Api.JetOpenDatabase(Sesid, database, String.Empty, out DbId, mode);
63+
Api.JetOpenTable(Sesid, DbId, GlobalsTableName, null, 0, mode == OpenDatabaseGrbit.ReadOnly ? OpenTableGrbit.ReadOnly :
64+
mode == OpenDatabaseGrbit.Exclusive ? OpenTableGrbit.DenyWrite : OpenTableGrbit.None,
65+
out GlobalsTable);
66+
EntityCountColumn = Api.GetTableColumnid(Sesid, GlobalsTable, EntityCountColumnName);
67+
GeometryCountColumn = Api.GetTableColumnid(Sesid, GlobalsTable, GeometryCountColumnName);
68+
FlushColumn = Api.GetTableColumnid(Sesid, GlobalsTable, FlushColumnName);
69+
IfcHeaderColumn = Api.GetTableColumnid(Sesid, GlobalsTable, ifcHeaderColumnName);
70+
ReadOnly = (mode == OpenDatabaseGrbit.ReadOnly);
71+
}
72+
catch
73+
{
74+
if (Sesid != null)
75+
{
76+
if (Table != JET_TABLEID.Nil && !Table.IsInvalid)
77+
Api.JetCloseTable(Sesid, Table);
78+
if (GlobalsTable != JET_TABLEID.Nil && !GlobalsTable.IsInvalid)
79+
Api.JetCloseTable(Sesid, GlobalsTable);
80+
if (DbId != JET_DBID.Nil && DbId != default(JET_DBID))
81+
Api.JetCloseDatabase(Sesid, DbId, CloseDatabaseGrbit.None);
82+
Api.JetEndSession(Sesid, EndSessionGrbit.None);
83+
}
84+
throw;
85+
}
6986
}
7087

7188
internal abstract int RetrieveCount();

Xbim.IO.Esent/Esent/EsentModel.cs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,18 +1138,21 @@ public IGeometryStore GeometryStore
11381138

11391139
public static IStepFileHeader GetStepFileHeader(string fileName)
11401140
{
1141-
//create a temporary model
1142-
var esentModel = new EsentModel();
1143-
esentModel.InstanceCache = new PersistedEntityInstanceCache(esentModel, null);
1141+
EsentModel esentModel = null;
1142+
EsentEntityCursor entTable = null;
11441143

1145-
esentModel.InstanceCache.DatabaseName = fileName;
1146-
IStepFileHeader header;
1147-
var entTable = esentModel.InstanceCache.GetEntityTable();
11481144
try
11491145
{
1146+
//create a temporary model
1147+
esentModel = new EsentModel();
1148+
esentModel.InstanceCache = new PersistedEntityInstanceCache(esentModel, null);
1149+
esentModel.InstanceCache.DatabaseName = fileName;
1150+
1151+
entTable = esentModel.InstanceCache.GetEntityTable();
11501152
using (entTable.BeginReadOnlyTransaction())
11511153
{
1152-
header = entTable.ReadHeader();
1154+
var header = entTable.ReadHeader();
1155+
return header;
11531156
}
11541157
}
11551158
catch (Exception e)
@@ -1158,10 +1161,14 @@ public static IStepFileHeader GetStepFileHeader(string fileName)
11581161
}
11591162
finally
11601163
{
1161-
esentModel.InstanceCache.FreeTable(entTable);
1162-
esentModel.Dispose();
1164+
if (esentModel != null)
1165+
{
1166+
if (entTable != null)
1167+
esentModel.InstanceCache.FreeTable(entTable);
1168+
1169+
esentModel.Dispose();
1170+
}
11631171
}
1164-
return header;
11651172
}
11661173

11671174
public void CreateFrom(IModel model, string fileName, ReportProgressDelegate progDelegate = null)

0 commit comments

Comments
 (0)