## utils/history/backup.c

/* [<][>][^][v][top][bottom][index][help] */

## DEFINITIONS

This source file includes following functions.

1. process_arguments
2. mark_pkey_position
3. export_archive
4. get_begin_time
5. main

       1 /***************************************
       2   $Revision: 1.1 $
       3
       4   Backup.  backup.c - whois archive DB backup.
       5
       6   Status: NOT REVIEWED, NOT TESTED, NOT COMPLETE
       7
       8   Implementation by: Tiago Antao
       9
      10   ******************/ /******************
      11   Copyright (c) 2002               RIPE NCC
      12
      13   All Rights Reserved
      14
      15   Permission to use, copy, modify, and distribute this software and its
      16   documentation for any purpose and without fee is hereby granted,
      17   provided that the above copyright notice appear in all copies and that
      18   both that copyright notice and this permission notice appear in
      19   supporting documentation, and that the name of the author not be
      20   used in advertising or publicity pertaining to distribution of the
      21   software without specific, written prior permission.
      22
      23   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
      24   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
      25   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
      26   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
      27   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      28   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      29   ***************************************/
      30
      31
      32 #include <stdio.h>
      33 #include <stdlib.h>
      34 #include <time.h>
      35 #include <rip.h>
      36 #include "miniconf.h"
      37 #include "dbsupport.h"
      38 #include "aconf.h"
      39
      40 long begin_time = 0;  //begin_time is really begin_time-1
      41
      42 /*
      43   process_arguments: processes command-line arguments.
      44 */
      45 void process_arguments(int argv, char** argc) {
         /* [<][>][^][v][top][bottom][index][help] */
      46   if (argv != 1) {
      47     printf("Usage: %s \n", argc[0]);
      48     exit(1);
      49   }
      50
      51 }
      52
      53 /*
      54  mark_pkey_position: updates the table of pkey positions
      55
      56  The mark is the end_time variable.
      57 */
      58 void mark_pkey_position() {
         /* [<][>][^][v][top][bottom][index][help] */
      59   SQ_result_set_t* rs;
      60   SQ_row_t*        row;
      61   char             pkey[100];
      62   char             ins_upd[200];
      63   char             sel[200];
      64
      65   //clumsy design courtesy of mysql bugs - should have a distinct
      66   //and no, I cannot use nostore
      67   sprintf(sel,
      68           "SELECT pkey FROM archive WHERE timestamp>%d",
      69           begin_time);
      70   SQ_execute_query(archive_conn, sel, &rs);
      71   //printf("%s\n", sel);
      72
      73   while ((row = SQ_row_next(rs)) != NULL) {
      74     prepare_string_attribute(SQ_get_column_string_nocopy(rs, row, 0), pkey);
      75
      76     sprintf(ins_upd,
      77            "INSERT INTO pkey_position(pkey,position) VALUES ('%s', %ld)",
      78             pkey, begin_time + 1);
      79     //printf("%s\n", ins_upd);
      80     if (SQ_execute_query(archive_conn, ins_upd, NULL) != 0) {
      81       sprintf(ins_upd,
      82              "UPDATE pkey_position SET position=%ld WHERE pkey='%s'",
      83              begin_time, pkey);
      84       SQ_execute_query(archive_conn, ins_upd, NULL);
      85     }
      86   }
      87   SQ_free_result(rs);
      88 }
      89
      90 /*
      91  export_archive: exports current archiving to dump
      92
      93  Exports current archive and table with previous references.
      94
      95  The name of the archive is determined from the timestamps from the
      96  current archiving operation.
      97
      98  Also sets timestamp on backup table.
      99
     100  mysqldump is used and has to be on PATH!
     101 */
     102 void export_archive() {
         /* [<][>][^][v][top][bottom][index][help] */
     103   SQ_result_set_t* rs;
     104   SQ_row_t*        row;
     105   char*            cmax;
     106   char             dump_command[2000];
     107   char             ts_upd[100];
     108
     109   SQ_execute_query(archive_conn,
     110                    "SELECT max(timestamp) from archive", &rs);
     111   row = SQ_row_next(rs);
     112
     113   if (row == NULL) {
     114     printf("Problems accessing the archive2 table");
     115     exit(1);
     116   }
     117   cmax = SQ_get_column_string_nocopy(rs, row, 0);
     118   if (cmax == NULL) {
     119     //printf("Its empty\n");
     120     SQ_free_result(rs);
     121     exit(0);
     122   }
     123   sprintf(dump_command,
     124           "mysqldump -q -t -h%s -u%s \"-w timestamp>%ld\" -p%s %s archive > %ld-%s.dump",
     125           host2, user2, begin_time, pass2, db2, begin_time, cmax);
     126   if (system(dump_command) != 0) {
     127     printf("mysqldump failed on archive\n");
     128     exit(1);
     129   }
     130   sprintf(dump_command,
     131           "mysqldump -t -h%s -u%s -p%s %s pkey_position > %ld-%s+pos.dump",
     132           host2, user2, pass2, db2, begin_time, cmax);
     133   if (system(dump_command) != 0) {
     134     printf("mysqldump failed on pkey_position\n");
     135     exit(1);
     136   }
     137
     138   sprintf(ts_upd, "INSERT INTO dump VALUES (%s)", cmax);
     139   if (SQ_execute_query(archive_conn, ts_upd, NULL) != 0) {
     140     printf("Problems inserting new dump timestamp\n");
     141     exit(1);
     142   }
     143   sprintf(ts_upd, "DELETE FROM dump WHERE timestamp <%s", cmax);
     144   if (SQ_execute_query(archive_conn, ts_upd, NULL) != 0) {
     145     printf("Problems deleting old dump timestamp\n");
     146     exit(1);
     147   }
     148
     149   SQ_free_result(rs);
     150 }
     151
     152 void get_begin_time() {
         /* [<][>][^][v][top][bottom][index][help] */
     153   SQ_result_set_t* rs;
     154   SQ_row_t*        row;
     155   char             select_query[100];
     156
     157   sprintf(select_query, "SELECT max(timestamp) FROM dump");
     158
     159   //printf("%s\n", select_query);
     160   SQ_execute_query(archive_conn, select_query, &rs);
     161
     162   row = SQ_row_next(rs);
     163   if (row == NULL) {
     164     printf("Could not get timestamp\n");
     165     exit(1);
     166   }
     167
     168   SQ_get_column_int(rs, row, 0, &begin_time);
     169   if (begin_time <0) {
     170     begin_time=0;
     171   }
     172 }
     173
     174
     175 /*
     176   main: Dump entry point
     177
     178   This function is reasonably self-commenting.
     179   Just note that pk_position functions generate a table of
     180   previous references of pkeys.
     181 */
     182 int main (int argv, char** argc) {
         /* [<][>][^][v][top][bottom][index][help] */
     183   process_arguments(argv, argc);
     184   read_configuration();
     185   get_db_connections();
     186
     187   get_begin_time();
     188   mark_pkey_position();
     189   export_archive();
     190   return 0;
     191 }

/* [<][>][^][v][top][bottom][index][help] */