code: func (l *LiteBackend) Put(ctx context.Context, i backend.Item) (*backend.Lease, error) {
  	if i.Key == nil {
  		return nil, trace.BadParameter("missing parameter key")
  	}
  	err := l.inTransaction(ctx, func(tx *sql.Tx) error {
  		created := l.clock.Now().UTC()
  		recordID := i.ID
  		if !l.Mirror {
  			recordID = id(created)
  		}
  		if !l.EventsOff {
  			stmt, err := tx.PrepareContext(ctx, "INSERT INTO events(type, created, kv_key, kv_modified, kv_expires, kv_value) values(?, ?, ?, ?, ?, ?)")
  			if err != nil {
  				return trace.Wrap(err)
  			}
  			if _, err := stmt.ExecContext(ctx, backend.OpPut, created, string(i.Key), recordID, expires(i.Expires), i.Value); err != nil {
  				return trace.Wrap(err)
  			}
  		}
  		stmt, err := tx.PrepareContext(ctx, "INSERT OR REPLACE INTO kv(key, modified, expires, value) values(?, ?, ?, ?)")
  		if err != nil {
  			return trace.Wrap(err)
  		}
  		if _, err := stmt.ExecContext(ctx, string(i.Key), recordID, expires(i.Expires), i.Value); err != nil {
  			return trace.Wrap(err)
  		}
  		return nil
  	})
  	if err != nil {
  		return nil, trace.Wrap(err)
  	}
  	return l.newLease(i), nil
  }
docs: // Put puts value into backend (creates if it does not
  // exists, updates it otherwise)