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) } }