Skip to content
86 changes: 62 additions & 24 deletions vendor/wheels/Migrator.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -120,19 +120,12 @@ component output="false" extends="wheels.Global"{
return local.rv;
}
local.rv &= "Migrating from #local.currentVersion# down to #arguments.version#.#Chr(13) & Chr(10)#";
for (local.i = ArrayLen(local.migrations); local.i >= 1; local.i--) {
local.migration = local.migrations[local.i];
if (local.migration.version <= arguments.version) {
break;
}
if (local.migration.status == "migrated" && application[local.appKey].allowMigrationDown) {
local.step = $runMigrationStep(migration = local.migration, direction = "down");
local.rv &= local.step.output;
if (!local.step.success) {
break;
}
}
}
local.rv = $migrateToDownLoop(
rv = local.rv,
migrations = local.migrations,
version = arguments.version,
allowMigrationDown = application[local.appKey].allowMigrationDown
);
} else {
if(arguments.missingMigFlag){
// Note: this path used to delete the current version's
Expand All @@ -155,22 +148,67 @@ component output="false" extends="wheels.Global"{
} else {
local.rv &= "Migrating from #local.currentVersion# up to #arguments.version#.#Chr(13) & Chr(10)#";
}
for (local.migration in local.migrations) {
if (local.migration.version <= arguments.version && local.migration.status != "migrated") {
local.step = $runMigrationStep(migration = local.migration, direction = "up");
local.rv &= local.step.output;
if (!local.step.success) {
break;
}
} else if (local.migration.version > arguments.version) {
break;
}
};
local.rv = $migrateToUpLoop(
rv = local.rv,
migrations = local.migrations,
version = arguments.version
);
}
}
return local.rv;
}

/**
* Internal function. Applies the `down` migration loop for migrateTo, iterating migrations
* from newest to oldest and running down() on migrated ones above the target version. Appends
* each step's output to `rv` and returns the accumulated output string.
*/
public string function $migrateToDownLoop(
required string rv,
required array migrations,
required string version,
required boolean allowMigrationDown
) {
for (local.i = ArrayLen(arguments.migrations); local.i >= 1; local.i--) {
local.migration = arguments.migrations[local.i];
if (local.migration.version <= arguments.version) {
break;
}
if (local.migration.status == "migrated" && arguments.allowMigrationDown) {
local.step = $runMigrationStep(migration = local.migration, direction = "down");
arguments.rv &= local.step.output;
if (!local.step.success) {
break;
}
}
}
return arguments.rv;
}

/**
* Internal function. Applies the `up` migration loop for migrateTo, iterating migrations in
* order and running up() on pending ones at or below the target version. Appends each step's
* output to `rv` and returns the accumulated output string.
*/
public string function $migrateToUpLoop(
required string rv,
required array migrations,
required string version
) {
for (local.migration in arguments.migrations) {
if (local.migration.version <= arguments.version && local.migration.status != "migrated") {
local.step = $runMigrationStep(migration = local.migration, direction = "up");
arguments.rv &= local.step.output;
if (!local.step.success) {
break;
}
} else if (local.migration.version > arguments.version) {
break;
}
}
return arguments.rv;
}

