Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 0516ee0

Browse files
committed
Merge pull request #396 from ilyalukyanov/master
Fixinf VistaDB assembly discovery
2 parents bc5f0e3 + e813df3 commit 0516ee0

File tree

7 files changed

+221
-87
lines changed

7 files changed

+221
-87
lines changed

src/ServiceStack.OrmLite.VistaDB.Tests/App.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<remove invariant="System.Data.VistaDB5" />
1111
<add invariant="System.Data.VistaDB5" name="VistaDB 5 Data Provider"
1212
description="VistaDB 5 ADO.NET Provider for .Net"
13-
type="VistaDB.Provider.VistaDBProviderFactory, VistaDB.5.NET40" />
13+
type="VistaDB.Provider.VistaDBProviderFactory, VistaDB.5.NET40, Version=5.0.0.0, Culture=neutral, PublicKeyToken=dfc935afe2125461" />
1414
</DbProviderFactories>
1515
</system.data>
1616
</configuration>

src/ServiceStack.OrmLite.VistaDB.Tests/OrmLiteTestBase.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,12 @@ public void TestFixtureSetUp()
1717
{
1818
LogManager.LogFactory = new ConsoleLogFactory();
1919

20+
VistaDbDialect.Provider.UseLibraryFromGac = true;
2021
OrmLiteConfig.DialectProvider = VistaDbDialect.Provider;
2122

22-
var dataFileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".vdb5");
23-
var sourceStream = typeof(OrmLiteTestBase).Assembly
24-
.GetManifestResourceStream("ServiceStack.OrmLite.VistaDB.Tests.Resources.test.vdb5");
23+
DataFileName = TestVistaDb.ExtractTestDatabaseFileToTempFile();
2524

26-
using (sourceStream)
27-
using (var destStream = File.Create(dataFileName))
28-
sourceStream.CopyTo(destStream);
29-
30-
DataFileName = dataFileName;
31-
ConnectionString = "Data Source=" + dataFileName + ";";
25+
ConnectionString = "Data Source=" + DataFileName + ";";
3226
}
3327

3428
[TestFixtureTearDown]

src/ServiceStack.OrmLite.VistaDB.Tests/TestVistaDb.cs

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,44 @@
1-
using System.Data;
1+
using System;
2+
using System.Configuration;
3+
using System.Data;
24
using System.Data.Common;
5+
using System.IO;
36
using NUnit.Framework;
47

