X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fcats%2Fsql_get.c;h=e44dc47d4e220751151109096243f236c040872a;hb=f5984fe3b5fe567e1609078ed5966f4d0428f0a7;hp=0bcba5b91cd48c2be35118cd4db5eb9f018dfceb;hpb=07518107344753d03ad157da1a50ec4af04b5d4e;p=bacula%2Fbacula diff --git a/bacula/src/cats/sql_get.c b/bacula/src/cats/sql_get.c index 0bcba5b91c..e44dc47d4e 100644 --- a/bacula/src/cats/sql_get.c +++ b/bacula/src/cats/sql_get.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2009 Free Software Foundation Europe e.V. + Copyright (C) 2000-2010 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -25,7 +25,7 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ -/* +/** * 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 @@ -33,11 +33,11 @@ * * Kern Sibbald, March 2000 * - * Version $Id: sql_get.c 8918 2009-06-23 11:56:35Z ricozz $ */ -/* The following is necessary so that we do not include +/** + * 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 */ @@ -45,7 +45,7 @@ #include "bacula.h" #include "cats.h" -#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_DBI +#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI /* ----------------------------------------------------------------------- * @@ -59,7 +59,7 @@ static int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr); static int db_get_filename_record(JCR *jcr, B_DB *mdb); -/* +/** * Given a full filename (with path), look up the File record * (with attributes) in the database. * @@ -86,7 +86,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 @@ -116,7 +116,7 @@ int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr) int stat = 0; char ed1[50], ed2[50], ed3[50]; - if (jcr->get_JobLevel() == L_VERIFY_DISK_TO_CATALOG) { + if (jcr->getJobLevel() == L_VERIFY_DISK_TO_CATALOG) { Mmsg(mdb->cmd, "SELECT FileId, LStat, MD5 FROM File,Job WHERE " "File.JobId=Job.JobId AND File.PathId=%s AND " @@ -125,16 +125,6 @@ int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr) edit_int64(fdbr->PathId, ed1), edit_int64(fdbr->FilenameId, ed2), edit_int64(jr->ClientId,ed3)); - - } else if (jr != NULL) { - /* Called from Verify so jr->FileIndex is valid */ - Mmsg(mdb->cmd, -"SELECT FileId, LStat, MD5 FROM File WHERE File.JobId=%s AND File.PathId=%s AND " -"File.FilenameId=%s AND FileIndex=%u", - edit_int64(fdbr->JobId, ed1), - edit_int64(fdbr->PathId, ed2), - edit_int64(fdbr->FilenameId,ed3), - jr->FileIndex); } else { Mmsg(mdb->cmd, "SELECT FileId, LStat, MD5 FROM File WHERE File.JobId=%s AND File.PathId=%s AND " @@ -151,11 +141,6 @@ int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr) if (QUERY_DB(jcr, mdb, mdb->cmd)) { 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); - Dmsg1(000, "=== Problem! %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)); @@ -164,6 +149,13 @@ int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr) bstrncpy(fdbr->LStat, row[1], sizeof(fdbr->LStat)); bstrncpy(fdbr->Digest, row[2], sizeof(fdbr->Digest)); stat = 1; + if (mdb->num_rows > 1) { + Mmsg3(mdb->errmsg, _("get_file_record want 1 got rows=%d PathId=%s FilenameId=%s\n"), + mdb->num_rows, + edit_int64(fdbr->PathId, ed1), + edit_int64(fdbr->FilenameId, ed2)); + Dmsg1(000, "=== Problem! %s", mdb->errmsg); + } } } else { Mmsg2(mdb->errmsg, _("File record for PathId=%s FilenameId=%s not found.\n"), @@ -178,7 +170,8 @@ int db_get_file_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, FILE_DBR *fdbr) } -/* Get Filename record +/** + * Get Filename record * Returns: 0 on failure * FilenameId on success * @@ -222,7 +215,8 @@ static int db_get_filename_record(JCR *jcr, B_DB *mdb) return FilenameId; } -/* Get path record +/** + * Get path record * Returns: 0 on failure * PathId on success * @@ -281,7 +275,7 @@ int db_get_path_record(JCR *jcr, B_DB *mdb) } -/* +/** * Get Job record for given JobId or Job name * Returns: false on failure * true on success @@ -296,13 +290,13 @@ bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) Mmsg(mdb->cmd, "SELECT VolSessionId,VolSessionTime," "PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus," "Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId,FileSetId," -"SchedTime,RealEndTime,ReadBytes,HasBase " +"SchedTime,RealEndTime,ReadBytes,HasBase,PurgedFiles " "FROM Job WHERE Job='%s'", jr->Job); } else { Mmsg(mdb->cmd, "SELECT VolSessionId,VolSessionTime," "PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus," "Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId,FileSetId," -"SchedTime,RealEndTime,ReadBytes,HasBase " +"SchedTime,RealEndTime,ReadBytes,HasBase,PurgedFiles " "FROM Job WHERE JobId=%s", edit_int64(jr->JobId, ed1)); } @@ -346,13 +340,14 @@ bool db_get_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr) jr->EndTime = str_to_utime(jr->cEndTime); jr->RealEndTime = str_to_utime(jr->cRealEndTime); jr->HasBase = str_to_int64(row[21]); + jr->PurgedFiles = str_to_int64(row[22]); sql_free_result(mdb); db_unlock(mdb); return true; } -/* +/** * Find VolumeNames for a given JobId * Returns: 0 on error or no Volumes found * number of volumes on success @@ -409,7 +404,7 @@ int db_get_job_volume_names(JCR *jcr, B_DB *mdb, JobId_t JobId, POOLMEM **Volume return stat; } -/* +/** * Find Volume parameters for a give JobId * Returns: 0 on error or no Volumes found * number of volumes on success @@ -428,7 +423,7 @@ 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,Copy," +"JobMedia.EndFile,StartBlock,JobMedia.EndBlock," "Slot,StorageId,InChanger" " FROM JobMedia,Media WHERE JobMedia.JobId=%s" " AND JobMedia.MediaId=Media.MediaId ORDER BY VolIndex,JobMediaId", @@ -467,10 +462,9 @@ int db_get_job_volume_parameters(JCR *jcr, B_DB *mdb, JobId_t JobId, VOL_PARAMS EndBlock = str_to_uint64(row[7]); Vols[i].StartAddr = (((uint64_t)StartFile)<<32) | StartBlock; Vols[i].EndAddr = (((uint64_t)EndFile)<<32) | EndBlock; -// Vols[i].Copy = str_to_uint64(row[8]); - Vols[i].Slot = str_to_uint64(row[9]); - StorageId = str_to_uint64(row[10]); - Vols[i].InChanger = str_to_uint64(row[11]); + Vols[i].Slot = str_to_uint64(row[8]); + StorageId = str_to_uint64(row[9]); + Vols[i].InChanger = str_to_uint64(row[10]); Vols[i].Storage[0] = 0; SId[i] = StorageId; } @@ -498,7 +492,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 @@ -515,7 +509,7 @@ int db_get_num_pool_records(JCR *jcr, B_DB *mdb) return stat; } -/* +/** * This function returns a list of all the Pool record ids. * The caller must free ids if non-NULL. * @@ -552,7 +546,7 @@ int db_get_pool_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) return stat; } -/* +/** * This function returns a list of all the Client record ids. * The caller must free ids if non-NULL. * @@ -568,7 +562,7 @@ int db_get_client_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) db_lock(mdb); *ids = NULL; - Mmsg(mdb->cmd, "SELECT ClientId FROM Client"); + Mmsg(mdb->cmd, "SELECT ClientId FROM Client ORDER BY Name"); if (QUERY_DB(jcr, mdb, mdb->cmd)) { *num_ids = sql_num_rows(mdb); if (*num_ids > 0) { @@ -591,7 +585,8 @@ int db_get_client_ids(JCR *jcr, B_DB *mdb, int *num_ids, uint32_t *ids[]) -/* Get Pool Record +/** + * Get Pool Record * If the PoolId is non-zero, we get its record, * otherwise, we search on the PoolName * @@ -674,7 +669,8 @@ bool db_get_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr) return ok; } -/* Get Client Record +/** + * Get Client Record * If the ClientId is non-zero, we get its record, * otherwise, we search on the Client Name * @@ -729,7 +725,7 @@ int db_get_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cdbr) return stat; } -/* +/** * Get Counter Record * * Returns: 0 on failure @@ -780,7 +776,8 @@ int db_get_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr) } -/* Get FileSet Record +/** + * Get FileSet Record * If the FileSetId is non-zero, we get its record, * otherwise, we search on the name * @@ -831,7 +828,7 @@ int db_get_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr) } -/* +/** * Get the number of Media records * * Returns: -1 on failure @@ -848,10 +845,10 @@ int db_get_num_media_records(JCR *jcr, B_DB *mdb) return stat; } - -/* +/** * This function returns a list of all the Media record ids for - * the current Pool with the correct Media Type. + * the current Pool, the correct Media Type, Recyle, Enabled, StorageId, VolBytes + * VolumeName if specified * The caller must free ids if non-NULL. * * Returns false: on failure @@ -864,12 +861,50 @@ bool db_get_media_ids(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr, int *num_ids, uint32_t uint32_t *id; char ed1[50]; bool ok = false; + char buf[MAX_NAME_LENGTH*3]; /* Can contain MAX_NAME_LENGTH*2+1 + AND ....='' */ + char esc[MAX_NAME_LENGTH*2+1]; db_lock(mdb); *ids = NULL; - Mmsg(mdb->cmd, "SELECT DISTINCT MediaId FROM Media WHERE PoolId=%s " - " AND MediaType='%s'", - edit_int64(mr->PoolId, ed1), mr->MediaType); + + Mmsg(mdb->cmd, "SELECT DISTINCT MediaId FROM Media WHERE Recycle=%d AND Enabled=%d ", + mr->Recycle, mr->Enabled); + + if (*mr->MediaType) { + db_escape_string(jcr, mdb, esc, mr->MediaType, strlen(mr->MediaType)); + bsnprintf(buf, sizeof(buf), "AND MediaType='%s' ", esc); + pm_strcat(mdb->cmd, buf); + } + + if (mr->StorageId) { + bsnprintf(buf, sizeof(buf), "AND StorageId=%s ", edit_uint64(mr->StorageId, ed1)); + pm_strcat(mdb->cmd, buf); + } + + if (mr->PoolId) { + bsnprintf(buf, sizeof(buf), "AND PoolId=%s ", edit_uint64(mr->PoolId, ed1)); + pm_strcat(mdb->cmd, buf); + } + + if (mr->VolBytes) { + bsnprintf(buf, sizeof(buf), "AND VolBytes > %s ", edit_uint64(mr->VolBytes, ed1)); + pm_strcat(mdb->cmd, buf); + } + + if (*mr->VolumeName) { + db_escape_string(jcr, mdb, esc, mr->VolumeName, strlen(mr->VolumeName)); + bsnprintf(buf, sizeof(buf), "AND VolumeName = '%s' ", esc); + pm_strcat(mdb->cmd, buf); + } + + if (*mr->VolStatus) { + db_escape_string(jcr, mdb, esc, mr->VolStatus, strlen(mr->VolStatus)); + bsnprintf(buf, sizeof(buf), "AND VolStatus = '%s' ", esc); + pm_strcat(mdb->cmd, buf); + } + + Dmsg1(100, "q=%s\n", mdb->cmd); + if (QUERY_DB(jcr, mdb, mdb->cmd)) { *num_ids = sql_num_rows(mdb); if (*num_ids > 0) { @@ -891,7 +926,7 @@ bool db_get_media_ids(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr, int *num_ids, uint32_t } -/* +/** * This function returns a list of all the DBIds that are returned * for the query. * @@ -928,7 +963,8 @@ bool db_get_query_dbids(JCR *jcr, B_DB *mdb, POOL_MEM &query, dbid_list &ids) return ok; } -/* Get Media Record +/** + * Get Media Record * * Returns: false: on failure * true: on success @@ -1047,7 +1083,7 @@ bool db_get_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr) return ok; } -/* +/** * Find the last "accurate" backup state (that can take deleted files in * account) * 1) Get all files with jobid in list (F subquery) @@ -1094,7 +1130,7 @@ bool db_get_file_list(JCR *jcr, B_DB *mdb, char *jobids, return db_sql_query(mdb, buf.c_str(), result_handler, ctx); } -/* +/** * This procedure gets the base jobid list used by jobids, */ bool db_get_used_base_jobids(JCR *jcr, B_DB *mdb, @@ -1109,7 +1145,8 @@ bool db_get_used_base_jobids(JCR *jcr, B_DB *mdb, return db_sql_query(mdb, buf.c_str(), db_list_handler, result); } -/* The decision do change an incr/diff was done before +/** + * The decision do change an incr/diff was done before * Full : do nothing * Differential : get the last full id * Incremental : get the last full + last diff + last incr(s) ids @@ -1224,14 +1261,16 @@ bool db_get_base_file_list(JCR *jcr, B_DB *mdb, bool db_get_base_jobid(JCR *jcr, B_DB *mdb, JOB_DBR *jr, JobId_t *jobid) { + POOL_MEM query(PM_FNAME); + utime_t StartTime; + db_int64_ctx lctx; char date[MAX_TIME_LENGTH]; bool ret=false; - int64_t id = *jobid = 0; - POOLMEM *query = get_pool_memory(PM_FNAME); + *jobid = 0; // char clientid[50], filesetid[50]; - utime_t StartTime = (jr->StartTime)?jr->StartTime:time(NULL); + StartTime = (jr->StartTime)?jr->StartTime:time(NULL); bstrutime(date, sizeof(date), StartTime + 1); /* we can take also client name, fileset, etc... */ @@ -1251,18 +1290,17 @@ bool db_get_base_jobid(JCR *jcr, B_DB *mdb, JOB_DBR *jr, JobId_t *jobid) // edit_uint64(jr->FileSetId, filesetid)); date); - Dmsg1(10, "db_get_base_jobid q=%s\n", query); - if (!db_sql_query(mdb, query, db_int64_handler, &id)) { + Dmsg1(10, "db_get_base_jobid q=%s\n", query.c_str()); + if (!db_sql_query(mdb, query.c_str(), db_int64_handler, &lctx)) { goto bail_out; } - *jobid = (JobId_t) id; + *jobid = (JobId_t) lctx.value; - Dmsg1(10, "db_get_base_jobid=%lld\n", id); + Dmsg1(10, "db_get_base_jobid=%lld\n", *jobid); ret = true; bail_out: - free_pool_memory(query); return ret; } -#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_DBI */ +#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI */