Index: ApplySchemaCommand.cpp
===================================================================
--- ApplySchemaCommand.cpp	(revision 3180)
+++ ApplySchemaCommand.cpp	(working copy)
@@ -100,123 +100,185 @@
     for (FdoInt32 i = 0; i < classesSize; i++)
     {
         FdoPtr<FdoClassDefinition> classDef(featureClasses->GetItem(i));
-        FdoPtr<FdoPropertyDefinitionCollection> props(classDef->GetProperties());
-
-        if (NULL != props && props->GetCount() > 0)
+        switch ( classDef->GetElementState() )
         {
-            std::string sep;
-            std::string sqlColumns;
+        case FdoSchemaElementState_Added:
+            CreateTable(classDef);
+            break;
+        case FdoSchemaElementState_Deleted:
+            DropTable(classDef);
+            break;
+        case FdoSchemaElementState_Modified:
+        case FdoSchemaElementState_Detached:
+        case FdoSchemaElementState_Unchanged:
+            break;
+        }
+    }
+}
 
-            //
-            // Read properties and parse details: name, data type, size.
-            // 
-            FdoInt32 const propsSize = props->GetCount();
-            for (FdoInt32 j = 0; j < propsSize; j++)
-            {
-                FdoPtr<FdoPropertyDefinition> propDef(props->GetItem(j));
-                if (FdoPropertyType_DataProperty == propDef->GetPropertyType())
-                {
-                    FdoStringP propName(propDef->GetName());
-                    std::string sqlType(details::PgTypeFromFdoProperty(propDef));
-                    if (sqlType.empty())
-                    {
-                        throw FdoCommandException::Create(L"ApplySchemaCommand::Execute: Unkown data property type"); 
-                    }
+///////////////////////////////////////////////////////////////////////////////
+// Private operations
+///////////////////////////////////////////////////////////////////////////////
 
-                    sqlColumns += sep;
-                    sqlColumns += static_cast<char const*>(propName.Lower());
-                    sqlColumns += " " + sqlType;
-                    sep = ",";
-                }
-            }
+void ApplySchemaCommand::CreateTable(FdoPtr<FdoClassDefinition> classDef) const
+{
+    FDOLOG_MARKER("ApplySchemaCommand::-CreateTable");
 
-            //
-            // Read identity properties used to build PRIMARY KEY
-            //
-            sep = "";
-            std::string sqlPrimaryKey;
-            FdoPtr<FdoDataPropertyDefinitionCollection> propsIdentity(classDef->GetIdentityProperties());
-            FdoInt32 const propsIdSize = propsIdentity->GetCount();
-            for (FdoInt32 j = 0; j < propsIdSize; j++)
+    FdoPtr<FdoPropertyDefinitionCollection> props(classDef->GetProperties());
+
+    if (NULL != props && props->GetCount() > 0)
+    {
+        std::string sep;
+        std::string sqlColumns;
+
+        //
+        // Read properties and parse details: name, data type, size.
+        // 
+        FdoInt32 const propsSize = props->GetCount();
+        for (FdoInt32 j = 0; j < propsSize; j++)
+        {
+            FdoPtr<FdoPropertyDefinition> propDef(props->GetItem(j));
+            if (FdoPropertyType_DataProperty == propDef->GetPropertyType())
             {
-                FdoPtr<FdoDataPropertyDefinition> propId(propsIdentity->GetItem(j));
-                FdoStringP propName(propId->GetName());
-
-                if (sqlPrimaryKey.empty())
+                FdoStringP propName(propDef->GetName());
+                std::string sqlType(details::PgTypeFromFdoProperty(propDef));
+                if (sqlType.empty())
                 {
-                    sqlPrimaryKey = ", PRIMARY KEY(";
+                    throw FdoCommandException::Create(L"ApplySchemaCommand::Execute: Unkown data property type"); 
                 }
 
-                sqlPrimaryKey += sep;
-                sqlPrimaryKey += static_cast<char const*>(propName.Lower());
+                sqlColumns += sep;
+                sqlColumns += static_cast<char const*>(propName.Lower());
+                sqlColumns += " " + sqlType;
                 sep = ",";
             }
+        }
 
-            if (!sqlPrimaryKey.empty())
+        //
+        // Read identity properties used to build PRIMARY KEY
+        //
+        sep = "";
+        std::string sqlPrimaryKey;
+        FdoPtr<FdoDataPropertyDefinitionCollection> propsIdentity(classDef->GetIdentityProperties());
+        FdoInt32 const propsIdSize = propsIdentity->GetCount();
+        for (FdoInt32 j = 0; j < propsIdSize; j++)
+        {
+            FdoPtr<FdoDataPropertyDefinition> propId(propsIdentity->GetItem(j));
+            FdoStringP propName(propId->GetName());
+
+            if (sqlPrimaryKey.empty())
             {
-                sqlPrimaryKey += ")";
+                sqlPrimaryKey = ", PRIMARY KEY(";
             }
 
-            //
-            // CREATE TABLE command
-            // 
-            std::string tableName(static_cast<char const*>(FdoStringP(classDef->GetName()).Lower()));
+            sqlPrimaryKey += sep;
+            sqlPrimaryKey += static_cast<char const*>(propName.Lower());
+            sep = ",";
+        }
 
-            std::string sqlCreate("CREATE TABLE ");
-            sqlCreate += tableName;
-            sqlCreate += " ( ";
-            sqlCreate += sqlColumns;
-            if (!sqlPrimaryKey.empty())
-            {
-                sqlCreate += sqlPrimaryKey;
-            }
-            sqlCreate += " )";
+        if (!sqlPrimaryKey.empty())
+        {
+            sqlPrimaryKey += ")";
+        }
 
-            FDOLOG_WRITE("SQL:\n\t%s", sqlCreate.c_str());
+        //
+        // CREATE TABLE command
+        // 
+        std::string tableName(static_cast<char const*>(FdoStringP(classDef->GetName()).Lower()));
 
-            mConn->PgExecuteCommand(sqlCreate.c_str());
+        std::string sqlCreate("CREATE TABLE ");
+        sqlCreate += tableName;
+        sqlCreate += " ( ";
+        sqlCreate += sqlColumns;
+        if (!sqlPrimaryKey.empty())
+        {
+            sqlCreate += sqlPrimaryKey;
+        }
+        sqlCreate += " )";
 
-            //
-            // Register geometric property as PostGIS geometry column 
-            //
-            if (FdoClassType_FeatureClass == classDef->GetClassType())
-            {
-                FdoFeatureClass* featClass = static_cast<FdoFeatureClass*>(classDef.p);
+        FDOLOG_WRITE("SQL:\n\t%s", sqlCreate.c_str());
 
-                AddGeometryColumn(tableName, featClass->GetGeometryProperty());
+        mConn->PgExecuteCommand(sqlCreate.c_str());
 
-                // Create GiST index for table-column pair.
-                CreateSpatialIndex(tableName, featClass->GetGeometryProperty());
-            }
+        //
+        // Register geometric property as PostGIS geometry column 
+        //
+        if (FdoClassType_FeatureClass == classDef->GetClassType())
+        {
+            FdoFeatureClass* featClass = static_cast<FdoFeatureClass*>(classDef.p);
 
-            //
-            // CREATE SEQUENCE for single column, integral type PRIMARY KEY
-            //
-            if (1 == propsIdSize)
+            AddGeometryColumn(tableName, featClass->GetGeometryProperty());
+
+            // Create GiST index for table-column pair.
+            CreateSpatialIndex(tableName, featClass->GetGeometryProperty());
+        }
+
+        //
+        // CREATE SEQUENCE for single column, integral type PRIMARY KEY
+        //
+        if (1 == propsIdSize)
+        {
+            FdoPtr<FdoDataPropertyDefinition> propId = propsIdentity->GetItem(0);
+            assert(NULL != propId);
+
+            if (propId->GetIsAutoGenerated()
+                && (FdoDataType_Int16 == propId->GetDataType() 
+                    || FdoDataType_Int32 == propId->GetDataType()
+                    || FdoDataType_Int64 == propId->GetDataType()))
             {
-                FdoPtr<FdoDataPropertyDefinition> propId = propsIdentity->GetItem(0);
-                assert(NULL != propId);
-
-                if (propId->GetIsAutoGenerated()
-                    && (FdoDataType_Int16 == propId->GetDataType() 
-                        || FdoDataType_Int32 == propId->GetDataType()
-                        || FdoDataType_Int64 == propId->GetDataType()))
-                {
-                    CreateSequence(tableName, propId);
-                }
+                CreateSequence(tableName, propId);
             }
+        }
 
-            // TODO: Add class description as a COMMENT
+        // TODO: Add class description as a COMMENT
 
 
-        } // if (NULL != props && props->GetCount() > 0)
+    } // if (NULL != props && props->GetCount() > 0)
+}
+
+void ApplySchemaCommand::DropTable(FdoPtr<FdoClassDefinition> classDef) const
+{
+    FDOLOG_MARKER("ApplySchemaCommand::-DropTable");
+    //
+    // DROP TABLE command
+    // 
+    std::string tableName(static_cast<char const*>(FdoStringP(classDef->GetName()).Lower()));
+    size_t tildePos = tableName.find("~");
+    if ( 0 < tildePos )
+    {
+        tableName = tableName.substr(tildePos+1);
     }
+    std::string sqlDrop("DROP TABLE ");
+    sqlDrop += tableName;
+
+    FDOLOG_WRITE("SQL:\n\t%s", sqlDrop.c_str());
+
+    mConn->PgExecuteCommand(sqlDrop.c_str());
+
+    FdoPtr<FdoDataPropertyDefinitionCollection> propsIdentity(classDef->GetIdentityProperties());
+    FdoInt32 const propsIdSize = propsIdentity->GetCount();
+    //
+    // DROP SEQUENCE for single column, integral type PRIMARY KEY
+    //
+    if (1 == propsIdSize)
+    {
+        FdoPtr<FdoDataPropertyDefinition> propId = propsIdentity->GetItem(0);
+        assert(NULL != propId);
+
+        if (propId->GetIsAutoGenerated()
+            && (FdoDataType_Int16 == propId->GetDataType() 
+                || FdoDataType_Int32 == propId->GetDataType()
+                || FdoDataType_Int64 == propId->GetDataType()))
+        {
+            std::string column(static_cast<char const*>(FdoStringP(propId->GetName()).Lower()));
+            std::string sequence = details::MakeSequenceName(tableName, column);
+
+            std::string sql("DROP SEQUENCE " + sequence);
+            mConn->PgExecuteCommand(sql.c_str());
+        }
+    }
 }
 
-///////////////////////////////////////////////////////////////////////////////
-// Private operations
-///////////////////////////////////////////////////////////////////////////////
-
 void ApplySchemaCommand::AddGeometryColumn(std::string const& table,
                                            FdoPtr<FdoGeometricPropertyDefinition> prop) const
 {
Index: ApplySchemaCommand.h
===================================================================
--- ApplySchemaCommand.h	(revision 3180)
+++ ApplySchemaCommand.h	(working copy)
@@ -134,6 +134,18 @@
     //
 
 
+    // This function creates a feature table
+    // It is a simple proxy around SQL command:
+    // CREATE TABLE <table_name> ( <column_name> <type>, ... [, <primary key>])
+    // \param
+    // classDef - definition of feature class
+    //
+    void CreateTable(FdoPtr<FdoClassDefinition> classDef) const;
+
+
+    void DropTable(FdoPtr<FdoClassDefinition> classDef) const;
+
+
     // This function registers geometry column in PostGIS meta-schema.
     // It is a simple proxy around SQL command:
     // AddGeometryColumn(<schema_name>,<table_name>,<column_name>,<srid>,<type>,<dimension>)

