/** BEGIN COPYRIGHT BLOCK
 * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
 * Copyright (C) 2005 Red Hat, Inc.
 * All rights reserved.
 *
 * License: GPL (version 3 or any later version).
 * See LICENSE for details. 
 * END COPYRIGHT BLOCK **/

#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

/* 
 *  File: monitor.c
 *
 *  Functions:
 * 
 *      ldif_back_monitor_info() - ldap ldif back-end initialize routine 
 *
 *      get_monitordn() - gets the monitor dn for this backend
 *
 */

#include "back-ldif.h"

extern char Versionstr[];


/*
 *  Function: ldif_back_monitor_info
 *
 *  Returns: returns 1
 *  
 *  Description: This function wraps up backend specific monitor information
 *               and returns it to the client as an entry. This function
 *               is usually called by ldif_back_search upon receipt of 
 *               the monitor dn for this backend.
 */
int
ldif_back_monitor_info( Slapi_PBlock *pb, LDIF *db)
{
  Slapi_Entry	*e;          /*Entry*/
  char		buf[BUFSIZ]; /*Buffer for getting the attrs*/
  struct berval	val;         /*More attribute storage*/
  struct berval	*vals[2];    /*Even more*/
  char          *type;       /*Database name (type) */

  vals[0] = &val;
  vals[1] = NULL;  

  /*Alloc the entry and set the monitordn*/
  e = slapi_entry_alloc();
  slapi_entry_set_dn(e, (char *) get_monitordn(pb));
  
  /* Get the database name (be_type) */
  slapi_pblock_get( pb, SLAPI_BE_TYPE, &type);
  PR_snprintf( buf, sizeof(buf), "%s", type );
  val.bv_val = buf;
  val.bv_len = strlen( buf );
  slapi_entry_attr_merge( e, "database", vals );

  /*Lock the database*/
  PR_Lock( db->ldif_lock );

  /*Get the number of database hits */
  sprintf( buf, "%ld",  db->ldif_hits);
  val.bv_val = buf;
  val.bv_len = strlen( buf );
  slapi_entry_attr_merge( e, "entrycachehits", vals );

  /*Get the number of database tries */
  sprintf( buf, "%ld", db->ldif_tries);
  val.bv_val = buf;
  val.bv_len = strlen( buf );
  slapi_entry_attr_merge( e, "entrycachetries", vals );

  /*Get the current size of the entrycache (db) */
  sprintf( buf, "%ld",  db->ldif_n);
  val.bv_val = buf;
  val.bv_len = strlen( buf );
  slapi_entry_attr_merge( e, "currententrycachesize", vals );


  /*
   * Get the maximum size of the entrycache (db) 
   * in this database, there is no max, so return the current size
   */
  val.bv_val = buf;
  val.bv_len = strlen( buf );
  slapi_entry_attr_merge( e, "maxentrycachesize", vals );

  /* Release the lock*/
  PR_Unlock( db->ldif_lock );

  /*Send the results back to the client*/
  slapi_send_ldap_search_entry( pb, e, NULL, NULL, 0 );
  slapi_send_ldap_result( pb, LDAP_SUCCESS, NULL, NULL, 1, NULL );
  
  slapi_entry_free( e );

  return(1);


}


/*
 *  Function: get_monitordn
 *
 *  Returns: returns ptr to string if success, NULL else
 *  
 *  Description: get_monitordn takes a pblock and extracts the 
 *               monitor dn of this backend. The monitordn is a special
 *               signal to the backend to return backend specific monitor
 *               information (usually called by back_ldif_search()).
 */
char *
get_monitordn(Slapi_PBlock *pb )
{
  char *mdn;

  slapi_pblock_get( pb, SLAPI_BE_MONITORDN, &mdn );
  
  if (mdn == NULL) {
    return(NULL);
    
  }

  return(strdup(mdn));

}