58
namespace ServiceStack.OrmLite.VistaDB.Tests
69
{
710
[TestFixture]
811
public class TestVistaDb
912
{
13+
public static string ExtractTestDatabaseFileToTempFile()
14+
{
15+
var dataFileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".vdb5");
16+
17+
ExtractTestDatabaseFile(dataFileName);
18+
19+
return dataFileName;
20+
}
21+
22+
public static void ExtractTestDatabaseFile(string dataFileName)
23+
{
24+
var sourceStream = typeof(OrmLiteTestBase).Assembly
25+
.GetManifestResourceStream("ServiceStack.OrmLite.VistaDB.Tests.Resources.test.vdb5");
26+
27+
using (sourceStream)
28+
using (var destStream = File.Create(dataFileName))
29+
sourceStream.CopyTo(destStream);
30+
}
31+
32+
public static void CreateDatabase(DbProviderFactory factory)
33+
{
34+
using (var conn = factory.CreateConnection())
35+
using (var comm = conn.CreateCommand())
36+
{
37+
comm.CommandText = @"CREATE DATABASE '|DataDirectory|\Database.vdb5', PAGE SIZE 4, LCID 1033, CASE SENSITIVE FALSE;";
38+
comm.ExecuteNonQuery();
39+
}
40+
}
41+
1042
[Test]
1143
public void TestVistaDB()
1244
{
@@ -24,8 +56,24 @@ public void TestVistaDB()
2456
VersionInfo = "Failed to load connectionString from config file";
2557
Assert.Fail(VersionInfo);
2658
}
59+
60+
DbProviderFactory factory = null;
2761
// Loads the factory
28-
DbProviderFactory factory = DbProviderFactories.GetFactory(connectionString.ProviderName);
62+
try
63+
{
64+
factory = DbProviderFactories.GetFactory(connectionString.ProviderName);
65+
}
66+
catch
67+
{
68+
Assert.Fail("VistaDB library should be copied locally or installed into GAC.");
69+
}
70+
71+
try
72+
{
73+
CreateDatabase(factory);
74+
}
75+
catch { }
76+
2977
// After this it looks pretty normal
3078
using (DbConnection connection = factory.CreateConnection())
3179
{

src/ServiceStack.OrmLite.VistaDB/ReflectionBasedDialectProvider.cs

Lines changed: 79 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,81 @@ namespace ServiceStack.OrmLite.VistaDB
88
public abstract class ReflectionBasedDialectProvider<T> : OrmLiteDialectProviderBase<T>
99
where T: IOrmLiteDialectProvider
1010
{
11-
protected Type ConnectionType { get; private set; }
11+
private Lazy<Type> _connectionType;
1212

13-
protected ReflectionBasedDialectProvider(Type connectionType)
13+
private AssemblyName _assemblyGacName;
14+
private AssemblyName _assemblyLocalName;
15+
private string _providerTypeName;
16+
17+
protected ReflectionBasedDialectProvider()
1418
{
15-
if (connectionType == null)
16-
throw new ArgumentNullException("connectionType");
19+
_connectionType = new Lazy<Type>(LoadAssemblyAndGetType);
20+
}
21+
22+
protected abstract AssemblyName DefaultAssemblyGacName { get; }
23+
24+
protected abstract AssemblyName DefaultAssemblyLocalName { get; }
25+
26+
protected abstract string DefaultProviderTypeName { get; }
27+
28+
protected Type ConnectionType { get { return _connectionType.Value; } }
1729

18-
if (!typeof(IDbConnection).IsAssignableFrom(connectionType))
19-
throw new ArgumentException("Invalid connectionType");
30+
public bool UseLibraryFromGac { get; set; }
2031

21-
this.ConnectionType = connectionType;
32+
public AssemblyName AssemblyGacName
33+
{
34+
get
35+
{
36+
if (_assemblyGacName == null)
37+
_assemblyGacName = DefaultAssemblyGacName;
38+
39+
return _assemblyGacName;
40+
}
41+
set
42+
{
43+
SetValueSafe(value, v => _assemblyGacName = v);
44+
}
2245
}
2346

24-
protected ReflectionBasedDialectProvider(AssemblyName assemblyName, string typeName)
25-
: this (LoadAssemblyAndGetType(assemblyName, typeName))
26-
{}
47+
public AssemblyName AssemblyLocalName
48+
{
49+
get
50+
{
51+
if (_assemblyLocalName == null)
52+
_assemblyLocalName = DefaultAssemblyLocalName;
2753

28-
protected ReflectionBasedDialectProvider(string assemblyName, string typeName)
29-
: this (new AssemblyName(assemblyName), typeName)
30-
{}
54+
return _assemblyLocalName;
55+
}
56+
set
57+
{
58+
SetValueSafe(value, v => _assemblyLocalName = v);
59+
}
60+
}
3161

32-
protected static Type LoadAssemblyAndGetType(AssemblyName assemblyName, string typeName)
62+
public string ProviderTypeName
3363
{
64+
get
65+
{
66+
if (_providerTypeName == null)
67+
_providerTypeName = DefaultProviderTypeName;
68+
69+
return _providerTypeName;
70+
}
71+
set
72+
{
73+
SetValueSafe(value, v => _providerTypeName = v);
74+
}
75+
}
76+
77+
protected Type LoadAssemblyAndGetType()
78+
{
79+
var assemblyName = this.UseLibraryFromGac
80+
? this.AssemblyGacName
81+
: this.AssemblyLocalName;
82+
3483
var assembly = Assembly.Load(assemblyName);
35-
return assembly.GetType(typeName, true);
84+
85+
return assembly.GetType(this.ProviderTypeName, true);
3686
}
3787

3888
protected virtual IDbConnection ActivateDbConnection(string connectionString)
@@ -47,5 +97,19 @@ public override IDbConnection CreateConnection(string connectionString, Dictiona
4797
{
4898
return this.ActivateDbConnection(connectionString);
4999
}
100+
101+
private static void ThrowUnableToChangeProperty()
102+
{
103+
throw new InvalidOperationException("This property should only be set before the first time a connection is created");
104+
}
105+
106+
private void SetValueSafe<TValue>(TValue value, Action<TValue> action)
107+
where TValue: class
108+
{
109+
if (_connectionType.IsValueCreated)
110+
ThrowUnableToChangeProperty();
111+
112+
action.Invoke(value);
113+
}
50114
}
51115
}

src/ServiceStack.OrmLite.VistaDB/VistaDBExpression.cs

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -36,43 +36,6 @@ public override string ToUpdateStatement(T item, bool excludeDefaults = false)
3636
dialectProvider.GetQuotedTableName(ModelDef), setFields, WhereExpression);
3737
}
3838

