Hi all,

This is my first email to the list, I think :)

I would like to start with a suggestion, I'm currently working on the
huge application using MD:Unity on Oracle, and what I'm facing is a luck
of validation for unique keys. Basically when I submit a value and the
value is already in the table, oracle throwing "Unique constrain
violation" error.

I've taken a good look into ObjectDao.cfc and would like to propose the
following oracle query to update oracle "readFields" method.

Below is updated cffunction. Basically I'm adding column "uniqueKey",
which identifies uniqueness of the key in the table. Please notice it
will only take a single key, not a compound ones. With that, changes
also required in object.cfc and metadata.project.xsl. You will also
notice other modifications to the query.

I'm not sure if this can be done on MSSQL, MySQL and others, but it is a
very useful addition to me.

Doug, others...thoughts?
__________________________________________

        <cffunction name="readFields" access="private" hint="I populate
the table with fields." output="false" returntype="void">
                <cfargument name="Object" hint="I am the object to read
fields into." required="yes" type="any" />
                <cfset var qFields = 0 />
                <cfset var Field = 0 />

                <cfquery name="qFields"  datasource="#getDsn()#"
username="#getUsername()#" password="#getPassword()#">
                        SELECT COL.COLUMN_NAME AS NAME,
                           CASE
                                 WHEN PRIMARYCONSTRAINTS.COLUMN_NAME IS
NULL THEN
                                  'false'
                                 ELSE
                                  'true'
                           END AS PRIMARYKEY,
                           /* Oracle has no equivalent to autoincrement
or  identity */
                           'false' AS "IDENTITY",
                           CASE
                                 WHEN COL.NULLABLE = 'Y' THEN
                                  'true'
                                 ELSE
                                  'false'
                           END AS NULLABLE,
                           COL.DATA_TYPE AS DBDATATYPE,
                           CASE
                           /* 26 is the length of now() in ColdFusion
(i.e. {ts '2006-06-26 13:10:14'})*/
                                 WHEN COL.DATA_TYPE = 'DATE' THEN
                                  32
                                 WHEN COL.DATA_TYPE = 'NUMBER' THEN
                                  COL.DATA_PRECISION
                                 WHEN COL.DATA_TYPE = 'VARCHAR2' THEN
                                  COL.CHAR_LENGTH
                                 ELSE
                                  COL.DATA_LENGTH
                           END AS LENGTH,
                           COL.DATA_DEFAULT AS "DEFAULT",
                           CASE
                                 WHEN UNIQUECONSTRAINTS.COLUMN_NAME IS
NULL THEN
                                  'false'
                                 ELSE
                                  'true'
                           END AS UNIQUEKEY
                        FROM ALL_TAB_COLUMNS COL,
                           (SELECT COLCON.COLUMN_NAME, COLCON.TABLE_NAME
                                  FROM ALL_CONS_COLUMNS COLCON,
ALL_CONSTRAINTS TABCON
                                 WHERE TABCON.TABLE_NAME = <cfqueryparam
cfsqltype="cf_sql_varchar" maxlength="128"
value="#arguments.Object.getName()#" />
                                   AND COLCON.CONSTRAINT_NAME =
TABCON.CONSTRAINT_NAME
                                   AND COLCON.TABLE_NAME =
TABCON.TABLE_NAME
                                   AND 'P' = TABCON.CONSTRAINT_TYPE)
PRIMARYCONSTRAINTS,
                           (SELECT COLCON.COLUMN_NAME, COLCON.TABLE_NAME
                                  FROM ALL_CONS_COLUMNS COLCON,
ALL_CONSTRAINTS TABCON
                                 WHERE TABCON.TABLE_NAME = <cfqueryparam
cfsqltype="cf_sql_varchar" maxlength="128"
value="#arguments.Object.getName()#" />
                                   AND COLCON.CONSTRAINT_NAME =
TABCON.CONSTRAINT_NAME
                                   AND COLCON.TABLE_NAME =
TABCON.TABLE_NAME
                                   AND 'U' = TABCON.CONSTRAINT_TYPE
                                   AND POSITION = 1) UNIQUECONSTRAINTS
                        WHERE COL.TABLE_NAME = <cfqueryparam
cfsqltype="cf_sql_varchar" maxlength="128"
value="#arguments.Object.getName()#" />
                        AND COL.COLUMN_NAME =
PRIMARYCONSTRAINTS.COLUMN_NAME(+)
                        AND COL.TABLE_NAME =
PRIMARYCONSTRAINTS.TABLE_NAME(+)
                        AND COL.COLUMN_NAME =
UNIQUECONSTRAINTS.COLUMN_NAME(+)
                        AND COL.TABLE_NAME =
UNIQUECONSTRAINTS.TABLE_NAME(+)
                        ORDER BY COL.COLUMN_ID
                </cfquery>

                <cfloop query="qFields">
                        <!--- create the field --->
                        <cfset Field = StructNew() />
                        <cfset Field.name         = qFields.name />
                        <cfset Field.primaryKey   = qFields.primaryKey
/>
                        <cfset Field.uniqueKey    = qFields.uniqueKey />
                        <cfset Field.identity     = qFields.identity />
                        <cfset Field.nullable     = qFields.nullable />
                        <cfset Field.dbDataType   = qFields.dbDataType
/>
                        <cfset Field.cfDataType   =
getCfDataType(qFields.dbDataType) />
                        <cfset Field.cfSqlType    =
getCfSqlType(qFields.dbDataType) />
                        <cfset Field.length       = qFields.length />
                        <cfset Field.default      =
getDefault(qFields.default, Field.cfDataType, Field.nullable) />
                        <cfset Field.sequenceName = "" />

                        <!--- add the field to the table --->
                        <cfset arguments.Object.addField(Field) />
                </cfloop>
        </cffunction>


-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Reactor for ColdFusion Mailing List
[email protected]
Archives at: http://www.mail-archive.com/reactor%40doughughes.net/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

Reply via email to