Commit 2af3be78272fec5944d8b016cd9d451a28e6bbc2

Authored by YevhenBondarenko
1 parent afc29596

added tag for OtaPackage

@@ -67,6 +67,7 @@ CREATE TABLE IF NOT EXISTS ota_package ( @@ -67,6 +67,7 @@ CREATE TABLE IF NOT EXISTS ota_package (
67 type varchar(32) NOT NULL, 67 type varchar(32) NOT NULL,
68 title varchar(255) NOT NULL, 68 title varchar(255) NOT NULL,
69 version varchar(255) NOT NULL, 69 version varchar(255) NOT NULL,
  70 + tag varchar(255),
70 url varchar(255), 71 url varchar(255),
71 file_name varchar(255), 72 file_name varchar(255),
72 content_type varchar(255), 73 content_type varchar(255),
@@ -37,6 +37,7 @@ public class OtaPackageInfo extends SearchTextBasedWithAdditionalInfo<OtaPackage @@ -37,6 +37,7 @@ public class OtaPackageInfo extends SearchTextBasedWithAdditionalInfo<OtaPackage
37 private OtaPackageType type; 37 private OtaPackageType type;
38 private String title; 38 private String title;
39 private String version; 39 private String version;
  40 + private String tag;
40 private String url; 41 private String url;
41 private boolean hasData; 42 private boolean hasData;
42 private String fileName; 43 private String fileName;
@@ -499,6 +499,7 @@ public class ModelConstants { @@ -499,6 +499,7 @@ public class ModelConstants {
499 public static final String OTA_PACKAGE_TYPE_COLUMN = "type"; 499 public static final String OTA_PACKAGE_TYPE_COLUMN = "type";
500 public static final String OTA_PACKAGE_TILE_COLUMN = TITLE_PROPERTY; 500 public static final String OTA_PACKAGE_TILE_COLUMN = TITLE_PROPERTY;
501 public static final String OTA_PACKAGE_VERSION_COLUMN = "version"; 501 public static final String OTA_PACKAGE_VERSION_COLUMN = "version";
  502 + public static final String OTA_PACKAGE_TAG_COLUMN = "tag";
502 public static final String OTA_PACKAGE_URL_COLUMN = "url"; 503 public static final String OTA_PACKAGE_URL_COLUMN = "url";
503 public static final String OTA_PACKAGE_FILE_NAME_COLUMN = "file_name"; 504 public static final String OTA_PACKAGE_FILE_NAME_COLUMN = "file_name";
504 public static final String OTA_PACKAGE_CONTENT_TYPE_COLUMN = "content_type"; 505 public static final String OTA_PACKAGE_CONTENT_TYPE_COLUMN = "content_type";
@@ -48,6 +48,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DATA_S @@ -48,6 +48,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DATA_S
48 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DEVICE_PROFILE_ID_COLUMN; 48 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DEVICE_PROFILE_ID_COLUMN;
49 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_FILE_NAME_COLUMN; 49 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_FILE_NAME_COLUMN;
50 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TABLE_NAME; 50 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TABLE_NAME;
  51 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TAG_COLUMN;
51 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TENANT_ID_COLUMN; 52 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TENANT_ID_COLUMN;
52 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TILE_COLUMN; 53 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TILE_COLUMN;
53 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TYPE_COLUMN; 54 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TYPE_COLUMN;
@@ -78,6 +79,9 @@ public class OtaPackageEntity extends BaseSqlEntity<OtaPackage> implements Searc @@ -78,6 +79,9 @@ public class OtaPackageEntity extends BaseSqlEntity<OtaPackage> implements Searc
78 @Column(name = OTA_PACKAGE_VERSION_COLUMN) 79 @Column(name = OTA_PACKAGE_VERSION_COLUMN)
79 private String version; 80 private String version;
80 81
  82 + @Column(name = OTA_PACKAGE_TAG_COLUMN)
  83 + private String tag;
  84 +
81 @Column(name = OTA_PACKAGE_URL_COLUMN) 85 @Column(name = OTA_PACKAGE_URL_COLUMN)
82 private String url; 86 private String url;
83 87
@@ -112,24 +116,25 @@ public class OtaPackageEntity extends BaseSqlEntity<OtaPackage> implements Searc @@ -112,24 +116,25 @@ public class OtaPackageEntity extends BaseSqlEntity<OtaPackage> implements Searc
112 super(); 116 super();
113 } 117 }
114 118
115 - public OtaPackageEntity(OtaPackage firmware) {  
116 - this.createdTime = firmware.getCreatedTime();  
117 - this.setUuid(firmware.getUuidId());  
118 - this.tenantId = firmware.getTenantId().getId();  
119 - if (firmware.getDeviceProfileId() != null) {  
120 - this.deviceProfileId = firmware.getDeviceProfileId().getId(); 119 + public OtaPackageEntity(OtaPackage otaPackage) {
  120 + this.createdTime = otaPackage.getCreatedTime();
  121 + this.setUuid(otaPackage.getUuidId());
  122 + this.tenantId = otaPackage.getTenantId().getId();
  123 + if (otaPackage.getDeviceProfileId() != null) {
  124 + this.deviceProfileId = otaPackage.getDeviceProfileId().getId();
121 } 125 }
122 - this.type = firmware.getType();  
123 - this.title = firmware.getTitle();  
124 - this.version = firmware.getVersion();  
125 - this.url = firmware.getUrl();  
126 - this.fileName = firmware.getFileName();  
127 - this.contentType = firmware.getContentType();  
128 - this.checksumAlgorithm = firmware.getChecksumAlgorithm();  
129 - this.checksum = firmware.getChecksum();  
130 - this.data = firmware.getData().array();  
131 - this.dataSize = firmware.getDataSize();  
132 - this.additionalInfo = firmware.getAdditionalInfo(); 126 + this.type = otaPackage.getType();
  127 + this.title = otaPackage.getTitle();
  128 + this.version = otaPackage.getVersion();
  129 + this.tag = otaPackage.getTag();
  130 + this.url = otaPackage.getUrl();
  131 + this.fileName = otaPackage.getFileName();
  132 + this.contentType = otaPackage.getContentType();
  133 + this.checksumAlgorithm = otaPackage.getChecksumAlgorithm();
  134 + this.checksum = otaPackage.getChecksum();
  135 + this.data = otaPackage.getData().array();
  136 + this.dataSize = otaPackage.getDataSize();
  137 + this.additionalInfo = otaPackage.getAdditionalInfo();
133 } 138 }
134 139
135 @Override 140 @Override
@@ -144,26 +149,27 @@ public class OtaPackageEntity extends BaseSqlEntity<OtaPackage> implements Searc @@ -144,26 +149,27 @@ public class OtaPackageEntity extends BaseSqlEntity<OtaPackage> implements Searc
144 149
145 @Override 150 @Override
146 public OtaPackage toData() { 151 public OtaPackage toData() {
147 - OtaPackage firmware = new OtaPackage(new OtaPackageId(id));  
148 - firmware.setCreatedTime(createdTime);  
149 - firmware.setTenantId(new TenantId(tenantId)); 152 + OtaPackage otaPackage = new OtaPackage(new OtaPackageId(id));
  153 + otaPackage.setCreatedTime(createdTime);
  154 + otaPackage.setTenantId(new TenantId(tenantId));
150 if (deviceProfileId != null) { 155 if (deviceProfileId != null) {
151 - firmware.setDeviceProfileId(new DeviceProfileId(deviceProfileId)); 156 + otaPackage.setDeviceProfileId(new DeviceProfileId(deviceProfileId));
152 } 157 }
153 - firmware.setType(type);  
154 - firmware.setTitle(title);  
155 - firmware.setVersion(version);  
156 - firmware.setUrl(url);  
157 - firmware.setFileName(fileName);  
158 - firmware.setContentType(contentType);  
159 - firmware.setChecksumAlgorithm(checksumAlgorithm);  
160 - firmware.setChecksum(checksum);  
161 - firmware.setDataSize(dataSize); 158 + otaPackage.setType(type);
  159 + otaPackage.setTitle(title);
  160 + otaPackage.setVersion(version);
  161 + otaPackage.setTag(tag);
  162 + otaPackage.setUrl(url);
  163 + otaPackage.setFileName(fileName);
  164 + otaPackage.setContentType(contentType);
  165 + otaPackage.setChecksumAlgorithm(checksumAlgorithm);
  166 + otaPackage.setChecksum(checksum);
  167 + otaPackage.setDataSize(dataSize);
162 if (data != null) { 168 if (data != null) {
163 - firmware.setData(ByteBuffer.wrap(data));  
164 - firmware.setHasData(true); 169 + otaPackage.setData(ByteBuffer.wrap(data));
  170 + otaPackage.setHasData(true);
165 } 171 }
166 - firmware.setAdditionalInfo(additionalInfo);  
167 - return firmware; 172 + otaPackage.setAdditionalInfo(additionalInfo);
  173 + return otaPackage;
168 } 174 }
169 } 175 }
@@ -48,6 +48,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DATA_S @@ -48,6 +48,7 @@ import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DATA_S
48 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DEVICE_PROFILE_ID_COLUMN; 48 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_DEVICE_PROFILE_ID_COLUMN;
49 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_FILE_NAME_COLUMN; 49 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_FILE_NAME_COLUMN;
50 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TABLE_NAME; 50 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TABLE_NAME;
  51 +import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TAG_COLUMN;
