Skip to content

cleanup #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
358 changes: 190 additions & 168 deletions Assets/Output/DBEvolution.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,175 +4,197 @@

namespace UnityORM
{
/// <summary>
/// Schme management tool.
/// Execute only diff sqls.
/// </summary>
public class DBEvolution
{

string dbFilePath;
SqliteDatabase database;

public SqliteDatabase Database{
get{
if(database == null){
database = new SqliteDatabase();

database.Open(dbFilePath);
CreateMetaTable();
}
return database;
}
}

public bool RecreateTableIfHashDiffers{get;set;}

/// <summary>
/// Initializes a new instance of the <see cref="com.geishatokyo.DB.DBEvolution"/> class.
/// </summary>
/// <param name='dbFilePath'>
/// Db file path.
/// </param>
public DBEvolution (string dbFilePath)
{
this.dbFilePath = dbFilePath;
RecreateTableIfHashDiffers = false;
}


/// <summary>
/// Evolute the specified tableName with sqls.
/// </summary>
/// <param name='tableName'>
/// Table name.
/// </param>
/// <param name='sqls'>
/// Sqls.
/// </param>
public void Evolute(string tableName, List<string> sqls){
TableVersion version = GetTableVersion(tableName);
var db = this.Database;
if(RecreateTableIfHashDiffers && version.QueryHash != null){
string hash;
if(sqls.Count > version.QueryIndex){
hash = GetHash(sqls.GetRange(0,version.QueryIndex + 1));
}else{
hash = "";
}
if(hash != version.QueryHash){
Debug.Log(string.Format("Table hash error.OnDB:{0} Passed:{1}",version.QueryHash,hash));
DropTable(tableName);
version.QueryIndex = -1;
version.QueryHash = null;
}
}

bool updated = false;
int successIndex = -1;
bool error = false;
for(int i = version.QueryIndex + 1;i < sqls.Count;i++){
Debug.Log(string.Format("Execute query of {0}:{1}" ,tableName,i));
updated = true;
try{
db.ExecuteNonQuery(sqls[i]);
successIndex = i;
}catch(SqliteException e){
error = true;
Debug.Log("Error SQL:" + sqls[i]);
Debug.LogException(e);
break;
}
}

if(successIndex >= 0){
sqls = sqls.GetRange(0,successIndex + 1);
if(version.QueryHash == null){
string hashCode = GetHash(sqls);
CreateRecord(tableName,sqls.Count - 1,hashCode);
}else{
string hashCode = GetHash(sqls);
UpdateRecord(tableName,sqls.Count - 1,hashCode);
}
}

if(error){
Debug.Log("There are some errors.Please fix your sql");
}

}

public void Close(){
if(database != null){
database.Close();
database = null;
}
}

string GetHash(List<string> sqls){
string join = string.Join("_",sqls.ToArray());
return join.GetHashCode().ToString();
}

void CreateRecord(string tableName,int index,string queryHash){
string sql = string.Format(
@"INSERT INTO MetaTable VALUES('{0}',{1},'{2}');",tableName,index,queryHash);
Database.ExecuteNonQuery(sql);
}
void UpdateRecord(string tableName,int index,string queryHash){
string sql = string.Format(
@"UPDATE MetaTable SET queryIndex={0},queryHash='{1}' WHERE tableName='{2}';",
index,queryHash,tableName);
Database.ExecuteNonQuery(sql);
}

void DropTable(string tableName){
Debug.Log("DROP TABLE IF EXISTS " + tableName);
string sql = string.Format(@"DROP TABLE IF EXISTS {0};",tableName);
Database.ExecuteNonQuery(sql);

string metaSql = string.Format(@"DELETE FROM MetaTable WHERE tableName='{0}';",tableName);
Database.ExecuteNonQuery(metaSql);
}

TableVersion GetTableVersion(string tableName){
string sql = @"SELECT * FROM MetaTable WHERE tableName = '" + tableName + "';";
DataTable dt = Database.ExecuteQuery(sql);

TableVersion tv = new TableVersion();
if(dt.Rows.Count > 0){
tv.TableName = tableName;
var row = dt.Rows[0];
tv.QueryIndex = row.GetAsInt("queryIndex");
tv.QueryHash = row["queryHash"].ToString();
}else{
tv.TableName = tableName;
tv.QueryIndex = -1;
tv.QueryHash = null;
}
return tv;
}



bool CreateMetaTable(){
string createTable = @"CREATE TABLE IF NOT EXISTS MetaTable(
/// <summary>
/// Schme management tool.
/// Execute only diff sqls.
/// </summary>
public class DBEvolution
{
private string dbFilePath;
private SqliteDatabase database;

public SqliteDatabase Database {
get {
if (database == null)
{
database = new SqliteDatabase ();

database.Open (dbFilePath);
CreateMetaTable ();
}
return database;
}
}

public bool RecreateTableIfHashDiffers{ get; set; }

/// <summary>
/// Initializes a new instance of the <see cref="com.geishatokyo.DB.DBEvolution"/> class.
/// </summary>
/// <param name='dbFilePath'>
/// Db file path.
/// </param>
public DBEvolution (string dbFilePath)
{
this.dbFilePath = dbFilePath;
RecreateTableIfHashDiffers = false;
}

/// <summary>
/// Evolute the specified tableName with sqls.
/// </summary>
/// <param name='tableName'>
/// Table name.
/// </param>
/// <param name='sqls'>
/// Sqls.
/// </param>
public void Evolute (string tableName, List<string> sqls)
{
TableVersion version = GetTableVersion (tableName);
var db = this.Database;
if (RecreateTableIfHashDiffers && version.QueryHash != null)
{
string hash;
if (sqls.Count > version.QueryIndex)
{
hash = GetHash (sqls.GetRange (0, version.QueryIndex + 1));
}
else
{
hash = string.Empty;
}
if (hash != version.QueryHash)
{
Debug.Log (string.Format ("Table hash error.OnDB:{0} Passed:{1}", version.QueryHash, hash));
DropTable (tableName);
version.QueryIndex = -1;
version.QueryHash = null;
}
}

// TODO: use updated?
//bool updated = false;
int successIndex = -1;
bool error = false;

for (int i = version.QueryIndex + 1; i < sqls.Count; i++)
{
Debug.Log (string.Format ("Execute query of {0}:{1}", tableName, i));
//updated = true;
try
{
db.ExecuteNonQuery (sqls [i]);
successIndex = i;
}
catch (SqliteException e)
{
error = true;
Debug.LogError ("Error SQL:" + sqls [i]);
Debug.LogException (e);
break;
}
}

if (successIndex >= 0)
{
sqls = sqls.GetRange (0, successIndex + 1);
if (version.QueryHash == null)
{
string hashCode = GetHash (sqls);
CreateRecord (tableName, sqls.Count - 1, hashCode);
}
else
{
string hashCode = GetHash (sqls);
UpdateRecord (tableName, sqls.Count - 1, hashCode);
}
}

if (error)
{
Debug.LogError ("There are some errors.Please fix your sql");
}
}

public void Close ()
{
if (database != null)
{
database.Close ();
database = null;
}
}

private string GetHash (List<string> sqls)
{
string join = string.Join ("_", sqls.ToArray ());
return join.GetHashCode ().ToString ();
}

void CreateRecord (string tableName, int index, string queryHash)
{
string sql = string.Format (
@"INSERT INTO MetaTable VALUES('{0}',{1},'{2}');", tableName, index, queryHash);
Database.ExecuteNonQuery (sql);
}

void UpdateRecord (string tableName, int index, string queryHash)
{
string sql = string.Format (
@"UPDATE MetaTable SET queryIndex={0},queryHash='{1}' WHERE tableName='{2}';",
index, queryHash, tableName);
Database.ExecuteNonQuery (sql);
}

private void DropTable (string tableName)
{
Debug.Log ("DROP TABLE IF EXISTS " + tableName);
string sql = string.Format (@"DROP TABLE IF EXISTS {0};", tableName);
Database.ExecuteNonQuery (sql);

string metaSql = string.Format (@"DELETE FROM MetaTable WHERE tableName='{0}';", tableName);
Database.ExecuteNonQuery (metaSql);
}

private TableVersion GetTableVersion (string tableName)
{
string sql = @"SELECT * FROM MetaTable WHERE tableName = '" + tableName + "';";
DataTable dt = Database.ExecuteQuery (sql);

TableVersion tv = new TableVersion ();
if (dt.Rows.Count > 0)
{
tv.TableName = tableName;
var row = dt.Rows [0];
tv.QueryIndex = row.GetAsInt ("queryIndex");
tv.QueryHash = row ["queryHash"].ToString ();
}
else
{
tv.TableName = tableName;
tv.QueryIndex = -1;
tv.QueryHash = null;
}
return tv;
}

private bool CreateMetaTable ()
{
string createTable = @"CREATE TABLE IF NOT EXISTS MetaTable(
tableName VARCHAR(100) NOT NULL,
queryIndex Int NOT NULL,
queryHash VARCHAR(100) NOT NULL);";
Database.ExecuteNonQuery(createTable);
// TODO fix to check table is really created.
return true;
}



}

struct TableVersion{
public string TableName;
public int QueryIndex;
public string QueryHash;
}
}
Database.ExecuteNonQuery (createTable);
// TODO fix to check table is really created.
return true;
}
}

struct TableVersion
{
public string TableName;
public int QueryIndex;
public string QueryHash;
}
}