summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/back-ldif/monitor.c
blob: 9ea741e15449e1b45d68b6e72ba28f5c4874b0ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/** BEGIN COPYRIGHT BLOCK
 * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
 * Copyright (C) 2005 Red Hat, Inc.
 * All rights reserved.
 * END COPYRIGHT BLOCK **/
/* 
 *  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);
  sprintf( 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));

}