51 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TENANT_ID_COLUMN; 52 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TENANT_ID_COLUMN;
52 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TILE_COLUMN; 53 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TILE_COLUMN;
53 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TYPE_COLUMN; 54 import static org.thingsboard.server.dao.model.ModelConstants.OTA_PACKAGE_TYPE_COLUMN;
@@ -78,6 +79,9 @@ public class OtaPackageInfoEntity extends BaseSqlEntity<OtaPackageInfo> implemen @@ -78,6 +79,9 @@ public class OtaPackageInfoEntity extends BaseSqlEntity<OtaPackageInfo> implemen
78 @Column(name = OTA_PACKAGE_VERSION_COLUMN) 79 @Column(name = OTA_PACKAGE_VERSION_COLUMN)
79 private String version; 80 private String version;
80 81
  82 + @Column(name = OTA_PACKAGE_TAG_COLUMN)
  83 + private String tag;
  84 +
81 @Column(name = OTA_PACKAGE_URL_COLUMN) 85 @Column(name = OTA_PACKAGE_URL_COLUMN)
82 private String url; 86 private String url;
83 87
@@ -111,26 +115,27 @@ public class OtaPackageInfoEntity extends BaseSqlEntity<OtaPackageInfo> implemen @@ -111,26 +115,27 @@ public class OtaPackageInfoEntity extends BaseSqlEntity<OtaPackageInfo> implemen
111 super(); 115 super();
112 } 116 }
113 117
114 - public OtaPackageInfoEntity(OtaPackageInfo firmware) {  
115 - this.createdTime = firmware.getCreatedTime();  
116 - this.setUuid(firmware.getUuidId());  
117 - this.tenantId = firmware.getTenantId().getId();  
118 - this.type = firmware.getType();  
119 - if (firmware.getDeviceProfileId() != null) {  
120 - this.deviceProfileId = firmware.getDeviceProfileId().getId(); 118 + public OtaPackageInfoEntity(OtaPackageInfo otaPackageInfo) {
  119 + this.createdTime = otaPackageInfo.getCreatedTime();
  120 + this.setUuid(otaPackageInfo.getUuidId());
  121 + this.tenantId = otaPackageInfo.getTenantId().getId();
  122 + this.type = otaPackageInfo.getType();
  123 + if (otaPackageInfo.getDeviceProfileId() != null) {
  124 + this.deviceProfileId = otaPackageInfo.getDeviceProfileId().getId();
121 } 125 }
122 - this.title = firmware.getTitle();  
123 - this.version = firmware.getVersion();  
124 - this.url = firmware.getUrl();  
125 - this.fileName = firmware.getFileName();  
126 - this.contentType = firmware.getContentType();  
127 - this.checksumAlgorithm = firmware.getChecksumAlgorithm();  
128 - this.checksum = firmware.getChecksum();  
129 - this.dataSize = firmware.getDataSize();  
130 - this.additionalInfo = firmware.getAdditionalInfo(); 126 + this.title = otaPackageInfo.getTitle();
  127 + this.version = otaPackageInfo.getVersion();
  128 + this.tag = otaPackageInfo.getTag();
  129 + this.url = otaPackageInfo.getUrl();
  130 + this.fileName = otaPackageInfo.getFileName();
  131 + this.contentType = otaPackageInfo.getContentType();
  132 + this.checksumAlgorithm = otaPackageInfo.getChecksumAlgorithm();
  133 + this.checksum = otaPackageInfo.getChecksum();
  134 + this.dataSize = otaPackageInfo.getDataSize();
  135 + this.additionalInfo = otaPackageInfo.getAdditionalInfo();
131 } 136 }
132 137
133 - public OtaPackageInfoEntity(UUID id, long createdTime, UUID tenantId, UUID deviceProfileId, OtaPackageType type, String title, String version, 138 + public OtaPackageInfoEntity(UUID id, long createdTime, UUID tenantId, UUID deviceProfileId, OtaPackageType type, String title, String version, String tag,
134 String url, String fileName, String contentType, ChecksumAlgorithm checksumAlgorithm, String checksum, Long dataSize, 139 String url, String fileName, String contentType, ChecksumAlgorithm checksumAlgorithm, String checksum, Long dataSize,
135 Object additionalInfo, boolean hasData) { 140 Object additionalInfo, boolean hasData) {
136 this.id = id; 141 this.id = id;
@@ -162,23 +167,24 @@ public class OtaPackageInfoEntity extends BaseSqlEntity<OtaPackageInfo> implemen @@ -162,23 +167,24 @@ public class OtaPackageInfoEntity extends BaseSqlEntity<OtaPackageInfo> implemen
162 167
163 @Override 168 @Override
164 public OtaPackageInfo toData() { 169 public OtaPackageInfo toData() {
165 - OtaPackageInfo firmware = new OtaPackageInfo(new OtaPackageId(id));  
166 - firmware.setCreatedTime(createdTime);  
167 - firmware.setTenantId(new TenantId(tenantId)); 170 + OtaPackageInfo otaPackageInfo = new OtaPackageInfo(new OtaPackageId(id));
  171 + otaPackageInfo.setCreatedTime(createdTime);
  172 + otaPackageInfo.setTenantId(new TenantId(tenantId));
168 if (deviceProfileId != null) { 173 if (deviceProfileId != null) {
169 - firmware.setDeviceProfileId(new DeviceProfileId(deviceProfileId)); 174 + otaPackageInfo.setDeviceProfileId(new DeviceProfileId(deviceProfileId));
170 } 175 }
171 - firmware.setType(type);  
172 - firmware.setTitle(title);  
173 - firmware.setVersion(version);  
174 - firmware.setUrl(url);  
175 - firmware.setFileName(fileName);  
176 - firmware.setContentType(contentType);  
177 - firmware.setChecksumAlgorithm(checksumAlgorithm);  
178 - firmware.setChecksum(checksum);  
179 - firmware.setDataSize(dataSize);  
180 - firmware.setAdditionalInfo(additionalInfo);  
181 - firmware.setHasData(hasData);  
182 - return firmware; 176 + otaPackageInfo.setType(type);
  177 + otaPackageInfo.setTitle(title);
  178 + otaPackageInfo.setVersion(version);
  179 + otaPackageInfo.setTag(tag);
  180 + otaPackageInfo.setUrl(url);
  181 + otaPackageInfo.setFileName(fileName);
  182 + otaPackageInfo.setContentType(contentType);
  183 + otaPackageInfo.setChecksumAlgorithm(checksumAlgorithm);
  184 + otaPackageInfo.setChecksum(checksum);
  185 + otaPackageInfo.setDataSize(dataSize);
  186 + otaPackageInfo.setAdditionalInfo(additionalInfo);
  187 + otaPackageInfo.setHasData(hasData);
  188 + return otaPackageInfo;
183 } 189 }
184 } 190 }
@@ -51,6 +51,7 @@ import org.thingsboard.server.dao.tenant.TenantDao; @@ -51,6 +51,7 @@ import org.thingsboard.server.dao.tenant.TenantDao;
51 import java.nio.ByteBuffer; 51 import java.nio.ByteBuffer;
52 import java.util.Collections; 52 import java.util.Collections;
53 import java.util.List; 53 import java.util.List;
  54 +import java.util.Objects;
