Browse Source

FD3-100 Se arregló el método para poder traer elementos en mayor
cantidad e insertarlos en la base de datos. Previo a actualización, se
eliminan, no indexar elementos en base al ID de la entidad Device.

Maximiliano Schvindt 8 years ago
parent
commit
0ebbfe6b96
2 changed files with 48 additions and 28 deletions
  1. 3 4
      src/StatsBundle/Entity/Device.php
  2. 45 24
      src/StatsBundle/Services/DeviceManager.php

+ 3 - 4
src/StatsBundle/Entity/Device.php

@@ -11,7 +11,6 @@ use Symfony\Component\Validator\Constraints as Assert;
  * @ORM\Table
  * @ORM\Entity
  * 
- * @UniqueEntity(fields={"ip"}, message="errors.duplicate_key")
  */
 class Device
 {
@@ -21,7 +20,7 @@ class Device
     /**
      * @var int
      *
-     * @ORM\Column(name="id", type="integer")
+     * @ORM\Column(name="id", type="integer", nullable=false)
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="AUTO")
      */
@@ -83,11 +82,11 @@ class Device
     }
 
     /**
-     * @return int
+     * @return string
      */
     public function getId()
     {
-        return $this->id;
+        return "id";
     }
 
     /**

+ 45 - 24
src/StatsBundle/Services/DeviceManager.php

@@ -58,46 +58,67 @@ class DeviceManager
     {
         $devices = array();
         $deviceServers = $this->deviceServerRepository->findAll();
-        $dateTime = new \DateTime("now");
+        $em = $this->em;
         
+        $dateTime = new \DateTime("now");
+        $date = $dateTime->format("Y-m-d H:i:s");
+
         foreach ($deviceServers as $deviceServer) {
             $deviceTypes = $deviceServer->getDeviceTypes();
+            $deviceServerId = $deviceServer->getId();
+
+            $qb = $em->createQueryBuilder();
+            $qb->delete('StatsBundle:Device', 'd');
+            $qb->where('d.deviceServer = :server');
+            $qb->setParameter('server', $deviceServer);
+
+            $qb->getQuery()->getResult();
             
             foreach ($deviceTypes as $deviceType) {
                 $filters = array(
                     'deviceType' => $deviceType,
                 );
-                $remoteDevices = $this->webservice->get($deviceServer->getUrl(), $filters);
-                
-                foreach ($remoteDevices as $remoteDevice) {
-                    $deviceType = $remoteDevice['deviceType'];
-                    $deviceId = $remoteDevice['deviceId'];
-                    $tenancyId = $remoteDevice['tenancyId'];
-                    $devicesIds[] = $deviceId;
-                    unset($remoteDevice['id']);
-                    unset($remoteDevice['deviceType']);
-                    unset($remoteDevice['deviceId']);
-                    unset($remoteDevice['tenancyId']);
-                    $device = $this->create($deviceType, $deviceId, $deviceServer, $tenancyId, $remoteDevice, $dateTime);
-                    if ($device) {
-                        $devices[] = $device;
+
+                $limit = 2000;
+                $offset = 0;
+
+                $remoteDevices = $this->webservice->get($deviceServer->getUrl(), $filters, array(), $limit, $offset);
+                while(!empty($remoteDevices)) {
+
+                    $devices_values = array();
+
+                    foreach ($remoteDevices as $remoteDevice) {
+                        $deviceType = str_replace("\\","\\\\",$remoteDevice['deviceType']);
+                        $deviceId = $remoteDevice['deviceId'];
+                        $tenancyId = $remoteDevice['tenancyId'];
+                        $deviceIp = $remoteDevice['ip'];
+                        $deviceExtraData = $remoteDevice['extraData'];
+                        $devicesIds[] = $deviceId;
+                        $row = "(NULL, {$deviceServerId}, '{$deviceIp}','{$deviceType}', {$deviceId}, '{$deviceExtraData}', {$tenancyId}, '{$date}')";
+                        
+                        $devices_values[] = $row;
+                    
                     }
+
+                    $conn = $em->getConnection();
+                    $sql = "INSERT LOW_PRIORITY IGNORE INTO `device` (`id`, `device_server_id`, `ip`, `device_type`, `device_id`, `extra_data`, `tenancy_id`, `updated`) VALUES ".  implode(",", $devices_values).";";
+                    $conn->query($sql);
+                    $conn->close();
+                    
+                    $offset += $limit;
+                    $remoteDevices = $this->webservice->get($deviceServer->getUrl(), $filters, array(), $limit, $offset);
                 }
             }
         }
 
-        // Al insertar o actualizar Devices, les actualizamos el updated, luego eliminamos los anteriores a esta corrida.
-        $em = $this->em;
-        $qb = $em->createQueryBuilder();
-        $qb->delete('StatsBundle:Device', 'd');
-        $qb->where($qb->expr()->lt('d.updated', ':now'));
-        $qb->setParameter('now', $dateTime);
-
-        $countDelete = $qb->getQuery()->getResult();
-
         return $devices;
     }
 
+
+    /*
+     * SE DEJA DE UTILIZAR, SE REALIZA UNA ACTUALIZACIÓN POR SQL PARA AGILIZAR, ELIMINACIÓN PREVIA
+     *
+     */
     /**
      * @param string $deviceType
      * @param int $deviceId