/**
* Runs a single specific migration's up() regardless of sequence order.
* Used for out-of-sequence migrations that were created by other developers
Expand Down
2 changes: 1 addition & 1 deletion vendor/wheels/channel/DatabaseAdapter.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ component {

queryExecute("
CREATE TABLE wheels_events (
id #local.varcharType#(36) NOT NULL PRIMARY KEY,
id #local.varcharType#(255) NOT NULL PRIMARY KEY,
channel #local.varcharType#(255) NOT NULL,
event #local.varcharType#(255) NOT NULL,
data #local.textType#,
Expand Down
178 changes: 72 additions & 106 deletions vendor/wheels/databaseAdapters/H2/H2Model.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -9,117 +9,83 @@ component extends="wheels.databaseAdapters.Base" output=false {
return true;
}

variables.h2TypeMap = {
"bigint": "cf_sql_bigint",
"int8": "cf_sql_bigint",
"binary": "cf_sql_binary",
"bytea": "cf_sql_binary",
"raw": "cf_sql_binary",
"binary varying": "cf_sql_binary",
"bit": "cf_sql_bit",
"bool": "cf_sql_bit",
"boolean": "cf_sql_bit",
"binary large object": "cf_sql_blob",
"blob": "cf_sql_blob",
"tinyblob": "cf_sql_blob",
"mediumblob": "cf_sql_blob",
"longblob": "cf_sql_blob",
"image": "cf_sql_blob",
"oid": "cf_sql_blob",
"char": "cf_sql_char",
"character": "cf_sql_char",
"nchar": "cf_sql_char",
"uuid": "cf_sql_char",
"date": "cf_sql_date",
"dec": "cf_sql_decimal",
"decimal": "cf_sql_decimal",
"number": "cf_sql_decimal",
"numeric": "cf_sql_decimal",
"double": "cf_sql_double",
"double precision": "cf_sql_double",
"float": "cf_sql_float",
"float4": "cf_sql_float",
"float8": "cf_sql_float",
"real": "cf_sql_float",
"int": "cf_sql_integer",
"int4": "cf_sql_integer",
"integer": "cf_sql_integer",
"mediumint": "cf_sql_integer",
"signed": "cf_sql_integer",
"identity": "cf_sql_integer",
"int2": "cf_sql_smallint",
"smallint": "cf_sql_smallint",
"year": "cf_sql_smallint",
"time": "cf_sql_time",
"datetime": "cf_sql_timestamp",
"smalldatetime": "cf_sql_timestamp",
"timestamp": "cf_sql_timestamp",
"tinyint": "cf_sql_tinyint",
"varbinary": "cf_sql_varbinary",
"longvarbinary": "cf_sql_varbinary",
"varchar": "cf_sql_varchar",
"varchar2": "cf_sql_varchar",
"longvarchar": "cf_sql_varchar",
"varchar_ignorecase": "cf_sql_varchar",
"nvarchar": "cf_sql_varchar",
"nvarchar2": "cf_sql_varchar",
"clob": "cf_sql_varchar",
"nclob": "cf_sql_varchar",
"text": "cf_sql_varchar",
"tinytext": "cf_sql_varchar",
"mediumtext": "cf_sql_varchar",
"longtext": "cf_sql_varchar",
"ntext": "cf_sql_varchar",
"enum": "cf_sql_varchar",
"character varying": "cf_sql_varchar",
"character large object": "cf_sql_varchar",
"nvarchar_casesensitive": "cf_sql_nvarchar",
"json": "cf_sql_longvarchar"
};

/**
* Map database types to the ones used in CFML.
*/
public string function $getType(required string type, string scale, string details) {
switch (arguments.type) {
case "bigint":
case "int8":
local.rv = "cf_sql_bigint";
break;
case "binary":
case "bytea":
case "raw":
case "binary varying":
local.rv = "cf_sql_binary";
break;
case "bit":
case "bool":
case "boolean":
local.rv = "cf_sql_bit";
break;
case "binary large object":
case "blob":
case "tinyblob":
case "mediumblob":
case "longblob":
case "image":
case "oid":
local.rv = "cf_sql_blob";
break;
case "char":
case "character":
case "nchar":
case "UUID":
local.rv = "cf_sql_char";
break;
case "date":
local.rv = "cf_sql_date";
break;
case "dec":
case "decimal":
case "number":
case "numeric":
local.rv = "cf_sql_decimal";
break;
case "double":
case "double precision":
local.rv = "cf_sql_double";
break;
case "float":
case "float4":
case "float8":
case "real":
local.rv = "cf_sql_float";
break;
case "int":
case "int4":
case "integer":
case "mediumint":
case "signed":
case "identity":
local.rv = "cf_sql_integer";
break;
case "int2":
case "smallint":
case "year":
local.rv = "cf_sql_smallint";
break;
case "time":
local.rv = "cf_sql_time";
break;
case "datetime":
case "smalldatetime":
case "timestamp":
local.rv = "cf_sql_timestamp";
break;
case "tinyint":
local.rv = "cf_sql_tinyint";
break;
case "varbinary":
case "longvarbinary":
local.rv = "cf_sql_varbinary";
break;
case "varchar":
case "varchar2":
case "longvarchar":
case "varchar_ignorecase":
case "nvarchar":
case "nvarchar2":
case "clob":
case "nclob":
case "text":
case "tinytext":
case "mediumtext":
case "longtext":
case "ntext":
case "enum":
case "character varying":
case "character large object":
local.rv = "cf_sql_varchar";
break;
case "nvarchar_casesensitive":
local.rv = "cf_sql_nvarchar";
break;
case "json":
local.rv = "cf_sql_longvarchar";
break;
default:
$throwUnknownColumnType(arguments.type);
break;
local.key = LCase(arguments.type);
if (StructKeyExists(variables.h2TypeMap, local.key)) {
return variables.h2TypeMap[local.key];
}
return local.rv;
$throwUnknownColumnType(arguments.type);
}

/**
Expand Down
Loading
Loading