2 * Bacula Catalog Database Create record routines
4 * Bacula Catalog Database routines written specifically
5 * for Bacula. Note, these routines are VERY dumb and
6 * do not provide all the functionality of an SQL database.
7 * The purpose of these routines is to ensure that Bacula
8 * can limp along if no real database is loaded on the
11 * Kern Sibbald, January MMI
17 Copyright (C) 2001-2006 Kern Sibbald
19 This program is free software; you can redistribute it and/or
20 modify it under the terms of the GNU General Public License
21 version 2 as amended with additional clauses defined in the
22 file LICENSE in the main source directory.
24 This program is distributed in the hope that it will be useful,
25 but WITHOUT ANY WARRANTY; without even the implied warranty of
26 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 the file LICENSE for additional details.
32 /* The following is necessary so that we do not include
33 * the dummy external definition of DB.
35 #define __SQL_C /* indicate that this is sql.c */
43 /* Forward referenced functions */
44 bool db_create_pool_record(B_DB *mdb, POOL_DBR *pr);
46 /* -----------------------------------------------------------------------
48 * Bacula specific defines and subroutines
50 * -----------------------------------------------------------------------
53 int db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
55 /* *****FIXME***** implement this */
59 int db_create_file_item(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
61 /****FIXME***** not implemented */
67 * Create a new record for the Job
68 * This record is created at the start of the Job,
69 * it is updated in bdb_update.c when the Job terminates.
71 * Returns: 0 on failure
74 int db_create_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
79 if (!bdb_open_jobs_file(mdb)) {
84 bdb_write_control_file(mdb);
86 len = sizeof(JOB_DBR);
87 jr->JobId = mdb->control.JobId;
88 fseek(mdb->jobfd, 0L, SEEK_END);
89 if (fwrite(jr, len, 1, mdb->jobfd) != 1) {
90 Mmsg1(&mdb->errmsg, "Error writing DB Jobs file. ERR=%s\n", strerror(errno));
99 /* Create a JobMedia record for Volume used this job
100 * Returns: 0 on failure
101 * record-id on success
103 bool db_create_jobmedia_record(JCR *jcr, B_DB *mdb, JOBMEDIA_DBR *jm)
108 if (!bdb_open_jobmedia_file(mdb)) {
112 mdb->control.JobMediaId++;
113 jm->JobMediaId = mdb->control.JobMediaId;
114 bdb_write_control_file(mdb);
116 len = sizeof(JOBMEDIA_DBR);
118 fseek(mdb->jobmediafd, 0L, SEEK_END);
119 if (fwrite(jm, len, 1, mdb->jobmediafd) != 1) {
120 Mmsg1(&mdb->errmsg, "Error writing DB JobMedia file. ERR=%s\n", strerror(errno));
124 fflush(mdb->jobmediafd);
126 return jm->JobMediaId;
131 * Create a unique Pool record
132 * Returns: 0 on failure
135 bool db_create_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr)
140 memset(&mpr, 0, sizeof(mpr));
141 strcpy(mpr.Name, pr->Name);
142 if (db_get_pool_record(jcr, mdb, &mpr)) {
143 Mmsg1(&mdb->errmsg, "Pool record %s already exists\n", mpr.Name);
148 if (!bdb_open_pools_file(mdb)) {
153 mdb->control.PoolId++;
154 pr->PoolId = mdb->control.PoolId;
155 bdb_write_control_file(mdb);
158 fseek(mdb->poolfd, 0L, SEEK_END);
159 if (fwrite(pr, len, 1, mdb->poolfd) != 1) {
160 Mmsg1(&mdb->errmsg, "Error writing DB Pools file. ERR=%s\n", strerror(errno));
169 bool db_create_device_record(JCR *jcr, B_DB *mdb, DEVICE_DBR *dr)
172 bool db_create_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *dr)
175 bool db_create_mediatype_record(JCR *jcr, B_DB *mdb, MEDIATYPE_DBR *dr)
180 * Create Unique Media record. This record
181 * contains all the data pertaining to a specific
184 * Returns: 0 on failure
187 int db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
193 memset(&mmr, 0, sizeof(mmr));
194 strcpy(mmr.VolumeName, mr->VolumeName);
195 if (db_get_media_record(jcr, mdb, &mmr)) {
196 Mmsg1(&mdb->errmsg, "Media record %s already exists\n", mmr.VolumeName);
202 mdb->control.MediaId++;
203 mr->MediaId = mdb->control.MediaId;
204 bdb_write_control_file(mdb);
207 fseek(mdb->mediafd, 0L, SEEK_END);
208 if (fwrite(mr, len, 1, mdb->mediafd) != 1) {
209 Mmsg1(&mdb->errmsg, "Error writing DB Media file. ERR=%s\n", strerror(errno));
213 fflush(mdb->mediafd);
220 * Create a unique Client record or return existing record
221 * Returns: 0 on failure
224 int db_create_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr)
231 if (db_get_client_record(jcr, mdb, cr)) {
232 Mmsg1(&mdb->errmsg, "Client record %s already exists\n", cr->Name);
237 if (!bdb_open_client_file(mdb)) {
242 mdb->control.ClientId++;
243 cr->ClientId = mdb->control.ClientId;
244 bdb_write_control_file(mdb);
246 fseek(mdb->clientfd, 0L, SEEK_END);
248 if (fwrite(cr, len, 1, mdb->clientfd) != 1) {
249 Mmsg1(&mdb->errmsg, "Error writing DB Client file. ERR=%s\n", strerror(errno));
253 fflush(mdb->clientfd);
259 * Create a unique FileSet record or return existing record
261 * Note, here we write the FILESET_DBR structure
263 * Returns: 0 on failure
266 bool db_create_fileset_record(JCR *jcr, B_DB *mdb, FILESET_DBR *fsr)
273 if (db_get_fileset_record(jcr, mdb, fsr)) {
274 Mmsg1(&mdb->errmsg, "FileSet record %s already exists\n", fsr->FileSet);
279 if (!bdb_open_fileset_file(mdb)) {
284 mdb->control.FileSetId++;
285 fsr->FileSetId = mdb->control.FileSetId;
286 bdb_write_control_file(mdb);
288 fseek(mdb->clientfd, 0L, SEEK_END);
290 if (fwrite(fsr, len, 1, mdb->filesetfd) != 1) {
291 Mmsg1(&mdb->errmsg, "Error writing DB FileSet file. ERR=%s\n", strerror(errno));
295 fflush(mdb->filesetfd);
300 int db_create_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr)
304 #endif /* HAVE_BACULA_DB */