protected void append()

in src/main/java/org/apache/log4j/DBAppender.java [209:357]


  protected void append(LoggingEvent event) {
      Connection connection = null;
      try {
          connection = connectionSource.getConnection();
          connection.setAutoCommit(false);
          
          PreparedStatement insertStatement;
          if (cnxSupportsGetGeneratedKeys) {
        	  insertStatement = connection.prepareStatement(insertSQL, Statement.RETURN_GENERATED_KEYS);
          } else {
              insertStatement = connection.prepareStatement(insertSQL);
          }

/*          insertStatement.setLong(1, event.getSequenceNumber());*/
		  insertStatement.setLong(1, 0);
		
          insertStatement.setLong(2, event.getTimeStamp());
          insertStatement.setString(3, event.getRenderedMessage());
          insertStatement.setString(4, event.getLoggerName());
          insertStatement.setString(5, event.getLevel().toString());
          insertStatement.setString(6, event.getNDC());
          insertStatement.setString(7, event.getThreadName());
          insertStatement.setShort(8, DBHelper.computeReferenceMask(event));
          
          LocationInfo li;
          
          if (event.locationInformationExists() || locationInfo) {
              li = event.getLocationInformation();
          } else {
              li = LocationInfo.NA_LOCATION_INFO;
          }
          
          insertStatement.setString(9, li.getFileName());
          insertStatement.setString(10, li.getClassName());
          insertStatement.setString(11, li.getMethodName());
          insertStatement.setString(12, li.getLineNumber());
          
          int updateCount = insertStatement.executeUpdate();
          if (updateCount != 1) {
              LogLog.warn("Failed to insert loggingEvent");
          }
          
          ResultSet rs = null;
          Statement idStatement = null;
          boolean gotGeneratedKeys = false;
          if (cnxSupportsGetGeneratedKeys) {
              try {
                  rs = (ResultSet) GET_GENERATED_KEYS_METHOD.invoke(insertStatement, null);
                  gotGeneratedKeys = true;
              } catch(InvocationTargetException ex) {
                  Throwable target = ex.getTargetException();
                  if (target instanceof SQLException) {
                      throw (SQLException) target;
                  }
                  throw ex; 
              } catch(IllegalAccessException ex) {
                  LogLog.warn("IllegalAccessException invoking PreparedStatement.getGeneratedKeys", ex);
              }
          }
          
          if (!gotGeneratedKeys) {
              insertStatement.close();
              insertStatement = null;
              
              idStatement = connection.createStatement();
              idStatement.setMaxRows(1);
              rs = idStatement.executeQuery(sqlDialect.getSelectInsertId());
          }
          
          // A ResultSet cursor is initially positioned before the first row; the 
          // first call to the method next makes the first row the current row
          rs.next();
          int eventId = rs.getInt(1);
          
          rs.close();

          // we no longer need the insertStatement
          if(insertStatement != null) {
              insertStatement.close();
              insertStatement = null;
          }

          if(idStatement != null) {
              idStatement.close();
              idStatement = null;
          }

          Set propertiesKeys = event.getPropertyKeySet();
          
          if (propertiesKeys.size() > 0) {
              PreparedStatement insertPropertiesStatement =
                  connection.prepareStatement(insertPropertiesSQL);
              
              for (Iterator i = propertiesKeys.iterator(); i.hasNext();) {
                  String key = (String) i.next();
                  String value = event.getProperty(key);
                  
                  //LogLog.info("id " + eventId + ", key " + key + ", value " + value);
                  insertPropertiesStatement.setInt(1, eventId);
                  insertPropertiesStatement.setString(2, key);
                  insertPropertiesStatement.setString(3, value);
                  
                  if (cnxSupportsBatchUpdates) {
                      insertPropertiesStatement.addBatch();
                  } else {
                      insertPropertiesStatement.execute();
                  }
              }
              
              if (cnxSupportsBatchUpdates) {
                  insertPropertiesStatement.executeBatch();
              }
              
              insertPropertiesStatement.close();
              insertPropertiesStatement = null;
          }
          
          String[] strRep = event.getThrowableStrRep();
          
          if (strRep != null) {
              LogLog.debug("Logging an exception");
              
              PreparedStatement insertExceptionStatement =
                  connection.prepareStatement(insertExceptionSQL);
              
              for (short i = 0; i < strRep.length; i++) {
                  insertExceptionStatement.setInt(1, eventId);
                  insertExceptionStatement.setShort(2, i);
                  insertExceptionStatement.setString(3, strRep[i]);
                  if (cnxSupportsBatchUpdates) {
                      insertExceptionStatement.addBatch();
                  } else {
                      insertExceptionStatement.execute();
                  }
              }
              if (cnxSupportsBatchUpdates) {
                  insertExceptionStatement.executeBatch();
              }
              insertExceptionStatement.close();
              insertExceptionStatement = null;
          }
          
          connection.commit();
      } catch (Throwable sqle) {
          LogLog.error("problem appending event", sqle);
      } finally {
          DBHelper.closeConnection(connection);
      }
  }