private int GetMaxValue(MSITableColumnCategoryType category) {
     switch (category) {
         case MSITableColumnCategoryType.Integer:
             return 32767;
         case MSITableColumnCategoryType.DoubleInteger:
             return 2147483647;
         case MSITableColumnCategoryType.TimeDate:
             return 2147483647;
         default:
             throw new ApplicationException("Unhandled category: "+ category.ToString());
     }
 }
 private bool IsNumeric(MSITableColumnCategoryType category) {
     switch (category) {
         case MSITableColumnCategoryType.Integer:
         case MSITableColumnCategoryType.DoubleInteger:
         case MSITableColumnCategoryType.TimeDate:
             return true;
         default:
             return false;
     }
 }
 private string GetNonNullableMsiColumnType(MSITableColumnCategoryType category) {
     switch (category) {
         case MSITableColumnCategoryType.Text:
             return "s0";
         case MSITableColumnCategoryType.UpperCase:
             return "s72";
         case MSITableColumnCategoryType.LowerCase:
             return "s72";
         case MSITableColumnCategoryType.Integer:
             return "i2";
         case MSITableColumnCategoryType.DoubleInteger:
             return "i4";
         case MSITableColumnCategoryType.TimeDate:
             return "i4";
         case MSITableColumnCategoryType.Identifier:
             return "s72";
         case MSITableColumnCategoryType.Property:
             return "s72";
         case MSITableColumnCategoryType.Filename:
             return "s255";
         case MSITableColumnCategoryType.WildCardFilename:
             return "l0";
         case MSITableColumnCategoryType.Path:
             return "s255";
         case MSITableColumnCategoryType.Paths:
             return "s255";
         case MSITableColumnCategoryType.AnyPath:
             return "s255";
         case MSITableColumnCategoryType.DefaultDir:
             return "l255";
         case MSITableColumnCategoryType.RegPath:
             return "l255";
         case MSITableColumnCategoryType.Formatted:
             return "s255";
         case MSITableColumnCategoryType.Template:
             return "l0";
         case MSITableColumnCategoryType.Condition:
             return "s255";
         case MSITableColumnCategoryType.GUID:
             return "s38";
         case MSITableColumnCategoryType.Version:
             return "s32";
         case MSITableColumnCategoryType.Language:
             return "s255";
         case MSITableColumnCategoryType.Binary:
             return "v0";
             // case MSITableColumnCategoryType.CustomSource:
             // return "s72";
         case MSITableColumnCategoryType.Cabinet:
             return "s255";
         case MSITableColumnCategoryType.Shortcut:
             return "s72";
         default:
             throw new ApplicationException("Unhandled category: "+ category.ToString());
     }
 }
 private string GetType(MSITableColumnCategoryType category) {
     if (IsNumeric(category)) {
         return "int";
     } else if (category == MSITableColumnCategoryType.Binary) {
         return "binary";
     } else {
         return "string";
     }
 }
 private string GetMsiColumnType(MSITableColumnCategoryType category, bool nullable) {
     if (nullable) {
         return GetNonNullableMsiColumnType(category).ToUpper();
     } else {
         return GetNonNullableMsiColumnType(category);
     }
 }