Figure 8-16.Published Etomic.ShareTransformer assets
At this point, we can move on to construct the database deploy scripts.
The Deploy Script with Database Deployment
We will construct a deployment script for a fresh database deployment and also a script to
handle incremental deployment. First, let us quickly review the standard web deployment
script we have previously used:
<?xml version="1.0" encoding="utf-8" ?> 
<project name="Etomic.ShareTransformer" default="help">
<description>
Deploy file for the Etomic.Transformer.Web application
</description>
<property name="nant.onfailure" value="fail"/>
<property name="company.name" value="Etomic"/>
<property name="core.publish" 
CHAPTER 8 DATABASE INTEGRATION
263
Change from pdf to jpg - Convert PDF to JPEG images in C#.net, ASP.NET MVC, WinForms, WPF project
How to convert PDF to JPEG using C#.NET PDF to JPEG conversion / converter library control SDK
convert pdf file into jpg format; .net pdf to jpg
Change from pdf to jpg - VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.net, ASP.NET MVC, WinForms, WPF project
Online Tutorial for PDF to JPEG (JPG) Conversion in VB.NET Image Application
convert multiple page pdf to jpg; convert pdf to jpeg on
value="http://localhost/ccnet/files/${solution.name}"/>
<property name="core.deploy" value="D:\dotNetDelivery\TempDeploy"/>
<property name="core.environment" 
value="D:\dotNetDeliveryWebs\${solution.name}"/>
<loadtasks 
assembly="D:\dotNetDelivery\Tools\NAntContrib\0.85rc2\➥
bin\NAnt.Contrib.Tasks.dll"
/>
<target name="go" 
depends="selectversion, get, createenvironments, position, database, 
configure, notify"/>
<target name="selectversion" 
description="Selects the version of the system.">
<if test="${debug}">
<property name="sys.version" value="0.0.0.0"/>
</if>
</target>
<target name="get" description="Grab the correct assets.">
<delete dir="${core.deploy}\" failonerror="false"/>
<mkdir dir="${core.deploy}\${sys.version}\"/>
<get 
src="${core.publish}/${solution.name}-Build-${sys.version}.zip"
dest="${core.deploy}\${solution.name}-Build-${sys.version}.zip" 
/>
<unzip 
zipfile="${core.deploy}\${solution.name}-Build-${sys.version}.zip" 
todir="${core.deploy}\${sys.version}\"/>
</target>
<target name="createenvironments" 
description="Create the environments required">
<mkdir dir="${core.environment}\${sys.version}\" failonerror="false"/>
<mkiisdir dirpath="${core.environment}\${sys.version}\" 
vdirname="${solution.name}-${sys.version}"/>
</target>
<target name="position" description="Place required assets">
<copy todir="${core.environment}\${sys.version}\">
<fileset basedir="${core.deploy}\${sys.version}">
<include name="**"/>
</fileset>
</copy>
</target>
CHAPTER 8 ■ DATABASE INTEGRATION
264
Online Convert Jpeg to PDF file. Best free online export Jpg image
Download Free Trial. Convert a JPG to PDF. Web Security. All your JPG and PDF files will be permanently erased from our servers after one hour.
.pdf to .jpg online; convert pdf image to jpg online
JPG to PNG Converter | Convert JPEG to PNG, Convert PNG to JPG
Allow to change converting image with adjusted width & height; Change image resolution Open JPEG to PNG Converter first; Load JPG images from local folders in
advanced pdf to jpg converter; convert pdf to gif or jpg
<target name="database" description="Deploy the database changes">
</target>
<target name="configure" 
description="Amend configuration settings as necessary">
</target>
<target name="notify" 
description="Tell everyone of the success or failure.">
<echo message="Notifying you of the deploy process success."/>
</target>
<target name="fail">
<echo message="Notifying you of a failure in the deploy process."/>
</target>
</project>
I have amended the dependencies to include the databasetarget—the configuretarget
has always been there. Both of these targets are empty currently. This deploy script will oper-
ate as expected and deploy the web assets as we have previously seen. This is not a lot of help,
though, since they will be pointing to the incorrect database: the development instance. The
details of the database step can be implemented as follows:
<target name="database" description="Deploy the database changes">
<get 
src="${core.publish}/${solution.name}-DB-${sys.version}.zip"
dest="${core.deploy}\${solution.name}-DB-${sys.version}.zip" 
/>
<unzip zipfile="${core.deploy}\${solution.name}-DB-${sys.version}.zip" 
todir="${core.deploy}\DB-${sys.version}\"/>
<delete>
<fileset basedir="${core.deploy}\DB-${sys.version}\schema">
<include name="ALTER*" />
</fileset>
</delete>
<dbIntegrate 
folder="${core.deploy}\DB-${sys.version}\schema" 
compare="CreationTime"
server="localhost"
database="${solution.name}-Test"
uid="sa"
pwd="w1bbl3"
/>
CHAPTER 8 DATABASE INTEGRATION
265
Online Convert PDF to Jpeg images. Best free online PDF JPEG
Download Free Trial. Convert a PDF File to JPG. Web Security. Your PDF and JPG files will be deleted from our servers an hour after the conversion.
convert multi page pdf to jpg; best convert pdf to jpg
C# Image Convert: How to Convert Tiff Image to Jpeg, Png, Bmp, &
RasterEdge.XDoc.PDF.dll. C:\input.tif"; String outputDirectory = @"C:\output\"; // Convert tiff to jpg and show How to change Tiff image to Bmp image in your C#
bulk pdf to jpg; convert pdf picture to jpg
<dbIntegrate 
folder="${core.deploy}\DB-${sys.version}\reference" 
compare="CreationTime"
server="localhost"
database="${solution.name}-Test"
uid="sa"
pwd="w1bbl3"
/>
</target>
The use of the <dbIntegrate>task requires the inclusion of the ManualDBTasksassembly
and so the following <loadtasks>is required (again, referencing the debug assembly):
<loadtasks 
assembly="D:\dotNetDelivery\Tools\Etomic.NAntExtensions\ ➥
Etomic.NAntExtensions.GeneralTasks.dll"/>
Thedatabasetarget gets and unzips the assets in the same way as the regular code deploy-
ment target. After this, it removes the ALTER script from the schemafolder as we are interested
only in the CREATE script, before executing the CREATE script using the <dbIntegrate>custom
task, and then executing the input of the reference data with another task.
Note
This works entirely satisfactorily,though the manual database task is now looking a little long in
the tooth.I should add to my notebook that this task could be refactored to include multiple script types to
be executed and perhaps revisit the filesetissue to save on duplication of information and effort.But that
is for another time.
The configuration step is identical to the build script, and therefore suffers from the same
data/process mix issue:
<target name="configure" description="Amend configuration settings as necessary">
<attrib file="${core.environment}\${sys.version}\web.config" 
readonly="false" />
<xmlpoke
file="${core.environment}\${sys.version}\web.config"
xpath="/configuration/appSettings/add[@key = ➥
'DbConnectionString']/@value"
value="server=localhost;database=etomic.sharetransformer-test; ➥
uid=transformer;pwd=transform3r" />
<attrib file="${core.environment}\${sys.version}\web.config" 
readonly="true" />
</target>
Once again, that is that. Running this deployment script in the usual way will result in a
fresh deployment of the chosen application version. Here is the output from the execution of
the script against version 1.0.4.0 of the application:
CHAPTER 8 ■ DATABASE INTEGRATION
266
C# Image Convert: How to Convert Adobe PDF to Jpeg, Png, Bmp, &
String inputFilePath = @"C:\input.pdf"; String outputFilePath = @"C:\output.jpg"; // Convert PDF to jpg. C# sample code for PDF to jpg image conversion.
convert pdf file to jpg; change pdf to jpg
JPG to JBIG2 Converter | Convert JPEG to JBIG2, Convert JBIG2 to
Users may easily change image size, rotate image angle, set image rotation in dpi Covert JPG & JBIG2 image with high-quality; Provide user-friendly interface
to jpeg; convert online pdf to jpg
---------- NAnt ----------
NAnt 0.85 
Copyright (C) 2001-2004 Gerry Shaw
http://nant.sourceforge.net
Buildfile: file:///Etomic.ShareTransformer.Deploy-CREATE.xml
Target(s) specified: go 
[loadtasks] Scanning assembly "NAnt.Contrib.Tasks" for extensions.
[loadtasks] Scanning assembly "Etomic.NAntExtensions.ManualDBTasks" for extensions.
selectversion:
get:
[delete] Deleting directory 'D:\TempDeploy\'.
[mkdir] Creating directory 'D:\TempDeploy\1.0.4.0\'.
[get] Retrieving 
'http://localhost/ccnet/files/Etomic.ShareTransformer/Etomic.ShareTransformer-
Build-1.0.4.0.zip' to 'D:\TempDeploy\Etomic.ShareTransformer-Build-1.0.4.0.zip'.
[unzip] Unzipping 'D:\TempDeploy\Etomic.ShareTransformer-Build-1.0.4.0.zip'
to 'D:\TempDeploy\1.0.4.0\' (19571 bytes).
createenvironments:
[mkiisdir] 
Creating/modifying virtual directory 'Etomic.ShareTransformer-1.0.4.0' on 
'localhost:80'.
position:
[copy] Copying 2 files to 'D:\Webs\Etomic.ShareTransformer\1.0.4.0\'.
database:
[get] Retrieving
'http://localhost/ccnet/files/Etomic.ShareTransformer/Etomic.ShareTransformer-DB-
1.0.4.0.zip' to 'D:\TempDeploy\Etomic.ShareTransformer-DB-1.0.4.0.zip'.
[unzip] Unzipping 'D:\TempDeploy\Etomic.ShareTransformer-DB-1.0.4.0.zip' to 
'D:\TempDeploy\DB-1.0.4.0\' (2229 bytes).
[delete] Deleting 1 files.
[dbIntegrate] CREATE-1.0.4.0.sql
[exec] 1> 2> 1> 2> 1> 2> 1> 2> 1> 2> 1> 2> 1> 2> 3> 1> 2> Msg 15023, Level 
16, State 1, Server ALIENVM, Procedure sp_grantdbaccess, Line 126
[exec] User or role 'Transformer' already exists in the current database.
[exec] 1> 2> Creating role db_owner
CHAPTER 8 DATABASE INTEGRATION
267
VB.NET PDF Convert to Images SDK: Convert PDF to png, gif images
Convert PDF to Jpg, Png, Bmp, Gif, Tiff and Bitmap in ASP.NET. Or directly change PDF to Gif image file in VB.NET program with this demo code.
change file from pdf to jpg on; .pdf to jpg
JPEG to PDF Converter | Convert JPEG to PDF, Convert PDF to JPEG
similar software; Support a batch conversion of JPG to PDF with amazingly high speed; Get a compressed PDF file after conversion; Support
batch pdf to jpg converter online; convert pdf image to jpg
[exec] 1> 2> 'Transformer' added to role 'db_owner'.
[exec] 1> 2> 1> 2> Creating [dbo].[Transformations]
[exec] 1> 2> 3> 4> 5> 6> 7> 8> 9> 10> Msg 2714, Level 16, State 6, Server 
ALIENVM, Line 1
[exec] There is already an object named 'Transformations' in the database.
[exec] Warning: The table 'Transformations' has been created but its maximum 
row size
[exec] (24533) exceeds the maximum number of bytes per row (8060). INSERT or 
UPDATE
[exec] of a row in this table will fail if the resulting row length exceeds 
8060
[exec] bytes.
[exec] 1> 2> 1> 2> (1 row affected)
[exec] 1> 2> Creating primary key [PK_Transformations] on 
[dbo].[Transformations]
[exec] 1> 2> Msg 1779, Level 16, State 1, Server ALIENVM, Line 1
[exec] Table 'Transformations' already has a primary key defined on it.
[exec] Msg 1750, Level 16, State 1, Server ALIENVM, Line 1
[exec] Could not create constraint. See previous errors.
[exec] Warning: The table 'Transformations' has been created but its maximum 
row size
[exec] (24533) exceeds the maximum number of bytes per row (8060). INSERT or 
UPDATE
[exec] of a row in this table will fail if the resulting row length exceeds 
8060
[exec] bytes.
[exec] 1> 2> 1> 2> (1 row affected)
[exec] 1> 2> 1> 2> 3> 4> 5> 6> The database update failed
[exec] 1> 2> 1> 
[dbIntegrate] Transformations.sql
[exec] 1> 2> 1> 2> 1> 2> 3> 4> 5> 6> 7> 8> 9> 10> 11> 12> 13> 14> 15> 16> 
17> 18> Msg 2627, Level 14, State 1, Server ALIENVM, Line 1
[exec] Violation of PRIMARY KEY constraint 'PK_Transformations'. Cannot 
insert
[exec] duplicate key in object 'Transformations'.
configure:
[attrib] Setting file attributes for 1 files to Normal.
[xmlpoke] Found '1' nodes matching XPath expression 
'/configuration/appSettings/add[@key = 'DbConnectionString']/@value'.
[attrib] Setting file attributes for 1 files to ReadOnly.
CHAPTER 8 ■ DATABASE INTEGRATION
268
notify:
[echo] Notifying you of the deploy process success.
go:
BUILD SUCCEEDED
Total time: 3.7 seconds.
Output completed (5 sec consumed) - Normal Termination
The output clearly shows the execution of the relevant database scripts (and some warn-
ings), and indeed the application has been correctly deployed and configured, as can be seen
in Figure 8-17.
Figure 8-17.Etomic.ShareTransformer v1.0.4.0
Checking the web.configand other files will also demonstrate that all is well.
So that is fine for a clean build, but what about a migrated build? This is slightly more
involved than the clean build for the reasons discussed before. To recap, because the database
has its migration scripts produced during each code build but not every code build is deployed,
when the deployment finally occurs, the application of the migration scripts from the previ-
ously deployed version must be applied sequentially to move the database to the current
version.
In practice this means that we need to provide some looping functionality for the data-
base step in a way that assesses the database versions. 
CHAPTER 8 DATABASE INTEGRATION
269
To actually implement this, we leave the previous deployment script generally unaltered,
but we move the content of the databasetarget into a new target called databaseincrement.
This target is not part of the master dependencies, but will be called as needed by the database
target. The databaseincrementtarget looks like this:
<target name="databaseincrement">
<get 
src="${core.publish}/${solution.name}-DB-${db.version}.zip"
dest="${core.deploy}\${solution.name}-DB-${db.version}.zip" 
/>
<unzip zipfile="${core.deploy}\${solution.name}-DB-${db.version}.zip" 
todir="${core.deploy}\DB-${db.version}\"/>
<delete>
<fileset basedir="${core.deploy}\DB-${db.version}\schema">
<include name="CREATE*" />
</fileset>
</delete>
<dbIntegrate 
folder="${core.deploy}\DB-${db.version}\schema" 
compare="CreationTime"
server="localhost"
database="${solution.name}-Test"
uid="sa"
pwd="w1bbl3"
/>
</target>
Note that we are now deleting the CREATE script since we are interested in the ALTER
scripts. Additionally, we have removed the step that adds the reference data so that we con-
centrate on the schema.
Note
In a real-life scenario,you would likely want to apply each set of migration scripts,too,and then
load in the final set of reference data.This final step could be handled in the regular databasetarget.
The database step therefore contains the looping function:
<target name="database" description="Deploy the database changes">
<foreach item="String" 
in="${etomic::get-db-version-list(old.db.version , sys.version)}" 
delim=" ," 
property="db.version">
<call target="databaseincrement"/>
</foreach>
</target>
CHAPTER 8 ■ DATABASE INTEGRATION
270
Complexity alert! I have stayed away from introducing scripted functions into the delivery
scripts where possible to avoid a move into even more “options” (read: confusion). In this
instance, though, I need an adequate way of providing a list to loop through, from the old
database version to the desired deployment version. This means that the execution of this
script relies on a new command-line input: the old.db.versionproperty.
The list I am looking for is something like the following:
1.0.2.0, 1.0.3.0, 1.0.4.0
This assumes I am migrating from version 1.0.2.0 to 1.0.4.0. To provide this list, the follow-
ing script function will do the trick:
<script language="C#" prefix="etomic" >
<code><![CDATA[                 
[Function("get-db-version-list")]
public static string GetDBVersionList(string firstVersion, string lastVersion)
{
int start, end, major, minor;
Match match;
Regex versionRegEx = ➥
new Regex(@"(?<major>\d*)\.(?<minor>\d*)\.(?<build>\d*)\.\d*",➥
RegexOptions.Compiled);
match = versionRegEx.Match(firstVersion);
major = Int32.Parse(match.Groups["major"].Value);
minor = Int32.Parse(match.Groups["minor"].Value);
start = Int32.Parse(match.Groups["build"].Value);
match = versionRegEx.Match(lastVersion);
end = Int32.Parse(match.Groups["build"].Value);
StringBuilder dbList = new StringBuilder();
for(int i=start+1; i<end+1; i++)
{
dbList.Append(String.Format("{0}.{1}.{2}.0,", major.ToString(), ➥
minor.ToString(), i.ToString()));
}
if (dbList.ToString().Length > 0)
return dbList.ToString().Substring(0, dbList.ToString().Length-1);
else
return "";
}
]]></code>
</script>
CHAPTER 8 DATABASE INTEGRATION
271
The code is another straightforward piece of C#, using a regular expression to pull apart
the version number, create a list, and then put the version numbers back together again. Once
again, thanks to the flexibility of NAnt, we can tackle a problem quickly and effectively.
Note
Sadly,we cannot tackle my own oversight so effectively.Because I have wrapped the version
number logic in the process,I am stuck with working with the full version number here without some signifi-
cant refactoring of the scripts.(Actually,it is not that big a deal,but I like to moan at myself now and then to
keep myself in check.) The bigger problem here is that the previous function does not handle a move,for
example,from 1.0.0.0 to 1.1.0.0,since we are dealing with only the third digit.Oh well—another entry in
the notebook.
With the addition of the function, this deploy script is complete. It can be run on an exist-
ing database version with the following command line (assuming you are moving from
version 1.0.2.0 to 1.0.4.0):
nant -f:Etomic.ShareTransformer.Deploy.ALTER.xml go -D:sys.version=1.0.4.0 ➥
-D:old.db.version=1.0.2.0 -D:debug=false
The most relevant output here is as follows:
database:
databaseincrement:
[get] Retrieving 
'http://localhost/ccnet/files/Etomic.ShareTransformer/Etomic.ShareTransformer-DB-
1.0.3.0.zip' to 'D:\TempDeploy\Etomic.ShareTransformer-DB-1.0.3.0.zip'.
[unzip] Unzipping 'D:\TempDeploy\Etomic.ShareTransformer-DB-1.0.3.0.zip' to 
'D:\TempDeploy\DB-1.0.3.0\' (2228 bytes).
[delete] Deleting 1 files.
[dbIntegrate] ALTER-etomic.sharetransformer-integrate-1.0.3.0.sql
[exec] 1> 2> 3> 4> 5> 6> 7> 1> 2> 1> 2> 1> 2> 1> 2> 1> 2> 1> 2> 1> 2> 1> 2> 
3> 4> 5> 6> The database update succeeded
[exec] 1> 2> 1> 
databaseincrement:
[get] Retrieving
'http://localhost/ccnet/files/Etomic.ShareTransformer/
<remainder>
<etc>
1.0.4.0.zip' to 'D:\TempDeploy\Etomic.ShareTransformer-DB-1.0.4.0.zip'.
[unzip] Unzipping 'D:\TempDeploy\Etomic.ShareTransformer-DB-1.0.4.0.zip' to 
'D:\TempDeploy\DB-1.0.4.0\' (2229 bytes).
CHAPTER 8 ■ DATABASE INTEGRATION
272
Documents you may be interested
Documents you may be interested