39-
protected virtual string BuildOrderByIdExpression()
40-
{
41-
if (ModelDef.PrimaryKey == null)
42-
throw new ApplicationException("Malformed model, no PrimaryKey defined");
43-
44-
return String.Format("ORDER BY {0}", OrmLiteConfig.DialectProvider.GetQuotedColumnName(ModelDef.PrimaryKey.FieldName));
45-
}
46-
47-
protected virtual string BuildWhereIdGTEFirstId()
48-
{
49-
if (ModelDef.PrimaryKey == null)
50-
throw new ApplicationException("Malformed model, no PrimaryKey defined");
51-
52-
var where = String.IsNullOrWhiteSpace(WhereExpression)
53-
? String.Format("{0} > @first_id", OrmLiteConfig.DialectProvider.GetQuotedColumnName(ModelDef.PrimaryKey.FieldName))
54-
: String.Format("({0}) AND {1} > @first_id", WhereExpression.Trim().Substring("WHERE".Length), OrmLiteConfig.DialectProvider.GetQuotedColumnName(ModelDef.PrimaryKey.FieldName));
55-
56-
return "WHERE " + where;
57-
}
58-
59-
protected virtual string BuildSelectTopNIdExpression(int skip)
60-
{
61-
if (ModelDef.PrimaryKey == null)
62-
throw new ApplicationException("Malformed model, no PrimaryKey defined");
63-
64-
return String.Format("SELECT TOP {0} @first_id = {1} ", skip, OrmLiteConfig.DialectProvider.GetQuotedColumnName(ModelDef.PrimaryKey.FieldName));
65-
}
66-
67-
protected virtual string BuildDeclareFirstIdExpression()
68-
{
69-
if (ModelDef.PrimaryKey == null)
70-
throw new ApplicationException("Malformed model, no PrimaryKey defined");
71-
72-
return String.Format("DECLARE @first_id {0};",
73-
OrmLiteConfig.DialectProvider.GetColumnTypeDefinition(ModelDef.PrimaryKey.FieldType));
74-
}
75-
7639
protected override object VisitColumnAccessMethod(MethodCallExpression m)
7740
{
7841
if (m.Arguments.Count == 1 && m.Method.Name == "Equals")

src/ServiceStack.OrmLite.VistaDB/VistaDbDialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ namespace ServiceStack.OrmLite
44
{
55
public static class VistaDbDialect
66
{
7-
public static IOrmLiteDialectProvider Provider { get { return VistaDbDialectProvider.Instance; } }
7+
public static VistaDbDialectProvider Provider { get { return VistaDbDialectProvider.Instance; } }
88
}
99
}

0 commit comments

Comments
 (0)