more work in progress migration code, still a while before
this becomes useful0.6.0-stable
parent
283cc90566
commit
c30e9ff0f1
|
@ -28,8 +28,11 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
|
using System.Data.Common;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using log4net;
|
||||||
|
|
||||||
namespace OpenSim.Data.Migrations
|
namespace OpenSim.Data.Migrations
|
||||||
{
|
{
|
||||||
|
@ -50,8 +53,8 @@ namespace OpenSim.Data.Migrations
|
||||||
/// When a database driver starts up, it specifies a resource that
|
/// When a database driver starts up, it specifies a resource that
|
||||||
/// needs to be brought up to the current revision. For instance:
|
/// needs to be brought up to the current revision. For instance:
|
||||||
///
|
///
|
||||||
/// Migration um = new Migration("Users");
|
/// Migration um = new Migration(DbConnection, "Users");
|
||||||
/// um.Upgrade(dbconnection);
|
/// um.Upgrade();
|
||||||
///
|
///
|
||||||
/// This works out which version Users is at, and applies all the
|
/// This works out which version Users is at, and applies all the
|
||||||
/// revisions past it to it. If there is no users table, all
|
/// revisions past it to it. If there is no users table, all
|
||||||
|
@ -63,11 +66,98 @@ namespace OpenSim.Data.Migrations
|
||||||
|
|
||||||
public class Migration
|
public class Migration
|
||||||
{
|
{
|
||||||
private string _type;
|
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
public Migration(string type)
|
private string _type;
|
||||||
|
private DbConnection _conn;
|
||||||
|
private string _subtype;
|
||||||
|
|
||||||
|
private static readonly string _migrations_create = "create table migrations(name varchar(100), version int)";
|
||||||
|
private static readonly string _migrations_init = "insert into migrations values('migrations', 1)";
|
||||||
|
private static readonly string _migrations_find = "select version from migrations where name='migrations'";
|
||||||
|
|
||||||
|
public Migration(DbConnection conn, string type)
|
||||||
{
|
{
|
||||||
_type = type;
|
_type = type;
|
||||||
|
_conn = conn;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Initialize()
|
||||||
|
{
|
||||||
|
DbCommand cmd = _conn.CreateCommand();
|
||||||
|
cmd.CommandText = _migrations_find;
|
||||||
|
// TODO: generic way to get that text
|
||||||
|
// if ( not found )
|
||||||
|
cmd.CommandText = _migrations_create;
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
|
||||||
|
cmd.CommandText = _migrations_init;
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Update()
|
||||||
|
{
|
||||||
|
int version = 0;
|
||||||
|
version = FindVersion(_type);
|
||||||
|
|
||||||
|
List<string> migrations = GetMigrationsAfter(version);
|
||||||
|
foreach (string m in migrations)
|
||||||
|
{
|
||||||
|
// TODO: update each
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: find the last revision by number and populate it back
|
||||||
|
}
|
||||||
|
|
||||||
|
private int FindVersion(string _type)
|
||||||
|
{
|
||||||
|
int version = 0;
|
||||||
|
DbCommand cmd = _conn.CreateCommand();
|
||||||
|
cmd.CommandText = "select version from migrations where name='" + _type + "' limit 1";
|
||||||
|
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private List<string> GetAllMigrations()
|
||||||
|
{
|
||||||
|
return GetMigrationsAfter(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<string> GetMigrationsAfter(int version)
|
||||||
|
{
|
||||||
|
Assembly assem = GetType().Assembly;
|
||||||
|
string[] names = assem.GetManifestResourceNames();
|
||||||
|
List<string> migrations = new List<string>();
|
||||||
|
|
||||||
|
Regex r = new Regex(@"^(\d\d\d)_" + _type + @"\.sql");
|
||||||
|
|
||||||
|
foreach (string s in names)
|
||||||
|
{
|
||||||
|
m_log.Info("MIGRATION: Resources: " + s);
|
||||||
|
if (s.EndsWith(_type + @"\.sql"))
|
||||||
|
{
|
||||||
|
Match m = r.Match(s);
|
||||||
|
m_log.Info("MIGRATION: Match: " + m.Groups[1].ToString());
|
||||||
|
int MigrationVersion = int.Parse(m.Groups[1].ToString());
|
||||||
|
using (Stream resource = assem.GetManifestResourceStream(s))
|
||||||
|
{
|
||||||
|
using (StreamReader resourceReader = new StreamReader(resource))
|
||||||
|
{
|
||||||
|
string resourceString = resourceReader.ReadToEnd();
|
||||||
|
migrations.Add(resourceString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: once this is working, get rid of this
|
||||||
|
if (migrations.Count < 1) {
|
||||||
|
throw new Exception(string.Format("Resource '{0}' was not found", _type));
|
||||||
|
}
|
||||||
|
|
||||||
|
return migrations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -212,6 +212,7 @@
|
||||||
<Reference name="System" localCopy="false"/>
|
<Reference name="System" localCopy="false"/>
|
||||||
<Reference name="System.Data"/>
|
<Reference name="System.Data"/>
|
||||||
<Reference name="OpenSim.Framework"/>
|
<Reference name="OpenSim.Framework"/>
|
||||||
|
<Reference name="log4net" />
|
||||||
<!-- needed for LLUUID types -->
|
<!-- needed for LLUUID types -->
|
||||||
<Reference name="libsecondlife.dll"/>
|
<Reference name="libsecondlife.dll"/>
|
||||||
<Files>
|
<Files>
|
||||||
|
|
Loading…
Reference in New Issue