248 lines
9.0 KiB
PHP
248 lines
9.0 KiB
PHP
<% /*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: model_generic.inc
|
|
|
|
Description: Generiek model voor willekeurige tabel
|
|
Parameters:
|
|
Context:
|
|
|
|
Notes:
|
|
*/
|
|
|
|
function model_generic_template()
|
|
{
|
|
this.table = "<unkown>";
|
|
this.primary = "<unkown>";
|
|
this.records_name = "<unkown>s";
|
|
this.record_name = "<unkown>";
|
|
this.fields = {};
|
|
this.list = { columns: [] };
|
|
this.search = { filters: [] };
|
|
this.soft_delete = null;
|
|
this.autfunction = "WEB_PRSSYS";
|
|
}
|
|
|
|
function _findseq(primary)
|
|
{
|
|
if (!primary)
|
|
return null;
|
|
var seq_name = primary.substr(0,3) + "_S_" + primary;
|
|
var seq = null;
|
|
var sql = "SELECT sequence_name"
|
|
+ " FROM user_sequences"
|
|
+ " WHERE sequence_name = " + safe.quoted_sql_upper(seq_name);
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.Eof)
|
|
{
|
|
seq = oRs("sequence_name").Value.toLowerCase();
|
|
__Log("Sequence {0} found".format(seq_name));
|
|
}
|
|
else
|
|
__Log("Sequence {0} not found".format(seq_name));
|
|
oRs.Close();
|
|
return seq;
|
|
}
|
|
|
|
function model_generic(table, autfunction)
|
|
{
|
|
var model = new model_generic_template();
|
|
model.autfunction = autfunction;
|
|
model.table = table.toLowerCase();
|
|
model.record_name = table.substring(0,1).toUpperCase() + table.substring(1);
|
|
model.records_name = model.record_name + "s";
|
|
|
|
var sql = "SELECT LOWER(cols.column_name) column_name, cols.position, cons.status, cons.owner, utc.data_type"
|
|
+ " FROM user_constraints cons, user_cons_columns cols, user_tab_columns utc"
|
|
+ " WHERE cons.table_name = " + safe.quoted_sql_upper(table)
|
|
+ " AND cols.table_name = cons.table_name"
|
|
+ " AND cons.constraint_type = 'P'"
|
|
+ " AND cons.constraint_name = cols.constraint_name"
|
|
+ " AND cons.owner = cols.owner"
|
|
+ " AND utc.table_name = cols.table_name"
|
|
+ " AND utc.column_name = cols.column_name"
|
|
+ " ORDER BY cols.table_name, cols.position";
|
|
var oRs = Oracle.Execute(sql);
|
|
if (oRs.Eof)
|
|
{
|
|
//abort_with_warning("Unable to determine primary key for table {0}".format(table));
|
|
model.primary = null;
|
|
}
|
|
else
|
|
{
|
|
model.primary = oRs("column_name").Value;
|
|
var data_type = oRs("data_type").Value;
|
|
if (data_type != 'NUMBER')
|
|
{
|
|
//abort_with_warning("Only NUMBER primary key supported, not {0} ({1})".format(data_type, model.primary));
|
|
model.primary = null;
|
|
}
|
|
oRs.MoveNext();
|
|
if (!oRs.Eof)
|
|
{
|
|
//abort_with_warning("Composite primary key not supported for table {0}".format(table));
|
|
model.primary = null;
|
|
}
|
|
}
|
|
oRs.Close();
|
|
|
|
var sql = "SELECT num_rows, last_analyzed"
|
|
+ " FROM user_tables"
|
|
+ " WHERE table_name = " + safe.quoted_sql_upper(table);
|
|
var oRs = Oracle.Execute(sql);
|
|
if (!oRs.Eof) // Is er niet bij views
|
|
{
|
|
model.estimated_rows = oRs("num_rows").Value;
|
|
model.last_analyzed = oRs("last_analyzed").Value;
|
|
}
|
|
oRs.Close;
|
|
|
|
var sql = "SELECT LOWER(column_name) column_name"
|
|
+ " , data_type"
|
|
+ " , data_length"
|
|
+ " , data_precision"
|
|
+ " , data_scale"
|
|
+ " FROM user_tab_columns utc"
|
|
+ " WHERE utc.table_name = UPPER(" + safe.quoted_sql_upper(table) + ")"
|
|
+ " ORDER BY column_id";
|
|
var oRs = Oracle.Execute(sql);
|
|
var hasName = false;
|
|
model.nrfields = 0;
|
|
var seq = _findseq(model.primary);
|
|
while (!oRs.eof)
|
|
{
|
|
model.nrfields++;
|
|
var field = { dbs: oRs.Fields("column_name").Value,
|
|
label: oRs.Fields("column_name").Value,
|
|
typ: "varchar"
|
|
};
|
|
var ora_type = oRs("data_type").Value;
|
|
var ora_length = oRs("data_length").Value;
|
|
var ora_precision = oRs("data_precision").Value;
|
|
var ora_scale = oRs("data_scale").Value;
|
|
|
|
switch (ora_type)
|
|
{
|
|
case 'NUMBER':
|
|
field.typ = 'number';
|
|
if (ora_scale > 0)
|
|
{
|
|
field.datatype = 'float';
|
|
}
|
|
if (field.dbs.match(/key$/)) // hier fac_tracking_refkey ook herkennen
|
|
{
|
|
field.typ = 'key';
|
|
if (field.dbs != model.primary)
|
|
{
|
|
var ftable = field.dbs.replace(/_key$/,"");// TODO ipv. de replace echt foreign-key constraint controleren
|
|
|
|
var sql = "SELECT table_name, num_rows"
|
|
+ " FROM user_tables"
|
|
+ " WHERE table_name = " + safe.quoted_sql_upper(ftable)
|
|
+ " OR table_name = " + safe.quoted_sql_upper(ftable.substr(4)); // mld_alg_locatie_key bijv.
|
|
if (ftable.match(/ins_discipline$/))
|
|
sql += " OR table_name = 'INS_TAB_DISCIPLINE'";
|
|
var oRs2 = Oracle.Execute(sql);
|
|
if (!oRs2.Eof)
|
|
{
|
|
ftable = oRs2("table_name").Value.toLowerCase();
|
|
field.num_rows = oRs2("num_rows").Value; // voor scf auto-listboxen interessant
|
|
field.foreign = { tbl: ftable, key: field.dbs, desc: field.dbs };
|
|
// TODO: Kan dit niet (beter) terugvallen op foreignKeyTabel MLD_DISCIPLINE en zo?
|
|
if (ftable == "ins_tab_discipline")
|
|
{
|
|
field.foreign = { tbl: ftable, key: "ins_discipline_key", desc: "ins_discipline_omschrijving" };
|
|
}
|
|
field.infoPointer = { Url: "appl/mgt/mgt_generic.asp?mode=show&table=" + ftable + "&id=" };
|
|
}
|
|
oRs2.Close();
|
|
|
|
if (foreignKeyTable(ftable))
|
|
{
|
|
field.foreign = ftable;
|
|
field.label = field.label.replace(/_key$/, "(_key)"); // indicatie dat het foreign is
|
|
field.filter = "exact";
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case "DATE":
|
|
field.typ = 'datetime';
|
|
if (field.dbs == model.table + "_datum" ||
|
|
field.dbs == model.table + "_van" ||
|
|
field.dbs == model.table + "_aanmaak")
|
|
field.filter = "range";
|
|
break;
|
|
case "CHAR":
|
|
case "VARCHAR2":
|
|
field.typ = 'varchar';
|
|
break;
|
|
case "MLD_T_UITVOERTIJD":
|
|
field.typ = 'varchar';
|
|
field.readonly = true;
|
|
// Het volgende werkt niet goed: er *moet* een table-alias voor die kan varieren?
|
|
// field.sql = field.dbs + ".tijdsduur || " + field.dbs + ".eenheid";
|
|
// field.sql = "'$mld_t_uitvoertijd not supported yet$'";
|
|
field.sql = "mld.uitvoertijd_to_char({0})".format(field.dbs);
|
|
break;
|
|
default:
|
|
abort_with_warning("Unknown Oracle type '{0}'".format(ora_type));
|
|
}
|
|
|
|
var fld = oRs.Fields("column_name").Value;
|
|
|
|
if (fld == table.toLowerCase() + "_verwijder")
|
|
model.soft_delete = fld;
|
|
|
|
// Dan zien we hem ook nergens meer?
|
|
if (fld == model.table + "_aanmaak")
|
|
field.readonly = true;
|
|
|
|
if (field.dbs.match(/(salt|hash|secret|password|apikey|authenticatie)$/)) // hier fac_tracking_refkey ook herkennen
|
|
field.secret = true;
|
|
|
|
if (fld == model.primary)
|
|
{
|
|
field.filter = "exact";
|
|
fld = "id";
|
|
if (seq)
|
|
field.seq = seq;
|
|
}
|
|
if (fld.match(/(_omschrijving|_oms|_remark|_code|_nr)$/))
|
|
field.filter = "like";
|
|
if (!hasName && fld.match(/_code$/))
|
|
{
|
|
fld = "name";
|
|
hasName = true;
|
|
}
|
|
if (!hasName && fld.match(/(_omschrijving|_oms|_remark)$/))
|
|
{
|
|
fld = "name";
|
|
hasName = true;
|
|
}
|
|
if (fld == model.table + "_module")
|
|
{
|
|
field.filter = "like";
|
|
}
|
|
if (field.filter)
|
|
model.search.filters.push(fld);
|
|
model.fields[fld] = field;
|
|
|
|
if (fld == "id" || fld == "name" || fld == "description" || field.filter)
|
|
model.list.columns.push(fld);
|
|
|
|
oRs.MoveNext();
|
|
}
|
|
oRs.Close();
|
|
if (!model.nrfields)
|
|
abort_with_warning("No columns found for {0}".format(table)); // voorkomt ook latere sql-injection op tabelnaam
|
|
|
|
api2.generic_REST(model);
|
|
|
|
__Log(model);
|
|
return model;
|
|
}
|
|
|
|
%>
|