jcr = j;
jcr->inc_use_count();
db = mdb; /* need to inc ref count */
- prev_dir = get_pool_memory(PM_NAME);
jobids = get_pool_memory(PM_NAME);
+ prev_dir = get_pool_memory(PM_NAME);
pattern = get_pool_memory(PM_NAME);
- *prev_dir = *pattern = *jobids = 0;
+ *jobids = *prev_dir = *pattern = 0;
dir_filenameid = pwd_id = offset = 0;
see_copies = see_all_version = false;
limit = 1000;
hlink *nodes;
int nb_node;
int max_node;
+
+ alist *table_node;
+
htable *cache_ppathid;
public:
max_node = NITEMS;
nodes = (hlink *) malloc(max_node * sizeof (hlink));
nb_node = 0;
+ table_node = New(alist(5, owned_by_alist));
+ table_node->append(nodes);
}
hlink *get_hlink() {
- if (nb_node >= max_node) {
- max_node *= 2;
- nodes = (hlink *)brealloc(nodes, sizeof(hlink) * max_node);
+ if (++nb_node >= max_node) {
+ nb_node = 0;
+ nodes = (hlink *)malloc(max_node * sizeof(hlink));
+ table_node->append(nodes);
}
- return nodes + nb_node++;
+ return nodes + nb_node;
}
bool lookup(char *pathid) {
~pathid_cache() {
cache_ppathid->destroy();
free(cache_ppathid);
- free(nodes);
+ delete table_node;
}
+private:
+ pathid_cache(const pathid_cache &); /* prohibit pass by value */
+ pathid_cache &operator= (const pathid_cache &);/* prohibit class assignment*/
} ;
/* Return the parent_dir with the trailing / (update the given string)
/* Does the ppathid exist for this ? we use a memory cache... In order to
* avoid the full loop, we consider that if a dir is allready in the
- * brestore_pathhierarchy table, then there is no need to calculate all the
+ * PathHierarchy table, then there is no need to calculate all the
* hierarchy
*/
while (path && *path)
if (!ppathid_cache.lookup(pathid))
{
Mmsg(mdb->cmd,
- "SELECT PPathId FROM brestore_pathhierarchy WHERE PathId = %s",
+ "SELECT PPathId FROM PathHierarchy WHERE PathId = %s",
pathid);
QUERY_DB(jcr, mdb, mdb->cmd);
ppathid_cache.insert(pathid);
Mmsg(mdb->cmd,
- "INSERT INTO brestore_pathhierarchy (PathId, PPathId) "
+ "INSERT INTO PathHierarchy (PathId, PPathId) "
"VALUES (%s,%lld)",
pathid, (uint64_t) parent.PathId);
path = mdb->path; /* already done */
}
} else {
- /* It's allready in the cache. We can leave, no time to waste here,
+ /* It's already in the cache. We can leave, no time to waste here,
* all the parent dirs have allready been done
*/
goto bail_out;
db_lock(mdb);
db_start_transaction(jcr, mdb);
- Mmsg(mdb->cmd, "SELECT 1 FROM brestore_knownjobid WHERE JobId = %s", jobid);
+ Mmsg(mdb->cmd, "SELECT 1 FROM Job WHERE JobId = %s AND HasCache=1", jobid);
if (!QUERY_DB(jcr, mdb, mdb->cmd) || sql_num_rows(mdb) > 0) {
Dmsg1(dbglevel, "already computed %d\n", (uint32_t)JobId );
}
/* Inserting path records for JobId */
- Mmsg(mdb->cmd, "INSERT INTO brestore_pathvisibility (PathId, JobId) "
+ Mmsg(mdb->cmd, "INSERT INTO PathVisibility (PathId, JobId) "
"SELECT DISTINCT PathId, JobId FROM File WHERE JobId = %s",
jobid);
QUERY_DB(jcr, mdb, mdb->cmd);
* only work on not allready hierarchised directories...
*/
Mmsg(mdb->cmd,
- "SELECT brestore_pathvisibility.PathId, Path "
- "FROM brestore_pathvisibility "
- "JOIN Path ON( brestore_pathvisibility.PathId = Path.PathId) "
- "LEFT JOIN brestore_pathhierarchy "
- "ON (brestore_pathvisibility.PathId = brestore_pathhierarchy.PathId) "
- "WHERE brestore_pathvisibility.JobId = %s "
- "AND brestore_pathhierarchy.PathId IS NULL "
+ "SELECT PathVisibility.PathId, Path "
+ "FROM PathVisibility "
+ "JOIN Path ON( PathVisibility.PathId = Path.PathId) "
+ "LEFT JOIN PathHierarchy "
+ "ON (PathVisibility.PathId = PathHierarchy.PathId) "
+ "WHERE PathVisibility.JobId = %s "
+ "AND PathHierarchy.PathId IS NULL "
"ORDER BY Path", jobid);
Dmsg1(dbglevel_sql, "q=%s\n", mdb->cmd);
QUERY_DB(jcr, mdb, mdb->cmd);
}
Mmsg(mdb->cmd,
- "INSERT INTO brestore_pathvisibility (PathId, JobId) "
+ "INSERT INTO PathVisibility (PathId, JobId) "
"SELECT a.PathId,%s "
"FROM ( "
"SELECT DISTINCT h.PPathId AS PathId "
- "FROM brestore_pathhierarchy AS h "
- "JOIN brestore_pathvisibility AS p ON (h.PathId=p.PathId) "
+ "FROM PathHierarchy AS h "
+ "JOIN PathVisibility AS p ON (h.PathId=p.PathId) "
"WHERE p.JobId=%s) AS a LEFT JOIN "
"(SELECT PathId "
- "FROM brestore_pathvisibility "
+ "FROM PathVisibility "
"WHERE JobId=%s) AS b ON (a.PathId = b.PathId) "
"WHERE b.PathId IS NULL", jobid, jobid, jobid);
QUERY_DB(jcr, mdb, mdb->cmd);
} while (sql_affected_rows(mdb) > 0);
- Mmsg(mdb->cmd, "INSERT INTO brestore_knownjobid (JobId) VALUES (%s)", jobid);
- INSERT_DB(jcr, mdb, mdb->cmd);
+ Mmsg(mdb->cmd, "UPDATE Job SET HasCache=1 WHERE JobId=%s", jobid);
+ UPDATE_DB(jcr, mdb, mdb->cmd);
bail_out:
db_end_transaction(jcr, mdb);
void bvfs_update_cache(JCR *jcr, B_DB *mdb)
{
uint32_t nb=0;
+ db_list_ctx jobids_list;
+
db_lock(mdb);
db_start_transaction(jcr, mdb);
- Mmsg(mdb->cmd, "SELECT 1 from brestore_knownjobid LIMIT 1");
- /* TODO: Add this code in the make_bacula_table script */
+#ifdef xxx
+ /* TODO: Remove this code when updating make_bacula_table script */
+ Mmsg(mdb->cmd, "SELECT 1 FROM Job WHERE HasCache<>2 LIMIT 1");
if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
Dmsg0(dbglevel, "Creating cache table\n");
- Mmsg(mdb->cmd,
- "CREATE TABLE brestore_knownjobid ("
- "JobId integer NOT NULL, "
- "CONSTRAINT brestore_knownjobid_pkey PRIMARY KEY (JobId))");
+ Mmsg(mdb->cmd, "ALTER TABLE Job ADD HasCache int DEFAULT 0");
QUERY_DB(jcr, mdb, mdb->cmd);
Mmsg(mdb->cmd,
- "CREATE TABLE brestore_pathhierarchy ( "
+ "CREATE TABLE PathHierarchy ( "
"PathId integer NOT NULL, "
"PPathId integer NOT NULL, "
- "CONSTRAINT brestore_pathhierarchy_pkey "
+ "CONSTRAINT pathhierarchy_pkey "
"PRIMARY KEY (PathId))");
QUERY_DB(jcr, mdb, mdb->cmd);
Mmsg(mdb->cmd,
- "CREATE INDEX brestore_pathhierarchy_ppathid "
- "ON brestore_pathhierarchy (PPathId)");
+ "CREATE INDEX pathhierarchy_ppathid "
+ "ON PathHierarchy (PPathId)");
QUERY_DB(jcr, mdb, mdb->cmd);
Mmsg(mdb->cmd,
- "CREATE TABLE brestore_pathvisibility ("
+ "CREATE TABLE PathVisibility ("
"PathId integer NOT NULL, "
"JobId integer NOT NULL, "
"Size int8 DEFAULT 0, "
"Files int4 DEFAULT 0, "
- "CONSTRAINT brestore_pathvisibility_pkey "
+ "CONSTRAINT pathvisibility_pkey "
"PRIMARY KEY (JobId, PathId))");
QUERY_DB(jcr, mdb, mdb->cmd);
Mmsg(mdb->cmd,
- "CREATE INDEX brestore_pathvisibility_jobid "
- "ON brestore_pathvisibility (JobId)");
+ "CREATE INDEX pathvisibility_jobid "
+ "ON PathVisibility (JobId)");
QUERY_DB(jcr, mdb, mdb->cmd);
}
-
- POOLMEM *jobids = get_pool_memory(PM_NAME);
- *jobids = 0;
+#endif
Mmsg(mdb->cmd,
"SELECT JobId from Job "
- "WHERE JobId NOT IN (SELECT JobId FROM brestore_knownjobid) "
+ "WHERE HasCache = 0 "
"AND Type IN ('B') AND JobStatus IN ('T', 'f', 'A') "
"ORDER BY JobId");
- db_sql_query(mdb, mdb->cmd, db_get_int_handler, jobids);
+ db_sql_query(mdb, mdb->cmd, db_list_handler, &jobids_list);
- bvfs_update_path_hierarchy_cache(jcr, mdb, jobids);
+ bvfs_update_path_hierarchy_cache(jcr, mdb, jobids_list.list);
db_end_transaction(jcr, mdb);
db_start_transaction(jcr, mdb);
Dmsg0(dbglevel, "Cleaning pathvisibility\n");
Mmsg(mdb->cmd,
- "DELETE FROM brestore_pathvisibility "
- "WHERE NOT EXISTS "
- "(SELECT 1 FROM Job WHERE JobId=brestore_pathvisibility.JobId)");
- nb = DELETE_DB(jcr, mdb, mdb->cmd);
- Dmsg1(dbglevel, "Affected row(s) = %d\n", nb);
-
- Dmsg0(dbglevel, "Cleaning knownjobid\n");
- Mmsg(mdb->cmd,
- "DELETE FROM brestore_knownjobid "
+ "DELETE FROM PathVisibility "
"WHERE NOT EXISTS "
- "(SELECT 1 FROM Job WHERE JobId=brestore_knownjobid.JobId)");
+ "(SELECT 1 FROM Job WHERE JobId=PathVisibility.JobId)");
nb = DELETE_DB(jcr, mdb, mdb->cmd);
Dmsg1(dbglevel, "Affected row(s) = %d\n", nb);
db_end_transaction(jcr, mdb);
- free_pool_memory(jobids);
+ db_unlock(mdb);
}
/*
if (stat == 0) {
break;
}
- Dmsg1(dbglevel, "Updating cache for %lld\n", (uint64_t) JobId);
+ Dmsg1(dbglevel, "Updating cache for %lld\n", (uint64_t)JobId);
update_path_hierarchy_cache(jcr, mdb, ppathid_cache, JobId);
}
}
POOL_MEM query;
- Mmsg(query,//0 1 2 3
-"SELECT File.FileId, File.Md5, File.JobId, File.LStat, "
-// 4 5
+ Mmsg(query,// 1 2 3 4
+"SELECT 'V', File.FileId, File.Md5, File.JobId, File.LStat, "
+// 5 6
"Media.VolumeName, Media.InChanger "
"FROM File, Job, Client, JobMedia, Media "
"WHERE File.FilenameId = %s "
int Bvfs::_handle_path(void *ctx, int fields, char **row)
{
- if (fields == BVFS_DIR_RECORD) {
+ if (bvfs_is_dir(row)) {
/* can have the same path 2 times */
if (strcmp(row[BVFS_Name], prev_dir)) {
pm_strcpy(prev_dir, row[BVFS_Name]);
{
Dmsg1(dbglevel, "ls_special_dirs(%lld)\n", (uint64_t)pwd_id);
char ed1[50], ed2[50];
- if (!*jobids) {
+ if (*jobids == 0) {
return;
}
if (!dir_filenameid) {
POOL_MEM query;
Mmsg(query,
"((SELECT PPathId AS PathId, '..' AS Path "
- "FROM brestore_pathhierarchy "
+ "FROM PathHierarchy "
"WHERE PathId = %s) "
"UNION "
"(SELECT %s AS PathId, '.' AS Path))",
edit_uint64(pwd_id, ed1), ed1);
POOL_MEM query2;
- Mmsg(query2,
-"SELECT tmp.PathId, tmp.Path, JobId, LStat "
+ Mmsg(query2,// 1 2 3 4 5 6
+"SELECT 'D', tmp.PathId, 0, tmp.Path, JobId, LStat, FileId "
"FROM %s AS tmp LEFT JOIN ( " // get attributes if any
"SELECT File1.PathId AS PathId, File1.JobId AS JobId, "
- "File1.LStat AS LStat FROM File AS File1 "
+ "File1.LStat AS LStat, File1.FileId AS FileId FROM File AS File1 "
"WHERE File1.FilenameId = %s "
"AND File1.JobId IN (%s)) AS listfile1 "
"ON (tmp.PathId = listfile1.PathId) "
{
Dmsg1(dbglevel, "ls_dirs(%lld)\n", (uint64_t)pwd_id);
char ed1[50], ed2[50];
- if (!*jobids) {
+ if (*jobids == 0) {
return false;
}
/* Then we get all the dir entries from File ... */
POOL_MEM query;
Mmsg(query,
-// 0 1 2 3
-"SELECT PathId, Path, JobId, LStat FROM ( "
+// 0 1 2 3 4 5 6
+"SELECT 'D', PathId, 0, Path, JobId, LStat, FileId FROM ( "
"SELECT Path1.PathId AS PathId, Path1.Path AS Path, "
"lower(Path1.Path) AS lpath, "
- "listfile1.JobId AS JobId, listfile1.LStat AS LStat "
+ "listfile1.JobId AS JobId, listfile1.LStat AS LStat, "
+ "listfile1.FileId AS FileId "
"FROM ( "
- "SELECT DISTINCT brestore_pathhierarchy1.PathId AS PathId "
- "FROM brestore_pathhierarchy AS brestore_pathhierarchy1 "
+ "SELECT DISTINCT PathHierarchy1.PathId AS PathId "
+ "FROM PathHierarchy AS PathHierarchy1 "
"JOIN Path AS Path2 "
- "ON (brestore_pathhierarchy1.PathId = Path2.PathId) "
- "JOIN brestore_pathvisibility AS brestore_pathvisibility1 "
- "ON (brestore_pathhierarchy1.PathId = brestore_pathvisibility1.PathId) "
- "WHERE brestore_pathhierarchy1.PPathId = %s "
- "AND brestore_pathvisibility1.jobid IN (%s) "
+ "ON (PathHierarchy1.PathId = Path2.PathId) "
+ "JOIN PathVisibility AS PathVisibility1 "
+ "ON (PathHierarchy1.PathId = PathVisibility1.PathId) "
+ "WHERE PathHierarchy1.PPathId = %s "
+ "AND PathVisibility1.jobid IN (%s) "
"%s "
") AS listpath1 "
"JOIN Path AS Path1 ON (listpath1.PathId = Path1.PathId) "
"LEFT JOIN ( " /* get attributes if any */
"SELECT File1.PathId AS PathId, File1.JobId AS JobId, "
- "File1.LStat AS LStat FROM File AS File1 "
+ "File1.LStat AS LStat, File1.FileId AS FileId FROM File AS File1 "
"WHERE File1.FilenameId = %s "
"AND File1.JobId IN (%s)) AS listfile1 "
"ON (listpath1.PathId = listfile1.PathId) "
{
Dmsg1(dbglevel, "ls_files(%lld)\n", (uint64_t)pwd_id);
char ed1[50];
- if (!*jobids) {
+ if (*jobids == 0) {
return false;
}
if (*pattern) {
Mmsg(filter, " AND Filename.Name %s '%s' ", SQL_MATCH, pattern);
}
-
+ /* TODO: Use JobTDate instead of FileId to determine the latest version */
POOL_MEM query;
- Mmsg(query, // 0 1 2 3 4
-"SELECT File.FilenameId, listfiles.Name, File.JobId, File.LStat, listfiles.id "
+ Mmsg(query, // 1 2 3 4
+"SELECT 'F', File.PathId, File.FilenameId, listfiles.Name, File.JobId, "
+ "File.LStat, listfiles.id "
"FROM File, ( "
"SELECT Filename.Name as Name, max(File.FileId) as id "
"FROM File, Filename "