diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2012-04-27 19:19:25 +0000 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2012-04-27 19:19:25 +0000 |
commit | 365a86bef2371035e4f6731fbcf1184f46346586 (patch) | |
tree | 24eb9b6456bed47a86dc81f3ae669ae90e425c70 | |
parent | 89654e64cfa18e19741ea97fe685ccfa2f40788c (diff) | |
download | traccar-server-365a86bef2371035e4f6731fbcf1184f46346586.tar.gz traccar-server-365a86bef2371035e4f6731fbcf1184f46346586.tar.bz2 traccar-server-365a86bef2371035e4f6731fbcf1184f46346586.zip |
-rw-r--r-- | src/org/traccar/model/DatabaseDataManager.java | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/org/traccar/model/DatabaseDataManager.java b/src/org/traccar/model/DatabaseDataManager.java new file mode 100644 index 000000000..8e12f177c --- /dev/null +++ b/src/org/traccar/model/DatabaseDataManager.java @@ -0,0 +1,134 @@ +/* + * Copyright 2012 Anton Tananaev (anton.tananaev@gmail.com) + * + * 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.traccar.model; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import org.traccar.helper.AdvancedConnection; +import org.traccar.helper.NamedParameterStatement; + +/** + * Database abstraction class + */ +public class DatabaseDataManager implements DataManager { + + public DatabaseDataManager(Properties properties) + throws ClassNotFoundException, SQLException { + initDatabase(properties); + } + + /** + * Database statements + */ + private NamedParameterStatement queryGetDevices; + private NamedParameterStatement queryAddPosition; + + /** + * Devices cache + */ + private Map devices; + private Calendar devicesLastUpdate; + private Long devicesRefreshDelay; + + /** + * Initialize database + */ + private void initDatabase(Properties properties) + throws ClassNotFoundException, SQLException { + + // Load driver + String driver = properties.getProperty("database.driver"); + if (driver != null) { + Class.forName(driver); + } + + // Refresh delay + String refreshDelay = properties.getProperty("database.refreshDelay"); + if (refreshDelay != null) { + devicesRefreshDelay = Long.valueOf(refreshDelay) * 1000; + } else { + devicesRefreshDelay = new Long(300) * 1000; // Magic number + } + + // Connect database + String url = properties.getProperty("database.url"); + String user = properties.getProperty("database.user"); + String password = properties.getProperty("database.password"); + AdvancedConnection connection = new AdvancedConnection(url, user, password); + + String query = properties.getProperty("database.selectDevice"); + queryGetDevices = new NamedParameterStatement(connection, query); + + query = properties.getProperty("database.insertPosition"); + queryAddPosition = new NamedParameterStatement(connection, query); + } + + public synchronized List getDevices() throws SQLException { + + List deviceList = new LinkedList(); + + queryGetDevices.prepare(); + ResultSet result = queryGetDevices.executeQuery(); + while (result.next()) { + Device device = new Device(); + device.setId(result.getLong("id")); + device.setImei(result.getString("imei")); + deviceList.add(device); + } + + return deviceList; + } + + public void addDevice(Device device) {} // TODO: implement + public void addUpdate(Device device) {} // TODO: implement + public void addRemove(Device device) {} // TODO: implement + + public Device getDeviceByImei(String imei) throws SQLException { + + if ((devices == null) || (Calendar.getInstance().getTimeInMillis() - devicesLastUpdate.getTimeInMillis() > devicesRefreshDelay)) { + devices = new HashMap(); + List deviceList = getDevices(); + for (Object device: deviceList) { + devices.put(((Device) device).getImei(), device); + } + devicesLastUpdate = Calendar.getInstance(); + } + + return (Device) devices.get(imei); + } + + public List getPositions(Long deviceId) { return null; } // TODO: implement + + public synchronized void addPosition(Position position) throws SQLException { + + queryAddPosition.prepare(); + + queryAddPosition.setLong("device_id", position.getDeviceId()); + queryAddPosition.setTimestamp("time", position.getTime()); + queryAddPosition.setBoolean("valid", position.getValid()); + queryAddPosition.setDouble("altitude", position.getAltitude()); + queryAddPosition.setDouble("latitude", position.getLatitude()); + queryAddPosition.setDouble("longitude", position.getLongitude()); + queryAddPosition.setDouble("speed", position.getSpeed()); + queryAddPosition.setDouble("course", position.getCourse()); + queryAddPosition.setDouble("power", position.getPower()); + queryAddPosition.setString("extended_info", position.getExtendedInfo()); + + queryAddPosition.executeUpdate(); + } + +} |