home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / geninsproc.tcl < prev    next >
Text File  |  1996-06-05  |  6KB  |  174 lines

  1. #--------------------------------------------------------------------------
  2. #
  3. # Copyright (c) 1992-1996 by Cadre Technologies, Inc.
  4. #
  5. # This software is furnished under a license and may be used only in
  6. # accordance with the terms of such license and with the inclusion of
  7. # the above copyright notice. This software or any other copies thereof
  8. # may not be provided or otherwise made available to any other person.
  9. # No title to and ownership of the software is hereby transferred.
  10. #
  11. # The information in this software is subject to change without notice
  12. # and should not be construed as a commitment by Cadre Technologies, Inc.
  13. #
  14. #---------------------------------------------------------------------------
  15. #
  16. #        File           : @(#)geninsproc.tcl    2.1 (2.1)
  17. #        Original date  : 18-8-1992
  18. #        Description    : Tcl script for generating insert procedures
  19. #
  20. #---------------------------------------------------------------------------
  21. #
  22. # @(#)geninsproc.tcl    2.1 (2.1)\t19 Apr 1996 Copyright 1992-1996 Cadre Technologies, Inc
  23. #
  24. #---------------------------------------------------------------------------
  25.  
  26.  
  27. # Generate the procedure body for an insert procedure
  28. #
  29. proc gen_insert_proc { current_section currtab } {
  30.  
  31.     global empty_imports_procs
  32.     global empty_exports_procs
  33.     if { [ get empty_imports_procs(ins,$currtab) 0] &&
  34.          [ get empty_exports_procs(ins,$currtab) 0] } {
  35.         return
  36.     }
  37.  
  38.     set tab_name      [ $currtab getUniqueName]
  39.     $current_section pushIndent
  40.     expand_text $current_section {
  41.         CREATE PROCEDURE pins_~$tab_name
  42.         (
  43.             ~[ gen_simple_data_decl_4gl $current_section $currtab "ALL"\
  44.                "new" " ,\n" ]
  45.         )
  46.         ~[ gen_as_declare $current_section ]
  47.         BEGIN
  48.             ~[ gen_ins_block $current_section $currtab ]
  49.             RETURN 1;
  50.         END
  51.         \\p\\g
  52.         
  53.     }
  54.     $current_section popIndent
  55. }
  56.  
  57. # Generate procedure block for a insert procedure
  58. #
  59. proc gen_ins_block { current_section currtab } {
  60.  
  61.     set tab_name [ $currtab getUniqueName]
  62.     $current_section pushIndent
  63.     if { ![ get empty_imports_procs(ins,$currtab) 0]} {
  64.         expand_text $current_section {
  65.             /* RI: CHECK RI FOR MASTERS
  66.              * Check referential integrity after an INSERT INTO
  67.              * table '~$tab_name'
  68.              */
  69.         }
  70.         gen_imp_ins $current_section $currtab
  71.     }
  72.     if { ![ get empty_exports_procs(ins,$currtab) 0]} {
  73.         expand_text $current_section {
  74.             /* RI: CHECK RI FOR DETAILS
  75.              * Check referential integrity after an insert into
  76.              * table '~$tab_name'
  77.              */
  78.         }
  79.         gen_exp_ins $current_section $currtab
  80.     }
  81.     $current_section popIndent
  82. }
  83.  
  84. # Generate for all import links the code to check the RI
  85. #
  86. proc gen_imp_ins { current_section currtab } {
  87.  
  88.     $current_section pushIndent
  89.     foreach link [ $currtab importSet] {
  90.          set rule_type [ $link getInsType]
  91.          if { $rule_type == "none" } {
  92.              continue;
  93.          }
  94.          set riproc [ get import_rules(ins,$rule_type)]
  95.          if { $riproc != "" } {
  96.              ins_$riproc $current_section $currtab $link
  97.          } else {
  98.              m4_error $E_NO_TCL_INS_RULE $rule_type [ $currtab getUniqueName]
  99.          }
  100.     }
  101.     $current_section popIndent
  102. }
  103.  
  104. # Generate for all export links the code to check the RI
  105. #
  106. proc gen_exp_ins { current_section currtab } {
  107.  
  108.     $current_section pushIndent
  109.     foreach link [ $currtab exportSet] {
  110.          set rule_type [ $link getInsType]
  111.          if { $rule_type == "none" } {
  112.              continue;
  113.          }
  114.          set riproc [ get export_rules(ins,$rule_type)]
  115.          if { $riproc != "" } {
  116.              ins_$riproc $current_section $currtab $link
  117.          } else {
  118.          m4_error $E_NO_TCL_INS_RULE $rule_type [$currtab getUniqueName]
  119.          }
  120.     }
  121.     $current_section popIndent
  122. }
  123.  
  124. # Reject on not exist exported key in detail
  125. #
  126. proc ins_rej_not_exist_d { current_section currtab link } {
  127.  
  128.     set detail        [ $link detail]
  129.     set detail_name   [ $detail getUniqueName]
  130.     set columns       [ $link columnSet]
  131.     set tab_name      [ $currtab getUniqueName]
  132.  
  133.     gen_exist_in_detail_link $current_section $currtab $detail $link ":new"
  134.     gen_error_ins_rej_not_exist_in_detail $current_section $tab_name
  135. }
  136.  
  137. # Reject on not exist foreign key in master table
  138. #
  139. proc ins_rej_not_exist_m { current_section currtab link } {
  140.  
  141.     set tab_name      [ $currtab getUniqueName]
  142.     set master        [ $link master]
  143.     set master_name   [ $master getUniqueName]
  144.     #set columns       [ $link columnSet]
  145.     #set detail_type   [ $link getDelType]
  146.  
  147.     gen_exist_in_master_link $current_section $currtab $master $link ":new"
  148.     gen_error_ins_rej_not_exist_in_master $current_section $tab_name $master_name
  149. }
  150.  
  151. # Cascade  insert into the master table
  152. #
  153. proc ins_ins_in_master { current_section currtab link } {
  154.  
  155.     set tab_name      [ $currtab getUniqueName]
  156.     set master        [ $link master]
  157.     set master_name   [ $master getUniqueName]
  158.     set columns       [ $link columnSet]
  159.     #set detail_type   [ $link getDelType]
  160.  
  161.     $current_section pushIndent
  162.     expand_text $current_section {
  163.         ~[ gen_exist_in_master_link $current_section $currtab $master $link ":new" ]
  164.         IF counter = 0 THEN
  165.             /* The tuple does not exist in the master table ~$master_name
  166.              */
  167.             msg = 'Inserting tuple in master table "~$master_name"';
  168.             MESSAGE :msg;
  169.             ~[ gen_ins_in_master $current_section $master $columns ]
  170.         ENDIF;
  171.     }
  172.     $current_section popIndent
  173. }
  174.