mas01cr@239
|
1 #include "audioDB.h"
|
mas01cr@239
|
2
|
mas01cr@239
|
3 /* Make a new database.
|
mas01cr@239
|
4
|
mas01cr@239
|
5 The database consists of:
|
mas01cr@239
|
6
|
mas01cr@239
|
7 * a header (see dbTableHeader struct definition);
|
mas01cr@239
|
8 * keyTable: list of keys of tracks;
|
mas01cr@239
|
9 * trackTable: Maps implicit feature index to a feature vector
|
mas01cr@239
|
10 matrix (sizes of tracks)
|
mas01cr@239
|
11 * featureTable: Lots of doubles;
|
mas01cr@239
|
12 * timesTable: (start,end) time points for each feature vector;
|
mas01cr@239
|
13 * powerTable: associated power for each feature vector;
|
mas01cr@239
|
14 * l2normTable: squared l2norms for each feature vector.
|
mas01cr@239
|
15 */
|
mas01cr@239
|
16
|
mas01cr@239
|
17 void audioDB::create(const char* dbName){
|
mas01cr@239
|
18 if ((dbfid = open (dbName, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0)
|
mas01cr@239
|
19 error("Can't create database file", dbName, "open");
|
mas01cr@239
|
20 get_lock(dbfid, 1);
|
mas01cr@239
|
21
|
mas01cr@239
|
22 VERB_LOG(0, "header size: %ju\n", (intmax_t) O2_HEADERSIZE);
|
mas01cr@239
|
23
|
mas01cr@239
|
24 dbH = new dbTableHeaderT();
|
mas01cr@239
|
25 assert(dbH);
|
mas01cr@239
|
26
|
mas01cr@256
|
27 //unsigned int maxfiles = (unsigned int) rint((double) O2_MAXFILES * (double) size / (double) O2_DEFAULTDBSIZE);
|
mas01cr@239
|
28
|
mas01cr@239
|
29 // Initialize header
|
mas01cr@239
|
30 dbH->magic = O2_MAGIC;
|
mas01cr@239
|
31 dbH->version = O2_FORMAT_VERSION;
|
mas01cr@239
|
32 dbH->numFiles = 0;
|
mas01cr@239
|
33 dbH->dim = 0;
|
mas01cr@239
|
34 dbH->flags = 0;
|
mas01cr@239
|
35 dbH->headerSize = O2_HEADERSIZE;
|
mas01cr@239
|
36 dbH->length = 0;
|
mas01cr@239
|
37 dbH->fileTableOffset = ALIGN_PAGE_UP(O2_HEADERSIZE);
|
mas01cr@256
|
38 dbH->trackTableOffset = ALIGN_PAGE_UP(dbH->fileTableOffset + O2_FILETABLE_ENTRY_SIZE*ntracks);
|
mas01cr@256
|
39 dbH->dataOffset = ALIGN_PAGE_UP(dbH->trackTableOffset + O2_TRACKTABLE_ENTRY_SIZE*ntracks);
|
mas01cr@256
|
40
|
mas01cr@256
|
41 off_t databytes = ((off_t) datasize) * 1024 * 1024;
|
mas01cr@256
|
42 off_t auxbytes = databytes / datadim;
|
mas01cr@256
|
43
|
mas01cr@256
|
44 dbH->timesTableOffset = ALIGN_PAGE_UP(dbH->dataOffset + databytes);
|
mas01cr@256
|
45 dbH->powerTableOffset = ALIGN_PAGE_UP(dbH->timesTableOffset + 2*auxbytes);
|
mas01cr@256
|
46 dbH->l2normTableOffset = ALIGN_PAGE_UP(dbH->powerTableOffset + auxbytes);
|
mas01cr@256
|
47 dbH->dbSize = ALIGN_PAGE_UP(dbH->l2normTableOffset + auxbytes);
|
mas01cr@239
|
48
|
mas01cr@239
|
49 write(dbfid, dbH, O2_HEADERSIZE);
|
mas01cr@239
|
50
|
mas01cr@239
|
51 // go to the location corresponding to the last byte
|
mas01cr@256
|
52 if (lseek (dbfid, dbH->dbSize - 1, SEEK_SET) == -1)
|
mas01cr@239
|
53 error("lseek error in db file", "", "lseek");
|
mas01cr@239
|
54
|
mas01cr@239
|
55 // write a dummy byte at the last location
|
mas01cr@239
|
56 if (write (dbfid, "", 1) != 1)
|
mas01cr@239
|
57 error("write error", "", "write");
|
mas01cr@239
|
58
|
mas01cr@239
|
59 VERB_LOG(0, "%s %s\n", COM_CREATE, dbName);
|
mas01cr@239
|
60 }
|
mas01cr@239
|
61
|
mas01cr@239
|
62 void audioDB::drop(){
|
mas01cr@239
|
63 // FIXME: drop something? Should we even allow this?
|
mas01cr@239
|
64 }
|
mas01cr@239
|
65
|