OpenDNSSEC-enforcer  1.4.6
ksm_purge.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008-2009 Nominet UK. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
19  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
21  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
22  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
23  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  */
26 
27 /*+
28  * ksm_purge.c - Purge Dead Keys
29  *
30  * Description:
31  * Holds all the functions needed to implement the "purge" command.
32 -*/
33 
34 #include "ksm/database.h"
35 #include "ksm/database_statement.h"
36 #include "ksm/db_fields.h"
37 #include "ksm/kmedef.h"
38 #include "ksm/ksm.h"
39 
40 
41 /*+
42  * KsmPurge - Purge Dead Keys
43  *
44  * Description:
45  * Implements the code to execute the "purge" command, which removes
46  * dead keys from the database.
47  *
48  * Arguments:
49  * None.
50 -*/
51 
52 void KsmPurge(void)
53 {
54  char* sql = NULL;
55  char* sql2 = NULL;
56  char* sql3 = NULL;
57  DB_RESULT result; /* Result of parameter query */
58  int where = 0;
59  int keypair_id;
60  DB_ROW row = NULL; /* Row object */
61  int status = 0;
62 
63  /* Construct the SQL; don't rely on cascading delete */
64  /* select ids of keys in dead state */
65  sql = DqsSpecifyInit("KEYDATA_VIEW", DB_KEYDATA_FIELDS);
66  DqsConditionInt(&sql, "STATE", DQS_COMPARE_EQ, KSM_STATE_DEAD, where++);
67  DqsEnd(&sql);
68 
69  /* delete rows in dnsseckeys which match */
70  status = DbExecuteSql(DbHandle(), sql, &result);
71  if (status == 0) {
72  status = DbFetchRow(result, &row);
73  while (status == 0) {
74  status = DbInt(row, DB_KEYDATA_ID, &keypair_id);
75  if (status == 0) {
76  /* delete all entries in dnsseckeys that match */
77  where = 0;
78  sql2 = DdsInit("dnsseckeys");
79  DdsConditionInt(&sql2, "keypair_id", DQS_COMPARE_EQ, keypair_id, where++);
80  DdsEnd(&sql2);
81  (void) DbExecuteSqlNoResult(DbHandle(), sql2);
82  DdsFree(sql2);
83 
84  /* Delete the row from keypairs */
85  sql3 = DdsInit("keypairs");
86  DdsConditionInt(&sql3, "ID", DQS_COMPARE_EQ, keypair_id, 0);
87  DdsEnd(&sql3);
88  (void) DbExecuteSqlNoResult(DbHandle(), sql3);
89  DdsFree(sql3);
90  }
91 
92  status = DbFetchRow(result, &row);
93  }
94  }
95  DdsFree(sql);
96 
97  DbFreeRow(row);
98  DbFreeResult(result);
99 
100  return;
101 }
void DbFreeResult(DB_RESULT result)
void KsmPurge(void)
Definition: ksm_purge.c:52
int DbFetchRow(DB_RESULT result, DB_ROW *row)
#define KSM_STATE_DEAD
Definition: ksm.h:370
char * DqsSpecifyInit(const char *table, const char *fields)
Definition: dq_string.c:117
#define DB_KEYDATA_ID
Definition: db_fields.h:57
void DdsFree(char *query)
Definition: dd_string.c:115
DB_HANDLE DbHandle(void)
void DqsConditionInt(char **query, const char *field, DQS_COMPARISON compare, int value, int index)
Definition: dq_string.c:224
void DdsConditionInt(char **query, const char *field, DQS_COMPARISON compare, int value, int index)
Definition: dd_string.c:88
char * DdsInit(const char *table)
Definition: dd_string.c:60
#define DB_KEYDATA_FIELDS
Definition: db_fields.h:56
void DbFreeRow(DB_ROW row)
int DbExecuteSql(DB_HANDLE handle, const char *stmt_str, DB_RESULT *result)
void DdsEnd(char **query)
Definition: dd_string.c:109
int DbInt(DB_ROW row, int field_index, int *value)
void DqsEnd(char **query)
Definition: dq_string.c:299
int DbExecuteSqlNoResult(DB_HANDLE handle, const char *stmt_str)