db = $db; $this->tableName = $tableName; $this->columnMap = $columnMap; if (!empty($separator)) { $this->separator = $separator; } $this->setFormatter(new DbFormatter()); } /** * Remove reference to database adapter * * @return void */ public function shutdown() { $this->db = null; } /** * Write a message to the log. * * @param array $event event data * @return void * @throws Exception\RuntimeException */ protected function doWrite(array $event) { if (null === $this->db) { throw new Exception\RuntimeException('Database adapter is null'); } $event = $this->formatter->format($event); // Transform the event array into fields if (null === $this->columnMap) { $dataToInsert = $this->eventIntoColumn($event); } else { $dataToInsert = $this->mapEventIntoColumn($event, $this->columnMap); } $statement = $this->db->query($this->prepareInsert($this->db, $this->tableName, $dataToInsert)); $statement->execute($dataToInsert); } /** * Prepare the INSERT SQL statement * * @param Adapter $db * @param string $tableName * @param array $fields * @return string */ protected function prepareInsert(Adapter $db, $tableName, array $fields) { $keys = array_keys($fields); $sql = 'INSERT INTO ' . $db->platform->quoteIdentifier($tableName) . ' (' . implode(",",array_map(array($db->platform, 'quoteIdentifier'), $keys)) . ') VALUES (' . implode(",",array_map(array($db->driver, 'formatParameterName'), $keys)) . ')'; return $sql; } /** * Map event into column using the $columnMap array * * @param array $event * @param array $columnMap * @return array */ protected function mapEventIntoColumn(array $event, array $columnMap = null) { if (empty($event)) { return array(); } $data = array(); foreach ($event as $name => $value) { if (is_array($value)) { foreach ($value as $key => $subvalue) { if (isset($columnMap[$name][$key])) { $data[$columnMap[$name][$key]] = $subvalue; } } } elseif (isset($columnMap[$name])) { $data[$columnMap[$name]] = $value; } } return $data; } /** * Transform event into column for the db table * * @param array $event * @return array */ protected function eventIntoColumn(array $event) { if (empty($event)) { return array(); } $data = array(); foreach ($event as $name => $value) { if (is_array($value)) { foreach ($value as $key => $subvalue) { $data[$name . $this->separator . $key] = $subvalue; } } else { $data[$name] = $value; } } return $data; } }