mirror of https://github.com/nocodb/nocodb
Pranav C
3 years ago
22 changed files with 572 additions and 696 deletions
@ -0,0 +1,86 @@ |
|||||||
|
import BaseRender from "../../BaseRender"; |
||||||
|
|
||||||
|
abstract class BaseModelXcMeta extends BaseRender { |
||||||
|
|
||||||
|
public abstract getXcColumnsObject(context:any):any[]; |
||||||
|
|
||||||
|
public getObject() { |
||||||
|
return { |
||||||
|
tn: this.ctx.tn, |
||||||
|
_tn: this.ctx._tn, |
||||||
|
columns: this.getXcColumnsObject(this.ctx), |
||||||
|
pks: [], |
||||||
|
hasMany: this.ctx.hasMany, |
||||||
|
belongsTo: this.ctx.belongsTo, |
||||||
|
db_type: this.ctx.db_type, |
||||||
|
type: this.ctx.type, |
||||||
|
|
||||||
|
v: [ |
||||||
|
...(this.ctx.hasMany || []).map(hm => ({ |
||||||
|
hm, |
||||||
|
_cn:`${hm._rtn} => ${hm._tn}` |
||||||
|
})), |
||||||
|
...(this.ctx.belongsTo || []).map(bt => ({ |
||||||
|
bt, |
||||||
|
_cn:`${bt._rtn} <= ${bt._tn}` |
||||||
|
})), |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
protected mapDefaultPrimaryValue(columnsArr: any[]):void { |
||||||
|
// pk can be at the end
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
/* |
||||||
|
|
||||||
|
if PK is at the end of table |
||||||
|
if (there is a column for PV) |
||||||
|
make that PV |
||||||
|
else |
||||||
|
lets think |
||||||
|
else if (pk is not at the end of table) |
||||||
|
if (there is a column for PV) |
||||||
|
make that PV |
||||||
|
else |
||||||
|
lets think |
||||||
|
else if ( no pk at all) |
||||||
|
let's think |
||||||
|
*/ |
||||||
|
|
||||||
|
if (!columnsArr.some(column => column.pv)) { |
||||||
|
let len = columnsArr.length; |
||||||
|
let pkIndex = -1; |
||||||
|
|
||||||
|
while (len--) { |
||||||
|
if (columnsArr[len].pk) { |
||||||
|
pkIndex = len; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// if PK is at the end of table
|
||||||
|
if (pkIndex === columnsArr.length - 1) { |
||||||
|
if (pkIndex > 0) { |
||||||
|
columnsArr[pkIndex - 1].pv = true; |
||||||
|
} |
||||||
|
} |
||||||
|
// pk is not at the end of table
|
||||||
|
else if (pkIndex > -1) { |
||||||
|
columnsArr[pkIndex + 1].pv = true; |
||||||
|
} |
||||||
|
// no pk at all
|
||||||
|
else { |
||||||
|
// todo:
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
export default BaseModelXcMeta; |
@ -1,459 +0,0 @@ |
|||||||
import BaseRender from "../../BaseRender"; |
|
||||||
|
|
||||||
class MssqlXcRender extends BaseRender { |
|
||||||
|
|
||||||
/** |
|
||||||
* |
|
||||||
* @param dir |
|
||||||
* @param filename |
|
||||||
* @param ctx |
|
||||||
* @param ctx.tn |
|
||||||
* @param ctx.columns |
|
||||||
* @param ctx.relations |
|
||||||
*/ |
|
||||||
constructor({dir, filename, ctx}) { |
|
||||||
super({dir, filename, ctx}); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Prepare variables used in code template |
|
||||||
*/ |
|
||||||
prepare() { |
|
||||||
|
|
||||||
const data:any = {}; |
|
||||||
|
|
||||||
/* example of simple variable */ |
|
||||||
data.tn = this.ctx.tn; |
|
||||||
|
|
||||||
/* for complex code provide a func and args - do derivation within the func cbk */ |
|
||||||
data.columns = { |
|
||||||
func: this._renderXcColumns.bind(this), |
|
||||||
args: {columns: this.ctx.columns, relations: this.ctx.relations, tn: this.ctx.tn} |
|
||||||
}; |
|
||||||
|
|
||||||
data.pks = { |
|
||||||
func: this._renderXcPks.bind(this), |
|
||||||
args: {columns: this.ctx.columns, relations: this.ctx.relations, tn: this.ctx.tn} |
|
||||||
}; |
|
||||||
|
|
||||||
/* for complex code provide a func and args - do derivation within the func cbk */ |
|
||||||
data.relations = { |
|
||||||
func: this._renderXcRelations.bind(this), |
|
||||||
args: {columns: this.ctx.columns, relations: this.ctx.relations, tn: this.ctx.tn} |
|
||||||
}; |
|
||||||
|
|
||||||
return data; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* |
|
||||||
* @param args |
|
||||||
* @param args.columns |
|
||||||
* @param args.relations |
|
||||||
* @returns {string} |
|
||||||
* @private |
|
||||||
*/ |
|
||||||
_renderXcColumns(args) { |
|
||||||
|
|
||||||
let str = '[\r\n'; |
|
||||||
|
|
||||||
for (let i = 0; i < args.columns.length; ++i) { |
|
||||||
|
|
||||||
str += `{\r\n`; |
|
||||||
str += `cn: '${args.columns[i].cn}',\r\n`; |
|
||||||
str += `dt: '${args.columns[i].dt}',\r\n`; |
|
||||||
if (args.columns[i].rqd) |
|
||||||
str += `rqd: ${args.columns[i].rqd},\r\n`; |
|
||||||
|
|
||||||
if (args.columns[i].cdf) |
|
||||||
str += `default: "${args.columns[i].cdf}",\r\n`; |
|
||||||
|
|
||||||
if (args.columns[i].un) |
|
||||||
str += `un: ${args.columns[i].un},\r\n`; |
|
||||||
|
|
||||||
if (args.columns[i].pk) |
|
||||||
str += `pk: ${args.columns[i].pk},\r\n`; |
|
||||||
|
|
||||||
if (args.columns[i].ai) |
|
||||||
str += `ai: ${args.columns[i].ai},\r\n`; |
|
||||||
|
|
||||||
str += `validate: {
|
|
||||||
func: [], |
|
||||||
args: [], |
|
||||||
msg: [] |
|
||||||
},`;
|
|
||||||
str += `},\r\n`; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
str += ']\r\n'; |
|
||||||
|
|
||||||
return str; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* |
|
||||||
* @param args |
|
||||||
* @param args.columns |
|
||||||
* @param args.relations |
|
||||||
* @returns {string} |
|
||||||
* @private |
|
||||||
*/ |
|
||||||
_renderXcPks(args) { |
|
||||||
|
|
||||||
let str = '{\r\n'; |
|
||||||
|
|
||||||
for (let i = 0; i < args.columns.length; ++i) { |
|
||||||
|
|
||||||
str += `${args.columns[i].cn} : {\r\n`; |
|
||||||
|
|
||||||
if (args.columns[i].rqd) |
|
||||||
str += `rqd: ${args.columns[i].rqd},`; |
|
||||||
|
|
||||||
if (args.columns[i].cdf) |
|
||||||
str += `default: "${args.columns[i].cdf}",`; |
|
||||||
|
|
||||||
if (args.columns[i].un) |
|
||||||
str += `un: ${args.columns[i].un},`; |
|
||||||
|
|
||||||
if (args.columns[i].pk) |
|
||||||
str += `pk: ${args.columns[i].pk},`; |
|
||||||
|
|
||||||
if (args.columns[i].ai) |
|
||||||
str += `ai: ${args.columns[i].ai},`; |
|
||||||
|
|
||||||
str += `validate: {
|
|
||||||
func: [], |
|
||||||
args: [], |
|
||||||
msg: [] |
|
||||||
},`;
|
|
||||||
str += `},\r\n`; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
str += '}\r\n'; |
|
||||||
|
|
||||||
return str; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* |
|
||||||
* @param args |
|
||||||
* @param args.tn |
|
||||||
* @param args.columns |
|
||||||
* @param args.relations |
|
||||||
* @returns {string} |
|
||||||
* @private |
|
||||||
*/ |
|
||||||
_renderXcRelations(args) { |
|
||||||
|
|
||||||
let relationStr = ''; |
|
||||||
|
|
||||||
let belongsToRelations = args.relations.filter(r => r.tn === args.tn); |
|
||||||
let hasManyRelations = args.relations.filter(r => r.rtn === args.tn); |
|
||||||
|
|
||||||
if (belongsToRelations.length || hasManyRelations.length) { |
|
||||||
|
|
||||||
relationStr = `${args.tn}.associate = function(models) {` |
|
||||||
|
|
||||||
for (let i = 0; i < belongsToRelations.length; ++i) { |
|
||||||
relationStr += `${args.tn}.belongsTo(models.${belongsToRelations[i].rtn});\n` |
|
||||||
} |
|
||||||
|
|
||||||
for (let i = 0; i < hasManyRelations.length; ++i) { |
|
||||||
relationStr += `${args.tn}.hasMany(models.${hasManyRelations[i]._tn});\n` |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
relationStr += `}` |
|
||||||
} |
|
||||||
|
|
||||||
return relationStr; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
_sequelizeGetType(column) { |
|
||||||
let str = ''; |
|
||||||
switch (column.dt) { |
|
||||||
case "int": |
|
||||||
str += `DataTypes.INTEGER(${column.dtxp})`; |
|
||||||
if (column.un) |
|
||||||
str += `.UNSIGNED`; |
|
||||||
break; |
|
||||||
case "tinyint": |
|
||||||
str += `DataTypes.INTEGER(${column.dtxp})`; |
|
||||||
if (column.un) |
|
||||||
str += `.UNSIGNED`; |
|
||||||
|
|
||||||
break; |
|
||||||
case "smallint": |
|
||||||
str += `DataTypes.INTEGER(${column.dtxp})`; |
|
||||||
if (column.un) |
|
||||||
str += `.UNSIGNED`; |
|
||||||
|
|
||||||
break; |
|
||||||
case "mediumint": |
|
||||||
str += `DataTypes.INTEGER(${column.dtxp})`; |
|
||||||
if (column.un) |
|
||||||
str += `.UNSIGNED`; |
|
||||||
|
|
||||||
break; |
|
||||||
case "bigint": |
|
||||||
str += `DataTypes.BIGINT`; |
|
||||||
if (column.un) |
|
||||||
str += `.UNSIGNED`; |
|
||||||
|
|
||||||
break; |
|
||||||
case "float": |
|
||||||
str += `DataTypes.FLOAT`; |
|
||||||
break; |
|
||||||
case "decimal": |
|
||||||
str += `DataTypes.DECIMAL`; |
|
||||||
break; |
|
||||||
case "double": |
|
||||||
str += `"DOUBLE(${column.dtxp},${column.ns})"`; |
|
||||||
break; |
|
||||||
case "real": |
|
||||||
str += `DataTypes.FLOAT`; |
|
||||||
break; |
|
||||||
case "bit": |
|
||||||
str += `DataTypes.BOOLEAN`; |
|
||||||
break; |
|
||||||
case "boolean": |
|
||||||
str += `DataTypes.STRING(45)`; |
|
||||||
break; |
|
||||||
case "serial": |
|
||||||
str += `DataTypes.BIGINT`; |
|
||||||
break; |
|
||||||
case "date": |
|
||||||
str += `DataTypes.DATEONLY`; |
|
||||||
break; |
|
||||||
case "datetime": |
|
||||||
str += `DataTypes.DATE`; |
|
||||||
break; |
|
||||||
case "timestamp": |
|
||||||
str += `DataTypes.DATE`; |
|
||||||
break; |
|
||||||
case "time": |
|
||||||
str += `DataTypes.TIME`; |
|
||||||
break; |
|
||||||
case "year": |
|
||||||
str += `"YEAR"`; |
|
||||||
break; |
|
||||||
case "char": |
|
||||||
str += `DataTypes.CHAR(${column.dtxp})`; |
|
||||||
break; |
|
||||||
case "varchar": |
|
||||||
str += `DataTypes.STRING(${column.dtxp})`; |
|
||||||
break; |
|
||||||
case "nchar": |
|
||||||
str += `DataTypes.CHAR(${column.dtxp})`; |
|
||||||
break; |
|
||||||
case "text": |
|
||||||
str += `DataTypes.TEXT`; |
|
||||||
break; |
|
||||||
case "tinytext": |
|
||||||
str += `DataTypes.TEXT`; |
|
||||||
break; |
|
||||||
case "mediumtext": |
|
||||||
str += `DataTypes.TEXT`; |
|
||||||
break; |
|
||||||
case "longtext": |
|
||||||
str += `DataTypes.TEXT`; |
|
||||||
break; |
|
||||||
case "binary": |
|
||||||
str += `"BINARY(${column.dtxp})"`; |
|
||||||
break; |
|
||||||
case "varbinary": |
|
||||||
str += `"VARBINARY(${column.dtxp})"`; |
|
||||||
break; |
|
||||||
case "blob": |
|
||||||
str += `"BLOB"`; |
|
||||||
break; |
|
||||||
case "tinyblob": |
|
||||||
str += `"TINYBLOB"`; |
|
||||||
break; |
|
||||||
case "mediumblob": |
|
||||||
str += `"MEDIUMBLOB"`; |
|
||||||
break; |
|
||||||
case "longblob": |
|
||||||
str += `"LONGBLOB"`; |
|
||||||
break; |
|
||||||
case "enum": |
|
||||||
str += `DataTypes.ENUM(${column.dtxp})`; |
|
||||||
break; |
|
||||||
case "set": |
|
||||||
str += `"SET(${column.dtxp})"`; |
|
||||||
break; |
|
||||||
case "time": |
|
||||||
str += `DataTypes.TIME`; |
|
||||||
break; |
|
||||||
case "geometry": |
|
||||||
str += `DataTypes.GEOMETRY`; |
|
||||||
break; |
|
||||||
case "point": |
|
||||||
str += `"POINT"`; |
|
||||||
break; |
|
||||||
case "linestring": |
|
||||||
str += `"LINESTRING"`; |
|
||||||
break; |
|
||||||
case "polygon": |
|
||||||
str += `"POLYGON"`; |
|
||||||
break; |
|
||||||
case "multipoint": |
|
||||||
str += `"MULTIPOINT"`; |
|
||||||
break; |
|
||||||
case "multilinestring": |
|
||||||
str += `"MULTILINESTRING"`; |
|
||||||
break; |
|
||||||
case "multipolygon": |
|
||||||
str += `"MULTIPOLYGON"`; |
|
||||||
break; |
|
||||||
case "json": |
|
||||||
str += `DataTypes.JSON`; |
|
||||||
break; |
|
||||||
default: |
|
||||||
str += `"${column.dt}"`; |
|
||||||
break; |
|
||||||
} |
|
||||||
return str; |
|
||||||
} |
|
||||||
|
|
||||||
_sequelizeGetDefault(column) { |
|
||||||
let str = ''; |
|
||||||
switch (column.dt) { |
|
||||||
case "int": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "tinyint": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "smallint": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "mediumint": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "bigint": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "float": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "decimal": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "double": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "real": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "bit": |
|
||||||
str += column.cdf ? column.cdf.split('b')[1] : column.cdf; |
|
||||||
break; |
|
||||||
case "boolean": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "serial": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "date": |
|
||||||
str += `sequelize.literal('${column.cdf_sequelize}')`; |
|
||||||
break; |
|
||||||
case "datetime": |
|
||||||
str += `sequelize.literal('${column.cdf_sequelize}')`; |
|
||||||
break; |
|
||||||
case "timestamp": |
|
||||||
str += `sequelize.literal('${column.cdf_sequelize}')`; |
|
||||||
break; |
|
||||||
case "time": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "year": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "char": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "varchar": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "nchar": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "text": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "tinytext": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "mediumtext": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "longtext": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "binary": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "varbinary": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "blob": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "tinyblob": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "mediumblob": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "longblob": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
case "enum": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "set": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "geometry": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "point": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "linestring": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "polygon": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "multipoint": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "multilinestring": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "multipolygon": |
|
||||||
str += `'${column.cdf}'`; |
|
||||||
break; |
|
||||||
case "json": |
|
||||||
str += column.cdf; |
|
||||||
break; |
|
||||||
} |
|
||||||
return str; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
export default MssqlXcRender; |
|
Loading…
Reference in new issue