int tot_ids; /* total to process */
} NAME_LIST;
-/*
- * Global variables
- */
+/* Global variables */
+
static bool fix = false;
static bool batch = false;
static BDB *db;
static char buf[20000];
static bool quit = false;
static CONFIG *config;
-static const char *idx_tmp_name;
+static const char *idx_tmp_name;
#define MAX_ID_LIST_LEN 10000000
-/*
- * Forward referenced functions
- */
-static void print_catalog_details(CAT *catalog, const char *working_dir);
+/* Forward referenced functions */
static int make_id_list(const char *query, ID_LIST *id_list);
static int delete_id_list(const char *query, ID_LIST *id_list);
static int make_name_list(const char *query, NAME_LIST *name_list);
static void do_interactive_mode();
static bool yes_no(const char *prompt);
static bool check_idx(const char *col_name);
-static bool create_tmp_idx(const char *idx_name, const char *table_name,
- const char *col_name);
+static bool create_tmp_idx(const char *idx_name, const char *table_name,
+ const char *col_name);
static bool drop_tmp_idx(const char *idx_name, const char *table_name);
static int check_idx_handler(void *ctx, int num_fields, char **row);
lmgr_init_thread();
my_name_is(argc, argv, "dbcheck");
- init_msg(NULL, NULL); /* setup message handler */
+ init_msg(NULL, NULL); /* setup message handler */
memset(&id_list, 0, sizeof(id_list));
memset(&name_list, 0, sizeof(name_list));
- while ((ch = getopt(argc, argv, "bc:C:d:fvB?")) != -1) {
+ while ((ch = getopt(argc, argv, "bc:C:d:fvB?")) != -1) {
switch (ch) {
case 'B':
print_catalog = true; /* get catalog information from config */
}
set_working_directory(director->working_directory);
- /*
- * Print catalog information and exit (-B)
- */
+ /* Print catalog information and exit (-B) */
if (print_catalog) {
- print_catalog_details(catalog, director->working_directory);
+
+ POOLMEM *catalog_details = get_pool_memory(PM_MESSAGE);
+ db = db_init_database(NULL, catalog->db_driver, catalog->db_name, catalog->db_user,
+ catalog->db_password, catalog->db_address,
+ catalog->db_port, catalog->db_socket,
+ catalog->db_ssl_key, catalog->db_ssl_cert, catalog->db_ssl_ca,
+ catalog->db_ssl_capath, catalog->db_ssl_cipher,
+ catalog->mult_db_connections,
+ catalog->disable_batch_insert);
+ if (db) {
+ printf("%sdb_type=%s\nworking_dir=%s\n", catalog->display(catalog_details),
+ db_get_engine_name(db), working_directory);
+ db_close_database(NULL, db);
+ }
+ free_pool_memory(catalog_details);
exit(0);
}
usage();
}
- /*
- * This is needed by SQLite to find the db
- */
+ /* This is needed by SQLite to find the db */
working_directory = argv[0];
db_name = "bacula";
user = db_name;
} /* if (argc >= 2) */
}
- /*
- * Open database
- */
- db = db_init_database(NULL, NULL, db_name, user, password, dbhost, dbport, NULL, dbsslkey, dbsslcert, dbsslca, dbsslcapath, dbsslcipher, false, false);
+ /* Open database */
+ db = db_init_database(NULL, NULL, db_name, user, password, dbhost,
+ dbport, NULL, dbsslkey, dbsslcert, dbsslca, dbsslcapath, dbsslcipher, false, false);
if (!db || !db_open_database(NULL, db)) {
Emsg1(M_FATAL, 0, "%s", db_strerror(db));
return 1;
}
- /*
- * Drop temporary index idx_tmp_name if it already exists
- */
+ /* Drop temporary index idx_tmp_name if it already exists */
drop_tmp_idx("idxPIchk", "File");
if (batch) {
do_interactive_mode();
}
- /*
- * Drop temporary index idx_tmp_name
- */
+ /* Drop temporary index idx_tmp_name */
drop_tmp_idx("idxPIchk", "File");
if (db) db_close_database(NULL, db);
return 0;
}
-static void print_catalog_details(CAT *catalog, const char *working_dir)
-{
- POOLMEM *catalog_details = get_pool_memory(PM_MESSAGE);
-
- /*
- * Instantiate a BDB class and see what db_type gets assigned to it.
- */
- db = db_init_database(NULL, catalog->db_driver, catalog->db_name, catalog->db_user,
- catalog->db_password, catalog->db_address,
- catalog->db_port, catalog->db_socket,
- catalog->db_ssl_key, catalog->db_ssl_cert, catalog->db_ssl_ca,
- catalog->db_ssl_capath, catalog->db_ssl_cipher,
- catalog->mult_db_connections,
- catalog->disable_batch_insert);
- if (db) {
- printf("%sdb_type=%s\nworking_dir=%s\n", catalog->display(catalog_details),
- db_get_engine_name(db), working_directory);
- db_close_database(NULL, db);
- }
- free_pool_memory(catalog_details);
-}
-
static void do_interactive_mode()
{
const char *cmd;
static int get_name_handler(void *ctx, int num_fields, char **row)
{
- POOLMEM *name = (POOLMEM *)ctx;
-
+ POOLMEM *buf = (POOLMEM *)ctx;
if (row[0]) {
- pm_strcpy(&name, row[0]);
+ pm_strcpy(&buf, row[0]);
}
return 0;
}
printf(_("Checking for duplicate Filename entries.\n"));
- /*
- * Make list of duplicated names
- */
+ /* Make list of duplicated names */
query = "SELECT Name, count(Name) as Count FROM Filename GROUP BY Name "
"HAVING count(Name) > 1";
return;
}
if (fix) {
- /*
- * Loop through list of duplicate names
- */
+ /* Loop through list of duplicate names */
for (int i=0; i<name_list.num_ids; i++) {
- /*
- * Get all the Ids of each name
- */
+ /* Get all the Ids of each name */
db_escape_string(NULL, db, esc_name, name_list.name[i], strlen(name_list.name[i]));
bsnprintf(buf, sizeof(buf), "SELECT FilenameId FROM Filename WHERE Name='%s'", esc_name);
if (verbose > 1) {
if (verbose) {
printf(_("Found %d for: %s\n"), id_list.num_ids, name_list.name[i]);
}
- /*
- * Force all records to use the first id then delete the other ids
- */
+ /* Force all records to use the first id then delete the other ids */
for (int j=1; j<id_list.num_ids; j++) {
char ed1[50], ed2[50];
bsnprintf(buf, sizeof(buf), "UPDATE File SET FilenameId=%s WHERE FilenameId=%s",
printf(_("Checking for duplicate Path entries.\n"));
- /*
- * Make list of duplicated names
- */
+ /* Make list of duplicated names */
query = "SELECT Path, count(Path) as Count FROM Path "
"GROUP BY Path HAVING count(Path) > 1";
return;
}
if (fix) {
- /*
- * Loop through list of duplicate names
- */
+ /* Loop through list of duplicate names */
for (int i=0; i<name_list.num_ids; i++) {
- /*
- * Get all the Ids of each name
- */
+ /* Get all the Ids of each name */
db_escape_string(NULL, db, esc_name, name_list.name[i], strlen(name_list.name[i]));
bsnprintf(buf, sizeof(buf), "SELECT PathId FROM Path WHERE Path='%s'", esc_name);
if (verbose > 1) {
if (verbose) {
printf(_("Found %d for: %s\n"), id_list.num_ids, name_list.name[i]);
}
- /*
- * Force all records to use the first id then delete the other ids
- */
+ /* Force all records to use the first id then delete the other ids */
for (int j=1; j<id_list.num_ids; j++) {
char ed1[50], ed2[50];
bsnprintf(buf, sizeof(buf), "UPDATE File SET PathId=%s WHERE PathId=%s",
if (!make_id_list(query, &id_list)) {
exit(1);
}
- /*
- * Loop doing 300000 at a time
- */
+ /* Loop doing 300000 at a time */
while (id_list.num_ids != 0) {
printf(_("Found %d orphaned JobMedia records.\n"), id_list.num_ids);
if (id_list.num_ids && verbose && yes_no(_("Print them? (yes/no): "))) {
char ed1[50];
bsnprintf(buf, sizeof(buf),
"SELECT JobMedia.JobMediaId,JobMedia.JobId,Media.VolumeName FROM JobMedia,Media "
-"WHERE JobMedia.JobMediaId=%s AND Media.MediaId=JobMedia.MediaId",
+ "WHERE JobMedia.JobMediaId=%s AND Media.MediaId=JobMedia.MediaId",
edit_int64(id_list.Id[i], ed1));
if (!db_sql_query(db, buf, print_jobmedia_handler, NULL)) {
printf("%s\n", db_strerror(db));
if (!make_id_list(query, &id_list)) {
exit(1);
}
- /*
- * Loop doing 300000 at a time
- */
+ /* Loop doing 300000 at a time */
while (id_list.num_ids != 0) {
printf(_("Found %d orphaned File records.\n"), id_list.num_ids);
if (name_list.num_ids && verbose && yes_no(_("Print them? (yes/no): "))) {
char ed1[50];
bsnprintf(buf, sizeof(buf),
"SELECT File.FileId,File.JobId,Filename.Name FROM File,Filename "
-"WHERE File.FileId=%s AND File.FilenameId=Filename.FilenameId",
+ "WHERE File.FileId=%s AND File.FilenameId=Filename.FilenameId",
edit_int64(id_list.Id[i], ed1));
if (!db_sql_query(db, buf, print_file_handler, NULL)) {
printf("%s\n", db_strerror(db));
}
idx_tmp_name = NULL;
- /*
- * Check the existence of the required "one column" index
- */
+ /* Check the existence of the required "one column" index */
if (!check_idx("PathId")) {
if (yes_no(_("Create temporary index? (yes/no): "))) {
- /*
- * create temporary index PathId
- */
+ /* create temporary index PathId */
create_tmp_idx("idxPIchk", "File", "PathId");
}
}
if (!make_id_list(query, &id_list)) {
exit(1);
}
- /*
- * Loop doing 300000 at a time
- */
+ /* Loop doing 300000 at a time */
while (id_list.num_ids != 0) {
printf(_("Found %d orphaned Path records.\n"), id_list.num_ids);
if (id_list.num_ids && verbose && yes_no(_("Print them? (yes/no): "))) {
for (int i=0; i < id_list.num_ids; i++) {
char ed1[50];
- bsnprintf(buf, sizeof(buf), "SELECT Path FROM Path WHERE PathId=%s",
+ bsnprintf(buf, sizeof(buf), "SELECT Path FROM Path WHERE PathId=%s",
edit_int64(id_list.Id[i], ed1));
db_sql_query(db, buf, print_name_handler, NULL);
}
if (!make_id_list(query, &id_list)) {
exit(1);
}
- }
- /*
- * Drop temporary index idx_tmp_name
- */
+ }
+ /* Drop temporary index idx_tmp_name */
drop_tmp_idx("idxPIchk", "File");
}
static void eliminate_orphaned_filename_records()
{
idx_tmp_name = NULL;
- /*
- * Check the existence of the required "one column" index
- */
+ /* Check the existence of the required "one column" index */
if (!check_idx("FilenameId") ) {
if (yes_no(_("Create temporary index? (yes/no): "))) {
- /*
- * Create temporary index FilenameId
- */
+ /* Create temporary index FilenameId */
create_tmp_idx("idxFIchk", "File", "FilenameId");
}
}
if (!make_id_list(query, &id_list)) {
exit(1);
}
- /*
- * Loop doing 300000 at a time
- */
+ /* Loop doing 300000 at a time */
while (id_list.num_ids != 0) {
printf(_("Found %d orphaned Filename records.\n"), id_list.num_ids);
if (id_list.num_ids && verbose && yes_no(_("Print them? (yes/no): "))) {
for (int i=0; i < id_list.num_ids; i++) {
char ed1[50];
- bsnprintf(buf, sizeof(buf), "SELECT Name FROM Filename WHERE FilenameId=%s",
+ bsnprintf(buf, sizeof(buf), "SELECT Name FROM Filename WHERE FilenameId=%s",
edit_int64(id_list.Id[i], ed1));
db_sql_query(db, buf, print_name_handler, NULL);
}
exit(1);
}
}
- /*
- * Drop temporary index idx_tmp_name
- */
+ /* Drop temporary index idx_tmp_name */
drop_tmp_idx("idxFIchk", "File");
}
const char *query;
printf(_("Checking for orphaned Client entries.\n"));
- /*
- * In English:
+ /* In English:
* Wiffle through Client for every Client
* joining with the Job table including every Client even if
* there is not a match in Job (left outer join), then
const char *query;
printf(_("Checking for orphaned Job entries.\n"));
- /*
- * In English:
+ /* In English:
* Wiffle through Job for every Job
* joining with the Client table including every Job even if
* there is not a match in Client (left outer join), then
for (i=0; i < id_list.num_ids; i++) {
char ed1[50];
bsnprintf(buf, sizeof(buf),
- "SELECT Name FROM Filename WHERE FilenameId=%s",
+ "SELECT Name FROM Filename WHERE FilenameId=%s",
edit_int64(id_list.Id[i], ed1));
if (!db_sql_query(db, buf, print_name_handler, NULL)) {
printf("%s\n", db_strerror(db));
int len;
char ed1[50];
bsnprintf(buf, sizeof(buf),
- "SELECT Name FROM Filename WHERE FilenameId=%s",
+ "SELECT Name FROM Filename WHERE FilenameId=%s",
edit_int64(id_list.Id[i], ed1));
if (!db_sql_query(db, buf, get_name_handler, name)) {
printf("%s\n", db_strerror(db));
}
- /*
- * Strip trailing slash(es)
- */
+ /* Strip trailing slash(es) */
for (len=strlen(name); len > 0 && IsPathSeparator(name[len-1]); len--)
{ }
if (len == 0) {
}
db_sql_query(db, buf, NULL, NULL);
}
- free_pool_memory(name);
+ free_pool_memory(name);
}
}
if (!db_sql_query(db, buf, get_name_handler, name)) {
printf("%s\n", db_strerror(db));
}
- /*
- * Strip trailing blanks
- */
+ /* Strip trailing blanks */
for (len=strlen(name); len > 0 && name[len-1]==' '; len--) {
name[len-1] = 0;
}
- /*
- * Add trailing slash
- */
+ /* Add trailing slash */
len = pm_strcat(&name, "/");
db_escape_string(NULL, db, esc_name, name, len);
bsnprintf(buf, sizeof(buf), "UPDATE Path SET Path='%s' WHERE PathId=%s",
}
db_sql_query(db, buf, NULL, NULL);
}
- free_pool_memory(name);
+ free_pool_memory(name);
}
}
static IDX_LIST idx_list[MAXIDX];
-/*
+/*
* Called here with each table index to be added to the list
*/
static int check_idx_handler(void *ctx, int num_fields, char **row)
{
- /*
- * Table | Non_unique | Key_name | Seq_in_index | Column_name |...
- * File | 0 | PRIMARY | 1 | FileId |...
- */
+ /*
+ * Table | Non_unique | Key_name | Seq_in_index | Column_name |...
+ * File | 0 | PRIMARY | 1 | FileId |...
+ */
char *name, *key_name, *col_name;
int i, len;
int found = false;
-
+
name = (char *)ctx;
key_name = row[2];
col_name = row[4];
break;
}
}
- /*
- * If the new Key_name, add it to the list
- */
+ /* If the new Key_name, add it to the list */
if (!found) {
len = strlen(key_name) + 1;
idx_list[i].key_name = (char *)malloc(len);
int found = false;
const char *query = "SHOW INDEX FROM File";
- switch (db_get_type_index(db)) {
- case SQL_TYPE_MYSQL:
- memset(&idx_list, 0, sizeof(idx_list));
- if (!db_sql_query(db, query, check_idx_handler, (void *)col_name)) {
- printf("%s\n", db_strerror(db));
- }
- for (i = 0; (idx_list[i].key_name != NULL) && (i < MAXIDX) ; i++) {
- /*
- * NOTE : if (idx_list[i].count_key > 1) then index idx_list[i].key_name is "multiple-column" index
- */
- if ((idx_list[i].count_key == 1) && (idx_list[i].count_col == 1)) {
- /*
- * "one column" index over *col_name found
- */
- found = true;
- }
+ if (db_get_type_index(db) != SQL_TYPE_MYSQL) {
+ return true;
+ }
+ /* Continue for MySQL */
+ memset(&idx_list, 0, sizeof(idx_list));
+ if (!db_sql_query(db, query, check_idx_handler, (void *)col_name)) {
+ printf("%s\n", db_strerror(db));
+ }
+ for (i = 0; (idx_list[i].key_name != NULL) && (i < MAXIDX) ; i++) {
+ /*
+ * NOTE : if (idx_list[i].count_key > 1) then index idx_list[i].key_name is "multiple-column" index
+ */
+ if ((idx_list[i].count_key == 1) && (idx_list[i].count_col == 1)) {
+ /* "one column" index over *col_name found */
+ found = true;
}
- if (found) {
- if (verbose) {
- printf(_("Ok. Index over the %s column already exists and dbcheck will work faster.\n"), col_name);
- }
- } else {
- printf(_("Note. Index over the %s column not found, that can greatly slow down dbcheck.\n"), col_name);
+ }
+ if (found) {
+ if (verbose) {
+ printf(_("Ok. Index over the %s column already exists and dbcheck will work faster.\n"), col_name);
}
- return found;
- default:
- return true;
+ } else {
+ printf(_("Note. Index over the %s column not found, that can greatly slow down dbcheck.\n"), col_name);
}
+ return found;
}
/*
* Create temporary one-column index
*/
-static bool create_tmp_idx(const char *idx_name, const char *table_name,
- const char *col_name)
+static bool create_tmp_idx(const char *idx_name, const char *table_name,
+ const char *col_name)
{
idx_tmp_name = NULL;
printf(_("Create temporary index... This may take some time!\n"));
- bsnprintf(buf, sizeof(buf), "CREATE INDEX %s ON %s (%s)", idx_name, table_name, col_name);
+ bsnprintf(buf, sizeof(buf), "CREATE INDEX %s ON %s (%s)", idx_name, table_name, col_name);
if (verbose) {
printf("%s\n", buf);
}