<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns="http://www.w3.org/1999/xhtml" 
	xmlns:msxsl="urn:schemas-microsoft-com:xslt"
	xmlns:Gen-it="http://mycompany.com/mynamespace"
	version="1.0">
<xsl:output method="text" encoding="us-ascii" indent="yes"/>

<xsl:variable name="ProjectName">SampleCase_</xsl:variable>
<xsl:variable name="Author">&lt;Gen-it&gt;</xsl:variable>
<xsl:variable name="CreationDate">24-01-2001</xsl:variable>

<xsl:template match="/">
	<xsl:for-each select="//Class">
{{Gen-it:BeginFile#<xsl:value-of select="Class.name"/>.asmx#}}&lt;%@ WebService Language="c#" Codebehind="<xsl:value-of select="Class.name"/>.cs" Class="SampleCase.<xsl:value-of select="Class.name"/>"%&gt;
{{Gen-it:EndFile}}
{{Gen-it:BeginFile#<xsl:value-of select="Class.name"/>.cs#}}namespace SampleCase
{
    using System;
    using System.Collections;
    using System.Configuration;
    using System.ComponentModel;
    using System.Data;
    using System.Data.ADO;
    using System.Diagnostics;
    using System.Web;
    using System.Web.Services;

    /// <summary>
    ///    Summary description for <xsl:value-of select="Class.name"/>.
    /// </summary>
    public class <xsl:value-of select="Class.name"/> : System.Web.Services.WebService
    {
		private <xsl:value-of select="Class.name"/>SQL obj<xsl:value-of select="Class.name"/>SQL;
		private ADOConnection objConnection;
		
		public <xsl:value-of select="Class.name"/>()
		{
            //CODEGEN: This call is required by the ASP+ Web Services Designer
            InitializeComponent();
			obj<xsl:value-of select="Class.name"/>SQL = new <xsl:value-of select="Class.name"/>SQL();
			objConnection = new ADOConnection ();
			// Refactor-->
			objConnection.ConnectionString = "Provider=SQLOLEDB.1;User ID=sa;Persist Security Info=False;Initial Catalog=UVNET;Data Source=C003W2K";
        }

        /// <summary>
        ///    Required method for Designer support - do not modify
        ///    the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
        }

        /// <summary>
        ///    Clean up any resources being used.
        /// </summary>
        public override void Dispose()
        {
        }

		[WebMethod]
        public DataSet Open()
        {
			return this.Select();
        }

		[WebMethod]
        public void Save(DataSet ds<xsl:value-of select="Class.name"/>)
        {
			// Update all new, deleted and modified rows in objData
			foreach (DataRow objRow in ds<xsl:value-of select="Class.name"/>.Tables[0].Rows)
			{
				switch (objRow.RowState)
				{
					case DataRowState.Modified:
						this.Update(objRow);
						break;
					case DataRowState.Deleted:
						this.Delete(objRow);
						break;
					case DataRowState.New:
						this.Insert(objRow);
						break;
					default:
						break;
				}
			}
			return;
        }
		private DataSet Select()
		{
			ADODataSetCommand objDataSetCommand;
			DataSet objDataSet;
			String strSQL;

			strSQL = obj<xsl:value-of select="Class.name"/>SQL.GetSelectSQL();
			objDataSetCommand = obj<xsl:value-of select="Class.name"/>SQL.GetSelectCommand(strSQL, ref objConnection);
			
			objDataSet = new DataSet();
			objConnection.Open();
			objDataSet.EnforceConstraints = false;
			objDataSetCommand.FillDataSet(objDataSet);
			objDataSet.EnforceConstraints = true;
			objConnection.Close();
			return objDataSet;
		}
		private void Insert (System.Data.DataRow objRow)
		{
			ADOCommand objCommand;
			string strSQL;

			strSQL = obj<xsl:value-of select="Class.name"/>SQL.GetInsertSQL();
			objCommand = obj<xsl:value-of select="Class.name"/>SQL.GetInsertCommand(strSQL, ref objRow, ref objConnection);
			
			objCommand.ActiveConnection.Open();
			objCommand.ExecuteNonQuery();
			objConnection.Close();

			return;
		}
		private void Update (System.Data.DataRow objRow)
		{
			ADOCommand objCommand;
			string strSQL;

			strSQL = obj<xsl:value-of select="Class.name"/>SQL.GetUpdateSQL();
			objCommand = obj<xsl:value-of select="Class.name"/>SQL.GetUpdateCommand(strSQL, ref objRow, ref objConnection);
			
			objConnection.Open();
			objCommand.ExecuteNonQuery();
			objConnection.Close();

			return;
		}
		private void Delete (System.Data.DataRow objRow)
		{
			ADOCommand objCommand;
			string strSQL;

			strSQL = obj<xsl:value-of select="Class.name"/>SQL.GetDeleteSQL();
			objCommand = obj<xsl:value-of select="Class.name"/>SQL.GetDeleteCommand(strSQL, ref objRow, ref objConnection);
			
			objCommand.ActiveConnection.Open();
			objCommand.ExecuteNonQuery();
			objConnection.Close();

			return;
		}
    }
}
{{Gen-it:EndFile}}

{{Gen-it:BeginFile#<xsl:value-of select="Class.name"/>SQL.cs#}}namespace SampleCase
{
    using System;
    using System.Data;
    using System.Data.ADO;


    /// <summary>
    ///    Summary description for <xsl:value-of select="Class.name"/>SQL.
    /// </summary>
    public class <xsl:value-of select="Class.name"/>SQL
    {
        public <xsl:value-of select="Class.name"/>SQL()
        {
            //
            // TODO: Add Constructor Logic here
            //
        }

		public string GetInsertSQL()
		{
			string strSQL;

			strSQL = "INSERT INTO <xsl:value-of select="Class.name"/> ( ";
<xsl:for-each select="Attribute[Attribute.stereotype!='PK']">
			strSQL = strSQL + "<xsl:apply-templates select="." mode="field"/><xsl:if test="position()!=last()">,</xsl:if> ";</xsl:for-each>        
			strSQL = strSQL + ") VALUES( ";
<xsl:for-each select="Attribute[Attribute.stereotype!='PK']">
			strSQL = strSQL + "?<xsl:if test="position()!=last()">,</xsl:if> ";</xsl:for-each>        
			strSQL = strSQL + ")";

			return strSQL;
		}
		public ADOCommand GetInsertCommand(string strSQL, ref DataRow objRow, ref ADOConnection objConnection)
		{
			ADOCommand objCommand;
			ADOParameter objParam;
			
			objCommand = new ADOCommand(strSQL, objConnection);
<xsl:for-each select="Attribute[Attribute.stereotype!='PK']">
			objParam = New SQLParameter("<xsl:apply-templates select="." mode="field"/>", <xsl:apply-templates select="." mode="ADODBType"/>)
			objParam.Value = objRow["<xsl:apply-templates select="." mode="field"/>"];
			objCommand.Parameters.Add(objParam)</xsl:for-each>        

			return objCommand;
		}
		public string GetUpdateSQL()
		{
			string strSQL;

			strSQL = "UPDATE <xsl:value-of select="Class.name"/> SET ";
<xsl:for-each select="Attribute[Attribute.stereotype!='PK']">
			strSQL = strSQL + "<xsl:apply-templates select="." mode="field"/> = ? <xsl:if test="position()!=last()">,</xsl:if> ";</xsl:for-each>        
<xsl:for-each select="Attribute[Attribute.stereotype='PK']">
			strSQL = strSQL + "WHERE (<xsl:apply-templates select="." mode="field"/> = ?) ";</xsl:for-each>        

			return strSQL;
		}
		public ADOCommand GetUpdateCommand(string strSQL, ref DataRow objRow, ref ADOConnection objConnection)
		{
			ADOCommand objCommand;

			objCommand = new ADOCommand(strSQL, objConnection);
<xsl:for-each select="Attribute[Attribute.stereotype!='PK']">
			objParam = New SQLParameter("<xsl:apply-templates select="." mode="field"/>", <xsl:apply-templates select="." mode="ADODBType"/>)
			objParam.Value = objRow["<xsl:apply-templates select="." mode="field"/>"];
			objCommand.Parameters.Add(objParam)</xsl:for-each>        
<xsl:for-each select="Attribute[Attribute.stereotype='PK']">
			objParam = New SQLParameter("<xsl:apply-templates select="." mode="field"/>", <xsl:apply-templates select="." mode="ADODBType"/>)
			objParam.Value = objRow["<xsl:apply-templates select="." mode="field"/>"];
			objCommand.Parameters.Add(objParam)</xsl:for-each>        
			
			return objCommand;
		}
		public string GetDeleteSQL()
		{
			string strSQL;

			strSQL = "DELETE FROM <xsl:value-of select="Class.name"/> WHERE ";
<xsl:for-each select="Attribute[Attribute.stereotype='PK']">
			strSQL = strSQL + "(<xsl:apply-templates select="." mode="field"/> = ?) ";</xsl:for-each>        
			
			return strSQL;
		}
		public ADOCommand GetDeleteCommand(string strSQL, ref DataRow objRow, ref ADOConnection objConnection)
		{
			ADOCommand objCommand;

			objCommand = new ADOCommand(strSQL, objConnection);
			objRow.RejectChanges();
<xsl:for-each select="Attribute[Attribute.stereotype='PK']">
			objParam = New SQLParameter("<xsl:apply-templates select="." mode="field"/>", <xsl:apply-templates select="." mode="ADODBType"/>)
			objParam.Value = objRow["<xsl:apply-templates select="." mode="field"/>"];
			objCommand.Parameters.Add(objParam)</xsl:for-each>        

			return objCommand;
		}
		public string GetSelectSQL(string strWhere, string strOrder)
		{
			string strSQL;

			strSQL = "SELECT ";
<xsl:for-each select="Attribute">
			strSQL = strSQL + "<xsl:apply-templates select="." mode="field"/><xsl:if test="position()!=last()">,</xsl:if> ";</xsl:for-each>        
			strSQL = strSQL + "FROM <xsl:value-of select="Class.name"/> ";
			strSQL = strSQL + strWhere + " ";
			strSQL = strSQL + strOrder + " ";
			
			return strSQL;
		}
		public string GetSelectSQL(string strWhere)
		{
			return GetSelectSQL(strWhere, "");
		}
		public string GetSelectSQL()
		{
			return GetSelectSQL("", "");
		}
		public ADODataSetCommand GetSelectCommand(string strSQL, ref ADOConnection objConnection)
		{
			ADODataSetCommand objDataSetCommand;

			objDataSetCommand = new ADODataSetCommand(strSQL, objConnection);
			objDataSetCommand.TableMappings.Add("Table","<xsl:value-of select="Class.name"/>");
   		
			return objDataSetCommand;
		}

    }
}
{{Gen-it:EndFile}}
</xsl:for-each>
</xsl:template>

<xsl:template match="Attribute" mode="datatype">
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,3)='int'">Integer</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,7)='numeric'">Long</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,7)='varchar'">String</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,7)='decimal'">Decimal</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,5)='float'">Double</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,8)='datetime'">Date</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,4)='real'">Single</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,9)='timestamp'">Date</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,4)='text'">String</xsl:if>
</xsl:template>

