2 Bacula® - The Network Backup Solution
4 Copyright (C) 2009-2009 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version three of the GNU Affero General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU Affero General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
30 * Program to test cache path
32 * Eric Bollengier, August 2009
38 #include "cats/cats.h"
39 #include "cats/sql_glue.h"
40 #include "cats/bvfs.h"
41 #include "findlib/find.h"
45 static const char *file = "COPYRIGHT";
47 static const char *db_name = "regress";
48 static const char *db_user = "regress";
49 static const char *db_password = "";
50 static const char *db_host = NULL;
56 "\nVersion: %s (%s)\n"
57 " -d <nn> set debug level to <nn>\n"
58 " -dt print timestamp in debug output\n"
59 " -n <name> specify the database name (default bacula)\n"
60 " -u <user> specify database user name (default bacula)\n"
61 " -P <password specify database password (default none)\n"
62 " -h <host> specify database host (default NULL)\n"
63 " -w <working> specify working directory\n"
64 " -j <jobids> specify jobids\n"
65 " -p <path> specify path\n"
66 " -f <file> specify file\n"
67 " -l <limit> maximum tuple to fetch\n"
68 " -T truncate cache table before starting\n"
70 " -? print this message\n\n"), 2001, VERSION, BDATE);
74 static int result_handler(void *ctx, int fields, char **row)
76 Bvfs *vfs = (Bvfs *)ctx;
77 ATTR *attr = vfs->get_attr();
78 char empty[] = "A A A A A A A A A A A A A A";
80 memset(&attr->statp, 0, sizeof(struct stat));
81 decode_stat((row[BVFS_LStat] && row[BVFS_LStat][0])?row[BVFS_LStat]:empty,
82 &attr->statp, &attr->LinkFI);
84 if (bvfs_is_dir(row) || bvfs_is_file(row))
86 /* display clean stuffs */
88 if (bvfs_is_dir(row)) {
89 pm_strcpy(attr->ofname, bvfs_basename_dir(row[BVFS_Name]));
91 /* if we see the requested file, note his filenameid */
92 if (bstrcmp(row[BVFS_Name], file)) {
93 fnid = str_to_int64(row[BVFS_FilenameId]);
95 pm_strcpy(attr->ofname, row[BVFS_Name]);
97 print_ls_output(vfs->get_jcr(), attr);
100 Pmsg5(0, "JobId=%s FileId=%s\tMd5=%s\tVolName=%s\tVolInChanger=%s\n",
101 row[BVFS_JobId], row[BVFS_FileId], row[BVFS_Md5], row[BVFS_VolName],
102 row[BVFS_VolInchanger]);
104 pm_strcpy(attr->ofname, file);
105 print_ls_output(vfs->get_jcr(), attr);
111 /* number of thread started */
113 int main (int argc, char *argv[])
116 char *jobids = (char *)"1";
117 char *path=NULL, *client=NULL;
120 setlocale(LC_ALL, "");
121 bindtextdomain("bacula", LOCALEDIR);
122 textdomain("bacula");
125 Dmsg0(0, "Starting bvfs_test tool\n");
127 my_name_is(argc, argv, "bvfs_test");
128 init_msg(NULL, NULL);
132 while ((ch = getopt(argc, argv, "h:c:l:d:n:P:Su:vf:w:?j:p:f:T")) != -1) {
134 case 'd': /* debug level */
135 if (*optarg == 't') {
136 dbg_timestamp = true;
138 debug_level = atoi(optarg);
139 if (debug_level <= 0) {
145 limit = str_to_int64(optarg);
161 working_directory = optarg;
169 db_password = optarg;
202 Pmsg0(0, _("Wrong number of arguments: \n"));
205 JCR *bjcr = new_jcr(sizeof(JCR), NULL);
206 bjcr->JobId = getpid();
207 bjcr->set_JobType(JT_CONSOLE);
208 bjcr->set_JobLevel(L_FULL);
209 bjcr->JobStatus = JS_Running;
210 bjcr->client_name = get_pool_memory(PM_FNAME);
211 pm_strcpy(bjcr->client_name, "Dummy.Client.Name");
212 bstrncpy(bjcr->Job, "bvfs_test", sizeof(bjcr->Job));
214 if ((db = db_init_database(NULL, NULL, db_name, db_user, db_password,
215 db_host, 0, NULL, false, false)) == NULL) {
216 Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n"));
218 Dmsg1(0, "db_type=%s\n", db_get_type(db));
220 if (!db_open_database(NULL, db)) {
221 Emsg0(M_ERROR_TERM, 0, db_strerror(db));
223 Dmsg0(200, "Database opened\n");
225 Pmsg2(000, _("Using Database: %s, User: %s\n"), db_name, db_user);
231 Pmsg0(0, "Clean old table\n");
232 db_sql_query(db, "DELETE FROM PathHierarchy", NULL, NULL);
233 db_sql_query(db, "UPDATE Job SET HasCache=0", NULL, NULL);
234 db_sql_query(db, "DELETE FROM PathVisibility", NULL, NULL);
235 bvfs_update_cache(bjcr, db);
239 fs.set_handler(result_handler, &fs);
241 fs.set_jobids(jobids);
248 fs.ls_special_dirs();
250 while (fs.ls_files()) {
254 if (fnid && client) {
255 Pmsg0(0, "---------------------------------------------\n");
256 Pmsg1(0, "Getting file version for %s\n", file);
257 fs.get_all_file_versions(fs.get_pwd(), fnid, client);
264 Pmsg0(0, "list /\n");
266 fs.ls_special_dirs();
270 Pmsg0(0, "list /tmp/\n");
272 fs.ls_special_dirs();
276 Pmsg0(0, "list /tmp/regress/\n");
277 fs.ch_dir("/tmp/regress/");
278 fs.ls_special_dirs();
282 Pmsg0(0, "list /tmp/regress/build/\n");
283 fs.ch_dir("/tmp/regress/build/");
284 fs.ls_special_dirs();
288 fs.get_all_file_versions(1, 347, "zog4-fd");
291 strcpy(p, "/tmp/toto/rep/");
293 if(strcmp(p, "/tmp/toto/")) {
294 Pmsg0(000, "Error in bvfs_parent_dir\n");
297 if(strcmp(p, "/tmp/")) {
298 Pmsg0(000, "Error in bvfs_parent_dir\n");
302 Pmsg0(000, "Error in bvfs_parent_dir\n");
306 Pmsg0(000, "Error in bvfs_parent_dir\n");
310 Pmsg0(000, "Error in bvfs_parent_dir\n");