home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume25 / sybperl / part01 / t / sbex.pl
Perl Script  |  1991-11-11  |  4KB  |  143 lines

  1. #!../sybperl
  2.  
  3.  
  4. @nul = ('not null','null');
  5. @sysdb = ('master', 'model', 'tempdb');
  6.  
  7. require "../lib/sybperl.pl";
  8.  
  9. print "Sybperl version $SybperlVer\n\n";
  10.  
  11. print "This script tests some of sybperl's functions, and prints out\n";
  12. print "description of the databases that are defined in your Sybase\n";
  13. print "dataserver.\n\n";
  14.  
  15.  
  16. $dbproc = &dblogin("sa");    # Login to sybase
  17.  
  18. $dbproc2 = &dbopen;        # Get a second dbprocess, so that we can select from several
  19.                                 # chanels simultaneously. We could code things so that this
  20.                 # feature is unnecessary, but it's good to exercise it.
  21.  
  22.                 # First, find out what databases exist:
  23. &dbcmd($dbproc, "select name from sysdatabases order by crdate\n");
  24. &dbsqlexec($dbproc);
  25. &dbresults($dbproc);
  26.  
  27. database: while((@db = &dbnextrow($dbproc)))
  28. {
  29.     foreach $nm (@sysdb)
  30.     {
  31.     if($db[0] =~ /$nm/)
  32.     {
  33.         print "'$db[0]' is a system database\n";
  34.         next database;
  35.     }
  36.     }
  37.     print "Finding user tables in user database $db[0]...";
  38.  
  39.     &dbcmd($dbproc2, "select o.name, u.name, o.id\n"); # 
  40.     &dbcmd($dbproc2, "from $db[0].dbo.sysobjects o, $db[0].dbo.sysusers u\n");
  41.     &dbcmd($dbproc2, "where o.type = 'U' and u.uid = o.uid\n");
  42.     &dbcmd($dbproc2, "order by o.name\n");
  43.  
  44.     &dbsqlexec($dbproc2);
  45.     &dbresults($dbproc2);
  46.  
  47.     while((@dat = &dbnextrow($dbproc2)))
  48.     {
  49.     $tab = join('@', @dat);    # Save the information
  50.     push(@tables, $tab);    # for later use...
  51.     }
  52.     print "Done.\n";
  53.  
  54.     print "Finding user defined datatypes in database $db[0]...\n";
  55.  
  56.     &dbcmd($dbproc2, "select s.length,substring(s.name,1,30),substring(st.name,1,30)\n");
  57.     &dbcmd($dbproc2, "from   $db[0].dbo.systypes s, $db[0].dbo.systypes st\n");
  58.     &dbcmd($dbproc2, "where  st.type = s.type\n");
  59.     &dbcmd($dbproc2, "and s.usertype > 100 and st.usertype < 100 and st.usertype != 18\n");
  60.     &dbsqlexec($dbproc2);
  61.     &dbresults($dbproc2);
  62.  
  63.     while((@dat = &dbnextrow($dbproc2)))
  64.     {
  65.     print "sp_addtype $dat[1],";
  66.     if ($dat[2] =~ /char|binary/)
  67.     {
  68.         print "'$dat[2]($dat[0])'";
  69.     }
  70.     else
  71.     {
  72.         print "$dat[2]";
  73.     }
  74.     print "\n";
  75.  
  76.     }
  77.     print "Done.\n";
  78.  
  79.     print "Now we find the table definition for each user table\nin database $db[0]...\n";
  80.  
  81.     foreach $ln (@tables)        # For each line in the list
  82.     {
  83.     @tab = split('@',$ln);
  84.  
  85.     &dbcmd($dbproc2, "select Column_name = c.name, \n");
  86.     &dbcmd($dbproc2, "       Type = t.name, \n");
  87.     &dbcmd($dbproc2, "       Length = c.length, \n");
  88.     &dbcmd($dbproc2, "       Nulls = convert(bit, (c.status & 8))\n");
  89.     &dbcmd($dbproc2, "from   $db[0].dbo.syscolumns c, $db[0].dbo.systypes t\n");
  90.     &dbcmd($dbproc2, "where  c.id = $tab[2]\n");
  91.     &dbcmd($dbproc2, "and    c.usertype *= t.usertype\n");
  92.     
  93.     &dbsqlexec($dbproc2);
  94.     &dbresults($dbproc2);
  95.  
  96.     print "\nTABLE $db[0].$tab[1].$tab[0]\n ("; 
  97.     $first = 1;
  98.     while((@field = &dbnextrow($dbproc2)))
  99.     {
  100.         print ",\n" if !$first;        # add a , and a \n if not first field in table
  101.         
  102.         print "\t$field[0] \t$field[1]";
  103.         print "($field[2])" if $field[1] =~ /char|bin/;
  104.         print " $nul[$field[3]]";
  105.  
  106.         $first = 0 if $first;
  107.     }
  108.     print " )\n";
  109.  
  110. # now get the indexes...
  111. #
  112.     print "\nIndexes on $db[0].$tab[0].$tab[1]...\n\n";
  113.     &dbuse($dbproc2, $db[0]);
  114.     &dbcmd($dbproc2, "sp_helpindex '$tab[1].$tab[0]'\n");
  115.  
  116.     &dbsqlexec($dbproc2);
  117.     &dbresults($dbproc2);
  118.  
  119.     while((@field = &dbnextrow($dbproc2)))
  120.     {
  121.         print "unique " if $field[1] =~ /unique/;
  122.         print "clustered " if $field[1] =~ /^clust/;
  123.         print "index $field[0]\n";
  124.         @col = split(/,/,$field[2]);
  125.         print "on $db[0].$tab[1].$tab[0] (";
  126.         $first = 1;
  127.         foreach $ln1 (@col)
  128.         {
  129.         print ", " if !$first;
  130.         $first = 0;
  131.         print "$ln1";
  132.         }
  133.         print ")\n";
  134.     }
  135.     print "\nDone.\n";
  136.     }
  137.     &dbuse($dbproc2, "master");
  138.     @tables = ();
  139. }
  140.  
  141. &dbexit;
  142.  
  143.