]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/record.h
restore + SQL editing cleanups
[bacula/bacula] / bacula / src / stored / record.h
1 /*
2  * Record, and label definitions for Bacula
3  *  media data format.
4  *
5  *   Version $Id$
6  *
7  */
8 /*
9    Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
10
11    This program is free software; you can redistribute it and/or
12    modify it under the terms of the GNU General Public License as
13    published by the Free Software Foundation; either version 2 of
14    the License, or (at your option) any later version.
15
16    This program is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19    General Public License for more details.
20
21    You should have received a copy of the GNU General Public
22    License along with this program; if not, write to the Free
23    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
24    MA 02111-1307, USA.
25
26  */
27
28
29 #ifndef __RECORD_H
30 #define __RECORD_H 1
31
32 /* Return codes from read_device_volume_label() */
33 #define VOL_NOT_READ      0               /* Volume label not read */
34 #define VOL_OK            1               /* volume name OK */
35 #define VOL_NO_LABEL      2               /* volume not labeled */
36 #define VOL_IO_ERROR      3               /* volume I/O error */
37 #define VOL_NAME_ERROR    4               /* Volume name mismatch */
38 #define VOL_CREATE_ERROR  5               /* Error creating label */
39 #define VOL_VERSION_ERROR 6               /* Bacula version error */
40 #define VOL_LABEL_ERROR   7               /* Bad label type */
41
42
43 /*  See block.h for RECHDR_LENGTH */
44
45 /*
46  * This is the Media structure for a record header.
47  *  NB: when it is written it is serialized.
48
49    uint32_t VolSessionId;
50    uint32_t VolSessionTime;
51
52  * The above 8 bytes are only written in a BB01 block, BB02
53  *  and later blocks contain these values in the block header
54  *  rather than the record header.
55
56    int32_t  FileIndex;
57    int32_t  Stream;
58    uint32_t data_len;
59
60  */
61
62 /* Record state bit definitions */
63 #define REC_NO_HEADER        0x01     /* No header read */
64 #define REC_PARTIAL_RECORD   0x02     /* returning partial record */
65 #define REC_BLOCK_EMPTY      0x04     /* not enough data in block */
66 #define REC_NO_MATCH         0x08     /* No match on continuation data */
67 #define REC_CONTINUATION     0x10     /* Continuation record found */
68 #define REC_ISTAPE           0x20     /* Set if device is tape */
69
70 #define is_partial_record(r) ((r)->state & REC_PARTIAL_RECORD)
71 #define is_block_empty(r)    ((r)->state & REC_BLOCK_EMPTY)
72
73 /*
74  * DEV_RECORD for reading and writing records.
75  * It consists of a Record Header, and the Record Data
76  * 
77  *  This is the memory structure for the record header.
78  */
79 typedef struct s_dev_rec {
80    int      sync;                     /* synchronous */
81    /* File and Block are always returned on reading records, but
82     *  only returned on writing if sync is set (obviously).
83     */
84    uint32_t File;                     /* File number */
85    uint32_t Block;                    /* Block number */
86    uint32_t VolSessionId;             /* sequential id within this session */
87    uint32_t VolSessionTime;           /* session start time */
88    int32_t  FileIndex;                /* sequential file number */
89    int32_t  Stream;                   /* stream number */
90    uint32_t data_len;                 /* current record length */
91    uint32_t remainder;                /* remaining bytes to read/write */
92    uint32_t state;                    /* state bits */
93    uint8_t  ser_buf[WRITE_RECHDR_LENGTH];   /* serialized record header goes here */
94    POOLMEM *data;                     /* Record data. This MUST be a memory pool item */
95 } DEV_RECORD;
96
97
98 /*
99  * Values for LabelType that are put into the FileIndex field
100  * Note, these values are negative to distinguish them
101  * from user records where the FileIndex is forced positive.
102  */
103 #define PRE_LABEL   -1                /* Vol label on unwritten tape */
104 #define VOL_LABEL   -2                /* Volume label first file */
105 #define EOM_LABEL   -3                /* Writen at end of tape */        
106 #define SOS_LABEL   -4                /* Start of Session */
107 #define EOS_LABEL   -5                /* End of Session */
108 #define EOT_LABEL   -6                /* End of physical tape (2 eofs) */
109
110 /* 
111  *   Volume Label Record.  This is the in-memory definition. The
112  *     tape definition is defined in the serialization code itself
113  *     ser_volume_label() and unser_volume_label() and is slightly different.
114  */
115
116  
117 struct Volume_Label {
118   /*  
119    * The first items in this structure are saved
120    * in the DEVICE buffer, but are not actually written
121    * to the tape.
122    */
123   int32_t LabelType;                  /* This is written in header only */
124   uint32_t LabelSize;                 /* length of serialized label */
125   /*
126    * The items below this line are stored on 
127    * the tape
128    */
129   char Id[32];                        /* Bacula Immortal ... */
130
131   uint32_t VerNum;                    /* Label version number */
132
133   /* VerNum <= 10 */
134   float64_t label_date;               /* Date tape labeled */
135   float64_t label_time;               /* Time tape labeled */
136
137   /* VerNum >= 11 */
138   btime_t   label_btime;              /* tdate tape labeled */
139   btime_t   write_btime;              /* tdate tape written */
140
141   /* Unused with VerNum >= 11 */
142   float64_t write_date;               /* Date this label written */
143   float64_t write_time;               /* Time this label written */
144
145   char VolName[MAX_NAME_LENGTH];      /* Volume name */
146   char PrevVolName[MAX_NAME_LENGTH];  /* Previous Volume Name */
147   char PoolName[MAX_NAME_LENGTH];     /* Pool name */
148   char PoolType[MAX_NAME_LENGTH];     /* Pool type */
149   char MediaType[MAX_NAME_LENGTH];    /* Type of this media */
150
151   char HostName[MAX_NAME_LENGTH];     /* Host name of writing computer */
152   char LabelProg[50];                 /* Label program name */
153   char ProgVersion[50];               /* Program version */
154   char ProgDate[50];                  /* Program build date/time */
155 };
156
157 #define SER_LENGTH_Volume_Label 1024   /* max serialised length of volume label */
158 #define SER_LENGTH_Session_Label 1024  /* max serialised length of session label */
159
160 typedef struct Volume_Label VOLUME_LABEL;
161
162 /*
163  * Session Start/End Label
164  *  This record is at the beginning and end of each session
165  */
166 struct Session_Label {
167   char Id[32];                        /* Bacula Immortal ... */
168
169   uint32_t VerNum;                    /* Label version number */
170
171   uint32_t JobId;                     /* Job id */
172   uint32_t VolumeIndex;               /* Sequence no of volume for this job */
173
174   /* VerNum >= 11 */
175   btime_t   write_btime;              /* Tdate this label written */
176
177   /* VerNum < 11 */
178   float64_t write_date;               /* Date this label written */
179
180   /* Unused VerNum >= 11 */
181   float64_t write_time;               /* Time this label written */
182
183   char PoolName[MAX_NAME_LENGTH];     /* Pool name */
184   char PoolType[MAX_NAME_LENGTH];     /* Pool type */
185   char JobName[MAX_NAME_LENGTH];      /* base Job name */
186   char ClientName[MAX_NAME_LENGTH];
187   char Job[MAX_NAME_LENGTH];          /* Unique name of this Job */
188   char FileSetName[MAX_NAME_LENGTH];
189   char FileSetMD5[MAX_NAME_LENGTH];
190   uint32_t JobType;
191   uint32_t JobLevel;
192   /* The remainder are part of EOS label only */
193   uint32_t JobFiles;
194   uint64_t JobBytes;
195   uint32_t StartBlock;
196   uint32_t EndBlock;
197   uint32_t StartFile;
198   uint32_t EndFile;
199   uint32_t JobErrors;
200   uint32_t JobStatus;                 /* Job status */
201
202 };
203 typedef struct Session_Label SESSION_LABEL;
204
205 #define SERIAL_BUFSIZE  1024          /* volume serialisation buffer size */
206
207 #endif