func (do *Domain) getAllSchemasWithTablesFromMeta(m *meta.Meta) ([]*model.DBInfo, error) { schemas, err := m.ListDatabases() if err != nil { return nil, errors.Trace(err) } for _, di := range schemas { if di.State != model.StatePublic { // schema is not public, can't be used outside. continue } tables, err1 := m.ListTables(di.ID) if err1 != nil { err = err1 return nil, errors.Trace(err1) } di.Tables = make([]*model.TableInfo, 0, len(tables)) for _, tbl := range tables { if tbl.State != model.StatePublic { // schema is not public, can't be used outside. continue } di.Tables = append(di.Tables, tbl) } } return schemas, nil }
func (d *ddl) onCreateSchema(t *meta.Meta, job *model.Job) error { schemaID := job.SchemaID var name model.CIStr if err := job.DecodeArgs(&name); err != nil { // arg error, cancel this job. job.State = model.JobCancelled return errors.Trace(err) } dbInfo := &model.DBInfo{ ID: schemaID, Name: name, State: model.StateNone, } dbs, err := t.ListDatabases() if err != nil { return errors.Trace(err) } for _, db := range dbs { if db.Name.L == name.L { if db.ID != schemaID { // database exists, can't create, we should cancel this job now. job.State = model.JobCancelled return errors.Trace(ErrExists) } dbInfo = db } } _, err = t.GenSchemaVersion() if err != nil { return errors.Trace(err) } switch dbInfo.State { case model.StateNone: // none -> public job.SchemaState = model.StatePublic dbInfo.State = model.StatePublic err = t.CreateDatabase(dbInfo) if err != nil { return errors.Trace(err) } // finish this job job.State = model.JobDone return nil default: // we can't enter here. return errors.Errorf("invalid db state %v", dbInfo.State) } }
func (d *ddl) onCreateSchema(t *meta.Meta, job *model.Job) error { schemaID := job.SchemaID dbInfo := &model.DBInfo{} if err := job.DecodeArgs(dbInfo); err != nil { // arg error, cancel this job. job.State = model.JobCancelled return errors.Trace(err) } dbInfo.ID = schemaID dbInfo.State = model.StateNone dbs, err := t.ListDatabases() if err != nil { return errors.Trace(err) } for _, db := range dbs { if db.Name.L == dbInfo.Name.L { if db.ID != schemaID { // database exists, can't create, we should cancel this job now. job.State = model.JobCancelled return errors.Trace(infoschema.ErrDatabaseExists) } dbInfo = db } } ver, err := updateSchemaVersion(t, job) if err != nil { return errors.Trace(err) } switch dbInfo.State { case model.StateNone: // none -> public job.SchemaState = model.StatePublic dbInfo.State = model.StatePublic err = t.CreateDatabase(dbInfo) if err != nil { return errors.Trace(err) } // finish this job job.State = model.JobDone addDBHistoryInfo(job, ver, dbInfo) return nil default: // we can't enter here. return errors.Errorf("invalid db state %v", dbInfo.State) } }
func (do *Domain) fetchAllSchemasWithTables(m *meta.Meta) ([]*model.DBInfo, error) { allSchemas, err := m.ListDatabases() if err != nil { return nil, errors.Trace(err) } splittedSchemas := do.splitForConcurrentFetch(allSchemas) doneCh := make(chan error, len(splittedSchemas)) for _, schemas := range splittedSchemas { go do.fetchSchemasWithTables(schemas, m, doneCh) } for range splittedSchemas { err = <-doneCh if err != nil { return nil, errors.Trace(err) } } return allSchemas, nil }