<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE properties SYSTEM 'http://java.sun.com/dtd/properties.dtd'>

<properties>

    <!-- SERVER CONFIG -->

    <entry key='web.enable'>true</entry>
    <entry key='web.port'>8082</entry>
    <entry key='web.path'>[WEB]</entry>

    <entry key='geocoder.enable'>true</entry>
    <entry key='geocoder.type'>google</entry>

    <entry key='logger.enable'>true</entry>
    <entry key='logger.level'>all</entry>
    <entry key='logger.file'>[LOG]</entry>

    <!-- DATABASE CONFIG -->

    <entry key='database.driver'>org.h2.Driver</entry>
    <entry key='database.url'>jdbc:h2:[DATABASE]</entry>
    <entry key='database.user'>sa</entry>
    <entry key='database.password'></entry>

    <entry key='database.checkTable'>traccar</entry>

    <entry key='database.selectSchemaVersion'>
        SELECT * FROM traccar;
    </entry>

    <entry key='database.createSchema'>
        CREATE TABLE "user" (
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(128) NOT NULL,
        email VARCHAR(128) NOT NULL UNIQUE,
        hashedPassword VARCHAR(128) NOT NULL,
        salt VARCHAR(128) DEFAULT '' NOT NULL,
        readonly BIT DEFAULT 0 NOT NULL,
        admin BIT DEFAULT 0 NOT NULL,
        map VARCHAR(128),
        language VARCHAR(128),
        distanceUnit VARCHAR(128),
        speedUnit VARCHAR(128),
        latitude FLOAT DEFAULT 0 NOT NULL,
        longitude FLOAT DEFAULT 0 NOT NULL,
        zoom INT DEFAULT 0 NOT NULL);

        CREATE TABLE device (
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(128) NOT NULL,
        uniqueId VARCHAR(128) NOT NULL UNIQUE,
        status VARCHAR(128),
        lastUpdate TIMESTAMP,
        positionId INT,
        dataId INT);

        CREATE TABLE user_device (
        userId INT NOT NULL,
        deviceId INT NOT NULL,
        "read" BIT DEFAULT 1 NOT NULL,
        "write" BIT DEFAULT 1 NOT NULL,
        FOREIGN KEY (userId) REFERENCES "user" (id) ON DELETE CASCADE,
        FOREIGN KEY (deviceId) REFERENCES device (id) ON DELETE CASCADE);

        CREATE INDEX user_device_userId ON user_device(userId);

        CREATE TABLE position (
        id INT PRIMARY KEY AUTO_INCREMENT,
        protocol VARCHAR(128),
        deviceId INT NOT NULL,
        serverTime TIMESTAMP NOT NULL,
        deviceTime TIMESTAMP NOT NULL,
        fixTime TIMESTAMP NOT NULL,
        valid BIT NOT NULL,
        latitude FLOAT NOT NULL,
        longitude FLOAT NOT NULL,
        altitude FLOAT NOT NULL,
        speed FLOAT NOT NULL,
        course FLOAT NOT NULL,
        address VARCHAR(512),
        other VARCHAR(4096) NOT NULL,
        FOREIGN KEY (deviceId) REFERENCES device (id) ON DELETE CASCADE);
        
        CREATE INDEX position_deviceId_fixTime ON position (deviceId, fixTime);

        CREATE TABLE data (
        id INT PRIMARY KEY AUTO_INCREMENT,
        protocol VARCHAR(128),
        deviceId INT NOT NULL,
        serverTime TIMESTAMP NOT NULL,
        deviceTime TIMESTAMP NOT NULL,
        other VARCHAR(4096) NOT NULL,
        FOREIGN KEY (deviceId) REFERENCES device (id) ON DELETE CASCADE);

        ALTER TABLE device ADD
        FOREIGN KEY (positionId) REFERENCES position (id) ON DELETE CASCADE;

        ALTER TABLE device ADD
        FOREIGN KEY (dataId) REFERENCES data (id) ON DELETE CASCADE;

        CREATE TABLE server (
        id INT PRIMARY KEY AUTO_INCREMENT,
        registration BIT NOT NULL,
        map VARCHAR(128),
        language VARCHAR(128),
        distanceUnit VARCHAR(128),
        speedUnit VARCHAR(128),
        latitude FLOAT DEFAULT 0 NOT NULL,
        longitude FLOAT DEFAULT 0 NOT NULL,
        zoom INT DEFAULT 0 NOT NULL);

        CREATE TABLE traccar (
        version INT DEFAULT 0 NOT NULL);

        INSERT INTO traccar (version) VALUES (301);
    </entry>

    <entry key='database.selectServers'>
        SELECT * FROM server;
    </entry>

    <entry key='database.insertServer'>
        INSERT INTO server (registration, latitude, longitude, zoom)
        VALUES (:registration, :latitude, :longitude, :zoom);
    </entry>

    <entry key='database.updateServer'>
        UPDATE server SET
        registration = :registration,
        map = :map,
        language = :language,
        distanceUnit = :distanceUnit,
        speedUnit = :speedUnit,
        latitude = :latitude,
        longitude = :longitude,
        zoom = :zoom
        WHERE id = :id;
    </entry>

    <entry key='database.loginUser'>
        SELECT * FROM "user"
        WHERE email = :email;
    </entry>

    <entry key='database.selectUser'>
        SELECT * FROM "user"
        WHERE id = :id;
    </entry>

    <entry key='database.selectUsersAll'>
        SELECT * FROM "user";
    </entry>

    <entry key='database.insertUser'>
        INSERT INTO "user" (name, email, hashedPassword, salt, admin)
        VALUES (:name, :email, :hashedPassword, :salt, :admin);
    </entry>

    <entry key='database.updateUser'>
        UPDATE "user" SET
        name = :name,
        email = :email,
        admin = :admin,
        map = :map,
        language = :language,
        distanceUnit = :distanceUnit,
        speedUnit = :speedUnit,
        latitude = :latitude,
        longitude = :longitude,
        zoom = :zoom
        WHERE id = :id;
    </entry>

    <entry key='database.updateUserPassword'>
        UPDATE "user" SET hashedPassword = :hashedPassword, salt = :salt WHERE id = :id;
    </entry>
    
    <entry key='database.deleteUser'>
        DELETE FROM "user" WHERE id = :id;
    </entry>

    <entry key='database.getPermissionsAll'>
        SELECT userId, deviceId FROM user_device;
    </entry>
    
    <entry key='database.selectDevicesAll'>
        SELECT * FROM device;
    </entry>
    
    <entry key='database.selectDevices'>
        SELECT * FROM device d INNER JOIN user_device ud ON d.id = ud.deviceId WHERE ud.userId = :userId;
    </entry>
    
    <entry key='database.insertDevice'>
        INSERT INTO device (name, uniqueId) VALUES (:name, :uniqueId);
    </entry>
    
    <entry key='database.updateDevice'>
        UPDATE device SET name = :name, uniqueId = :uniqueId WHERE id = :id;
    </entry>
    
    <entry key='database.deleteDevice'>
        DELETE FROM device WHERE id = :id;
    </entry>
    
    <entry key='database.linkDevice'>
        INSERT INTO user_device (userId, deviceId) VALUES (:userId, :deviceId);
    </entry>

    <entry key='database.selectPositions'>
        SELECT * FROM position WHERE deviceId = :deviceId AND fixTime BETWEEN :from AND :to;    
    </entry>

    <entry key='database.insertPosition'>
        INSERT INTO position (deviceId, protocol, serverTime, deviceTime, fixTime, valid, latitude, longitude, altitude, speed, course, address, other)
        VALUES (:deviceId, :protocol, CURRENT_TIMESTAMP(), :time, :time, :valid, :latitude, :longitude, :altitude, :speed, :course, :address, :other);
    </entry>

    <entry key='database.selectLatestPositions'>
        SELECT * FROM position WHERE id IN (SELECT positionId FROM device);
    </entry>

    <entry key='database.updateLatestPosition'>
        UPDATE device SET positionId = :id WHERE id = :deviceId;
    </entry>

    <!-- PROTOCOL CONFIG -->

    <entry key='gps103.port'>5001</entry>
    <entry key='tk103.port'>5002</entry>
    <entry key='gl100.port'>5003</entry>
    <entry key='gl200.port'>5004</entry>
    <entry key='t55.port'>5005</entry>
    <entry key='xexun.port'>5006</entry>
    <entry key='xexun.extended'>false</entry>
    <entry key='totem.port'>5007</entry>
    <entry key='enfora.port'>5008</entry>
    <entry key='meiligao.port'>5009</entry>
    <entry key='maxon.port'>5010</entry>
    <entry key='suntech.port'>5011</entry>
    <entry key='progress.port'>5012</entry>
    <entry key='h02.port'>5013</entry>
    <entry key='jt600.port'>5014</entry>
    <entry key='ev603.port'>5015</entry>
    <entry key='v680.port'>5016</entry>
    <entry key='pt502.port'>5017</entry>
    <entry key='tr20.port'>5018</entry>
    <entry key='navis.port'>5019</entry>
    <entry key='meitrack.port'>5020</entry>
    <entry key='skypatrol.port'>5021</entry>
    <entry key='gt02.port'>5022</entry>
    <entry key='gt06.port'>5023</entry>
    <entry key='megastek.port'>5024</entry>
    <entry key='navigil.port'>5025</entry>
    <entry key='gpsgate.port'>5026</entry>
    <entry key='teltonika.port'>5027</entry>
    <entry key='mta6.port'>5028</entry>
    <entry key='tzone.port'>5029</entry>
    <entry key='tlt2h.port'>5030</entry>
    <entry key='taip.port'>5031</entry>
    <entry key='wondex.port'>5032</entry>
    <entry key='cellocator.port'>5033</entry>
    <entry key='galileo.port'>5034</entry>
    <entry key='ywt.port'>5035</entry>
    <entry key='tk102.port'>5036</entry>
    <entry key='intellitrac.port'>5037</entry>
    <entry key='xt7.port'>5038</entry>
    <entry key='wialon.port'>5039</entry>
    <entry key='carscop.port'>5040</entry>
    <entry key='apel.port'>5041</entry>
    <entry key='manpower.port'>5042</entry>
    <entry key='globalsat.port'>5043</entry>
    <entry key='atrack.port'>5044</entry>
    <entry key='pt3000.port'>5045</entry>
    <entry key='ruptela.port'>5046</entry>
    <entry key='topflytech.port'>5047</entry>
    <entry key='laipac.port'>5048</entry>
    <entry key='aplicom.port'>5049</entry>
    <entry key='gotop.port'>5050</entry>
    <entry key='sanav.port'>5051</entry>
    <entry key='gator.port'>5052</entry>
    <entry key='noran.port'>5053</entry>
    <entry key='m2m.port'>5054</entry>
    <entry key='osmand.port'>5055</entry>
    <entry key='easytrack.port'>5056</entry>
    <entry key='gpsmarker.port'>5057</entry>
    <entry key='khd.port'>5058</entry>
    <entry key='piligrim.port'>5059</entry>
    <entry key='stl060.port'>5060</entry>
    <entry key='cartrack.port'>5061</entry>
    <entry key='minifinder.port'>5062</entry>
    <entry key='haicom.port'>5063</entry>
    <entry key='eelink.port'>5064</entry>
    <entry key='box.port'>5065</entry>
    <entry key='freedom.port'>5066</entry>
    <entry key='telik.port'>5067</entry>
    <entry key='trackbox.port'>5068</entry>
    <entry key='visiontek.port'>5069</entry>
    <entry key='orion.port'>5070</entry>
    <entry key='riti.port'>5071</entry>
    <entry key='ulbotech.port'>5072</entry>
    <entry key='tramigo.port'>5073</entry>
    <entry key='tr900.port'>5074</entry>
    <entry key='ardi01.port'>5075</entry>
    <entry key='xt013.port'>5076</entry>
    <entry key='autofon.port'>5077</entry>
    <entry key='gosafe.port'>5078</entry>
    <entry key='autofon45.port'>5079</entry>
    <entry key='bce.port'>5080</entry>
    <entry key='xirgo.port'>5081</entry>
    <entry key='calamp.port'>5082</entry>
    <entry key='mtx.port'>5083</entry>
    <entry key='tytan.port'>5084</entry>
    <entry key='avl301.port'>5085</entry>
    <entry key='castel.port'>5086</entry>
    <entry key='mxt.port'>5087</entry>
    <entry key='cityeasy.port'>5088</entry>

</properties>