check.anubis 4.53 KB
/*
 * Created by PyramIDE.
 * User: フランスのトトロ 
 * Date: 04/02/2016
 * Time: 22:34
 * © Calexium 
 */

read calexium_lib/database/model/db_model.anubis
read system/string.anubis
read tools/list.anubis
read tools/basis.anubis

public define Maybe(List(String))
  get_all_apps_name
  (
    List(HK_App)  apps,
    List(String)  so_far
  )=
  if apps is
  {
    []      then  success(so_far),
    [h . t] then
      since h is hk_app(name, _),
      if name:so_far then
        println("The app name "+name+" already exists"); failure
      //'this' is not allowed as app name because the  
      //else name = "this" then
      //  prinln("error: 'this' is forbidden app name "); failure
      else
        get_all_apps_name(t, [name. so_far])
  }.


define Maybe(HK_Model_Column)
  resolve_foreign
  (
    List(String)    apps_name,
    String          current_app_name,
    String          table_name,
    HK_Model_Column col
  )=
  since col is hk_column(name, type, attrib, help),
  if type is foreign_key(fk_app, fk_table)  then
    with mb_fk_app =  if (fk_app) is
                      {
                        this            then println("this found replaced by "+current_app_name+" in app '"+current_app_name+"' table '"+table_name+"' column '"+name+"'");
                          success(current_app_name),
                        app_name(_name)  then
                          if _name:apps_name then 
                            success(_name) 
                          else
                            println("foreign key app '"+_name+"' doesn't exists in app '"+current_app_name+"' table '"+table_name+"' column '"+_name+"'");failure,
                        none            then
                          success("")
                      },
    if mb_fk_app is
    {
      failure           then failure,
      success(n_fk_app) then success(hk_column(name, foreign_key(if (fk_app) is app_name(_) then app_name(n_fk_app) else fk_app, (if length(n_fk_app)>0 then n_fk_app+"_"else "")+fk_table), attrib, help))
    }
  else
    success(col).
  
define Maybe(List(HK_Model_Column))
  resolve_foreign
  (
    List(String)    apps_name,
    String          app_name,
    String          table_name,
    List(HK_Model_Column) columns,
    List(HK_Model_Column) so_far
  )=
  if columns is
  {
    []      then  success(reverse(so_far)),
    [h . t] then  
      if resolve_foreign(apps_name, app_name, table_name, h) is 
      {
        failure       then failure,
        success(col)  then resolve_foreign(apps_name, app_name, table_name, t, [col. so_far])
      }
  }.
  
define Maybe(List(HK_Table))
  resolve_foreign
  (
    List(String)    apps_name,
    String          app_name,
    List(HK_Table)  tables,
    List(HK_Table)  so_far
  )=
  if tables is 
  {
    []      then success(reverse(so_far)),
    [h . t] then
      since h is hk_table(name, model, display),
      since model is hk_model(columns, display_string),
      with table_name = if length(app_name) > 0 then app_name +"_"+name else name,
      if resolve_foreign(apps_name, app_name, table_name, columns, []) is
      {
        failure                 then failure,
        success(checked_model)  then resolve_foreign(apps_name, app_name, t, [hk_table(table_name, hk_model(checked_model, display_string), display) . so_far])
      }
  }.
  
define Maybe(HK_App)
  resolve_foreign
  (
    List(String)  apps_name,
    HK_App        app
  )=
  since app is hk_app(name, tables),
  if resolve_foreign(apps_name, name, tables, []) is 
  {
    failure                   then  failure,
    success(resolved_tables)  then  success(hk_app(name, resolved_tables))
  }.
  
define Maybe(List(HK_App))
  resolve_foreign
  (
    List(String)  apps_name,
    List(HK_App)  apps,
    List(HK_App)  so_far
  )=
  if apps is
  {
    []      then success(reverse(so_far)),
    [h . t] then 
      if resolve_foreign(apps_name, h) is
      {
        failure       then failure,
        success(app)  then resolve_foreign(apps_name, t, [app . so_far])
      }
  }.
  
public define Maybe(HK_Database)
  check_database
  (
    HK_Database current_db  //database model description
  )=
  since current_db is hk_database(name, apps),
  
  if get_all_apps_name(apps, []) is
  {
    failure           then failure,
    success(chk_apps) then
    //TODO Check for reserved keyword used in column name, table name
    if resolve_foreign(chk_apps, apps, []) is
    {
      failure                 then failure,
      success(resolved_apps)  then
        //with checked_db = current_db,
        success(hk_database(name, resolved_apps))
      
    }
  }.