func createSQLTables(addr string, options graph.Options) error { conn, err := connectSQLTables(addr, options) if err != nil { return err } defer conn.Close() tx, err := conn.Begin() if err != nil { clog.Errorf("Couldn't begin creation transaction: %s", err) return err } table, err := tx.Exec(nodesTableStatement) if err != nil { tx.Rollback() errd := err.(*pq.Error) if errd.Code == "42P07" { return graph.ErrDatabaseExists } clog.Errorf("Cannot create nodes table: %v", table) return err } table, err = tx.Exec(` CREATE TABLE quads ( horizon BIGSERIAL PRIMARY KEY, subject_hash BYTEA NOT NULL, predicate_hash BYTEA NOT NULL, object_hash BYTEA NOT NULL, label_hash BYTEA, id BIGINT, ts timestamp );`) if err != nil { tx.Rollback() errd := err.(*pq.Error) if errd.Code == "42P07" { return graph.ErrDatabaseExists } clog.Errorf("Cannot create quad table: %v", table) return err } factor, factorOk, err := options.IntKey("db_fill_factor") if !factorOk { factor = defaultFillFactor } spoIndexes := quadsSecondaryIndexes(factor) var index sql.Result index, err = tx.Exec(quadsUniqueIndex + quadsForeignIndex + spoIndexes) if err != nil { clog.Errorf("Cannot create indices: %v", index) tx.Rollback() return err } tx.Commit() return nil }
func createSQLTables(addr string, options graph.Options) error { conn, err := connectSQLTables(addr, options) if err != nil { return err } defer conn.Close() tx, err := conn.Begin() if err != nil { clog.Errorf("Couldn't begin creation transaction: %s", err) return err } quadTable, err := tx.Exec(` CREATE TABLE quads ( subject TEXT NOT NULL, predicate TEXT NOT NULL, object TEXT NOT NULL, label TEXT, horizon BIGSERIAL PRIMARY KEY, id BIGINT, ts timestamp, subject_hash TEXT NOT NULL, predicate_hash TEXT NOT NULL, object_hash TEXT NOT NULL, label_hash TEXT, UNIQUE(subject_hash, predicate_hash, object_hash, label_hash) );`) if err != nil { tx.Rollback() errd := err.(*pq.Error) if errd.Code == "42P07" { return graph.ErrDatabaseExists } clog.Errorf("Cannot create quad table: %v", quadTable) return err } factor, factorOk, err := options.IntKey("db_fill_factor") if !factorOk { factor = 50 } var index sql.Result index, err = tx.Exec(fmt.Sprintf(` CREATE INDEX spo_index ON quads (subject_hash) WITH (FILLFACTOR = %d); CREATE INDEX pos_index ON quads (predicate_hash) WITH (FILLFACTOR = %d); CREATE INDEX osp_index ON quads (object_hash) WITH (FILLFACTOR = %d); `, factor, factor, factor)) if err != nil { clog.Errorf("Cannot create indices: %v", index) tx.Rollback() return err } tx.Commit() return nil }
func newQuadStore(path string, options graph.Options) (graph.QuadStore, error) { var qs QuadStore var err error qs.path = path cacheSize := DefaultCacheSize val, ok, err := options.IntKey("cache_size_mb") if err != nil { return nil, err } else if ok { cacheSize = val } qs.dbOpts = &opt.Options{ BlockCacheCapacity: cacheSize * opt.MiB, } qs.dbOpts.ErrorIfMissing = true writeBufferSize := DefaultWriteBufferSize val, ok, err = options.IntKey("writeBufferSize") if err != nil { return nil, err } else if ok { writeBufferSize = val } qs.dbOpts.WriteBuffer = writeBufferSize * opt.MiB qs.writeopts = &opt.WriteOptions{ Sync: false, } qs.readopts = &opt.ReadOptions{} db, err := leveldb.OpenFile(qs.path, qs.dbOpts) if err != nil { clog.Errorf("Error, could not open! %v", err) return nil, err } qs.db = db if clog.V(1) { clog.Infof("%v", qs.GetStats()) } vers, err := getVersion(qs.db) if err != nil { clog.Errorf("Error, could not read version info! %v", err) db.Close() return nil, err } else if vers != latestDataVersion { db.Close() return nil, fmt.Errorf("leveldb: data version is out of date (%d vs %d). Run cayleyupgrade for your config to update the data.", vers, latestDataVersion) } err = qs.getMetadata() if err != nil { db.Close() return nil, err } return &qs, nil }
func newQuadStore(path string, options graph.Options) (graph.QuadStore, error) { var qs QuadStore var err error qs.path = path cacheSize := DefaultCacheSize val, ok, err := options.IntKey("cache_size_mb") if err != nil { return nil, err } else if ok { cacheSize = val } qs.dbOpts = &opt.Options{ BlockCacheCapacity: cacheSize * opt.MiB, } qs.dbOpts.ErrorIfMissing = true writeBufferSize := DefaultWriteBufferSize val, ok, err = options.IntKey("writeBufferSize") if err != nil { return nil, err } else if ok { writeBufferSize = val } qs.dbOpts.WriteBuffer = writeBufferSize * opt.MiB qs.writeopts = &opt.WriteOptions{ Sync: false, } qs.readopts = &opt.ReadOptions{} db, err := leveldb.OpenFile(qs.path, qs.dbOpts) if err != nil { clog.Errorf("Error, could not open! %v", err) return nil, err } qs.db = db clog.Infof("%v", qs.GetStats()) err = qs.getMetadata() if err != nil { return nil, err } return &qs, nil }