mirror of https://github.com/iSoron/uhabits.git
parent
b96385c4a7
commit
ecb5352134
@ -0,0 +1,112 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
|
||||
*
|
||||
* This file is part of Loop Habit Tracker.
|
||||
*
|
||||
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.core.db;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
public class JdbcCursor implements Cursor
|
||||
{
|
||||
private ResultSet resultSet;
|
||||
|
||||
public JdbcCursor(ResultSet resultSet)
|
||||
{
|
||||
this.resultSet = resultSet;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close()
|
||||
{
|
||||
try
|
||||
{
|
||||
resultSet.close();
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean moveToNext()
|
||||
{
|
||||
try
|
||||
{
|
||||
return resultSet.next();
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getInt(int index)
|
||||
{
|
||||
try
|
||||
{
|
||||
return resultSet.getInt(index);
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getLong(int index)
|
||||
{
|
||||
try
|
||||
{
|
||||
return resultSet.getLong(index);
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getDouble(int index)
|
||||
{
|
||||
try
|
||||
{
|
||||
return resultSet.getDouble(index);
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getString(int index)
|
||||
{
|
||||
try
|
||||
{
|
||||
return resultSet.getString(index);
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,184 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
|
||||
*
|
||||
* This file is part of Loop Habit Tracker.
|
||||
*
|
||||
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.core.db;
|
||||
|
||||
import org.apache.commons.lang3.*;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.*;
|
||||
|
||||
public class JdbcDatabase implements Database
|
||||
{
|
||||
private Connection connection;
|
||||
|
||||
private boolean transactionSuccessful;
|
||||
|
||||
public JdbcDatabase(Connection connection)
|
||||
{
|
||||
this.connection = connection;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cursor select(String query, String... params)
|
||||
{
|
||||
try
|
||||
{
|
||||
PreparedStatement st = buildStatement(query, params);
|
||||
return new JdbcCursor(st.executeQuery());
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int update(String tableName,
|
||||
Map<String, Object> map,
|
||||
String where,
|
||||
String... params)
|
||||
{
|
||||
try
|
||||
{
|
||||
ArrayList<String> fields = new ArrayList<>();
|
||||
ArrayList<String> values = new ArrayList<>();
|
||||
|
||||
for (Map.Entry<String, Object> entry : map.entrySet())
|
||||
{
|
||||
if (entry.getValue() == null) continue;
|
||||
fields.add(entry.getKey() + "=?");
|
||||
values.add(entry.getValue().toString());
|
||||
}
|
||||
values.addAll(Arrays.asList(params));
|
||||
|
||||
String query = String.format("update %s set %s where %s", tableName,
|
||||
StringUtils.join(fields, ", "), where);
|
||||
System.out.println(query);
|
||||
|
||||
PreparedStatement st = buildStatement(query, values.toArray());
|
||||
return st.executeUpdate();
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long insert(String tableName, Map<String, Object> map)
|
||||
{
|
||||
try
|
||||
{
|
||||
ArrayList<String> fields = new ArrayList<>();
|
||||
ArrayList<Object> params = new ArrayList<>();
|
||||
ArrayList<String> questionMarks = new ArrayList<>();
|
||||
|
||||
for (Map.Entry<String, Object> entry : map.entrySet())
|
||||
{
|
||||
if (entry.getValue() == null) continue;
|
||||
fields.add(entry.getKey());
|
||||
params.add(entry.getValue());
|
||||
questionMarks.add("?");
|
||||
}
|
||||
|
||||
String query =
|
||||
String.format("insert into %s(%s) values(%s)", tableName,
|
||||
StringUtils.join(fields, ", "),
|
||||
StringUtils.join(questionMarks, ", "));
|
||||
|
||||
PreparedStatement st = buildStatement(query, params.toArray());
|
||||
st.execute();
|
||||
|
||||
Long id = null;
|
||||
ResultSet keys = st.getGeneratedKeys();
|
||||
if (keys.next()) id = keys.getLong(1);
|
||||
return id;
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(String tableName, String where, String... params)
|
||||
{
|
||||
String query =
|
||||
String.format("delete from %s where %s", tableName, where);
|
||||
execute(query, (Object[]) params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String query, Object... params)
|
||||
{
|
||||
try
|
||||
{
|
||||
buildStatement(query, params).execute();
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private PreparedStatement buildStatement(String query, Object[] params)
|
||||
throws SQLException
|
||||
{
|
||||
PreparedStatement st = connection.prepareStatement(query);
|
||||
int index = 1;
|
||||
for (Object param : params) st.setString(index++, param.toString());
|
||||
return st;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void beginTransaction()
|
||||
{
|
||||
try
|
||||
{
|
||||
connection.setAutoCommit(false);
|
||||
transactionSuccessful = false;
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void setTransactionSuccessful()
|
||||
{
|
||||
transactionSuccessful = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void endTransaction()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (transactionSuccessful) connection.commit();
|
||||
else connection.rollback();
|
||||
connection.setAutoCommit(true);
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
|
||||
*
|
||||
* This file is part of Loop Habit Tracker.
|
||||
*
|
||||
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.core.db;
|
||||
|
||||
import android.support.annotation.*;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
public class MigrationHelper
|
||||
{
|
||||
private final FileOpener opener;
|
||||
|
||||
private final Database db;
|
||||
|
||||
public MigrationHelper(@NonNull FileOpener opener, @NonNull Database db)
|
||||
{
|
||||
this.opener = opener;
|
||||
this.db = db;
|
||||
}
|
||||
|
||||
public void executeMigrations(int oldVersion, int newVersion)
|
||||
{
|
||||
try
|
||||
{
|
||||
for (int v = oldVersion + 1; v <= newVersion; v++)
|
||||
{
|
||||
String fname = String.format(Locale.US, "migrations/%d.sql", v);
|
||||
InputStream stream = opener.open(fname);
|
||||
for (String command : SQLParser.parse(stream))
|
||||
db.execute(command);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public interface FileOpener
|
||||
{
|
||||
InputStream open(String filename);
|
||||
}
|
||||
}
|
@ -1,25 +1,20 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Álinson Santos Xavier <isoron@gmail.com>
|
||||
* Copyright (C) 2014 Markus Pfeiffer
|
||||
*
|
||||
* This file is part of Loop Habit Tracker.
|
||||
*
|
||||
* Loop Habit Tracker is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* Loop Habit Tracker is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.database;
|
||||
package org.isoron.uhabits.core.db;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.IOException;
|
@ -0,0 +1,3 @@
|
||||
delete from Score;
|
||||
delete from Streak;
|
||||
delete from Checkmarks;
|
@ -0,0 +1 @@
|
||||
alter table Habits add column reminder_days integer not null default 127;
|
@ -0,0 +1,3 @@
|
||||
delete from Score;
|
||||
delete from Streak;
|
||||
delete from Checkmarks;
|
@ -0,0 +1,4 @@
|
||||
create index idx_score_habit_timestamp on Score(habit, timestamp);
|
||||
create index idx_checkmark_habit_timestamp on Checkmarks(habit, timestamp);
|
||||
create index idx_repetitions_habit_timestamp on Repetitions(habit, timestamp);
|
||||
create index idx_streak_habit_end on Streak(habit, end);
|
@ -0,0 +1,14 @@
|
||||
update habits set color=0 where color=-2937041;
|
||||
update habits set color=1 where color=-1684967;
|
||||
update habits set color=2 where color=-415707;
|
||||
update habits set color=3 where color=-5262293;
|
||||
update habits set color=4 where color=-13070788;
|
||||
update habits set color=5 where color=-16742021;
|
||||
update habits set color=6 where color=-16732991;
|
||||
update habits set color=7 where color=-16540699;
|
||||
update habits set color=8 where color=-10603087;
|
||||
update habits set color=9 where color=-7461718;
|
||||
update habits set color=10 where color=-2614432;
|
||||
update habits set color=11 where color=-13619152;
|
||||
update habits set color=12 where color=-5592406;
|
||||
update habits set color=0 where color<0 or color>12;
|
@ -0,0 +1,3 @@
|
||||
delete from Score;
|
||||
delete from Streak;
|
||||
delete from Checkmarks;
|
@ -0,0 +1,2 @@
|
||||
alter table Habits add column type integer not null default 0;
|
||||
alter table Repetitions add column value integer not null default 2;
|
@ -0,0 +1,11 @@
|
||||
drop table Score;
|
||||
create table Score (
|
||||
id integer primary key autoincrement,
|
||||
habit integer references habits(id),
|
||||
score real,
|
||||
timestamp integer);
|
||||
|
||||
create index idx_score_habit_timestamp on Score(habit, timestamp);
|
||||
|
||||
delete from streak;
|
||||
delete from checkmarks;
|
@ -0,0 +1,3 @@
|
||||
alter table Habits add column target_type integer not null default 0;
|
||||
alter table Habits add column target_value real not null default 0;
|
||||
alter table Habits add column unit text not null default "";
|
@ -0,0 +1,6 @@
|
||||
create table Events (
|
||||
id integer primary key autoincrement,
|
||||
timestamp integer,
|
||||
message text,
|
||||
server_id integer
|
||||
);
|
@ -0,0 +1,3 @@
|
||||
drop table checkmarks;
|
||||
drop table streak;
|
||||
drop table score;
|
@ -0,0 +1,12 @@
|
||||
update habits set color=19 where color=12;
|
||||
update habits set color=17 where color=11;
|
||||
update habits set color=15 where color=10;
|
||||
update habits set color=14 where color=9;
|
||||
update habits set color=13 where color=8;
|
||||
update habits set color=10 where color=7;
|
||||
update habits set color=9 where color=6;
|
||||
update habits set color=8 where color=5;
|
||||
update habits set color=7 where color=4;
|
||||
update habits set color=5 where color=3;
|
||||
update habits set color=4 where color=2;
|
||||
update habits set color=0 where color<0 or color>19;
|
@ -0,0 +1,41 @@
|
||||
create table Habits (
|
||||
id integer primary key autoincrement,
|
||||
archived integer,
|
||||
color integer,
|
||||
description text,
|
||||
freq_den integer,
|
||||
freq_num integer,
|
||||
highlight integer,
|
||||
name text,
|
||||
position integer,
|
||||
reminder_hour integer,
|
||||
reminder_min integer
|
||||
);
|
||||
|
||||
create table Checkmarks (
|
||||
id integer primary key autoincrement,
|
||||
habit integer references habits(id),
|
||||
timestamp integer,
|
||||
value integer
|
||||
);
|
||||
|
||||
create table Repetitions (
|
||||
id integer primary key autoincrement,
|
||||
habit integer references habits(id),
|
||||
timestamp integer
|
||||
);
|
||||
|
||||
create table Streak (
|
||||
id integer primary key autoincrement,
|
||||
end integer,
|
||||
habit integer references habits(id),
|
||||
length integer,
|
||||
start integer
|
||||
);
|
||||
|
||||
create table Score (
|
||||
id integer primary key autoincrement,
|
||||
habit integer references habits(id),
|
||||
score integer,
|
||||
timestamp integer
|
||||
);
|
Loading…
Reference in new issue