X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fcats%2Fsql_get.c;h=acd1d886cfe726e0f1485d374cfe84bcabd83ec7;hb=b34b84f6913ee6d03d6c838e647c4aedf4bda3f2;hp=968ebd865db5c6ecd986f29a9ed8798fb6aba532;hpb=31324722fa6a602c0f97fe47deb3ed2b69dead4b;p=bacula%2Fbacula diff --git a/bacula/src/cats/sql_get.c b/bacula/src/cats/sql_get.c index 968ebd865d..acd1d886cf 100644 --- a/bacula/src/cats/sql_get.c +++ b/bacula/src/cats/sql_get.c @@ -1,8 +1,8 @@ /* * Bacula Catalog Database Get record interface routines * Note, these routines generally get a record by id or - * by name. If more logic is involved, the routine - * should be in find.c + * by name. If more logic is involved, the routine + * should be in find.c * * Kern Sibbald, March 2000 * @@ -13,19 +13,14 @@ Copyright (C) 2000-2005 Kern Sibbald This program 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 2 of - the License, or (at your option) any later version. + modify it under the terms of the GNU General Public License + version 2 as ammended with additional clauses defined in the + file LICENSE in the main source directory. This program 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 this program; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + the file LICENSE for additional details. */ @@ -33,7 +28,7 @@ /* The following is necessary so that we do not include * the dummy external definition of DB. */ -#define __SQL_C /* indicate that this is sql.c */ +#define __SQL_C /* indicate that this is sql.c */ #include "bacula.h" #include "cats.h" @@ -65,7 +60,7 @@ extern void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname); * (with attributes) in the database. * * Returns: 0 on failure - * 1 on success with the File record in FILE_DBR + * 1 on success with the File record in FILE_DBR */ int db_get_file_attributes_record(JCR *jcr, B_DB *mdb, char *fname, JOB_DBR *jr, FILE_DBR *fdbr) { @@ -90,7 +85,7 @@ int db_get_file_attributes_record(JCR *jcr, B_DB *mdb, char *fname, JOB_DBR *jr, /* * Get a File record * Returns: 0 on failure - * 1 on success + * 1 on success * * DO NOT use Jmsg in this routine. * @@ -132,22 +127,22 @@ int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr) mdb->num_rows = sql_num_rows(mdb); Dmsg1(050, "get_file_record num_rows=%d\n", (int)mdb->num_rows); if (mdb->num_rows > 1) { - Mmsg1(&mdb->errmsg, _("get_file_record want 1 got rows=%d\n"), - mdb->num_rows); + Mmsg1(mdb->errmsg, _("get_file_record want 1 got rows=%d\n"), + mdb->num_rows); } if (mdb->num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("Error fetching row: %s\n"), sql_strerror(mdb)); - } else { - fdbr->FileId = (FileId_t)str_to_int64(row[0]); - bstrncpy(fdbr->LStat, row[1], sizeof(fdbr->LStat)); - bstrncpy(fdbr->SIG, row[2], sizeof(fdbr->SIG)); - stat = 1; - } + if ((row = sql_fetch_row(mdb)) == NULL) { + Mmsg1(mdb->errmsg, _("Error fetching row: %s\n"), sql_strerror(mdb)); + } else { + fdbr->FileId = (FileId_t)str_to_int64(row[0]); + bstrncpy(fdbr->LStat, row[1], sizeof(fdbr->LStat)); + bstrncpy(fdbr->SIG, row[2], sizeof(fdbr->SIG)); + stat = 1; + } } else { - Mmsg2(&mdb->errmsg, _("File record for PathId=%s FilenameId=%s not found.\n"), - edit_int64(fdbr->PathId, ed1), - edit_int64(fdbr->FilenameId, ed2)); + Mmsg2(mdb->errmsg, _("File record for PathId=%s FilenameId=%s not found.\n"), + edit_int64(fdbr->PathId, ed1), + edit_int64(fdbr->FilenameId, ed2)); } sql_free_result(mdb); } else { @@ -159,7 +154,7 @@ int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr) /* Get Filename record * Returns: 0 on failure - * FilenameId on success + * FilenameId on success * * DO NOT use Jmsg in this routine (see notes for get_file_record) */ @@ -176,23 +171,23 @@ static int db_get_filename_record(JCR *jcr, B_DB *mdb) char ed1[30]; mdb->num_rows = sql_num_rows(mdb); if (mdb->num_rows > 1) { - Mmsg2(&mdb->errmsg, _("More than one Filename!: %s for file: %s\n"), - edit_uint64(mdb->num_rows, ed1), mdb->fname); + Mmsg2(mdb->errmsg, _("More than one Filename!: %s for file: %s\n"), + edit_uint64(mdb->num_rows, ed1), mdb->fname); Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg); } if (mdb->num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); - } else { - FilenameId = atoi(row[0]); - if (FilenameId <= 0) { - Mmsg2(&mdb->errmsg, _("Get DB Filename record %s found bad record: %d\n"), - mdb->cmd, FilenameId); - FilenameId = 0; - } - } + if ((row = sql_fetch_row(mdb)) == NULL) { + Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); + } else { + FilenameId = str_to_int64(row[0]); + if (FilenameId <= 0) { + Mmsg2(mdb->errmsg, _("Get DB Filename record %s found bad record: %d\n"), + mdb->cmd, FilenameId); + FilenameId = 0; + } + } } else { - Mmsg1(&mdb->errmsg, _("Filename record: %s not found.\n"), mdb->fname); + Mmsg1(mdb->errmsg, _("Filename record: %s not found.\n"), mdb->fname); } sql_free_result(mdb); } else { @@ -203,7 +198,7 @@ static int db_get_filename_record(JCR *jcr, B_DB *mdb) /* Get path record * Returns: 0 on failure - * PathId on success + * PathId on success * * DO NOT use Jmsg in this routine (see notes for get_file_record) */ @@ -226,31 +221,31 @@ static int db_get_path_record(JCR *jcr, B_DB *mdb) char ed1[30]; mdb->num_rows = sql_num_rows(mdb); if (mdb->num_rows > 1) { - Mmsg2(&mdb->errmsg, _("More than one Path!: %s for path: %s\n"), - edit_uint64(mdb->num_rows, ed1), mdb->path); + Mmsg2(mdb->errmsg, _("More than one Path!: %s for path: %s\n"), + edit_uint64(mdb->num_rows, ed1), mdb->path); Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg); } /* Even if there are multiple paths, take the first one */ if (mdb->num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); - } else { - PathId = atoi(row[0]); - if (PathId <= 0) { - Mmsg2(&mdb->errmsg, _("Get DB path record %s found bad record: %s\n"), - mdb->cmd, edit_int64(PathId, ed1)); - PathId = 0; - } else { - /* Cache path */ - if (PathId != mdb->cached_path_id) { - mdb->cached_path_id = PathId; - mdb->cached_path_len = mdb->pnl; - pm_strcpy(&mdb->cached_path, mdb->path); - } - } - } + if ((row = sql_fetch_row(mdb)) == NULL) { + Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); + } else { + PathId = str_to_int64(row[0]); + if (PathId <= 0) { + Mmsg2(mdb->errmsg, _("Get DB path record %s found bad record: %s\n"), + mdb->cmd, edit_int64(PathId, ed1)); + PathId = 0; + } else { + /* Cache path */ + if (PathId != mdb->cached_path_id) { + mdb->cached_path_id = PathId; + mdb->cached_path_len = mdb->pnl; + pm_strcpy(mdb->cached_path, mdb->path); + } + } + } } else { - Mmsg1(&mdb->errmsg, _("Path record: %s not found.\n"), mdb->path); + Mmsg1(mdb->errmsg, _("Path record: %s not found.\n"), mdb->path); } sql_free_result(mdb); } else { @@ -263,7 +258,7 @@ static int db_get_path_record(JCR *jcr, B_DB *mdb) /* * Get Job record for given JobId or Job name * Returns: 0 on failure - * 1 on success + * 1 on success */ int db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) { @@ -281,18 +276,18 @@ int db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) "PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus," "Type,Level,ClientId " "FROM Job WHERE JobId=%s", - edit_int64(jr->JobId, ed1)); + edit_int64(jr->JobId, ed1)); } if (!QUERY_DB(jcr, mdb, mdb->cmd)) { db_unlock(mdb); - return 0; /* failed */ + return 0; /* failed */ } if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("No Job found for JobId %s\n"), edit_int64(jr->JobId, ed1)); + Mmsg1(mdb->errmsg, _("No Job found for JobId %s\n"), edit_int64(jr->JobId, ed1)); sql_free_result(mdb); db_unlock(mdb); - return 0; /* failed */ + return 0; /* failed */ } jr->VolSessionId = str_to_uint64(row[0]); @@ -300,7 +295,7 @@ int db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) jr->PoolId = str_to_int64(row[2]); bstrncpy(jr->cStartTime, row[3]!=NULL?row[3]:"", sizeof(jr->cStartTime)); bstrncpy(jr->cEndTime, row[4]!=NULL?row[4]:"", sizeof(jr->cEndTime)); - jr->JobFiles = atol(row[5]); + jr->JobFiles = str_to_int64(row[5]); jr->JobBytes = str_to_int64(row[6]); jr->JobTDate = str_to_int64(row[7]); bstrncpy(jr->Job, row[8]!=NULL?row[8]:"", sizeof(jr->Job)); @@ -317,10 +312,10 @@ int db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) /* * Find VolumeNames for a given JobId * Returns: 0 on error or no Volumes found - * number of volumes on success - * Volumes are concatenated in VolumeNames - * separated by a vertical bar (|) in the order - * that they were written. + * number of volumes on success + * Volumes are concatenated in VolumeNames + * separated by a vertical bar (|) in the order + * that they were written. * * Returns: number of volumes on success */ @@ -345,23 +340,23 @@ int db_get_job_volume_names(JCR *jcr, B_DB *mdb, JobId_t JobId, POOLMEM **Volume mdb->num_rows = sql_num_rows(mdb); Dmsg1(130, "Num rows=%d\n", mdb->num_rows); if (mdb->num_rows <= 0) { - Mmsg1(&mdb->errmsg, _("No volumes found for JobId=%d\n"), JobId); - stat = 0; + Mmsg1(mdb->errmsg, _("No volumes found for JobId=%d\n"), JobId); + stat = 0; } else { - stat = mdb->num_rows; - for (i=0; i < stat; i++) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg2(&mdb->errmsg, _("Error fetching row %d: ERR=%s\n"), i, sql_strerror(mdb)); + stat = mdb->num_rows; + for (i=0; i < stat; i++) { + if ((row = sql_fetch_row(mdb)) == NULL) { + Mmsg2(mdb->errmsg, _("Error fetching row %d: ERR=%s\n"), i, sql_strerror(mdb)); Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - stat = 0; - break; - } else { - if (*VolumeNames[0] != 0) { + stat = 0; + break; + } else { + if (*VolumeNames[0] != 0) { pm_strcat(VolumeNames, "|"); - } - pm_strcat(VolumeNames, row[0]); - } - } + } + pm_strcat(VolumeNames, row[0]); + } + } } sql_free_result(mdb); } else { @@ -374,8 +369,8 @@ int db_get_job_volume_names(JCR *jcr, B_DB *mdb, JobId_t JobId, POOLMEM **Volume /* * Find Volume parameters for a give JobId * Returns: 0 on error or no Volumes found - * number of volumes on success - * List of Volumes and start/end file/blocks (malloced structure!) + * number of volumes on success + * List of Volumes and start/end file/blocks (malloced structure!) * * Returns: number of volumes on success */ @@ -390,40 +385,42 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS db_lock(mdb); Mmsg(mdb->cmd, "SELECT VolumeName,MediaType,FirstIndex,LastIndex,StartFile," -"JobMedia.EndFile,StartBlock,JobMedia.EndBlock" +"JobMedia.EndFile,StartBlock,JobMedia.EndBlock,Copy,Stripe" " FROM JobMedia,Media WHERE JobMedia.JobId=%s" " AND JobMedia.MediaId=Media.MediaId ORDER BY VolIndex,JobMediaId", - edit_int64(JobId, ed1)); + edit_int64(JobId, ed1)); Dmsg1(130, "VolNam=%s\n", mdb->cmd); if (QUERY_DB(jcr, mdb, mdb->cmd)) { mdb->num_rows = sql_num_rows(mdb); Dmsg1(130, "Num rows=%d\n", mdb->num_rows); if (mdb->num_rows <= 0) { - Mmsg1(&mdb->errmsg, _("No volumes found for JobId=%d\n"), JobId); - stat = 0; + Mmsg1(mdb->errmsg, _("No volumes found for JobId=%d\n"), JobId); + stat = 0; } else { - stat = mdb->num_rows; - if (stat > 0) { - *VolParams = Vols = (VOL_PARAMS *)malloc(stat * sizeof(VOL_PARAMS)); - } - for (i=0; i < stat; i++) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg2(&mdb->errmsg, _("Error fetching row %d: ERR=%s\n"), i, sql_strerror(mdb)); + stat = mdb->num_rows; + if (stat > 0) { + *VolParams = Vols = (VOL_PARAMS *)malloc(stat * sizeof(VOL_PARAMS)); + } + for (i=0; i < stat; i++) { + if ((row = sql_fetch_row(mdb)) == NULL) { + Mmsg2(mdb->errmsg, _("Error fetching row %d: ERR=%s\n"), i, sql_strerror(mdb)); Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - stat = 0; - break; - } else { - bstrncpy(Vols[i].VolumeName, row[0], MAX_NAME_LENGTH); - bstrncpy(Vols[i].MediaType, row[1], MAX_NAME_LENGTH); - Vols[i].FirstIndex = str_to_uint64(row[2]); - Vols[i].LastIndex = str_to_uint64(row[3]); - Vols[i].StartFile = str_to_uint64(row[4]); - Vols[i].EndFile = str_to_uint64(row[5]); - Vols[i].StartBlock = str_to_uint64(row[6]); - Vols[i].EndBlock = str_to_uint64(row[7]); - } - } + stat = 0; + break; + } else { + bstrncpy(Vols[i].VolumeName, row[0], MAX_NAME_LENGTH); + bstrncpy(Vols[i].MediaType, row[1], MAX_NAME_LENGTH); + Vols[i].FirstIndex = str_to_uint64(row[2]); + Vols[i].LastIndex = str_to_uint64(row[3]); + Vols[i].StartFile = str_to_uint64(row[4]); + Vols[i].EndFile = str_to_uint64(row[5]); + Vols[i].StartBlock = str_to_uint64(row[6]); + Vols[i].EndBlock = str_to_uint64(row[7]); +// Vols[i].Copy = str_to_uint64(row[8]); +// Vols[i].Stripe = str_to_uint64(row[9]); + } + } } sql_free_result(mdb); } @@ -437,7 +434,7 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS * Get the number of pool records * * Returns: -1 on failure - * number on success + * number on success */ int db_get_num_pool_records(JCR *jcr, B_DB *mdb) { @@ -455,7 +452,7 @@ int db_get_num_pool_records(JCR *jcr, B_DB *mdb) * The caller must free ids if non-NULL. * * Returns 0: on failure - * 1: on success + * 1: on success */ int db_get_pool_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) { @@ -470,11 +467,11 @@ int db_get_pool_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) if (QUERY_DB(jcr, mdb, mdb->cmd)) { *num_ids = sql_num_rows(mdb); if (*num_ids > 0) { - id = (uint32_t *)malloc(*num_ids * sizeof(uint32_t)); - while ((row = sql_fetch_row(mdb)) != NULL) { - id[i++] = str_to_uint64(row[0]); - } - *ids = id; + id = (uint32_t *)malloc(*num_ids * sizeof(uint32_t)); + while ((row = sql_fetch_row(mdb)) != NULL) { + id[i++] = str_to_uint64(row[0]); + } + *ids = id; } sql_free_result(mdb); stat = 1; @@ -492,7 +489,7 @@ int db_get_pool_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) * The caller must free ids if non-NULL. * * Returns 0: on failure - * 1: on success + * 1: on success */ int db_get_client_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) { @@ -507,11 +504,11 @@ int db_get_client_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) if (QUERY_DB(jcr, mdb, mdb->cmd)) { *num_ids = sql_num_rows(mdb); if (*num_ids > 0) { - id = (uint32_t *)malloc(*num_ids * sizeof(uint32_t)); - while ((row = sql_fetch_row(mdb)) != NULL) { - id[i++] = str_to_uint64(row[0]); - } - *ids = id; + id = (uint32_t *)malloc(*num_ids * sizeof(uint32_t)); + while ((row = sql_fetch_row(mdb)) != NULL) { + id[i++] = str_to_uint64(row[0]); + } + *ids = id; } sql_free_result(mdb); stat = 1; @@ -530,70 +527,79 @@ int db_get_client_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) * If the PoolId is non-zero, we get its record, * otherwise, we search on the PoolName * - * Returns: 0 on failure - * id on success + * Returns: false on failure + * true on success */ -int db_get_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr) +bool db_get_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr) { SQL_ROW row; - int stat = 0; + bool ok = false; char ed1[50]; db_lock(mdb); - if (pdbr->PoolId != 0) { /* find by id */ + if (pdbr->PoolId != 0) { /* find by id */ Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,AcceptAnyVolume," "AutoPrune,Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles," "MaxVolBytes,PoolType,LabelType,LabelFormat FROM Pool WHERE Pool.PoolId=%s", - edit_int64(pdbr->PoolId, ed1)); - } else { /* find by name */ + edit_int64(pdbr->PoolId, ed1)); + } else { /* find by name */ Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,AcceptAnyVolume," "AutoPrune,Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles," "MaxVolBytes,PoolType,LabelType,LabelFormat FROM Pool WHERE Pool.Name='%s'", - pdbr->Name); + pdbr->Name); } if (QUERY_DB(jcr, mdb, mdb->cmd)) { mdb->num_rows = sql_num_rows(mdb); if (mdb->num_rows > 1) { - char ed1[30]; - Mmsg1(&mdb->errmsg, _("More than one Pool!: %s\n"), - edit_uint64(mdb->num_rows, ed1)); + char ed1[30]; + Mmsg1(mdb->errmsg, _("More than one Pool!: %s\n"), + edit_uint64(mdb->num_rows, ed1)); Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); } else if (mdb->num_rows == 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); + if ((row = sql_fetch_row(mdb)) == NULL) { + Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - } else { - pdbr->PoolId = str_to_int64(row[0]); + } else { + pdbr->PoolId = str_to_int64(row[0]); bstrncpy(pdbr->Name, row[1]!=NULL?row[1]:"", sizeof(pdbr->Name)); - pdbr->NumVols = str_to_int64(row[2]); - pdbr->MaxVols = str_to_int64(row[3]); - pdbr->UseOnce = str_to_int64(row[4]); - pdbr->UseCatalog = str_to_int64(row[5]); - pdbr->AcceptAnyVolume = str_to_int64(row[6]); - pdbr->AutoPrune = str_to_int64(row[7]); - pdbr->Recycle = str_to_int64(row[8]); - pdbr->VolRetention = str_to_int64(row[9]); - pdbr->VolUseDuration = str_to_int64(row[10]); - pdbr->MaxVolJobs = str_to_int64(row[11]); - pdbr->MaxVolFiles = str_to_int64(row[12]); - pdbr->MaxVolBytes = str_to_uint64(row[13]); + pdbr->NumVols = str_to_int64(row[2]); + pdbr->MaxVols = str_to_int64(row[3]); + pdbr->UseOnce = str_to_int64(row[4]); + pdbr->UseCatalog = str_to_int64(row[5]); + pdbr->AcceptAnyVolume = str_to_int64(row[6]); + pdbr->AutoPrune = str_to_int64(row[7]); + pdbr->Recycle = str_to_int64(row[8]); + pdbr->VolRetention = str_to_int64(row[9]); + pdbr->VolUseDuration = str_to_int64(row[10]); + pdbr->MaxVolJobs = str_to_int64(row[11]); + pdbr->MaxVolFiles = str_to_int64(row[12]); + pdbr->MaxVolBytes = str_to_uint64(row[13]); bstrncpy(pdbr->PoolType, row[14]!=NULL?row[14]:"", sizeof(pdbr->PoolType)); - pdbr->LabelType = str_to_int64(row[15]); + pdbr->LabelType = str_to_int64(row[15]); bstrncpy(pdbr->LabelFormat, row[16]!=NULL?row[16]:"", sizeof(pdbr->LabelFormat)); - stat = pdbr->PoolId; - } - } else { - Mmsg(mdb->errmsg, _("Pool record not found in Catalog.\n")); + ok = true; + } } sql_free_result(mdb); + } + if (ok) { + uint32_t NumVols; + Mmsg(mdb->cmd, "SELECT count(*) from Media WHERE PoolId=%s", + edit_int64(pdbr->PoolId, ed1)); + NumVols = get_sql_record_max(jcr, mdb); + Dmsg2(400, "Actual NumVols=%d Pool NumVols=%d\n", NumVols, pdbr->NumVols); + if (NumVols != pdbr->NumVols) { + pdbr->NumVols = NumVols; + db_update_pool_record(jcr, mdb, pdbr); + } } else { Mmsg(mdb->errmsg, _("Pool record not found in Catalog.\n")); } db_unlock(mdb); - return stat; + return ok; } /* Get Client Record @@ -601,7 +607,7 @@ int db_get_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr) * otherwise, we search on the Client Name * * Returns: 0 on failure - * 1 on success + * 1 on success */ int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cdbr) { @@ -610,12 +616,12 @@ int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cdbr) char ed1[50]; db_lock(mdb); - if (cdbr->ClientId != 0) { /* find by id */ + if (cdbr->ClientId != 0) { /* find by id */ Mmsg(mdb->cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention,JobRetention " "FROM Client WHERE Client.ClientId=%s", - edit_int64(cdbr->ClientId, ed1)); - } else { /* find by name */ + edit_int64(cdbr->ClientId, ed1)); + } else { /* find by name */ Mmsg(mdb->cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention,JobRetention " "FROM Client WHERE Client.Name='%s'", cdbr->Name); @@ -624,22 +630,22 @@ int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cdbr) if (QUERY_DB(jcr, mdb, mdb->cmd)) { mdb->num_rows = sql_num_rows(mdb); if (mdb->num_rows > 1) { - Mmsg1(&mdb->errmsg, _("More than one Client!: %s\n"), - edit_uint64(mdb->num_rows, ed1)); + Mmsg1(mdb->errmsg, _("More than one Client!: %s\n"), + edit_uint64(mdb->num_rows, ed1)); Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); } else if (mdb->num_rows == 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); + if ((row = sql_fetch_row(mdb)) == NULL) { + Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - } else { - cdbr->ClientId = str_to_int64(row[0]); + } else { + cdbr->ClientId = str_to_int64(row[0]); bstrncpy(cdbr->Name, row[1]!=NULL?row[1]:"", sizeof(cdbr->Name)); - bstrncpy(cdbr->Uname, row[2]!=NULL?row[1]:"", sizeof(cdbr->Uname)); - cdbr->AutoPrune = str_to_int64(row[3]); - cdbr->FileRetention = str_to_int64(row[4]); - cdbr->JobRetention = str_to_int64(row[5]); - stat = 1; - } + bstrncpy(cdbr->Uname, row[2]!=NULL?row[2]:"", sizeof(cdbr->Uname)); + cdbr->AutoPrune = str_to_int64(row[3]); + cdbr->FileRetention = str_to_int64(row[4]); + cdbr->JobRetention = str_to_int64(row[5]); + stat = 1; + } } else { Mmsg(mdb->errmsg, _("Client record not found in Catalog.\n")); } @@ -655,7 +661,7 @@ int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cdbr) * Get Counter Record * * Returns: 0 on failure - * 1 on success + * 1 on success */ int db_get_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr) { @@ -670,28 +676,28 @@ int db_get_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr) /* If more than one, report error, but return first row */ if (mdb->num_rows > 1) { - Mmsg1(&mdb->errmsg, _("More than one Counter!: %d\n"), (int)(mdb->num_rows)); + Mmsg1(mdb->errmsg, _("More than one Counter!: %d\n"), (int)(mdb->num_rows)); Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); } if (mdb->num_rows >= 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching Counter row: %s\n"), sql_strerror(mdb)); + if ((row = sql_fetch_row(mdb)) == NULL) { + Mmsg1(mdb->errmsg, _("error fetching Counter row: %s\n"), sql_strerror(mdb)); Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - sql_free_result(mdb); - db_unlock(mdb); - return 0; - } - cr->MinValue = atoi(row[0]); - cr->MaxValue = atoi(row[1]); - cr->CurrentValue = atoi(row[2]); - if (row[3]) { - bstrncpy(cr->WrapCounter, row[3], sizeof(cr->WrapCounter)); - } else { - cr->WrapCounter[0] = 0; - } - sql_free_result(mdb); - db_unlock(mdb); - return 1; + sql_free_result(mdb); + db_unlock(mdb); + return 0; + } + cr->MinValue = str_to_int64(row[0]); + cr->MaxValue = str_to_int64(row[1]); + cr->CurrentValue = str_to_int64(row[2]); + if (row[3]) { + bstrncpy(cr->WrapCounter, row[3], sizeof(cr->WrapCounter)); + } else { + cr->WrapCounter[0] = 0; + } + sql_free_result(mdb); + db_unlock(mdb); + return 1; } sql_free_result(mdb); } else { @@ -707,7 +713,7 @@ int db_get_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr) * otherwise, we search on the name * * Returns: 0 on failure - * id on success + * id on success */ int db_get_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) { @@ -716,33 +722,33 @@ int db_get_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) char ed1[50]; db_lock(mdb); - if (fsr->FileSetId != 0) { /* find by id */ + if (fsr->FileSetId != 0) { /* find by id */ Mmsg(mdb->cmd, "SELECT FileSetId,FileSet,MD5,CreateTime FROM FileSet " "WHERE FileSetId=%s", - edit_int64(fsr->FileSetId, ed1)); - } else { /* find by name */ + edit_int64(fsr->FileSetId, ed1)); + } else { /* find by name */ Mmsg(mdb->cmd, - "SELECT FileSetId,FileSet,CreateTime,MD5 FROM FileSet " + "SELECT FileSetId,FileSet,MD5,CreateTime FROM FileSet " "WHERE FileSet='%s' ORDER BY CreateTime DESC LIMIT 1", fsr->FileSet); } if (QUERY_DB(jcr, mdb, mdb->cmd)) { mdb->num_rows = sql_num_rows(mdb); if (mdb->num_rows > 1) { - char ed1[30]; - Mmsg1(&mdb->errmsg, _("Error got %s FileSets but expected only one!\n"), - edit_uint64(mdb->num_rows, ed1)); - sql_data_seek(mdb, mdb->num_rows-1); + char ed1[30]; + Mmsg1(mdb->errmsg, _("Error got %s FileSets but expected only one!\n"), + edit_uint64(mdb->num_rows, ed1)); + sql_data_seek(mdb, mdb->num_rows-1); } if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("FileSet record \"%s\" not found.\n"), fsr->FileSet); + Mmsg1(mdb->errmsg, _("FileSet record \"%s\" not found.\n"), fsr->FileSet); } else { - fsr->FileSetId = str_to_int64(row[0]); + fsr->FileSetId = str_to_int64(row[0]); bstrncpy(fsr->FileSet, row[1]!=NULL?row[1]:"", sizeof(fsr->FileSet)); bstrncpy(fsr->MD5, row[2]!=NULL?row[2]:"", sizeof(fsr->MD5)); bstrncpy(fsr->cCreateTime, row[3]!=NULL?row[3]:"", sizeof(fsr->cCreateTime)); - stat = fsr->FileSetId; + stat = fsr->FileSetId; } sql_free_result(mdb); } else { @@ -757,7 +763,7 @@ int db_get_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) * Get the number of Media records * * Returns: -1 on failure - * number on success + * number on success */ int db_get_num_media_records(JCR *jcr, B_DB *mdb) { @@ -777,7 +783,7 @@ int db_get_num_media_records(JCR *jcr, B_DB *mdb) * The caller must free ids if non-NULL. * * Returns 0: on failure - * 1: on success + * 1: on success */ int db_get_media_ids(JCR *jcr, B_DB *mdb, uint32_t PoolId, int *num_ids, uint32_t *ids[]) { @@ -794,11 +800,11 @@ int db_get_media_ids(JCR *jcr, B_DB *mdb, uint32_t PoolId, int *num_ids, uint32_ if (QUERY_DB(jcr, mdb, mdb->cmd)) { *num_ids = sql_num_rows(mdb); if (*num_ids > 0) { - id = (uint32_t *)malloc(*num_ids * sizeof(uint32_t)); - while ((row = sql_fetch_row(mdb)) != NULL) { - id[i++] = (uint32_t)atoi(row[0]); - } - *ids = id; + id = (uint32_t *)malloc(*num_ids * sizeof(uint32_t)); + while ((row = sql_fetch_row(mdb)) != NULL) { + id[i++] = str_to_uint64(row[0]); + } + *ids = id; } sql_free_result(mdb); stat = 1; @@ -815,7 +821,7 @@ int db_get_media_ids(JCR *jcr, B_DB *mdb, uint32_t PoolId, int *num_ids, uint32_ /* Get Media Record * * Returns: 0 on failure - * id on success + * id on success */ int db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) { @@ -830,20 +836,20 @@ int db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) db_unlock(mdb); return 1; } - if (mr->MediaId != 0) { /* find by id */ + if (mr->MediaId != 0) { /* find by id */ Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs," "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger," - "EndFile,EndBlock,VolParts,LabelType,LabelDate " + "EndFile,EndBlock,VolParts,LabelType,LabelDate,StorageId " "FROM Media WHERE MediaId=%s", - edit_int64(mr->MediaId, ed1)); - } else { /* find by name */ + edit_int64(mr->MediaId, ed1)); + } else { /* find by name */ Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks," "VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes," "MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs," "MaxVolFiles,Recycle,Slot,FirstWritten,LastWritten,InChanger," - "EndFile,EndBlock,VolParts,LabelType,LabelDate " + "EndFile,EndBlock,VolParts,LabelType,LabelDate,StorageId " "FROM Media WHERE VolumeName='%s'", mr->VolumeName); } @@ -851,65 +857,66 @@ int db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) char ed1[50]; mdb->num_rows = sql_num_rows(mdb); if (mdb->num_rows > 1) { - Mmsg1(&mdb->errmsg, _("More than one Volume!: %s\n"), - edit_uint64(mdb->num_rows, ed1)); + Mmsg1(mdb->errmsg, _("More than one Volume!: %s\n"), + edit_uint64(mdb->num_rows, ed1)); Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); } else if (mdb->num_rows == 1) { - if ((row = sql_fetch_row(mdb)) == NULL) { - Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); + if ((row = sql_fetch_row(mdb)) == NULL) { + Mmsg1(mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb)); Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg); - } else { - /* return values */ - mr->MediaId = str_to_int64(row[0]); + } else { + /* return values */ + mr->MediaId = str_to_int64(row[0]); bstrncpy(mr->VolumeName, row[1]!=NULL?row[1]:"", sizeof(mr->VolumeName)); - mr->VolJobs = str_to_int64(row[2]); - mr->VolFiles = str_to_int64(row[3]); - mr->VolBlocks = str_to_int64(row[4]); - mr->VolBytes = str_to_uint64(row[5]); - mr->VolMounts = str_to_int64(row[6]); - mr->VolErrors = str_to_int64(row[7]); - mr->VolWrites = str_to_int64(row[8]); - mr->MaxVolBytes = str_to_uint64(row[9]); - mr->VolCapacityBytes = str_to_uint64(row[10]); + mr->VolJobs = str_to_int64(row[2]); + mr->VolFiles = str_to_int64(row[3]); + mr->VolBlocks = str_to_int64(row[4]); + mr->VolBytes = str_to_uint64(row[5]); + mr->VolMounts = str_to_int64(row[6]); + mr->VolErrors = str_to_int64(row[7]); + mr->VolWrites = str_to_int64(row[8]); + mr->MaxVolBytes = str_to_uint64(row[9]); + mr->VolCapacityBytes = str_to_uint64(row[10]); bstrncpy(mr->MediaType, row[11]!=NULL?row[11]:"", sizeof(mr->MediaType)); bstrncpy(mr->VolStatus, row[12]!=NULL?row[12]:"", sizeof(mr->VolStatus)); - mr->PoolId = str_to_int64(row[13]); - mr->VolRetention = str_to_uint64(row[14]); - mr->VolUseDuration = str_to_uint64(row[15]); - mr->MaxVolJobs = str_to_int64(row[16]); - mr->MaxVolFiles = str_to_int64(row[17]); - mr->Recycle = str_to_int64(row[18]); - mr->Slot = str_to_int64(row[19]); + mr->PoolId = str_to_int64(row[13]); + mr->VolRetention = str_to_uint64(row[14]); + mr->VolUseDuration = str_to_uint64(row[15]); + mr->MaxVolJobs = str_to_int64(row[16]); + mr->MaxVolFiles = str_to_int64(row[17]); + mr->Recycle = str_to_int64(row[18]); + mr->Slot = str_to_int64(row[19]); bstrncpy(mr->cFirstWritten, row[20]!=NULL?row[20]:"", sizeof(mr->cFirstWritten)); - mr->FirstWritten = (time_t)str_to_utime(mr->cFirstWritten); + mr->FirstWritten = (time_t)str_to_utime(mr->cFirstWritten); bstrncpy(mr->cLastWritten, row[21]!=NULL?row[21]:"", sizeof(mr->cLastWritten)); - mr->LastWritten = (time_t)str_to_utime(mr->cLastWritten); - mr->InChanger = str_to_uint64(row[22]); - mr->EndFile = str_to_uint64(row[23]); - mr->EndBlock = str_to_uint64(row[24]); - mr->VolParts = str_to_int64(row[25]); - mr->LabelType = str_to_int64(row[26]); + mr->LastWritten = (time_t)str_to_utime(mr->cLastWritten); + mr->InChanger = str_to_uint64(row[22]); + mr->EndFile = str_to_uint64(row[23]); + mr->EndBlock = str_to_uint64(row[24]); + mr->VolParts = str_to_int64(row[25]); + mr->LabelType = str_to_int64(row[26]); bstrncpy(mr->cLabelDate, row[27]!=NULL?row[27]:"", sizeof(mr->cLabelDate)); - mr->LabelDate = (time_t)str_to_utime(mr->cLabelDate); - stat = mr->MediaId; - } + mr->LabelDate = (time_t)str_to_utime(mr->cLabelDate); + mr->StorageId = str_to_int64(row[28]); + stat = mr->MediaId; + } } else { - if (mr->MediaId != 0) { - Mmsg1(&mdb->errmsg, _("Media record MediaId=%s not found.\n"), - edit_int64(mr->MediaId, ed1)); - } else { - Mmsg1(&mdb->errmsg, _("Media record for Volume \"%s\" not found.\n"), - mr->VolumeName); - } + if (mr->MediaId != 0) { + Mmsg1(mdb->errmsg, _("Media record MediaId=%s not found.\n"), + edit_int64(mr->MediaId, ed1)); + } else { + Mmsg1(mdb->errmsg, _("Media record for Volume \"%s\" not found.\n"), + mr->VolumeName); + } } sql_free_result(mdb); } else { if (mr->MediaId != 0) { Mmsg(mdb->errmsg, _("Media record for MediaId=%u not found in Catalog.\n"), - mr->MediaId); + mr->MediaId); } else { Mmsg(mdb->errmsg, _("Media record for Vol=%s not found in Catalog.\n"), - mr->VolumeName); + mr->VolumeName); } } db_unlock(mdb); return stat;