Beispiel #1
0
 public function updateTable(FlexiObject $oObject)
 {
     $bDebug = false;
     $aList = FlexiModelUtil::getTableSchema($oObject->sTableName);
     $aFieldSQL = array();
     $aPrimary = array();
     $sLastField = "";
     $aLastPrimary = array();
     foreach ($oObject->aChild["field"] as $oFieldObject) {
         $oField = $oFieldObject->toArray();
         //finding field by old name and new name
         $bHasField = false;
         foreach ($aList as $oTableField) {
             $sFindName = empty($oField["oldname"]) ? $oField["sName"] : $oField["oldname"];
             if ($bDebug) {
                 echo "[" . $oTableField["Field"] . "]vs[" . $sFindName . "]";
             }
             if ($oTableField["Field"] == $sFindName) {
                 $bHasField = true;
                 break;
             }
         }
         //if old name not found, use new name
         if (!$bHasField && $oField["sName"] != $oField["oldname"]) {
             foreach ($aList as $oTableField) {
                 $sFindName = $oField["sName"];
                 if ($bDebug) {
                     echo "[" . $oTableField["Field"] . "]vs[" . $sFindName . "]";
                 }
                 if ($oTableField["Field"] == $sFindName) {
                     $bHasField = true;
                     break;
                 }
             }
         }
         if ($oField["iStatus"] == 1) {
             //update or add
             $sSQLDefault = FlexiModelUtil::getDefaultSQL($oField["default"], $oField["cannull"]);
             if ($oField["primary"]) {
                 $aPrimary[] = $oField["sName"];
             }
             if (strpos($oTableField["Key"], "PRI") !== false) {
                 $aLastPrimary[] = $oTableField["Field"];
             }
             //$this->doLog("Field: " . $oField["sName"] . ", " . $oFieldObject->options . ", enum: " . $oFieldObject->getEnum());
             $sFieldTypeSQL = FlexiModelUtil::getSQLName($oField["sName"]) . " " . strtoupper($oField["dbtype"]) . "" . (empty($oField["precision"]) ? "" : "(" . $oField["precision"] . ") ") . (!empty($oField["options"]) && $oField["dbtype"] == "enum" ? "(" . $oFieldObject->getEnum() . ")" : "") . " " . $sSQLDefault . " " . ($oField["autonumber"] ? "AUTO_INCREMENT" : "");
             if ($bHasField) {
                 $sFieldSQL = "CHANGE COLUMN " . FlexiModelUtil::getSQLName($sFindName) . " " . $sFieldTypeSQL;
             } else {
                 $sFieldSQL = "ADD COLUMN " . $sFieldTypeSQL;
             }
             $sFieldSQL .= empty($sLastField) ? " FIRST " : " AFTER " . FlexiModelUtil::getSQLName($sLastField);
             $aFieldSQL[] = $sFieldSQL;
             $sLastField = $oField["sName"];
         } else {
             //do delete
             if ($bHasField) {
                 $aFieldSQL[] = "DROP COLUMN " . FlexiModelUtil::getSQLName($sFindName);
             }
         }
     }
     //for
     $sSQL = "ALTER TABLE " . FlexiModelUtil::getSQLName($oObject->sTableName) . "\n";
     $sSQL .= implode(",\n", $aFieldSQL);
     if (!empty($aPrimary)) {
         $bIsSame = false;
         if (!empty($aLastPrimary)) {
             foreach ($aPrimary as $sPKey) {
                 $bFoundKey = false;
                 foreach ($aLastPrimary as $sLastKey) {
                     if ($sLastKey == $sPKey) {
                         $bFoundKey = true;
                         $bIsSame = true;
                         break;
                     }
                 }
                 //once found a single not same, time to redo primary key
                 if (!$bFoundKey) {
                     $bIsSame = false;
                     break;
                 }
             }
         }
         if (!$bIsSame) {
             $sPrimarySQL = FlexiModelUtil::getSQLName($aPrimary);
             if (!empty($aLastPrimary)) {
                 $sSQL .= "\n,DROP PRIMARY KEY";
             }
             $sSQL .= "\n,ADD PRIMARY KEY (" . $sPrimarySQL . ")";
         }
     } else {
         //new no primary key
         if (!empty($aLastPrimary)) {
             //last has primary, time to drop it
             $sSQL .= "\n,DROP PRIMARY KEY";
         }
     }
     //$sSQL .= ";";
     FlexiLogger::info(__METHOD__, "SQL: " . $sSQL);
     $this->logSQL($sSQL);
     return FlexiModelUtil::getInstance()->getXPDOExecute($sSQL);
 }