Rev546, Sidebar drag fix, Fix rebuild on dbschema changes, Test Dbschema changes, Fix atomicWrite error when old file already exists
This commit is contained in:
parent
bd67d8fe14
commit
c2fc131cdc
9 changed files with 31 additions and 8 deletions
|
@ -33,6 +33,7 @@ window.initScrollable = function () {
|
||||||
contentPosition = scrollContentWrapper.scrollTop;
|
contentPosition = scrollContentWrapper.scrollTop;
|
||||||
scrollerBeingDragged = true;
|
scrollerBeingDragged = true;
|
||||||
window.addEventListener('mousemove', scrollBarScroll)
|
window.addEventListener('mousemove', scrollBarScroll)
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
function stopDrag(evt) {
|
function stopDrag(evt) {
|
||||||
|
@ -42,6 +43,7 @@ window.initScrollable = function () {
|
||||||
|
|
||||||
function scrollBarScroll(evt) {
|
function scrollBarScroll(evt) {
|
||||||
if (scrollerBeingDragged === true) {
|
if (scrollerBeingDragged === true) {
|
||||||
|
evt.preventDefault();
|
||||||
var mouseDifferential = evt.pageY - normalizedPosition;
|
var mouseDifferential = evt.pageY - normalizedPosition;
|
||||||
var scrollEquivalent = mouseDifferential * (scrollContentWrapper.scrollHeight / scrollContainer.offsetHeight);
|
var scrollEquivalent = mouseDifferential * (scrollContentWrapper.scrollHeight / scrollContainer.offsetHeight);
|
||||||
scrollContentWrapper.scrollTop = contentPosition + scrollEquivalent;
|
scrollContentWrapper.scrollTop = contentPosition + scrollEquivalent;
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
-o-transition: top .08s;
|
-o-transition: top .08s;
|
||||||
transition: top .08s;
|
transition: top .08s;
|
||||||
}
|
}
|
||||||
.content {
|
.scroller {
|
||||||
-webkit-touch-callout: none;
|
-webkit-touch-callout: none;
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
-khtml-user-select: none;
|
-khtml-user-select: none;
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
-o-transition: top .08s;
|
-o-transition: top .08s;
|
||||||
-webkit-transition: top .08s; -moz-transition: top .08s; -o-transition: top .08s; -ms-transition: top .08s; transition: top .08s ;
|
-webkit-transition: top .08s; -moz-transition: top .08s; -o-transition: top .08s; -ms-transition: top .08s; transition: top .08s ;
|
||||||
}
|
}
|
||||||
.content {
|
.scroller {
|
||||||
-webkit-touch-callout: none;
|
-webkit-touch-callout: none;
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
-khtml-user-select: none;
|
-khtml-user-select: none;
|
||||||
|
@ -58,7 +58,7 @@
|
||||||
|
|
||||||
|
|
||||||
.body-sidebar { background-color: #666 !important; }
|
.body-sidebar { background-color: #666 !important; }
|
||||||
#inner-iframe { -webkit-transition: 0.3s ease-in-out; -moz-transition: 0.3s ease-in-out; -o-transition: 0.3s ease-in-out; -ms-transition: 0.3s ease-in-out; transition: 0.3s ease-in-out ; transform-origin: left; backface-visibility: hidden; outline: 1px solid transparent }
|
#inner-iframe { -webkit-transition: 0.3s ease-in-out; -moz-transition: 0.3s ease-in-out; -o-transition: 0.3s ease-in-out; -ms-transition: 0.3s ease-in-out; transition: 0.3s ease-in-out ; transform-origin: left; -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; -o-backface-visibility: hidden; -ms-backface-visibility: hidden; backface-visibility: hidden ; outline: 1px solid transparent }
|
||||||
.body-sidebar iframe { -webkit-transform: rotateY(5deg); -moz-transform: rotateY(5deg); -o-transform: rotateY(5deg); -ms-transform: rotateY(5deg); transform: rotateY(5deg) ; opacity: 0.8; pointer-events: none } /* translateX(-200px) scale(0.95)*/
|
.body-sidebar iframe { -webkit-transform: rotateY(5deg); -moz-transform: rotateY(5deg); -o-transform: rotateY(5deg); -ms-transform: rotateY(5deg); transform: rotateY(5deg) ; opacity: 0.8; pointer-events: none } /* translateX(-200px) scale(0.95)*/
|
||||||
|
|
||||||
/* SIDEBAR */
|
/* SIDEBAR */
|
||||||
|
|
|
@ -95,6 +95,7 @@ window.initScrollable = function () {
|
||||||
contentPosition = scrollContentWrapper.scrollTop;
|
contentPosition = scrollContentWrapper.scrollTop;
|
||||||
scrollerBeingDragged = true;
|
scrollerBeingDragged = true;
|
||||||
window.addEventListener('mousemove', scrollBarScroll)
|
window.addEventListener('mousemove', scrollBarScroll)
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
function stopDrag(evt) {
|
function stopDrag(evt) {
|
||||||
|
@ -104,6 +105,7 @@ window.initScrollable = function () {
|
||||||
|
|
||||||
function scrollBarScroll(evt) {
|
function scrollBarScroll(evt) {
|
||||||
if (scrollerBeingDragged === true) {
|
if (scrollerBeingDragged === true) {
|
||||||
|
evt.preventDefault();
|
||||||
var mouseDifferential = evt.pageY - normalizedPosition;
|
var mouseDifferential = evt.pageY - normalizedPosition;
|
||||||
var scrollEquivalent = mouseDifferential * (scrollContentWrapper.scrollHeight / scrollContainer.offsetHeight);
|
var scrollEquivalent = mouseDifferential * (scrollContentWrapper.scrollHeight / scrollContainer.offsetHeight);
|
||||||
scrollContentWrapper.scrollTop = contentPosition + scrollEquivalent;
|
scrollContentWrapper.scrollTop = contentPosition + scrollEquivalent;
|
||||||
|
@ -536,7 +538,6 @@ window.initScrollable = function () {
|
||||||
}).call(this);
|
}).call(this);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ---- plugins/Sidebar/media/morphdom.js ---- */
|
/* ---- plugins/Sidebar/media/morphdom.js ---- */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ class Config(object):
|
||||||
|
|
||||||
def __init__(self, argv):
|
def __init__(self, argv):
|
||||||
self.version = "0.3.2"
|
self.version = "0.3.2"
|
||||||
self.rev = 542
|
self.rev = 546
|
||||||
self.argv = argv
|
self.argv = argv
|
||||||
self.action = None
|
self.action = None
|
||||||
self.createParser()
|
self.createParser()
|
||||||
|
|
|
@ -96,7 +96,7 @@ class Peer(object):
|
||||||
self.onConnectionError()
|
self.onConnectionError()
|
||||||
return None # Connection failed
|
return None # Connection failed
|
||||||
|
|
||||||
for retry in range(0, 3): # Retry 3 times
|
for retry in range(1, 4): # Retry 3 times
|
||||||
try:
|
try:
|
||||||
res = self.connection.request(cmd, params, stream_to)
|
res = self.connection.request(cmd, params, stream_to)
|
||||||
if not res:
|
if not res:
|
||||||
|
|
|
@ -45,7 +45,7 @@ class SiteStorage:
|
||||||
if check and not self.db_checked:
|
if check and not self.db_checked:
|
||||||
changed_tables = self.db.checkTables()
|
changed_tables = self.db.checkTables()
|
||||||
if changed_tables:
|
if changed_tables:
|
||||||
self.rebuildDb(delete_db=False) # Todo only update the changed table datas
|
self.rebuildDb(delete_db=False) # TODO: only update the changed table datas
|
||||||
|
|
||||||
def closeDb(self):
|
def closeDb(self):
|
||||||
if self.db:
|
if self.db:
|
||||||
|
@ -176,7 +176,9 @@ class SiteStorage:
|
||||||
# Update Sql cache
|
# Update Sql cache
|
||||||
if inner_path == "dbschema.json":
|
if inner_path == "dbschema.json":
|
||||||
self.has_db = self.isFile("dbschema.json")
|
self.has_db = self.isFile("dbschema.json")
|
||||||
self.getDb().checkTables() # Check if any if table schema changed
|
# Reopen DB to check changes
|
||||||
|
self.closeDb()
|
||||||
|
self.openDb()
|
||||||
elif inner_path.endswith(".json") and self.has_db: # Load json file to db
|
elif inner_path.endswith(".json") and self.has_db: # Load json file to db
|
||||||
self.log.debug("Loading json file to db: %s" % inner_path)
|
self.log.debug("Loading json file to db: %s" % inner_path)
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -49,6 +49,21 @@ class TestDb:
|
||||||
assert "test_id" in cols
|
assert "test_id" in cols
|
||||||
assert "title" in cols
|
assert "title" in cols
|
||||||
|
|
||||||
|
# Add new table
|
||||||
|
assert "newtest" not in tables
|
||||||
|
db.schema["tables"]["newtest"] = {
|
||||||
|
"cols": [
|
||||||
|
["newtest_id", "INTEGER"],
|
||||||
|
["newtitle", "TEXT"],
|
||||||
|
],
|
||||||
|
"indexes": ["CREATE UNIQUE INDEX newtest_id ON newtest(newtest_id)"],
|
||||||
|
"schema_changed": 1426195822
|
||||||
|
}
|
||||||
|
db.checkTables()
|
||||||
|
tables = [row["name"] for row in db.execute("SELECT name FROM sqlite_master WHERE type='table'")]
|
||||||
|
assert "test" in tables
|
||||||
|
assert "newtest" in tables
|
||||||
|
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
|
|
|
@ -3,6 +3,7 @@ import socket
|
||||||
import struct
|
import struct
|
||||||
import re
|
import re
|
||||||
import collections
|
import collections
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
def atomicWrite(dest, content, mode="w"):
|
def atomicWrite(dest, content, mode="w"):
|
||||||
|
@ -10,6 +11,8 @@ def atomicWrite(dest, content, mode="w"):
|
||||||
f.write(content)
|
f.write(content)
|
||||||
f.flush()
|
f.flush()
|
||||||
os.fsync(f.fileno())
|
os.fsync(f.fileno())
|
||||||
|
if os.path.isfile(dest + "-old"): # Previous incomplete write
|
||||||
|
os.rename(dest + "-old", dest + "-old-%s" % time.time())
|
||||||
os.rename(dest, dest + "-old")
|
os.rename(dest, dest + "-old")
|
||||||
os.rename(dest + "-new", dest)
|
os.rename(dest + "-new", dest)
|
||||||
os.unlink(dest + "-old")
|
os.unlink(dest + "-old")
|
||||||
|
|
Loading…
Reference in a new issue