From 9c8730f60a9688e2ef846a965a19fd5c9907b875 Mon Sep 17 00:00:00 2001 From: Aaron Lindsay Date: Tue, 13 Aug 2013 20:43:16 -0400 Subject: [PATCH] Add Predecessor field to events, which holds the hash of the previous file at that path --- client/database.go | 10 +++++----- events.go | 5 +++++ server/database.go | 8 ++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/client/database.go b/client/database.go index 781f25d..603aa1f 100644 --- a/client/database.go +++ b/client/database.go @@ -37,7 +37,7 @@ func GetAndInitDB(config *conf.ConfigFile) (*AsinkDB, error) { } if !rows.Next() { //if this is false, it means no rows were returned - tx.Exec("CREATE TABLE events (id INTEGER, localid INTEGER PRIMARY KEY ASC, type INTEGER, status INTEGER, path TEXT, hash TEXT, timestamp INTEGER, permissions INTEGER);") + tx.Exec("CREATE TABLE events (id INTEGER, localid INTEGER PRIMARY KEY ASC, type INTEGER, status INTEGER, path TEXT, hash TEXT, predecessor TEXT, timestamp INTEGER, permissions INTEGER);") // tx.Exec("CREATE INDEX IF NOT EXISTS localididx on events (localid)") tx.Exec("CREATE INDEX IF NOT EXISTS ididx on events (id);") tx.Exec("CREATE INDEX IF NOT EXISTS pathidx on events (path);") @@ -66,7 +66,7 @@ func (adb *AsinkDB) DatabaseAddEvent(e *asink.Event) (err error) { adb.lock.Unlock() }() - result, err := tx.Exec("INSERT INTO events (id, type, status, path, hash, timestamp, permissions) VALUES (?,?,?,?,?,?,?);", e.Id, e.Type, e.Status, e.Path, e.Hash, e.Timestamp, e.Permissions) + result, err := tx.Exec("INSERT INTO events (id, type, status, path, hash, predecessor, timestamp, permissions) VALUES (?,?,?,?,?,?,?,?);", e.Id, e.Type, e.Status, e.Path, e.Hash, e.Predecessor, e.Timestamp, e.Permissions) if err != nil { return err } @@ -102,7 +102,7 @@ func (adb *AsinkDB) DatabaseUpdateEvent(e *asink.Event) (err error) { adb.lock.Unlock() }() - result, err := tx.Exec("UPDATE events SET id=?, type=?, status=?, path=?, hash=?, timestamp=?, permissions=? WHERE localid=?;", e.Id, e.Type, e.Status, e.Path, e.Hash, e.Timestamp, e.Permissions, e.LocalId) + result, err := tx.Exec("UPDATE events SET id=?, type=?, status=?, path=?, hash=?, prececessor=?, timestamp=?, permissions=? WHERE localid=?;", e.Id, e.Type, e.Status, e.Path, e.Hash, e.Predecessor, e.Timestamp, e.Permissions, e.LocalId) if err != nil { return err } @@ -127,14 +127,14 @@ func (adb *AsinkDB) DatabaseLatestRemoteEvent() (event *asink.Event, err error) //make sure the database gets unlocked defer adb.lock.Unlock() - rows, err := adb.db.Query("SELECT id, localid, type, status, path, hash, timestamp, permissions FROM events WHERE id > 0 ORDER BY id DESC LIMIT 1;") + row := adb.db.QueryRow("SELECT id, localid, type, status, path, hash, predecessor, timestamp, permissions FROM events WHERE path == ? ORDER BY timestamp DESC LIMIT 1;", path) if err != nil { return nil, err } for rows.Next() { event = new(asink.Event) - err = rows.Scan(&event.Id, &event.LocalId, &event.Type, &event.Status, &event.Path, &event.Hash, &event.Timestamp, &event.Permissions) + err = rows.Scan(&event.Id, &event.LocalId, &event.Type, &event.Status, &event.Path, &event.Hash, &event.Predecessor, &event.Timestamp, &event.Permissions) if err != nil { return nil, err } diff --git a/events.go b/events.go index f1318a3..c310d4a 100644 --- a/events.go +++ b/events.go @@ -32,6 +32,7 @@ type Event struct { Status EventStatus Path string Hash string + Predecessor string Timestamp int64 Permissions uint32 InDB bool `json:"-"` //defaults to false. Omitted from json marshalling. @@ -44,3 +45,7 @@ func (e *Event) IsUpdate() bool { func (e *Event) IsDelete() bool { return e.Type&DELETE == DELETE } + +func (e *Event) IsSameEvent(e2 *Event) bool { + return (e.Type == e2.Type && e.Path == e2.Path && e.Hash == e2.Hash && e.Predecessor == e2.Predecessor && e.Timestamp == e2.Timestamp && e.Permissions == e2.Permissions) +} diff --git a/server/database.go b/server/database.go index d33c1df..c30b479 100644 --- a/server/database.go +++ b/server/database.go @@ -31,7 +31,7 @@ func GetAndInitDB() (*AsinkDB, error) { } if !rows.Next() { //if this is false, it means no rows were returned - tx.Exec("CREATE TABLE events (id INTEGER PRIMARY KEY ASC, localid INTEGER, type INTEGER, status INTEGER, path TEXT, hash TEXT, timestamp INTEGER, permissions INTEGER);") + tx.Exec("CREATE TABLE events (id INTEGER PRIMARY KEY ASC, localid INTEGER, type INTEGER, status INTEGER, path TEXT, hash TEXT, predecessor TEXT, timestamp INTEGER, permissions INTEGER);") tx.Exec("CREATE INDEX IF NOT EXISTS pathidx on events (path);") } err = tx.Commit() @@ -59,7 +59,7 @@ func (adb *AsinkDB) DatabaseAddEvent(e *asink.Event) (err error) { adb.lock.Unlock() }() - result, err := tx.Exec("INSERT INTO events (localid, type, status, path, hash, timestamp, permissions) VALUES (?,?,?,?,?,?,?);", e.LocalId, e.Type, e.Status, e.Path, e.Hash, e.Timestamp, e.Permissions) + result, err := tx.Exec("INSERT INTO events (localid, type, status, path, hash, predecessor, timestamp, permissions) VALUES (?,?,?,?,?,?,?,?);", e.LocalId, e.Type, e.Status, e.Path, e.Hash, e.Predecessor, e.Timestamp, e.Permissions) if err != nil { return err } @@ -83,13 +83,13 @@ func (adb *AsinkDB) DatabaseRetrieveEvents(firstId uint64, maxEvents uint) (even defer func() { adb.lock.Unlock() }() - rows, err := adb.db.Query("SELECT id, localid, type, status, path, hash, timestamp, permissions FROM events WHERE id >= ? ORDER BY id ASC LIMIT ?;", firstId, maxEvents) + rows, err := adb.db.Query("SELECT id, localid, type, status, path, hash, predecessor, timestamp, permissions FROM events WHERE id >= ? ORDER BY id ASC LIMIT ?;", firstId, maxEvents) if err != nil { return nil, err } for rows.Next() { var event asink.Event - err = rows.Scan(&event.Id, &event.LocalId, &event.Type, &event.Status, &event.Path, &event.Hash, &event.Timestamp, &event.Permissions) + err = rows.Scan(&event.Id, &event.LocalId, &event.Type, &event.Status, &event.Path, &event.Hash, &event.Predecessor, &event.Timestamp, &event.Permissions) if err != nil { return nil, err }