<xsl:template match="Attribute" mode="variableprefix">
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,3)='int'">int</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,7)='numeric'">lng</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,7)='varchar'">str</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,7)='decimal'">dec</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,5)='float'">dbl</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,8)='datetime'">dat</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,4)='real'">dec</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,9)='timestamp'">dat</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,4)='text'">str</xsl:if>
	<xsl:value-of select="Gen-it:CapFirst(Attribute.name)"/>
</xsl:template>

<xsl:template match="Attribute" mode="field">
	<xsl:value-of select="Gen-it:CapFirst(Attribute.name)"/>
</xsl:template>

<xsl:template match="Attribute" mode="ADODBType">ADODBType.<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,3)='int'">Int</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,7)='numeric'">Numeric</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,7)='varchar'">VarChar</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,7)='decimal'">Decimal</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,5)='float'">Float</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,8)='datetime'">DateTime</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,4)='real'">Real</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,9)='timestamp'">TimeStamp</xsl:if>
	<xsl:if test="substring(Gen-it:Lower(Attribute.datatype),1,4)='text'">Text</xsl:if>
</xsl:template>

<msxsl:script language="VBScript" implements-prefix="Gen-it">
	' <!-- Return the text of the node as all UPPERCASE -->
	Function Upper(nodelist) 
		Upper = UCASE(nodelist.nextNode().text)
	End Function
	' <!-- Return the text of the node as all lowercase -->
	Function Lower(nodelist) 
		Lower = LCASE(nodelist.nextNode().text)
	End Function
	' <!-- Return the text of the node with the first character converted to Uppercase -->
	Function CapFirst(nodelist) 
		dim strText
		dim strOutput
		strText = nodelist.nextNode().text
		strOutput = UCASE(Left( strText, 1))
		strOutput = strOutput + LCASE((Right( strText, LEN(strText)-1)))
		CapFirst = strOutput
	End Function
	' <!-- Return the text of the node plus spaces to create a string of the specified length -->
	Function FillSpace(nodelist, length) 
		dim strText
		dim strOutput
		strText = nodelist.nextNode().text
		strOutput = strText + String( length - LEN(strText) , " ")
		FillSpace = strOutput
	End Function
</msxsl:script>


</xsl:stylesheet>
