#include "country.h" PG_MODULE_MAGIC; static inline char *create_string (const char *chars) { char *str = palloc0(3 * sizeof(char)); memcpy(str, chars, 3 * sizeof(char)); return str; } static inline country country_from_str(const char *str) { if (strlen(str) != 2) elog(ERROR, "invalid country input string %s", str); switch (tolower(str[0]) | tolower(str[1]) << 8) { case AD: return 1; case AE: return 2; case AF: return 3; case AG: return 4; case AI: return 5; case AL: return 6; case AM: return 7; case AO: return 8; case AQ: return 9; case AR: return 10; case AS: return 11; case AT: return 12; case AU: return 13; case AW: return 14; case AX: return 15; case AZ: return 16; case BA: return 17; case BB: return 18; case BD: return 19; case BE: return 20; case BF: return 21; case BG: return 22; case BH: return 23; case BI: return 24; case BJ: return 25; case BL: return 26; case BM: return 27; case BN: return 28; case BO: return 29; case BQ: return 30; case BR: return 31; case BS: return 32; case BT: return 33; case BV: return 34; case BW: return 35; case BY: return 36; case BZ: return 37; case CA: return 38; case CC: return 39; case CD: return 40; case CF: return 41; case CG: return 42; case CH: return 43; case CI: return 44; case CK: return 45; case CL: return 46; case CM: return 47; case CN: return 48; case CO: return 49; case CR: return 50; case CU: return 51; case CV: return 52; case CW: return 53; case CX: return 54; case CY: return 55; case CZ: return 56; case DE: return 57; case DJ: return 58; case DK: return 59; case DM: return 60; case DO: return 61; case DZ: return 62; case EC: return 63; case EE: return 64; case EG: return 65; case EH: return 66; case ER: return 67; case ES: return 68; case ET: return 69; case FI: return 70; case FJ: return 71; case FK: return 72; case FM: return 73; case FO: return 74; case FR: return 75; case GA: return 76; case GB: return 77; case GD: return 78; case GE: return 79; case GF: return 80; case GG: return 81; case GH: return 82; case GI: return 83; case GL: return 84; case GM: return 85; case GN: return 86; case GP: return 87; case GQ: return 88; case GR: return 89; case GS: return 90; case GT: return 91; case GU: return 92; case GW: return 93; case GY: return 94; case HK: return 95; case HM: return 96; case HN: return 97; case HR: return 98; case HT: return 99; case HU: return 100; case ID: return 101; case IE: return 102; case IL: return 103; case IM: return 104; case IN: return 105; case IO: return 106; case IQ: return 107; case IR: return 108; case IS: return 109; case IT: return 110; case JE: return 111; case JM: return 112; case JO: return 113; case JP: return 114; case KE: return 115; case KG: return 116; case KH: return 117; case KI: return 118; case KM: return 119; case KN: return 120; case KP: return 121; case KR: return 122; case KW: return 123; case KY: return 124; case KZ: return 125; case LA: return 126; case LB: return 127; case LC: return 128; case LI: return 129; case LK: return 130; case LR: return 131; case LS: return 132; case LT: return 133; case LU: return 134; case LV: return 135; case LY: return 136; case MA: return 137; case MC: return 138; case MD: return 139; case ME: return 140; case MF: return 141; case MG: return 142; case MH: return 143; case MK: return 144; case ML: return 145; case MM: return 146; case MN: return 147; case MO: return 148; case MP: return 149; case MQ: return 150; case MR: return 151; case MS: return 152; case MT: return 153; case MU: return 154; case MV: return 155; case MW: return 156; case MX: return 157; case MY: return 158; case MZ: return 159; case NA: return 160; case NC: return 161; case NE: return 162; case NF: return 163; case NG: return 164; case NI: return 165; case NL: return 166; case NO: return 167; case NP: return 168; case NR: return 169; case NU: return 170; case NZ: return 171; case OM: return 172; case PA: return 173; case PE: return 174; case PF: return 175; case PG: return 176; case PH: return 177; case PK: return 178; case PL: return 179; case PM: return 180; case PN: return 181; case PR: return 182; case PS: return 183; case PT: return 184; case PW: return 185; case PY: return 186; case QA: return 187; case RE: return 188; case RO: return 189; case RS: return 190; case RU: return 191; case RW: return 192; case SA: return 193; case SB: return 194; case SC: return 195; case SD: return 196; case SE: return 197; case SG: return 198; case SH: return 199; case SI: return 200; case SJ: return 201; case SK: return 202; case SL: return 203; case SM: return 204; case SN: return 205; case SO: return 206; case SR: return 207; case SS: return 208; case ST: return 209; case SV: return 210; case SX: return 211; case SY: return 212; case SZ: return 213; case TC: return 214; case TD: return 215; case TF: return 216; case TG: return 217; case TH: return 218; case TJ: return 219; case TK: return 220; case TL: return 221; case TM: return 222; case TN: return 223; case TO: return 224; case TR: return 225; case TT: return 226; case TV: return 227; case TW: return 228; case TZ: return 229; case UA: return 230; case UG: return 231; case UK: return 232; case UM: return 233; case US: return 234; case UY: return 235; case UZ: return 236; case VA: return 237; case VC: return 238; case VE: return 239; case VG: return 240; case VI: return 241; case VN: return 242; case VU: return 243; case WF: return 244; case WS: return 245; case YE: return 246; case YT: return 247; case ZA: return 248; case ZM: return 249; case ZW: return 250; case ZZ: return 255; default: elog(ERROR, "invalid country input string %s", str); } } static inline char *country_to_str(country c) { switch (c) { case 1: return create_string("ad"); case 2: return create_string("ae"); case 3: return create_string("af"); case 4: return create_string("ag"); case 5: return create_string("ai"); case 6: return create_string("al"); case 7: return create_string("am"); case 8: return create_string("ao"); case 9: return create_string("aq"); case 10: return create_string("ar"); case 11: return create_string("as"); case 12: return create_string("at"); case 13: return create_string("au"); case 14: return create_string("aw"); case 15: return create_string("ax"); case 16: return create_string("az"); case 17: return create_string("ba"); case 18: return create_string("bb"); case 19: return create_string("bd"); case 20: return create_string("be"); case 21: return create_string("bf"); case 22: return create_string("bg"); case 23: return create_string("bh"); case 24: return create_string("bi"); case 25: return create_string("bj"); case 26: return create_string("bl"); case 27: return create_string("bm"); case 28: return create_string("bn"); case 29: return create_string("bo"); case 30: return create_string("bq"); case 31: return create_string("br"); case 32: return create_string("bs"); case 33: return create_string("bt"); case 34: return create_string("bv"); case 35: return create_string("bw"); case 36: return create_string("by"); case 37: return create_string("bz"); case 38: return create_string("ca"); case 39: return create_string("cc"); case 40: return create_string("cd"); case 41: return create_string("cf"); case 42: return create_string("cg"); case 43: return create_string("ch"); case 44: return create_string("ci"); case 45: return create_string("ck"); case 46: return create_string("cl"); case 47: return create_string("cm"); case 48: return create_string("cn"); case 49: return create_string("co"); case 50: return create_string("cr"); case 51: return create_string("cu"); case 52: return create_string("cv"); case 53: return create_string("cw"); case 54: return create_string("cx"); case 55: return create_string("cy"); case 56: return create_string("cz"); case 57: return create_string("de"); case 58: return create_string("dj"); case 59: return create_string("dk"); case 60: return create_string("dm"); case 61: return create_string("do"); case 62: return create_string("dz"); case 63: return create_string("ec"); case 64: return create_string("ee"); case 65: return create_string("eg"); case 66: return create_string("eh"); case 67: return create_string("er"); case 68: return create_string("es"); case 69: return create_string("et"); case 70: return create_string("fi"); case 71: return create_string("fj"); case 72: return create_string("fk"); case 73: return create_string("fm"); case 74: return create_string("fo"); case 75: return create_string("fr"); case 76: return create_string("ga"); case 77: return create_string("gb"); case 78: return create_string("gd"); case 79: return create_string("ge"); case 80: return create_string("gf"); case 81: return create_string("gg"); case 82: return create_string("gh"); case 83: return create_string("gi"); case 84: return create_string("gl"); case 85: return create_string("gm"); case 86: return create_string("gn"); case 87: return create_string("gp"); case 88: return create_string("gq"); case 89: return create_string("gr"); case 90: return create_string("gs"); case 91: return create_string("gt"); case 92: return create_string("gu"); case 93: return create_string("gw"); case 94: return create_string("gy"); case 95: return create_string("hk"); case 96: return create_string("hm"); case 97: return create_string("hn"); case 98: return create_string("hr"); case 99: return create_string("ht"); case 100: return create_string("hu"); case 101: return create_string("id"); case 102: return create_string("ie"); case 103: return create_string("il"); case 104: return create_string("im"); case 105: return create_string("in"); case 106: return create_string("io"); case 107: return create_string("iq"); case 108: return create_string("ir"); case 109: return create_string("is"); case 110: return create_string("it"); case 111: return create_string("je"); case 112: return create_string("jm"); case 113: return create_string("jo"); case 114: return create_string("jp"); case 115: return create_string("ke"); case 116: return create_string("kg"); case 117: return create_string("kh"); case 118: return create_string("ki"); case 119: return create_string("km"); case 120: return create_string("kn"); case 121: return create_string("kp"); case 122: return create_string("kr"); case 123: return create_string("kw"); case 124: return create_string("ky"); case 125: return create_string("kz"); case 126: return create_string("la"); case 127: return create_string("lb"); case 128: return create_string("lc"); case 129: return create_string("li"); case 130: return create_string("lk"); case 131: return create_string("lr"); case 132: return create_string("ls"); case 133: return create_string("lt"); case 134: return create_string("lu"); case 135: return create_string("lv"); case 136: return create_string("ly"); case 137: return create_string("ma"); case 138: return create_string("mc"); case 139: return create_string("md"); case 140: return create_string("me"); case 141: return create_string("mf"); case 142: return create_string("mg"); case 143: return create_string("mh"); case 144: return create_string("mk"); case 145: return create_string("ml"); case 146: return create_string("mm"); case 147: return create_string("mn"); case 148: return create_string("mo"); case 149: return create_string("mp"); case 150: return create_string("mq"); case 151: return create_string("mr"); case 152: return create_string("ms"); case 153: return create_string("mt"); case 154: return create_string("mu"); case 155: return create_string("mv"); case 156: return create_string("mw"); case 157: return create_string("mx"); case 158: return create_string("my"); case 159: return create_string("mz"); case 160: return create_string("na"); case 161: return create_string("nc"); case 162: return create_string("ne"); case 163: return create_string("nf"); case 164: return create_string("ng"); case 165: return create_string("ni"); case 166: return create_string("nl"); case 167: return create_string("no"); case 168: return create_string("np"); case 169: return create_string("nr"); case 170: return create_string("nu"); case 171: return create_string("nz"); case 172: return create_string("om"); case 173: return create_string("pa"); case 174: return create_string("pe"); case 175: return create_string("pf"); case 176: return create_string("pg"); case 177: return create_string("ph"); case 178: return create_string("pk"); case 179: return create_string("pl"); case 180: return create_string("pm"); case 181: return create_string("pn"); case 182: return create_string("pr"); case 183: return create_string("ps"); case 184: return create_string("pt"); case 185: return create_string("pw"); case 186: return create_string("py"); case 187: return create_string("qa"); case 188: return create_string("re"); case 189: return create_string("ro"); case 190: return create_string("rs"); case 191: return create_string("ru"); case 192: return create_string("rw"); case 193: return create_string("sa"); case 194: return create_string("sb"); case 195: return create_string("sc"); case 196: return create_string("sd"); case 197: return create_string("se"); case 198: return create_string("sg"); case 199: return create_string("sh"); case 200: return create_string("si"); case 201: return create_string("sj"); case 202: return create_string("sk"); case 203: return create_string("sl"); case 204: return create_string("sm"); case 205: return create_string("sn"); case 206: return create_string("so"); case 207: return create_string("sr"); case 208: return create_string("ss"); case 209: return create_string("st"); case 210: return create_string("sv"); case 211: return create_string("sx"); case 212: return create_string("sy"); case 213: return create_string("sz"); case 214: return create_string("tc"); case 215: return create_string("td"); case 216: return create_string("tf"); case 217: return create_string("tg"); case 218: return create_string("th"); case 219: return create_string("tj"); case 220: return create_string("tk"); case 221: return create_string("tl"); case 222: return create_string("tm"); case 223: return create_string("tn"); case 224: return create_string("to"); case 225: return create_string("tr"); case 226: return create_string("tt"); case 227: return create_string("tv"); case 228: return create_string("tw"); case 229: return create_string("tz"); case 230: return create_string("ua"); case 231: return create_string("ug"); case 232: return create_string("uk"); case 233: return create_string("um"); case 234: return create_string("us"); case 235: return create_string("uy"); case 236: return create_string("uz"); case 237: return create_string("va"); case 238: return create_string("vc"); case 239: return create_string("ve"); case 240: return create_string("vg"); case 241: return create_string("vi"); case 242: return create_string("vn"); case 243: return create_string("vu"); case 244: return create_string("wf"); case 245: return create_string("ws"); case 246: return create_string("ye"); case 247: return create_string("yt"); case 248: return create_string("za"); case 249: return create_string("zm"); case 250: return create_string("zw"); case 255: return create_string("zz"); default : elog(ERROR, "unknown output country"); } } PG_FUNCTION_INFO_V1(country_in); Datum country_in(PG_FUNCTION_ARGS) { char *str = PG_GETARG_CSTRING(0); PG_RETURN_UINT8(country_from_str(str)); } PG_FUNCTION_INFO_V1(country_out); Datum country_out(PG_FUNCTION_ARGS) { country c = PG_GETARG_UINT8(0); PG_RETURN_CSTRING(country_to_str(c)); } PG_FUNCTION_INFO_V1(country_recv); Datum country_recv(PG_FUNCTION_ARGS) { StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); const char *str = pq_getmsgstring(buf); pq_getmsgend(buf); PG_RETURN_UINT8(country_from_str(str)); } PG_FUNCTION_INFO_V1(country_send); Datum country_send(PG_FUNCTION_ARGS) { country c = PG_GETARG_UINT8(0); StringInfoData buf; pq_begintypsend(&buf); pq_sendstring(&buf, country_to_str(c)); PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); }