2015-01-08 18:37:20 +01:00
/*
This file is part of TALER
2021-09-03 19:08:02 +02:00
Copyright ( C ) 2014 - 2021 Taler Systems SA
2015-01-08 18:37:20 +01:00
TALER is free software ; you can redistribute it and / or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation ; either version 3 , or ( at your option ) any later version .
TALER is distributed in the hope that it will be useful , but WITHOUT ANY
WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE . See the GNU General Public License for more details .
You should have received a copy of the GNU General Public License along with
2016-07-07 17:55:25 +02:00
TALER ; see the file COPYING . If not , see < http : //www.gnu.org/licenses/>
2015-01-08 18:37:20 +01:00
*/
/**
2016-03-01 15:35:04 +01:00
* @ file exchange - tools / taler - exchange - dbinit . c
* @ brief Create tables for the exchange database .
2015-01-08 18:37:20 +01:00
* @ author Florian Dold
2021-09-03 19:08:02 +02:00
* @ author Christian Grothoff
2015-01-08 18:37:20 +01:00
*/
# include "platform.h"
# include <gnunet/gnunet_util_lib.h>
2020-01-16 22:40:12 +01:00
# include "taler_exchangedb_lib.h"
2015-01-08 18:37:20 +01:00
2016-04-16 19:49:53 +02:00
/**
* Return value from main ( ) .
*/
static int global_ret ;
2016-05-21 19:22:03 +02:00
/**
* - r option : do full DB reset
*/
static int reset_db ;
2021-09-03 19:08:02 +02:00
/**
* - s option : clear revolving shard locks
*/
static int clear_shards ;
2016-05-31 09:16:09 +02:00
/**
* - g option : garbage collect DB reset
*/
static int gc_db ;
2021-07-29 23:56:46 +02:00
2016-04-16 19:49:53 +02:00
/**
* Main function that will be run .
*
* @ param cls closure
* @ param args remaining command - line arguments
* @ param cfgfile name of the configuration file used ( for saving , can be NULL ! )
* @ param cfg configuration
*/
static void
run ( void * cls ,
char * const * args ,
const char * cfgfile ,
const struct GNUNET_CONFIGURATION_Handle * cfg )
{
struct TALER_EXCHANGEDB_Plugin * plugin ;
2019-11-01 14:34:34 +01:00
( void ) cls ;
( void ) args ;
( void ) cfgfile ;
2016-04-16 19:49:53 +02:00
if ( NULL = =
( plugin = TALER_EXCHANGEDB_plugin_load ( cfg ) ) )
{
fprintf ( stderr ,
" Failed to initialize database plugin. \n " ) ;
2021-07-29 23:56:46 +02:00
global_ret = EXIT_NOTINSTALLED ;
2016-04-16 19:49:53 +02:00
return ;
}
2016-05-21 19:22:03 +02:00
if ( reset_db )
2020-03-07 12:23:32 +01:00
{
if ( GNUNET_OK ! = plugin - > drop_tables ( plugin - > cls ) )
{
2021-08-18 10:25:42 +02:00
GNUNET_log ( GNUNET_ERROR_TYPE_ERROR ,
2020-03-13 19:34:24 +01:00
" Could not drop tables as requested. Either database was not yet initialized, or permission denied. Consult the logs. Will still try to create new tables. \n " ) ;
2020-03-07 12:23:32 +01:00
}
}
2016-04-16 19:49:53 +02:00
if ( GNUNET_OK ! =
2016-05-02 06:36:58 +02:00
plugin - > create_tables ( plugin - > cls ) )
2016-04-16 19:49:53 +02:00
{
fprintf ( stderr ,
" Failed to initialize database. \n " ) ;
TALER_EXCHANGEDB_plugin_unload ( plugin ) ;
2021-11-24 00:25:17 +01:00
plugin = NULL ;
2021-07-29 23:56:46 +02:00
global_ret = EXIT_NOPERMISSION ;
2016-04-16 19:49:53 +02:00
return ;
}
2021-09-03 21:30:14 +02:00
if ( gc_db | | clear_shards )
2021-09-03 19:08:02 +02:00
{
2021-09-03 21:30:14 +02:00
if ( GNUNET_OK ! =
plugin - > preflight ( plugin - > cls ) )
2021-09-03 19:08:02 +02:00
{
fprintf ( stderr ,
2021-09-03 21:30:14 +02:00
" Failed to prepare database. \n " ) ;
TALER_EXCHANGEDB_plugin_unload ( plugin ) ;
2021-11-24 00:25:17 +01:00
plugin = NULL ;
2021-09-03 21:30:14 +02:00
global_ret = EXIT_NOPERMISSION ;
return ;
2021-09-03 19:08:02 +02:00
}
2021-09-03 21:30:14 +02:00
if ( clear_shards )
2020-03-07 12:23:32 +01:00
{
2021-09-03 21:30:14 +02:00
if ( 0 >
plugin - > delete_revolving_shards ( plugin - > cls ) )
{
fprintf ( stderr ,
" Clearing revolving shards failed! \n " ) ;
}
}
if ( gc_db )
{
if ( GNUNET_SYSERR = = plugin - > gc ( plugin - > cls ) )
{
fprintf ( stderr ,
" Garbage collection failed! \n " ) ;
}
2020-03-07 12:23:32 +01:00
}
2019-08-25 16:18:24 +02:00
}
2016-04-16 19:49:53 +02:00
TALER_EXCHANGEDB_plugin_unload ( plugin ) ;
2021-11-24 00:25:17 +01:00
plugin = NULL ;
2016-04-16 19:49:53 +02:00
}
2015-01-08 18:37:20 +01:00
/**
2015-03-16 18:19:05 +01:00
* The main function of the database initialization tool .
2016-03-01 15:35:04 +01:00
* Used to initialize the Taler Exchange ' s database .
2015-01-08 18:37:20 +01:00
*
* @ param argc number of arguments from the command line
* @ param argv command line arguments
2021-09-17 11:35:10 +02:00
* @ return 0 ok , non - zero on error
2015-01-08 18:37:20 +01:00
*/
int
2015-03-16 18:19:05 +01:00
main ( int argc ,
char * const * argv )
2015-01-08 18:37:20 +01:00
{
2016-04-10 17:10:20 +02:00
const struct GNUNET_GETOPT_CommandLineOption options [ ] = {
2017-03-25 21:22:22 +01:00
GNUNET_GETOPT_option_flag ( ' g ' ,
2019-08-25 16:18:24 +02:00
" gc " ,
" garbage collect database " ,
& gc_db ) ,
2021-09-03 19:08:02 +02:00
GNUNET_GETOPT_option_flag ( ' r ' ,
" reset " ,
" reset database (DANGEROUS: all existing data is lost!) " ,
& reset_db ) ,
GNUNET_GETOPT_option_flag ( ' s ' ,
" shardunlock " ,
" unlock all revolving shard locks (use after system crash or shard size change while services are not running) " ,
& clear_shards ) ,
2015-01-08 18:37:20 +01:00
GNUNET_GETOPT_OPTION_END
} ;
2021-01-07 10:40:01 +01:00
enum GNUNET_GenericReturnValue ret ;
2015-01-08 18:37:20 +01:00
2015-03-21 14:04:13 +01:00
if ( GNUNET_OK ! =
2021-01-07 10:40:01 +01:00
GNUNET_STRINGS_get_utf8_args ( argc , argv ,
& argc , & argv ) )
2021-07-29 23:56:46 +02:00
return EXIT_INVALIDARGUMENT ;
2021-08-08 16:45:32 +02:00
/* force linker to link against libtalerutil; if we do
not do this , the linker may " optimize " libtalerutil
away and skip # TALER_OS_init ( ) , which we do need */
TALER_OS_init ( ) ;
2021-01-07 10:40:01 +01:00
ret = GNUNET_PROGRAM_run (
argc , argv ,
" taler-exchange-dbinit " ,
gettext_noop ( " Initialize Taler exchange database " ) ,
options ,
& run , NULL ) ;
GNUNET_free_nz ( ( void * ) argv ) ;
if ( GNUNET_SYSERR = = ret )
2021-07-29 23:56:46 +02:00
return EXIT_INVALIDARGUMENT ;
2021-01-07 10:40:01 +01:00
if ( GNUNET_NO = = ret )
2021-07-29 23:56:46 +02:00
return EXIT_SUCCESS ;
2016-04-16 19:49:53 +02:00
return global_ret ;
2015-01-08 18:37:20 +01:00
}
2015-03-16 18:19:05 +01:00
2016-04-16 19:49:53 +02:00
2016-03-01 15:35:04 +01:00
/* end of taler-exchange-dbinit.c */