public function crearTablaCatalogo(OrigenDatos $origenDato, array $datos) { //Recuperar la información para construir la tabla $em = $this->getEntityManager(); $nombre_tabla = $origenDato->getNombreCatalogo(); $campos = $origenDato->getCampos(); //Verificar si existe la tabla $sql = "CREATE TABLE IF NOT EXISTS {$nombre_tabla} ("; foreach ($campos as $campo) { $sql .= $campo->getNombre() . " " . $campo->getTipoCampo()->getCodigo(); if ($campo->getSignificado()->getCodigo() == 'pk') { $sql .= ' PRIMARY KEY '; $pk = $campo->getNombre(); } $sql .= ', '; } $sql = trim($sql, ', ') . '); '; //Crear tabla temporal para hacer un puente y validar antes de subir al catálogo $nombre_temp = $nombre_tabla . time(); $sql .= ' SELECT * INTO TEMP ' . $nombre_temp . ' FROM ' . $nombre_tabla . ' LIMIT 0;'; $nombre_campos = implode(", ", array_keys($datos[0])); $sql .= "\n INSERT INTO {$nombre_temp}({$nombre_campos}) VALUES "; foreach ($datos as $fila) { $sql .= "('" . implode("','", $fila) . "'), "; } $sql = trim($sql, ', '); // Si tiene llave primaria if ($pk != '') { //Insertar las que no están $sql .= "; INSERT INTO {$nombre_tabla} SELECT * FROM {$nombre_temp} WHERE {$pk} NOT IN (SELECT {$pk} FROM {$nombre_tabla})"; //Actualizar las que estaban $sql .= "; UPDATE {$nombre_tabla} SET"; foreach (array_keys($datos[0]) as $campo) { $sql .= " {$campo} = {$nombre_temp}.{$campo}, "; } $sql = trim($sql, ', '); $sql .= " FROM {$nombre_temp} WHERE {$nombre_tabla}.{$pk} IN (SELECT {$pk} FROM {$nombre_tabla}) \n AND {$nombre_tabla}.{$pk} = {$nombre_temp}.{$pk}"; } try { $em->getConnection()->exec($sql); } catch (\PDOException $e) { return $e->getMessages(); } return true; }
/** * {@inheritDoc} */ public function getNombreCatalogo() { $this->__initializer__ && $this->__initializer__->__invoke($this, 'getNombreCatalogo', array()); return parent::getNombreCatalogo(); }