airavata-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From machris...@apache.org
Subject airavata git commit: AIRAVATA-2350 Including GATEWAY_ID in user resource profile keys
Date Wed, 29 Mar 2017 15:59:44 GMT
Repository: airavata
Updated Branches:
  refs/heads/develop 6bc536f59 -> 98ebc2c35


AIRAVATA-2350 Including GATEWAY_ID in user resource profile keys


Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/98ebc2c3
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/98ebc2c3
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/98ebc2c3

Branch: refs/heads/develop
Commit: 98ebc2c35b7e48ea1d63c25a42cf3c530c607144
Parents: 6bc536f
Author: Marcus Christie <machristie@apache.org>
Authored: Wed Mar 29 11:58:01 2017 -0400
Committer: Marcus Christie <machristie@apache.org>
Committed: Wed Mar 29 11:58:46 2017 -0400

----------------------------------------------------------------------
 .../catalog/impl/UsrResourceProfileImpl.java    |  4 ++--
 .../model/UserComputeResourcePreference.java    |  1 +
 .../model/UserComputeResourcePreferencePK.java  | 24 ++++++++++++++++----
 .../catalog/model/UserStoragePreference.java    |  1 +
 .../catalog/model/UserStoragePreferencePK.java  | 22 +++++++++++++++---
 .../UserComputeHostPreferenceResource.java      | 10 +++++---
 .../UserStoragePreferenceResource.java          | 14 ++++++++----
 .../registry/cpi/CompositeIdentifier.java       | 12 +++++++++-
 .../DeltaScripts/appCatalog_schema_delta.sql    |  6 ++---
 9 files changed, 73 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/98ebc2c3/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/UsrResourceProfileImpl.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/UsrResourceProfileImpl.java