54 import java.util.Optional; 55 import java.util.Optional;
55 56
56 import static org.thingsboard.server.common.data.CacheConstants.OTA_PACKAGE_CACHE; 57 import static org.thingsboard.server.common.data.CacheConstants.OTA_PACKAGE_CACHE;
@@ -318,6 +319,10 @@ public class BaseOtaPackageService implements OtaPackageService { @@ -318,6 +319,10 @@ public class BaseOtaPackageService implements OtaPackageService {
318 throw new DataValidationException("Updating otaPackage version is prohibited!"); 319 throw new DataValidationException("Updating otaPackage version is prohibited!");
319 } 320 }
320 321
  322 + if (!Objects.equals(otaPackage.getTag(), otaPackageOld.getTag())) {
  323 + throw new DataValidationException("Updating otaPackage tag is prohibited!");
  324 + }
  325 +
321 if (!otaPackageOld.getDeviceProfileId().equals(otaPackage.getDeviceProfileId())) { 326 if (!otaPackageOld.getDeviceProfileId().equals(otaPackage.getDeviceProfileId())) {
322 throw new DataValidationException("Updating otaPackage deviceProfile is prohibited!"); 327 throw new DataValidationException("Updating otaPackage deviceProfile is prohibited!");
323 } 328 }
@@ -26,14 +26,14 @@ import org.thingsboard.server.dao.model.sql.OtaPackageInfoEntity; @@ -26,14 +26,14 @@ import org.thingsboard.server.dao.model.sql.OtaPackageInfoEntity;
26 import java.util.UUID; 26 import java.util.UUID;
27 27
28 public interface OtaPackageInfoRepository extends CrudRepository<OtaPackageInfoEntity, UUID> { 28 public interface OtaPackageInfoRepository extends CrudRepository<OtaPackageInfoEntity, UUID> {
29 - @Query("SELECT new OtaPackageInfoEntity(f.id, f.createdTime, f.tenantId, f.deviceProfileId, f.type, f.title, f.version, f.url, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, CASE WHEN (f.data IS NOT NULL OR f.url IS NOT NULL) THEN true ELSE false END) FROM OtaPackageEntity f WHERE " + 29 + @Query("SELECT new OtaPackageInfoEntity(f.id, f.createdTime, f.tenantId, f.deviceProfileId, f.type, f.title, f.version, f.tag, f.url, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, CASE WHEN (f.data IS NOT NULL OR f.url IS NOT NULL) THEN true ELSE false END) FROM OtaPackageEntity f WHERE " +
30 "f.tenantId = :tenantId " + 30 "f.tenantId = :tenantId " +
31 "AND LOWER(f.searchText) LIKE LOWER(CONCAT(:searchText, '%'))") 31 "AND LOWER(f.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
32 Page<OtaPackageInfoEntity> findAllByTenantId(@Param("tenantId") UUID tenantId, 32 Page<OtaPackageInfoEntity> findAllByTenantId(@Param("tenantId") UUID tenantId,
33 @Param("searchText") String searchText, 33 @Param("searchText") String searchText,
34 Pageable pageable); 34 Pageable pageable);
35 35
36 - @Query("SELECT new OtaPackageInfoEntity(f.id, f.createdTime, f.tenantId, f.deviceProfileId, f.type, f.title, f.version, f.url, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, true) FROM OtaPackageEntity f WHERE " + 36 + @Query("SELECT new OtaPackageInfoEntity(f.id, f.createdTime, f.tenantId, f.deviceProfileId, f.type, f.title, f.version, f.tag, f.url, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, true) FROM OtaPackageEntity f WHERE " +
37 "f.tenantId = :tenantId " + 37 "f.tenantId = :tenantId " +
38 "AND f.deviceProfileId = :deviceProfileId " + 38 "AND f.deviceProfileId = :deviceProfileId " +
39 "AND f.type = :type " + 39 "AND f.type = :type " +
@@ -45,7 +45,7 @@ public interface OtaPackageInfoRepository extends CrudRepository<OtaPackageInfoE @@ -45,7 +45,7 @@ public interface OtaPackageInfoRepository extends CrudRepository<OtaPackageInfoE
45 @Param("searchText") String searchText, 45 @Param("searchText") String searchText,
46 Pageable pageable); 46 Pageable pageable);
47 47
48 - @Query("SELECT new OtaPackageInfoEntity(f.id, f.createdTime, f.tenantId, f.deviceProfileId, f.type, f.title, f.version, f.url, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, CASE WHEN (f.data IS NOT NULL OR f.url IS NOT NULL) THEN true ELSE false END) FROM OtaPackageEntity f WHERE f.id = :id") 48 + @Query("SELECT new OtaPackageInfoEntity(f.id, f.createdTime, f.tenantId, f.deviceProfileId, f.type, f.title, f.version, f.tag, f.url, f.fileName, f.contentType, f.checksumAlgorithm, f.checksum, f.dataSize, f.additionalInfo, CASE WHEN (f.data IS NOT NULL OR f.url IS NOT NULL) THEN true ELSE false END) FROM OtaPackageEntity f WHERE f.id = :id")
49 OtaPackageInfoEntity findOtaPackageInfoById(@Param("id") UUID id); 49 OtaPackageInfoEntity findOtaPackageInfoById(@Param("id") UUID id);
50 50
51 @Query(value = "SELECT exists(SELECT * " + 51 @Query(value = "SELECT exists(SELECT * " +
@@ -173,6 +173,7 @@ CREATE TABLE IF NOT EXISTS ota_package ( @@ -173,6 +173,7 @@ CREATE TABLE IF NOT EXISTS ota_package (
173 type varchar(32) NOT NULL, 173 type varchar(32) NOT NULL,
174 title varchar(255) NOT NULL, 174 title varchar(255) NOT NULL,
175 version varchar(255) NOT NULL, 175 version varchar(255) NOT NULL,
  176 + tag varchar(255),
176 url varchar(255), 177 url varchar(255),
177 file_name varchar(255), 178 file_name varchar(255),
178 content_type varchar(255), 179 content_type varchar(255),
@@ -188,6 +188,7 @@ CREATE TABLE IF NOT EXISTS ota_package ( @@ -188,6 +188,7 @@ CREATE TABLE IF NOT EXISTS ota_package (
188 type varchar(32) NOT NULL, 188 type varchar(32) NOT NULL,
189 title varchar(255) NOT NULL, 189 title varchar(255) NOT NULL,
190 version varchar(255) NOT NULL, 190 version varchar(255) NOT NULL,
  191 + tag varchar(255),
191 url varchar(255), 192 url varchar(255),
192 file_name varchar(255), 193 file_name varchar(255),
193 content_type varchar(255), 194 content_type varchar(255),