本文整理匯總了Golang中code/google/com/p/leveldb-go/leveldb/db.Options.GetErrorIfDBExists方法的典型用法代碼示例。如果您正苦於以下問題:Golang Options.GetErrorIfDBExists方法的具體用法?Golang Options.GetErrorIfDBExists怎麽用?Golang Options.GetErrorIfDBExists使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類code/google/com/p/leveldb-go/leveldb/db.Options
的用法示例。
在下文中一共展示了Options.GetErrorIfDBExists方法的1個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: Open
// Open opens a LevelDB whose files live in the given directory.
func Open(dirname string, opts *db.Options) (*DB, error) {
d := &DB{
dirname: dirname,
opts: opts,
icmp: internalKeyComparer{opts.GetComparer()},
pendingOutputs: make(map[uint64]struct{}),
}
if opts != nil {
d.icmpOpts = *opts
}
d.icmpOpts.Comparer = d.icmp
tableCacheSize := opts.GetMaxOpenFiles() - numNonTableCacheFiles
if tableCacheSize < minTableCacheSize {
tableCacheSize = minTableCacheSize
}
// tableCache初始化
d.tableCache.init(dirname, opts.GetFileSystem(), &d.icmpOpts, tableCacheSize)
// 初始化一個MemDB
d.mem = memdb.New(&d.icmpOpts)
// sync.Cond在Locker的基礎上增加的一個消息通知的功能。
// Cond有三個方法:Wait,Signal,Broadcast。
// Wait添加一個計數,也就是添加一個阻塞的goroutine。
// Signal解除一個goroutine的阻塞,計數減一。
// Broadcast接觸所有wait goroutine的阻塞。
d.compactionCond = sync.Cond{L: &d.mu}
fs := opts.GetFileSystem()
d.mu.Lock()
defer d.mu.Unlock()
// Lock the database directory.
// If the directory already exists, MkdirAll does nothing and returns nil.
// 如果目錄已經存在,則MkdirAll啥都不幹
err := fs.MkdirAll(dirname, 0755)
if err != nil {
return nil, err
}
// 創建LOCK文件,並加文件鎖
fileLock, err := fs.Lock(dbFilename(dirname, fileTypeLock, 0))
if err != nil {
return nil, err
}
defer func() {
if fileLock != nil {
fileLock.Close()
}
}()
// 若CURRENT文件不存在,則調用createDB
if _, err := fs.Stat(dbFilename(dirname, fileTypeCurrent, 0)); os.IsNotExist(err) {
// Create the DB if it did not already exist.
if err := createDB(dirname, opts); err != nil {
return nil, err
}
} else if err != nil {
return nil, fmt.Errorf("leveldb: database %q: %v", dirname, err)
} else if opts.GetErrorIfDBExists() {
return nil, fmt.Errorf("leveldb: database %q already exists", dirname)
}
// Load the version set.
// 先讀取CURRENT文件內容,獲取manifest文件名,然後逐條記錄讀取manifest文件的內容,根據內容生成一個新version,放入d.versions中
err = d.versions.load(dirname, opts)
if err != nil {
return nil, err
}
// Replay any newer log files than the ones named in the manifest.
var ve versionEdit
ls, err := fs.List(dirname)
if err != nil {
return nil, err
}
var logFiles fileNumAndNameSlice
for _, filename := range ls {
ft, fn, ok := parseDBFilename(filename)
if ok && ft == fileTypeLog && (fn >= d.versions.logNumber || fn == d.versions.prevLogNumber) {
logFiles = append(logFiles, fileNumAndName{fn, filename})
}
}
sort.Sort(logFiles)
for _, lf := range logFiles {
// 根據日誌文件重做日誌中記錄的操作,先將這些操作記錄存入一個臨時的memtable中,然後轉存入磁盤上level0存儲文件中
maxSeqNum, err := d.replayLogFile(&ve, fs, filepath.Join(dirname, lf.name))
if err != nil {
return nil, err
}
d.versions.markFileNumUsed(lf.num)
// 設置最新的操作序列號
if d.versions.lastSequence < maxSeqNum {
d.versions.lastSequence = maxSeqNum
}
}
// Create an empty .log file.
// 創建一個新的空log文件
ve.logNumber = d.versions.nextFileNum()
d.logNumber = ve.logNumber
//.........這裏部分代碼省略.........