b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/UsrResourceProfileImpl.java
index bb4cc0b..98c1af7 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/UsrResourceProfileImpl.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/impl/UsrResourceProfileImpl.java
@@ -205,7 +205,7 @@ public class UsrResourceProfileImpl implements UsrResourceProfile {
     public boolean removeUserComputeResourcePreferenceFromGateway(String userId, String gatewayId,
String preferenceId) throws AppCatalogException {
         try {
             UserComputeHostPreferenceResource resource = new UserComputeHostPreferenceResource();
-            CompositeIdentifier ids = new CompositeIdentifier(preferenceId, userId);
+            CompositeIdentifier ids = new CompositeIdentifier(preferenceId, userId, gatewayId);
             resource.remove(ids);
             return true;
         }catch (Exception e) {
@@ -218,7 +218,7 @@ public class UsrResourceProfileImpl implements UsrResourceProfile {
     public boolean removeUserDataStoragePreferenceFromGateway(String userId, String gatewayId,
String preferenceId) throws AppCatalogException {
         try {
             UserStoragePreferenceResource resource = new UserStoragePreferenceResource();
-            CompositeIdentifier ids = new CompositeIdentifier(preferenceId,userId);
+            CompositeIdentifier ids = new CompositeIdentifier(preferenceId,userId, gatewayId);
             resource.remove(ids);
             return true;
         }catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/airavata/blob/98ebc2c3/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserComputeResourcePreference.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserComputeResourcePreference.java
b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserComputeResourcePreference.java
index 05f6e7c..599793a 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserComputeResourcePreference.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserComputeResourcePreference.java
@@ -35,6 +35,7 @@ public class UserComputeResourcePreference {
     @Id
     @Column(name = "RESOURCE_ID")
     private String resourceId;
+    @Id
     @Column(name = "GATEWAY_ID")
     private String gatewayID;
     @Column(name = "PREFERED_BATCH_QUEUE")

http://git-wip-us.apache.org/repos/asf/airavata/blob/98ebc2c3/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserComputeResourcePreferencePK.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserComputeResourcePreferencePK.java
b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserComputeResourcePreferencePK.java
index 0192f79..fbb7dd7 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserComputeResourcePreferencePK.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserComputeResourcePreferencePK.java
@@ -24,11 +24,13 @@ package org.apache.airavata.registry.core.app.catalog.model;
 import java.io.Serializable;
 
 public class UserComputeResourcePreferencePK implements Serializable {
-    private String resourceId;
     private String userId;
+    private String gatewayID;
+    private String resourceId;
 
-    public UserComputeResourcePreferencePK(String userId, String resourceId) {
+    public UserComputeResourcePreferencePK(String userId, String gatewayID, String resourceId)
{
         this.userId = userId;
+        this.gatewayID = gatewayID;
         this.resourceId = resourceId;
     }
 
@@ -37,12 +39,22 @@ public class UserComputeResourcePreferencePK implements Serializable {
 
     @Override
     public boolean equals(Object o) {
-        return false;
+        if (this == o) return true;
+        if (!(o instanceof UserComputeResourcePreferencePK)) return false;
+
+        UserComputeResourcePreferencePK that = (UserComputeResourcePreferencePK) o;
+
+        if (!userId.equals(that.userId)) return false;
+        if (!gatewayID.equals(that.gatewayID)) return false;
+        return resourceId.equals(that.resourceId);
     }
 
     @Override
     public int hashCode() {
-        return 1;
+        int result = userId.hashCode();
+        result = 31 * result + gatewayID.hashCode();
+        result = 31 * result + resourceId.hashCode();
+        return result;
     }
 
     public String getUserId() {
@@ -60,4 +72,8 @@ public class UserComputeResourcePreferencePK implements Serializable {
     public void setResourceId(String resourceId) {
         this.resourceId = resourceId;
     }
+
+    public String getGatewayID() { return gatewayID; }
+
+    public void setGatewayID(String gatewayID) { this.gatewayID = gatewayID; }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/98ebc2c3/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserStoragePreference.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserStoragePreference.java
b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserStoragePreference.java
index 3efbd7b..9b96d9f 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserStoragePreference.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserStoragePreference.java
@@ -31,6 +31,7 @@ public class UserStoragePreference {
     @Id
     @Column(name = "USER_ID")
     private String userId;
+    @Id
     @Column(name = "GATEWAY_ID")
     private String gatewayID;
     @Id

http://git-wip-us.apache.org/repos/asf/airavata/blob/98ebc2c3/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserStoragePreferencePK.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserStoragePreferencePK.java
b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserStoragePreferencePK.java
index 7943b5a..9fdbe6a 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserStoragePreferencePK.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/model/UserStoragePreferencePK.java
@@ -26,10 +26,12 @@ import java.io.Serializable;
 public class UserStoragePreferencePK implements Serializable {
 
     private String userId;
+    private String gatewayID;
     private String storageResourceId;
 
-    public UserStoragePreferencePK(String userId, String storageResourceId) {
+    public UserStoragePreferencePK(String userId, String gatewayID, String storageResourceId)
{
         this.userId = userId;
+        this.gatewayID = gatewayID;
         this.storageResourceId = storageResourceId;
     }
 
@@ -38,12 +40,22 @@ public class UserStoragePreferencePK implements Serializable {
 
     @Override
     public boolean equals(Object o) {
-        return false;
+        if (this == o) return true;
+        if (!(o instanceof UserStoragePreferencePK)) return false;
+
+        UserStoragePreferencePK that = (UserStoragePreferencePK) o;
+
+        if (!userId.equals(that.userId)) return false;
+        if (!gatewayID.equals(that.gatewayID)) return false;
+        return storageResourceId.equals(that.storageResourceId);
     }
 
     @Override
     public int hashCode() {
-        return 1;
+        int result = userId.hashCode();
+        result = 31 * result + gatewayID.hashCode();
+        result = 31 * result + storageResourceId.hashCode();
+        return result;
     }
 
     public String getUserId() {
@@ -61,4 +73,8 @@ public class UserStoragePreferencePK implements Serializable {
     public void setStorageResourceId(String storageResourceId) {
         this.storageResourceId = storageResourceId;
     }
+
+    public String getGatewayID() { return gatewayID; }
+
+    public void setGatewayID(String gatewayID) { this.gatewayID = gatewayID; }
 }

http://git-wip-us.apache.org/repos/asf/airavata/blob/98ebc2c3/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/UserComputeHostPreferenceResource.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/UserComputeHostPreferenceResource.java
b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/UserComputeHostPreferenceResource.java
index 1dcbe9d..cbcf603 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/UserComputeHostPreferenceResource.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/UserComputeHostPreferenceResource.java
@@ -185,6 +185,7 @@ public class UserComputeHostPreferenceResource extends AppCatAbstractResource
{
             AppCatalogQueryGenerator generator = new AppCatalogQueryGenerator(USER_COMPUTE_RESOURCE_PREFERENCE);
             generator.setParameter(UserComputeResourcePreferenceConstants.RESOURCE_ID, ids.getTopLevelIdentifier().toString());
             generator.setParameter(UserComputeResourcePreferenceConstants.USER_ID, ids.getSecondLevelIdentifier().toString());
+            generator.setParameter(UserComputeResourcePreferenceConstants.GATEWAY_ID, ids.getThirdLevelIdentifier().toString());
 
             Query q = generator.deleteQuery(em);
             q.executeUpdate();
@@ -225,6 +226,7 @@ public class UserComputeHostPreferenceResource extends AppCatAbstractResource
{
             AppCatalogQueryGenerator generator = new AppCatalogQueryGenerator(USER_COMPUTE_RESOURCE_PREFERENCE);
             generator.setParameter(UserComputeResourcePreferenceConstants.RESOURCE_ID, ids.getTopLevelIdentifier().toString());
             generator.setParameter(UserComputeResourcePreferenceConstants.USER_ID, ids.getSecondLevelIdentifier().toString());
+            generator.setParameter(UserComputeResourcePreferenceConstants.GATEWAY_ID, ids.getThirdLevelIdentifier().toString());
             Query q = generator.selectQuery(em);
             UserComputeResourcePreference preference = (UserComputeResourcePreference) q.getSingleResult();
             UserComputeHostPreferenceResource preferenceResource =
@@ -351,7 +353,7 @@ public class UserComputeHostPreferenceResource extends AppCatAbstractResource
{
         EntityManager em = null;
         try {
             em = AppCatalogJPAUtils.getEntityManager();
-            UserComputeResourcePreference existingPreference = em.find(UserComputeResourcePreference.class,
new UserComputeResourcePreferencePK(userId, resourceId));
+            UserComputeResourcePreference existingPreference = em.find(UserComputeResourcePreference.class,
new UserComputeResourcePreferencePK(userId, gatewayID, resourceId));
             if (em.isOpen()) {
                 if (em.getTransaction().isActive()){
                     em.getTransaction().rollback();
@@ -429,9 +431,11 @@ public class UserComputeHostPreferenceResource extends AppCatAbstractResource
{
         EntityManager em = null;
         try {
             em = AppCatalogJPAUtils.getEntityManager();
+            String resourceId = ids.getTopLevelIdentifier().toString();
+            String userId = ids.getSecondLevelIdentifier().toString();
+            String gatewayId = ids.getThirdLevelIdentifier().toString();
             UserComputeResourcePreference existingPreference = em.find(UserComputeResourcePreference.class,
-                    new UserComputeResourcePreferencePK(ids.getTopLevelIdentifier().toString(),
-                            ids.getSecondLevelIdentifier().toString()));
+                    new UserComputeResourcePreferencePK(userId, gatewayId, resourceId));
             if (em.isOpen()) {
                 if (em.getTransaction().isActive()){
                     em.getTransaction().rollback();

http://git-wip-us.apache.org/repos/asf/airavata/blob/98ebc2c3/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/UserStoragePreferenceResource.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/UserStoragePreferenceResource.java
b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/UserStoragePreferenceResource.java
index 34852ae..2eb9c2b 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/UserStoragePreferenceResource.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/app/catalog/resources/UserStoragePreferenceResource.java
@@ -124,6 +124,7 @@ public class UserStoragePreferenceResource extends AppCatAbstractResource
{
             AppCatalogQueryGenerator generator = new AppCatalogQueryGenerator(USER_STORAGE_PREFERENCE);
             generator.setParameter(UserStoragePreferenceConstants.STORAGE_ID, ids.getTopLevelIdentifier().toString());
             generator.setParameter(UserStoragePreferenceConstants.USER_ID, ids.getSecondLevelIdentifier().toString());
+            generator.setParameter(UserStoragePreferenceConstants.GATEWAY_ID, ids.getThirdLevelIdentifier().toString());
 
             Query q = generator.deleteQuery(em);
             q.executeUpdate();
@@ -162,8 +163,9 @@ public class UserStoragePreferenceResource extends AppCatAbstractResource
{
             em = AppCatalogJPAUtils.getEntityManager();
             em.getTransaction().begin();
             AppCatalogQueryGenerator generator = new AppCatalogQueryGenerator(USER_STORAGE_PREFERENCE);
-            generator.setParameter(UserStoragePreferenceConstants.USER_ID, ids.getTopLevelIdentifier().toString());
-            generator.setParameter(UserStoragePreferenceConstants.STORAGE_ID, ids.getSecondLevelIdentifier().toString());
+            generator.setParameter(UserStoragePreferenceConstants.STORAGE_ID, ids.getTopLevelIdentifier().toString());
+            generator.setParameter(UserStoragePreferenceConstants.USER_ID, ids.getSecondLevelIdentifier().toString());
+            generator.setParameter(UserStoragePreferenceConstants.GATEWAY_ID, ids.getThirdLevelIdentifier().toString());
             Query q = generator.selectQuery(em);
             UserStoragePreference preference = (UserStoragePreference) q.getSingleResult();
             UserStoragePreferenceResource preferenceResource =
@@ -290,7 +292,7 @@ public class UserStoragePreferenceResource extends AppCatAbstractResource
{
         EntityManager em = null;
         try {
             em = AppCatalogJPAUtils.getEntityManager();
-            UserStoragePreference existingPreference = em.find(UserStoragePreference.class,
new UserStoragePreferencePK(userId, storageResourceId));
+            UserStoragePreference existingPreference = em.find(UserStoragePreference.class,
new UserStoragePreferencePK(userId, gatewayID, storageResourceId));
             if (em.isOpen()) {
                 if (em.getTransaction().isActive()){
                     em.getTransaction().rollback();
@@ -354,9 +356,11 @@ public class UserStoragePreferenceResource extends AppCatAbstractResource
{
         EntityManager em = null;
         try {
             em = AppCatalogJPAUtils.getEntityManager();
+            String storageResourceId = ids.getTopLevelIdentifier().toString();
+            String userId = ids.getSecondLevelIdentifier().toString();
+            String gatewayID = ids.getThirdLevelIdentifier().toString();
             UserStoragePreference existingPreference = em.find(UserStoragePreference.class,
-                    new UserStoragePreferencePK(ids.getTopLevelIdentifier().toString(),
-                            ids.getSecondLevelIdentifier().toString()));
+                    new UserStoragePreferencePK(userId, gatewayID, storageResourceId));
             if (em.isOpen()) {
                 if (em.getTransaction().isActive()){
                     em.getTransaction().rollback();

http://git-wip-us.apache.org/repos/asf/airavata/blob/98ebc2c3/modules/registry/registry-cpi/src/main/java/org/apache/airavata/registry/cpi/CompositeIdentifier.java
----------------------------------------------------------------------
diff --git a/modules/registry/registry-cpi/src/main/java/org/apache/airavata/registry/cpi/CompositeIdentifier.java
b/modules/registry/registry-cpi/src/main/java/org/apache/airavata/registry/cpi/CompositeIdentifier.java
index fee8aec..1e203ba 100644
--- a/modules/registry/registry-cpi/src/main/java/org/apache/airavata/registry/cpi/CompositeIdentifier.java
+++ b/modules/registry/registry-cpi/src/main/java/org/apache/airavata/registry/cpi/CompositeIdentifier.java
@@ -28,12 +28,18 @@ package org.apache.airavata.registry.cpi;
 public class CompositeIdentifier {
     private Object topLevelIdentifier;
     private Object secondLevelIdentifier;
+    private Object thirdLevelIdentifier;
 
     public CompositeIdentifier(Object topLevelIdentifier, Object secondLevelIdentifier) {
         this.topLevelIdentifier = topLevelIdentifier;
         this.secondLevelIdentifier = secondLevelIdentifier;
     }
 
+    public CompositeIdentifier(Object topLevelIdentifier, Object secondLevelIdentifier, Object
thirdLevelIdentifier) {
+        this(topLevelIdentifier, secondLevelIdentifier);
+        this.thirdLevelIdentifier = thirdLevelIdentifier;
+    }
+
     public Object getTopLevelIdentifier() {
         return topLevelIdentifier;
     }
@@ -42,9 +48,13 @@ public class CompositeIdentifier {
         return secondLevelIdentifier;
     }
 
+    public Object getThirdLevelIdentifier() { return thirdLevelIdentifier; }
+
     @Override
     public String toString() {
-        if (topLevelIdentifier instanceof String && secondLevelIdentifier instanceof
String) {
+        if (thirdLevelIdentifier != null && thirdLevelIdentifier instanceof String
&& topLevelIdentifier instanceof String && secondLevelIdentifier instanceof
String) {
+            return topLevelIdentifier + "," + secondLevelIdentifier + "," + thirdLevelIdentifier;
+        } else if (topLevelIdentifier instanceof String && secondLevelIdentifier
instanceof String) {
             return topLevelIdentifier + "," + secondLevelIdentifier;
         }else if (topLevelIdentifier instanceof String ) {
             return topLevelIdentifier.toString();

http://git-wip-us.apache.org/repos/asf/airavata/blob/98ebc2c3/modules/registry/release-migration-scripts/0.16-0.17/DeltaScripts/appCatalog_schema_delta.sql
----------------------------------------------------------------------
diff --git a/modules/registry/release-migration-scripts/0.16-0.17/DeltaScripts/appCatalog_schema_delta.sql
b/modules/registry/release-migration-scripts/0.16-0.17/DeltaScripts/appCatalog_schema_delta.sql
index e2f5dec..6832fdb 100644
--- a/modules/registry/release-migration-scripts/0.16-0.17/DeltaScripts/appCatalog_schema_delta.sql
+++ b/modules/registry/release-migration-scripts/0.16-0.17/DeltaScripts/appCatalog_schema_delta.sql
@@ -16,7 +16,7 @@ CREATE TABLE `USER_RESOURCE_PROFILE` (
   `IDENTITY_SERVER_PWD_CRED_TOKEN` varchar(255) DEFAULT NULL,
   `IDENTITY_SERVER_TENANT` varchar(255) DEFAULT NULL,
   `UPDATE_TIME` datetime DEFAULT NULL,
-  PRIMARY KEY (`USER_ID`)
+  PRIMARY KEY (`USER_ID`,`GATEWAY_ID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 CREATE TABLE `USER_STORAGE_PREFERENCE` (
   `STORAGE_RESOURCE_ID` varchar(255) NOT NULL,
@@ -25,7 +25,7 @@ CREATE TABLE `USER_STORAGE_PREFERENCE` (
   `FS_ROOT_LOCATION` varchar(255) DEFAULT NULL,
   `GATEWAY_ID` varchar(255) DEFAULT NULL,
   `LOGIN_USERNAME` varchar(255) DEFAULT NULL,
-  PRIMARY KEY (`STORAGE_RESOURCE_ID`,`USER_ID`)
+  PRIMARY KEY (`STORAGE_RESOURCE_ID`,`USER_ID`,`GATEWAY_ID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 CREATE TABLE `CLOUD_JOB_SUBMISSION` (
   `JOB_SUBMISSION_INTERFACE_ID` varchar(255) NOT NULL,
@@ -49,7 +49,7 @@ CREATE TABLE `USER_COMPUTE_RESOURCE_PREFERENCE` (
   `RESERVATION_END_TIME` datetime DEFAULT NULL,
   `RESERVATION_START_TIME` datetime DEFAULT NULL,
   `SCRATCH_LOCATION` varchar(255) DEFAULT NULL,
-  PRIMARY KEY (`RESOURCE_ID`,`USER_ID`)
+  PRIMARY KEY (`RESOURCE_ID`,`USER_ID`,`GATEWAY_ID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 ALTER TABLE `BATCH_QUEUE` ADD `DEFAULT_CPU_COUNT` int(11) DEFAULT NULL;
 ALTER TABLE `BATCH_QUEUE` ADD `DEFAULT_NODE_COUNT` int(11) DEFAULT NULL;


Mime
View raw message