コード例 #1
0
ファイル: etl.go プロジェクト: kyleconroy/deckbrew
func fetchCardIDs(ctx context.Context, db *cql.DB) ([]string, error) {
	ids := []string{}

	rows, err := db.QueryC(ctx, "SELECT id FROM cards")
	if err != nil {
		return ids, err
	}

	defer rows.Close()
	for rows.Next() {
		var id string
		if err := rows.Scan(&id); err != nil {
			return ids, err
		}
		ids = append(ids, id)
	}
	return ids, rows.Err()
}
コード例 #2
0
ファイル: etl.go プロジェクト: kyleconroy/deckbrew
func CreateCollection(db *cql.DB, r brew.Reader, collection MTGCollection) error {
	ctx := context.TODO()
	sets, cards := TransformCollection(collection)

	// Load the current cards and sets
	currentSets, err := r.GetSets(ctx)
	if err != nil {
		return err
	}

	currentCards, err := fetchCardIDs(ctx, db)
	if err != nil {
		return err
	}

	tx, err := db.Begin()
	if err != nil {
		return err
	}
	for _, s := range sets {
		if existingSet(currentSets, s.Id) {
			continue
		}
		_, err := tx.Exec(queryInsertSet, s.Id, s.Name, s.Border, s.Type)
		if err != nil {
			tx.Rollback()
			return fmt.Errorf("error intserting set %+v %s", s, err)
		}
	}

	i := 0
	for _, c := range cards {
		blob, err := json.Marshal(c)
		if err != nil {
			tx.Rollback()
			return err
		}
		if existingCard(currentCards, c.Id) {
			_, err = tx.Exec(queryUpdateCard,
				c.Name, blob, c.Text, c.ManaCost, c.ConvertedCost,
				c.Power, c.Toughness, c.Loyalty, c.Multicolor(),
				sarray(c.Rarities()), sarray(c.Types),
				sarray(c.Subtypes), sarray(c.Supertypes),
				sarray(c.Colors), sarray(c.Sets()),
				sarray(c.Formats()), sarray(c.Status()),
				sarray(c.MultiverseIds()), c.Id)
		} else {
			_, err = tx.Exec(queryInsertCard,
				c.Id, c.Name, blob, c.Text, c.ManaCost, c.ConvertedCost,
				c.Power, c.Toughness, c.Loyalty, c.Multicolor(),
				sarray(c.Rarities()), sarray(c.Types),
				sarray(c.Subtypes), sarray(c.Supertypes),
				sarray(c.Colors), sarray(c.Sets()),
				sarray(c.Formats()), sarray(c.Status()),
				sarray(c.MultiverseIds()))
		}
		if err != nil {
			tx.Rollback()
			return fmt.Errorf("error inserting / updating card %+v %s", c, err)
		}
		i += 1
	}
	return tx.Commit()
}