--- datadict-mssqlnative.inc.orig.php 2011-09-08 13:59:32.000000000 +0200 +++ datadict-mssqlnative.inc.php 2012-01-08 16:18:53.251672800 +0100 @@ -121,19 +121,66 @@ return $sql; } - /* function AlterColumnSQL($tabname, $flds) { - $tabname = $this->TableName ($tabname); + $tabname = $this->TableName($tabname); $sql = array(); list($lines,$pkey) = $this->_GenFields($flds); + foreach($lines as $v) { - $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; - } + // get field name and type + $arTmp = array(); + $arTmp = preg_split("/[\s]+/", $v); + $arCnt = count($arTmp); + $fieldname = $arTmp[0]; + $fieldtype = $arTmp[1]; + + $bHasDef = false; + $bIsNull = true; + + for($i = 2; $i < $arCnt; $i++) { + // get default value + if( trim($arTmp[$i]) == "DEFAULT" ) + { + $bHasDef = true; + if( $i+1 <= $arCnt ) { + $field_def = $arTmp[$i+1]; + } + } + + // get nullability + if( trim($arTmp[$i]) == "NOTNULL" ) + $bIsNull = false; + } + + + // delete default value if exists + $strDropDef = $this->DropDefaultValue($tabname, $fieldname); + if( trim($strDropDef) !== "" ) + $sql[] = $strDropDef; + + + if($bHasDef) { + // change type and nulls + if($bIsNull) + $sql[] = "ALTER TABLE $tabname $this->alterCol $fieldname $fieldtype NOT NULL"; + else + $sql[] = "ALTER TABLE $tabname$this->alterCol $fieldname $fieldtype"; + // Add default value + $sql[] = "ALTER TABLE $tabname ADD CONSTRAINT def_" . $tabname . "_" . $fieldname . " DEFAULT " . $field_def . " FOR $fieldname"; + } + else { + $sql[] = "ALTER TABLE $tabname $this->alterCol $v"; + } + } +/* + echo "
";
+		print_r($sql);
+		echo "

"; +*/ return $sql; } - */ function DropColumnSQL($tabname, $flds) { @@ -143,12 +190,59 @@ $f = array(); $s = 'ALTER TABLE ' . $tabname; foreach($flds as $v) { + + // delete default value if exists + $strDropDef = $this->DropDefaultValue($tabname, $v); + if( trim($strDropDef) !== "" ) + $sql[] = $strDropDef; + + $f[] = "\n$this->dropCol ".$this->NameQuote($v); } $s .= implode(', ',$f); $sql[] = $s; +/* + echo "
";
+		print_r($sql);
+		echo "

"; +*/ return $sql; } + + function DropDefaultValue($tabname, $fieldname) + { + $strSql = ""; + + // delete default value if exists + if( $this->connection->IsConnected() ) + { + $oRs = $this->connection->Execute(' + + SELECT name FROM sysobjects so JOIN sysconstraints sc ON so.id = sc.constid + WHERE object_name(so.parent_obj) = \'' . $tabname . '\' + AND so.xtype = \'D\' + AND sc.colid = ( + SELECT colid FROM syscolumns + WHERE id = object_id(\'' . $tabname . '\') AND name = \'' . $fieldname . '\' + ) + '); + if( $oRs ) + if(!$oRs->EOF) + { + $defName = $oRs->fields['name']; + // Remove default value + $strSql = "ALTER TABLE $tabname DROP CONSTRAINT $defName"; + } + + $oRs->Close(); + }; +/* + echo "
";
+		print_r($strSql);
+		echo "

"; +*/ + return $strSql; + } // return string must begin with space function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)