public function insert(Entity $entity)
 {
     $tag = "EntityDAO: insert()";
     Log::notice("{$tag}");
     $blueprint = $this->blueprint;
     $timezone_offset = $this->timezone_offset_modify;
     $query = "INSERT INTO " . $this->tableName() . " SET ";
     if ($entity->getId() != 0) {
         $query .= "id=" . $entity->getId() . ", ";
     }
     foreach ($blueprint->fields() as $field) {
         $key = $field->getKey();
         $value = $entity->get($key);
         $encType = $field->getEncType();
         if (!empty($value) || $value == "0") {
             if (!empty($encType) && $encType != "plain") {
                 $value = hash($encType, $value);
                 Log::debug("{$tag}: Encrypted value for {$key}: {$value}");
             }
             switch ($field->getDataType()) {
                 case "int":
                     $query .= "{$key}={$value}";
                     break;
                 case "decimal":
                 case "date":
                     $query .= "{$key}='{$value}'";
                     break;
                 case "datetime":
                 case "time":
                     $query .= "{$key}=CONVERT_TZ('{$value}', '{$timezone_offset}', '" . BPTimezone::UTC . "')";
                     break;
                 case "enum":
                     $query .= "{$key}='{$value}'";
                     break;
                 case "string":
                 case "text":
                 case "binary":
                     $value = DatabaseSanitizer::sanitize($value);
                     $query .= "{$key}='{$value}'";
                     break;
             }
         } else {
             $query .= "{$key}=NULL";
         }
         $query .= ", ";
     }
     $query = substr($query, 0, strlen($query) - 2);
     // remove trailing comma and space (", ")
     $sql = new DatabaseUpdate($query, "insert");
     try {
         $sql->doUpdate();
         return $sql->last_insert_id();
     } catch (Exception $e) {
         Log::error("{$tag}: [" . $sql->err_code . "] " . $sql->err_message);
         throw $e;
     }
 }