http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/sqlcomp/CmpSeabaseDDLroutine.h
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLroutine.h 
b/core/sql/sqlcomp/CmpSeabaseDDLroutine.h
new file mode 100644
index 0000000..18b6d7a
--- /dev/null
+++ b/core/sql/sqlcomp/CmpSeabaseDDLroutine.h
@@ -0,0 +1,280 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+
+#ifndef _CMP_SEABASE_PROCEDURES_H_
+#define _CMP_SEABASE_PROCEDURES_H_
+
+#include "CmpSeabaseDDL.h"
+
+// To add a new procedure:
+//   update export/lib/lib_mgmt.jar to include code for the new procedure 
+//   add a define representing the procedures below
+//   add a static const QString representing the create procedure text
+//   add a new entry in allLibmgrRoutineInfo 
+//   perform initialize trafodion, upgrade library management
+// recommend that new procedures are added in alphabetic order
+
+// At this time there is no support to drop or change the signature of an
+// existing procedure.  Since customers may be using the procedures, it is
+// recommended that they not be dropped or changed - instead add new ones
+// to handle the required change.
+  
+// List of supported system procedures - in alphabetic order
+#define SYSTEM_PROC_ADDLIB       "ADDLIB"
+#define SYSTEM_PROC_ALTERLIB     "ALTERLIB"
+#define SYSTEM_PROC_DROPLIB      "DROPLIB"
+#define SYSTEM_PROC_GETFILE      "GETFILE"
+#define SYSTEM_PROC_HELP         "HELP"
+#define SYSTEM_PROC_LS           "LS"
+#define SYSTEM_PROC_LSALL        "LSALL"
+#define SYSTEM_PROC_PUT          "PUT"
+#define SYSTEM_PROC_RM           "RM"
+#define SYSTEM_PROC_RMREX        "RMREX"
+
+// Create procedure text for system procedures
+static const QString seabaseProcAddlibDDL[] =
+{
+  {"  CREATE PROCEDURE IF NOT EXISTS %s.\"%s\"."SYSTEM_PROC_ADDLIB" "},
+  {" ( "},
+  {"  IN LIBNAME VARCHAR(1024) CHARACTER SET UTF8, "},
+  {"  IN FILENAME VARCHAR(1024) CHARACTER SET UTF8, "},
+  {"  IN HOSTNAME VARCHAR(1024) CHARACTER SET UTF8, "},
+  {"  IN LOCALFILE VARCHAR(1024) CHARACTER SET UTF8) "},
+  {"  EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.addLib 
(java.lang.String,java.lang.String,java.lang.String,java.lang.String)' "},
+  {"  EXTERNAL SECURITY DEFINER "},
+  {"  LIBRARY %s.\"%s\".%s "},
+  {"  LANGUAGE JAVA "},
+  {"  PARAMETER STYLE JAVA "},
+  {"  CONTAINS SQL "},
+  {"  NO TRANSACTION REQUIRED "},
+  {" ; "}
+};
+
+static const QString seabaseProcAlterlibDDL[] = 
+{
+  {"  CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".ALTERLIB "},
+  {" ( "},
+  {"  IN LIBNAME VARCHAR(1024) CHARACTER SET UTF8,"},
+  {"  IN FILENAME VARCHAR(1024) CHARACTER SET UTF8,"},
+  {"  IN HOSTNAME VARCHAR(1024) CHARACTER SET UTF8,"},
+  {"  IN LOCALFILE VARCHAR(1024) CHARACTER SET UTF8) "},
+  {"  EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.alterLib 
(java.lang.String,java.lang.String,java.lang.String,java.lang.String)' "},
+  {"  EXTERNAL SECURITY DEFINER "},
+  {"  LIBRARY %s.\"%s\".%s "},
+  {"  LANGUAGE JAVA "},
+  {"  PARAMETER STYLE JAVA "},
+  {"  CONTAINS SQL "},
+  {"  NO TRANSACTION REQUIRED "},
+  {" ; "}
+};
+
+static const QString seabaseProcDroplibDDL[] = 
+{
+  {"  CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".DROPLIB "},
+  {" ( "},
+  {"  IN LIBNAME VARCHAR(1024) CHARACTER SET UTF8, "},
+  {"  IN MODETYPE VARCHAR(1024) CHARACTER SET ISO88591) "},
+  {"  EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.dropLib 
(java.lang.String,java.lang.String)' "},
+  {"  EXTERNAL SECURITY DEFINER "},
+  {"  LIBRARY %s.\"%s\".%s "},
+  {"  LANGUAGE JAVA "},
+  {"  PARAMETER STYLE JAVA "},
+  {"  CONTAINS SQL "},
+  {"  NO TRANSACTION REQUIRED "},
+  {" ; "}
+};
+
+static const QString seabaseProcGetfileDDL[] = 
+{
+  {"  CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".GETFILE  "},
+  {" ( "},
+  {"  IN FILENAME VARCHAR(256) CHARACTER SET UTF8,"},
+  {"  IN OFFSET INTEGER,"},
+  {"  OUT FILEDATA VARCHAR(12800) CHARACTER SET UTF8,"},
+  {"  OUT DATALENGTH LARGEINT)"},
+  {"  EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.get 
(java.lang.String,int,java.lang.String[],long[])' "},
+  {"  LIBRARY %s.\"%s\".%s "},
+  {"  EXTERNAL SECURITY DEFINER "},
+  {"  LANGUAGE JAVA "},
+  {"  PARAMETER STYLE JAVA "},
+  {"  READS SQL DATA "},
+  {"  NO TRANSACTION REQUIRED "},
+  {" ; "}
+};
+
+static const QString seabaseProcHelpDDL[] =
+{
+  {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".HELP "},
+  {" ( "},
+  {" INOUT COMMANDNAME VARCHAR(2560) CHARACTER SET ISO88591) "},
+  {"  EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.help (java.lang.String[])' 
"},
+  {"  EXTERNAL SECURITY DEFINER "},
+  {"  LIBRARY %s.\"%s\".%s "},
+  {"  LANGUAGE JAVA "},
+  {"  PARAMETER STYLE JAVA "},
+  {"  READS SQL DATA "},
+  {" ; "}
+};
+
+static const QString seabaseProcLsDDL[] = 
+{
+  {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".LS  "},
+  {" ( "},
+  {"  IN FILENAME VARCHAR(256) CHARACTER SET UTF8, "},
+  {"  OUT FILENAMES VARCHAR(10240) CHARACTER SET ISO88591) "},
+  {"  EXTERNAL NAME 
'org.trafodion.libmgmt.FileMgmt.ls(java.lang.String,java.lang.String[])' "},
+  {"  EXTERNAL SECURITY DEFINER "},
+  {"  LIBRARY %s.\"%s\".%s "},
+  {"  LANGUAGE JAVA "},
+  {"  PARAMETER STYLE JAVA "},
+  {"  READS SQL DATA "},
+  {"  NO TRANSACTION REQUIRED "},
+  {" ; "}
+};
+
+static const QString seabaseProcLsallDDL[] = 
+{
+  {"  CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".LSALL "},
+  {" ( "},
+  {"  OUT FILENAMES VARCHAR(10240) CHARACTER SET ISO88591) "},
+  {"  EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.lsAll(java.lang.String[])' 
"},
+  {"  EXTERNAL SECURITY DEFINER "},
+  {"  LIBRARY %s.\"%s\".%s "}, 
+  {"  LANGUAGE JAVA "},
+  {"  PARAMETER STYLE JAVA "},
+  {"  READS SQL DATA "},
+  {"  NO TRANSACTION REQUIRED "},
+  {" ; "}
+};
+
+static const QString seabaseProcPutDDL[] =
+{
+  {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".PUT "},
+  {" ( "},
+  {"  IN FILEDATA VARCHAR(102400) CHARACTER SET ISO88591, "},
+  {"  IN FILENAME VARCHAR(256) CHARACTER SET UTF8, "},
+  {"  IN CREATEFLAG INTEGER, "},
+  {"  IN FILEOVERWRITE INTEGER) "},
+  {"  EXTERNAL NAME 
'org.trafodion.libmgmt.FileMgmt.put(java.lang.String,java.lang.String,int,int)' 
"},
+  {"  EXTERNAL SECURITY DEFINER "},
+  {"  LIBRARY %s.\"%s\".%s "},
+  {"  LANGUAGE JAVA "},
+  {"  PARAMETER STYLE JAVA "},
+  {"  READS SQL DATA "},
+  {"  NO TRANSACTION REQUIRED "},
+  {" ; "}
+};
+
+static const QString seabaseProcRmDDL[] = 
+{
+  {"  CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".RM "},
+  {" ( "},
+  {"  IN FILENAME VARCHAR(256) CHARACTER SET UTF8) "},
+  {"  EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.rm(java.lang.String)' "},
+  {"  EXTERNAL SECURITY DEFINER "},
+  {"  LIBRARY %s.\"%s\".%s "},
+  {"  LANGUAGE JAVA "},
+  {"  PARAMETER STYLE JAVA "},
+  {"  READS SQL DATA "},
+  {"  NO TRANSACTION REQUIRED "},
+  {" ; "}
+};
+
+static const QString seabaseProcRmrexDDL[] = 
+{
+  {"  CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".RMREX  "},
+  {" ( "},
+  {"  IN FILENAME VARCHAR(256) CHARACTER SET UTF8, "},
+  {"  OUT FILENAMES VARCHAR(10240) CHARACTER SET ISO88591) "},
+  {"  EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.rmRex(java.lang.String, 
java.lang.String[])' "},
+  {"  EXTERNAL SECURITY DEFINER "},
+  {"  LIBRARY %s.\"%s\".%s "},
+  {"  LANGUAGE JAVA "},
+  {"  PARAMETER STYLE JAVA "},
+  {"  READS SQL DATA "},
+  {"  NO TRANSACTION REQUIRED "},
+  {" ; "}
+};
+
+struct LibmgrRoutineInfo
+{
+  // name of the procedure
+  const char * newName;
+
+  // ddl stmt corresponding to the current ddl.
+  const QString *newDDL;
+  Lng32 sizeOfnewDDL;
+};
+
+static const LibmgrRoutineInfo allLibmgrRoutineInfo[] = {
+  {SYSTEM_PROC_ADDLIB, 
+   seabaseProcAddlibDDL, 
+   sizeof(seabaseProcAddlibDDL)
+  },
+
+  {SYSTEM_PROC_ALTERLIB, 
+   seabaseProcAlterlibDDL, 
+   sizeof(seabaseProcAlterlibDDL)
+  },
+
+  {SYSTEM_PROC_DROPLIB, 
+   seabaseProcDroplibDDL, 
+   sizeof(seabaseProcDroplibDDL)
+  },
+
+  {SYSTEM_PROC_GETFILE, 
+   seabaseProcGetfileDDL, 
+   sizeof(seabaseProcGetfileDDL)
+  },
+
+  {SYSTEM_PROC_HELP, 
+   seabaseProcHelpDDL, 
+   sizeof(seabaseProcHelpDDL)
+  },
+
+  {SYSTEM_PROC_LS, 
+   seabaseProcLsDDL, 
+   sizeof(seabaseProcLsDDL)
+  },
+
+  {SYSTEM_PROC_LSALL, 
+   seabaseProcLsallDDL, 
+   sizeof(seabaseProcLsallDDL)
+  },
+
+  {SYSTEM_PROC_PUT, 
+   seabaseProcPutDDL, 
+   sizeof(seabaseProcPutDDL)
+  },
+
+  {SYSTEM_PROC_RM, 
+   seabaseProcRmDDL, 
+   sizeof(seabaseProcRmDDL)
+  },
+
+  {SYSTEM_PROC_RMREX, 
+   seabaseProcRmrexDDL, 
+   sizeof(seabaseProcRmrexDDL)
+  }
+
+};
+
+#endif

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp 
b/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
index 34a8cf0..921369f 100644
--- a/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
+++ b/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
@@ -61,6 +61,7 @@ static bool dropOneTable(
    const char * schemaName, 
    const char * objectName,
    bool isVolatile,
+   bool ifExists,
    bool ddlXns);
    
 static bool transferObjectPrivs(
@@ -499,6 +500,8 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * 
dropSchemaNode)
 
    // select objects in the schema to drop, don't return 
PRIMARY_KEY_CONSTRAINTS,
    // they always get removed when the parent table is dropped.
+   // Filter out the LOB depenedent tables too - they will get dropped when 
+   //the main LOB table is dropped. 
    str_sprintf(query,"SELECT TRIM(object_name), TRIM(object_type) "
                      "FROM %s.\"%s\".%s "
                      "WHERE catalog_name = '%s' AND schema_name = '%s' AND "
@@ -548,12 +551,12 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * 
dropSchemaNode)
        dirtiedMetadata = TRUE;
        if (dropOneTable(cliInterface,(char*)catName.data(),
                         (char*)schName.data(),(char*)objName.data(),
-                        isVolatile, dropSchemaNode->ddlXns()))
+                        isVolatile, FALSE,dropSchemaNode->ddlXns()))
           someObjectsCouldNotBeDropped = true;
      }
    }
 
-   // Drop libraries, procedures (SPJs), UDFs (functions), and views 
+   // Drop procedures (SPJs), UDFs (functions), and views 
     objectsQueue->position();
     for (int idx = 0; idx < objectsQueue->numEntries(); idx++)
     {
@@ -576,14 +579,9 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * 
dropSchemaNode)
           case COM_REFERENTIAL_CONSTRAINT_OBJECT:
           case COM_SEQUENCE_GENERATOR_OBJECT:
           case COM_UNIQUE_CONSTRAINT_OBJECT:
-          {
-             continue;
-          }
           case COM_LIBRARY_OBJECT:
           {
-             objectTypeString = "LIBRARY";
-             cascade = "CASCADE";
-             break;
+             continue;
           }
 
           // If the library where procedures and functions reside is dropped
@@ -634,30 +632,85 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * 
dropSchemaNode)
           someObjectsCouldNotBeDropped = true;
    } 
 
-   // Drop all tables in the schema.  This will also drop any associated 
constraints. 
-
+   // Drop libraries in the schema
    objectsQueue->position();
    for (int idx = 0; idx < objectsQueue->numEntries(); idx++)
    {
-      OutputInfo * vi = (OutputInfo*)objectsQueue->getNext(); 
+      OutputInfo * vi = (OutputInfo*)objectsQueue->getNext();
 
-      NAString objName = vi->get(0);
+      char * objName = vi->get(0);
       NAString objType = vi->get(1);
 
-      // drop user objects first
-      if (objType == COM_BASE_TABLE_OBJECT_LIT)
+      if (objType == COM_LIBRARY_OBJECT_LIT)
       {
-         // histogram tables have already been dropped
-         if (!isHistogramTable(objName))
-         {
-            dirtiedMetadata = TRUE;
-            if (dropOneTable(cliInterface,(char*)catName.data(), 
-                             (char*)schName.data(),(char*)objName.data(),
-                             isVolatile, dropSchemaNode->ddlXns()))
-               someObjectsCouldNotBeDropped = true;
-         }
-      } 
-   } 
+         char buf [1000];
+
+         dirtiedMetadata = TRUE;
+         str_sprintf(buf, "DROP LIBRARY \"%s\".\"%s\".\"%s\" CASCADE",
+                     (char*)catName.data(), (char*)schName.data(), objName);
+         cliRC = cliInterface.executeImmediate(buf);
+
+         if (cliRC < 0 && cliRC != -CAT_OBJECT_DOES_NOT_EXIST_IN_TRAFODION)
+            someObjectsCouldNotBeDropped = true;
+      }
+   }
+
+   // Drop all tables in the schema.  This will also drop any associated 
constraints. 
+
+   objectsQueue->position();
+   for (int idx = 0; idx < objectsQueue->numEntries(); idx++)
+     {
+       OutputInfo * vi = (OutputInfo*)objectsQueue->getNext(); 
+
+       NAString objName = vi->get(0);
+       NAString objType = vi->get(1);
+
+       // drop user objects first
+       if (objType == COM_BASE_TABLE_OBJECT_LIT) 
+        {
+          // histogram tables have already been dropped
+          // Avoid any tables that match LOB dependent tablenames.
+          // (there is no special type for these tables) 
+          if (!isHistogramTable(objName) && !isLOBDependentNameMatch(objName))
+            {
+              dirtiedMetadata = TRUE;
+              if (dropOneTable(cliInterface,(char*)catName.data(), 
+                               (char*)schName.data(),(char*)objName.data(),
+                               isVolatile, FALSE,dropSchemaNode->ddlXns()))
+                someObjectsCouldNotBeDropped = true;
+            }
+        } 
+     } 
+
+   // If there are any user tables having the LOB dependent name pattern, they
+   // will still be around. Drop those. The real LOB dependent tables, would
+   //have been dropped in the previous step 
+  
+
+    objectsQueue->position();
+   for (int idx = 0; idx < objectsQueue->numEntries(); idx++)
+     {
+       OutputInfo * vi = (OutputInfo*)objectsQueue->getNext(); 
+
+       NAString objName = vi->get(0);
+       NAString objType = vi->get(1);
+
+       if (objType == COM_BASE_TABLE_OBJECT_LIT)
+        {
+          if (!isHistogramTable(objName) && isLOBDependentNameMatch(objName))
+            {
+              dirtiedMetadata = TRUE;
+              // Pass in TRUE for "ifExists" since the lobDependent tables 
+              // would have already been dropped and we don't want those to 
+              // raise errors. We just want to catch any user tables that 
+              // happen to have the same name patterns.
+              if (dropOneTable(cliInterface,(char*)catName.data(), 
+                               (char*)schName.data(),(char*)objName.data(),
+                               isVolatile,TRUE, dropSchemaNode->ddlXns()))
+                someObjectsCouldNotBeDropped = true;
+            }
+        } 
+     } 
  
    // Drop any remaining indexes.
 
@@ -1151,6 +1204,7 @@ static bool dropOneTable(
    const char * schemaName, 
    const char * objectName,
    bool isVolatile,
+   bool ifExists,
    bool ddlXns)
    
 {
@@ -1160,17 +1214,23 @@ char buf [1000];
 bool someObjectsCouldNotBeDropped = false;
 
 char volatileString[20] = {0};
+ char ifExistsString[20] = {0};
 Lng32 cliRC = 0;
 
+
+
    if (isVolatile)
       strcpy(volatileString,"VOLATILE");
 
+   if (ifExists)
+     strcpy(ifExistsString,"IF EXISTS");
+
    if (ComIsTrafodionExternalSchemaName(schemaName))
      str_sprintf(buf,"DROP EXTERNAL TABLE \"%s\" FOR \"%s\".\"%s\".\"%s\" 
CASCADE",
                  objectName,catalogName,schemaName,objectName);
    else
-     str_sprintf(buf,"DROP %s TABLE \"%s\".\"%s\".\"%s\" CASCADE",
-                 volatileString,catalogName,schemaName,objectName);
+     str_sprintf(buf,"DROP %s %s TABLE  \"%s\".\"%s\".\"%s\" CASCADE",
+                 volatileString, ifExistsString, 
catalogName,schemaName,objectName);
  
 ULng32 savedParserFlags = Get_SqlParser_Flags(0xFFFFFFFF);
 

Reply via email to