commit
cac2a66e7f
11 changed files with 116 additions and 32 deletions
|
|
@ -5,4 +5,36 @@ $$
|
|||
SELECT 'v1.5.1-ee'
|
||||
$$ LANGUAGE sql IMMUTABLE;
|
||||
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'AC';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'AN';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'BU';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'CP';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'CS';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'CT';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'DD';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'DG';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'DY';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'EA';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'FQ';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'FX';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'HV';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'IC';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'JT';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'MI';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'NH';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'NQ';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'NT';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'PC';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'PU';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'PZ';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'RH';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'SU';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'TA';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'TP';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'VD';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'WK';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'YD';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'YU';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'ZR';
|
||||
|
||||
COMMIT;
|
||||
|
|
@ -7,7 +7,7 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
|||
CREATE OR REPLACE FUNCTION openreplay_version()
|
||||
RETURNS text AS
|
||||
$$
|
||||
SELECT 'v1.5.0-ee'
|
||||
SELECT 'v1.5.1-ee'
|
||||
$$ LANGUAGE sql IMMUTABLE;
|
||||
|
||||
|
||||
|
|
@ -569,7 +569,7 @@ $$
|
|||
IF NOT EXISTS(SELECT *
|
||||
FROM pg_type typ
|
||||
WHERE typ.typname = 'country') THEN
|
||||
CREATE TYPE country AS ENUM ('UN','RW','SO','YE','IQ','SA','IR','CY','TZ','SY','AM','KE','CD','DJ','UG','CF','SC','JO','LB','KW','OM','QA','BH','AE','IL','TR','ET','ER','EG','SD','GR','BI','EE','LV','AZ','LT','SJ','GE','MD','BY','FI','AX','UA','MK','HU','BG','AL','PL','RO','XK','ZW','ZM','KM','MW','LS','BW','MU','SZ','RE','ZA','YT','MZ','MG','AF','PK','BD','TM','TJ','LK','BT','IN','MV','IO','NP','MM','UZ','KZ','KG','TF','HM','CC','PW','VN','TH','ID','LA','TW','PH','MY','CN','HK','BN','MO','KH','KR','JP','KP','SG','CK','TL','RU','MN','AU','CX','MH','FM','PG','SB','TV','NR','VU','NC','NF','NZ','FJ','LY','CM','SN','CG','PT','LR','CI','GH','GQ','NG','BF','TG','GW','MR','BJ','GA','SL','ST','GI','GM','GN','TD','NE','ML','EH','TN','ES','MA','MT','DZ','FO','DK','IS','GB','CH','SE','NL','AT','BE','DE','LU','IE','MC','FR','AD','LI','JE','IM','GG','SK','CZ','NO','VA','SM','IT','SI','ME','HR','BA','AO','NA','SH','BV','BB','CV','GY','GF','SR','PM','GL','PY','UY','BR','FK','GS','JM','DO','CU','MQ','BS','BM','AI','TT','KN','DM','AG','LC','TC','AW','VG','VC','MS','MF','BL','GP','GD','KY','BZ','SV','GT','HN','NI','CR','VE','EC','CO','PA','HT','AR','CL','BO','PE','MX','PF','PN','KI','TK','TO','WF','WS','NU','MP','GU','PR','VI','UM','AS','CA','US','PS','RS','AQ','SX','CW','BQ','SS');
|
||||
CREATE TYPE country AS ENUM ('UN','RW','SO','YE','IQ','SA','IR','CY','TZ','SY','AM','KE','CD','DJ','UG','CF','SC','JO','LB','KW','OM','QA','BH','AE','IL','TR','ET','ER','EG','SD','GR','BI','EE','LV','AZ','LT','SJ','GE','MD','BY','FI','AX','UA','MK','HU','BG','AL','PL','RO','XK','ZW','ZM','KM','MW','LS','BW','MU','SZ','RE','ZA','YT','MZ','MG','AF','PK','BD','TM','TJ','LK','BT','IN','MV','IO','NP','MM','UZ','KZ','KG','TF','HM','CC','PW','VN','TH','ID','LA','TW','PH','MY','CN','HK','BN','MO','KH','KR','JP','KP','SG','CK','TL','RU','MN','AU','CX','MH','FM','PG','SB','TV','NR','VU','NC','NF','NZ','FJ','LY','CM','SN','CG','PT','LR','CI','GH','GQ','NG','BF','TG','GW','MR','BJ','GA','SL','ST','GI','GM','GN','TD','NE','ML','EH','TN','ES','MA','MT','DZ','FO','DK','IS','GB','CH','SE','NL','AT','BE','DE','LU','IE','MC','FR','AD','LI','JE','IM','GG','SK','CZ','NO','VA','SM','IT','SI','ME','HR','BA','AO','NA','SH','BV','BB','CV','GY','GF','SR','PM','GL','PY','UY','BR','FK','GS','JM','DO','CU','MQ','BS','BM','AI','TT','KN','DM','AG','LC','TC','AW','VG','VC','MS','MF','BL','GP','GD','KY','BZ','SV','GT','HN','NI','CR','VE','EC','CO','PA','HT','AR','CL','BO','PE','MX','PF','PN','KI','TK','TO','WF','WS','NU','MP','GU','PR','VI','UM','AS','CA','US','PS','RS','AQ','SX','CW','BQ','SS','AC','AN','BU','CP','CS','CT','DD','DG','DY','EA','FQ','FX','HV','IC','JT','MI','NH','NQ','NT','PC','PU','PZ','RH','SU','TA','TP','VD','WK','YD','YU','ZR');
|
||||
END IF;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS sessions
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ export default withRequest({
|
|||
dataWrapper: data => data,
|
||||
dataName: 'assistCredendials',
|
||||
loadingName: 'loadingCredentials',
|
||||
})(withPermissions(['SESSION_REPLAY', 'ASSIST_LIVE'], '', true)(connect(
|
||||
})(withPermissions(['ASSIST_LIVE'], '', true)(connect(
|
||||
state => {
|
||||
const isAssist = state.getIn(['sessions', 'activeTab']).type === 'live';
|
||||
const hasSessioPath = state.getIn([ 'sessions', 'sessionPath' ]).includes('/sessions');
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import withPermissions from 'HOCs/withPermissions'
|
|||
import { KEYS } from 'Types/filter/customFilter';
|
||||
import { applyFilter, addAttribute } from 'Duck/filters';
|
||||
import { FilterCategory, FilterKey } from 'App/types/filter/filterType';
|
||||
import { addFilterByKeyAndValue, updateCurrentPage, toggleSortOrder } from 'Duck/liveSearch';
|
||||
import { addFilterByKeyAndValue, updateCurrentPage, updateSort } from 'Duck/liveSearch';
|
||||
import DropdownPlain from 'Shared/DropdownPlain';
|
||||
import SortOrderButton from 'Shared/SortOrderButton';
|
||||
import { TimezoneDropdown } from 'UI';
|
||||
|
|
@ -28,12 +28,12 @@ interface Props {
|
|||
updateCurrentPage: (page: number) => void,
|
||||
currentPage: number,
|
||||
metaList: any,
|
||||
sortOrder: string,
|
||||
toggleSortOrder: (sortOrder: string) => void,
|
||||
updateSort: (sort: any) => void,
|
||||
sort: any,
|
||||
}
|
||||
|
||||
function LiveSessionList(props: Props) {
|
||||
const { loading, filters, list, currentPage, metaList = [], sortOrder } = props;
|
||||
const { loading, filters, list, currentPage, metaList = [], sort } = props;
|
||||
var timeoutId;
|
||||
const hasUserFilter = filters.map(i => i.key).includes(KEYS.USERID);
|
||||
const [sessions, setSessions] = React.useState(list);
|
||||
|
|
@ -41,7 +41,6 @@ function LiveSessionList(props: Props) {
|
|||
text: capitalize(i), value: i
|
||||
})).toJS();
|
||||
|
||||
const [sortBy, setSortBy] = React.useState('');
|
||||
const displayedCount = Math.min(currentPage * PER_PAGE, sessions.size);
|
||||
|
||||
const addPage = () => props.updateCurrentPage(props.currentPage + 1)
|
||||
|
|
@ -53,9 +52,11 @@ function LiveSessionList(props: Props) {
|
|||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (metaList.size === 0 || !!sortBy) return;
|
||||
if (metaList.size === 0 || !!sort.field) return;
|
||||
|
||||
setSortBy(sortOptions[0] && sortOptions[0].value)
|
||||
if ( sortOptions[0]) {
|
||||
props.updateSort({ field: sortOptions[0].value });
|
||||
}
|
||||
}, [metaList]);
|
||||
|
||||
useEffect(() => {
|
||||
|
|
@ -96,7 +97,7 @@ function LiveSessionList(props: Props) {
|
|||
}
|
||||
|
||||
const onSortChange = (e, { value }) => {
|
||||
setSortBy(value);
|
||||
props.updateSort({ field: value });
|
||||
}
|
||||
|
||||
const timeout = () => {
|
||||
|
|
@ -106,6 +107,8 @@ function LiveSessionList(props: Props) {
|
|||
}, AUTOREFRESH_INTERVAL);
|
||||
}
|
||||
|
||||
console.log('srt', sort)
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className="flex mb-6 justify-between items-end">
|
||||
|
|
@ -125,10 +128,10 @@ function LiveSessionList(props: Props) {
|
|||
<DropdownPlain
|
||||
options={sortOptions}
|
||||
onChange={onSortChange}
|
||||
value={sortBy}
|
||||
value={sort.field}
|
||||
/>
|
||||
</div>
|
||||
<SortOrderButton onChange={props.toggleSortOrder} sortOrder={sortOrder} />
|
||||
<SortOrderButton onChange={(state) => props.updateSort({ order: state })} sortOrder={sort.order} />
|
||||
</div>
|
||||
</div>
|
||||
<NoContent
|
||||
|
|
@ -143,8 +146,8 @@ function LiveSessionList(props: Props) {
|
|||
show={ !loading && sessions && sessions.size === 0}
|
||||
>
|
||||
<Loader loading={ loading }>
|
||||
{sessions && sessions.sortBy(i => i.metadata[sortBy]).update(list => {
|
||||
return sortOrder === 'desc' ? list.reverse() : list;
|
||||
{sessions && sessions.sortBy(i => i.metadata[sort.field]).update(list => {
|
||||
return sort.order === 'desc' ? list.reverse() : list;
|
||||
}).take(displayedCount).map(session => (
|
||||
<SessionItem
|
||||
key={ session.sessionId }
|
||||
|
|
@ -168,14 +171,14 @@ function LiveSessionList(props: Props) {
|
|||
)
|
||||
}
|
||||
|
||||
export default withPermissions(['ASSIST_LIVE', 'SESSION_REPLAY'])(connect(
|
||||
export default withPermissions(['ASSIST_LIVE'])(connect(
|
||||
(state) => ({
|
||||
list: state.getIn(['sessions', 'liveSessions']),
|
||||
loading: state.getIn([ 'sessions', 'loading' ]),
|
||||
filters: state.getIn([ 'liveSearch', 'instance', 'filters' ]),
|
||||
currentPage: state.getIn(["liveSearch", "currentPage"]),
|
||||
metaList: state.getIn(['customFields', 'list']).map(i => i.key),
|
||||
sortOrder: state.getIn(['liveSearch', 'sortOrder']),
|
||||
sort: state.getIn(['liveSearch', 'sort']),
|
||||
}),
|
||||
{
|
||||
fetchLiveList,
|
||||
|
|
@ -183,6 +186,6 @@ export default withPermissions(['ASSIST_LIVE', 'SESSION_REPLAY'])(connect(
|
|||
addAttribute,
|
||||
addFilterByKeyAndValue,
|
||||
updateCurrentPage,
|
||||
toggleSortOrder,
|
||||
updateSort,
|
||||
}
|
||||
)(LiveSessionList));
|
||||
|
|
|
|||
|
|
@ -17,16 +17,16 @@ export default function MetaMoreButton(props: Props) {
|
|||
</span>
|
||||
</div>
|
||||
) }
|
||||
className="p-0"
|
||||
content={
|
||||
<div className="flex flex-col">
|
||||
<div className="text-sm grid grid-col p-4 gap-3" style={{ maxHeight: '200px', overflowY: 'auto'}}>
|
||||
{list.slice(maxLength).map(({ label, value }, index) => (
|
||||
<MetaItem key={index} label={label} value={value} className="mb-3" />
|
||||
<MetaItem key={index} label={label} value={value} />
|
||||
))}
|
||||
</div>
|
||||
}
|
||||
on="click"
|
||||
position="center center"
|
||||
hideOnScroll
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ interface Props {
|
|||
className?: string,
|
||||
metaList: []
|
||||
}
|
||||
const MAX_LENGTH = 3;
|
||||
const MAX_LENGTH = 4;
|
||||
export default function SessionMetaList(props: Props) {
|
||||
const { className = '', metaList } = props
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -15,14 +15,17 @@ const EDIT = editType(name);
|
|||
const CLEAR_SEARCH = `${name}/CLEAR_SEARCH`;
|
||||
const APPLY = `${name}/APPLY`;
|
||||
const UPDATE_CURRENT_PAGE = `${name}/UPDATE_CURRENT_PAGE`;
|
||||
const TOGGLE_SORT_ORDER = `${name}/TOGGLE_SORT_ORDER`;
|
||||
const UPDATE_SORT = `${name}/UPDATE_SORT`;
|
||||
|
||||
const initialState = Map({
|
||||
list: List(),
|
||||
instance: new Filter({ filters: [] }),
|
||||
filterSearchList: {},
|
||||
currentPage: 1,
|
||||
sortOrder: 'asc',
|
||||
sort: {
|
||||
order: 'asc',
|
||||
field: ''
|
||||
}
|
||||
});
|
||||
|
||||
function reducer(state = initialState, action = {}) {
|
||||
|
|
@ -31,8 +34,8 @@ function reducer(state = initialState, action = {}) {
|
|||
return state.mergeIn(['instance'], action.instance);
|
||||
case UPDATE_CURRENT_PAGE:
|
||||
return state.set('currentPage', action.page);
|
||||
case TOGGLE_SORT_ORDER:
|
||||
return state.set('sortOrder', action.order);
|
||||
case UPDATE_SORT:
|
||||
return state.mergeIn(['sort'], action.sort);
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
|
@ -103,9 +106,9 @@ export function updateCurrentPage(page) {
|
|||
};
|
||||
}
|
||||
|
||||
export function toggleSortOrder (order) {
|
||||
export function updateSort(sort) {
|
||||
return {
|
||||
type: TOGGLE_SORT_ORDER,
|
||||
order,
|
||||
type: UPDATE_SORT,
|
||||
sort,
|
||||
};
|
||||
}
|
||||
|
|
@ -34,7 +34,7 @@ export default Record({
|
|||
rangeValue,
|
||||
startDate,
|
||||
endDate,
|
||||
groupByUser: true,
|
||||
groupByUser: false,
|
||||
|
||||
sort: 'startTs',
|
||||
order: 'desc',
|
||||
|
|
|
|||
|
|
@ -1,9 +1,23 @@
|
|||
# Ability to add sticky sessions using any parameters
|
||||
FROM openresty/openresty:buster as builder
|
||||
workdir /work
|
||||
ADD https://github.com/openresty/lua-resty-balancer/archive/refs/heads/master.tar.gz .
|
||||
RUN apt update && \
|
||||
apt install gcc make -y && \
|
||||
tar -xf master.tar.gz && \
|
||||
cd lua-resty-balancer-master && \
|
||||
make
|
||||
|
||||
|
||||
FROM openresty/openresty:buster
|
||||
|
||||
# Adding prometheus monitoring support
|
||||
ADD https://raw.githubusercontent.com/knyar/nginx-lua-prometheus/master/prometheus.lua /usr/local/openresty/lualib/
|
||||
ADD https://raw.githubusercontent.com/knyar/nginx-lua-prometheus/master/prometheus_keys.lua /usr/local/openresty/lualib/
|
||||
ADD https://raw.githubusercontent.com/knyar/nginx-lua-prometheus/master/prometheus_resty_counter.lua /usr/local/openresty/lualib/
|
||||
COPY --from=builder /work/lua-resty-balancer-master/*.so /usr/local/openresty/lualib/lua-resty-chash/
|
||||
COPY --from=builder /work/lua-resty-balancer-master/lib /usr/local/openresty/lualib/lua-resty-chash/lib/
|
||||
|
||||
RUN chmod 0644 /usr/local/openresty/lualib/*.lua
|
||||
|
||||
# Enabling monitoring on port 9145
|
||||
|
|
|
|||
|
|
@ -5,4 +5,36 @@ $$
|
|||
SELECT 'v1.5.1'
|
||||
$$ LANGUAGE sql IMMUTABLE;
|
||||
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'AC';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'AN';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'BU';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'CP';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'CS';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'CT';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'DD';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'DG';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'DY';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'EA';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'FQ';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'FX';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'HV';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'IC';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'JT';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'MI';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'NH';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'NQ';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'NT';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'PC';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'PU';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'PZ';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'RH';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'SU';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'TA';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'TP';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'VD';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'WK';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'YD';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'YU';
|
||||
ALTER TYPE country ADD VALUE IF NOT EXISTS 'ZR';
|
||||
|
||||
COMMIT;
|
||||
|
|
@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS events;
|
|||
CREATE OR REPLACE FUNCTION openreplay_version()
|
||||
RETURNS text AS
|
||||
$$
|
||||
SELECT 'v1.5.0'
|
||||
SELECT 'v1.5.1'
|
||||
$$ LANGUAGE sql IMMUTABLE;
|
||||
|
||||
-- --- accounts.sql ---
|
||||
|
|
@ -464,7 +464,7 @@ $$
|
|||
|
||||
-- --- sessions.sql ---
|
||||
CREATE TYPE device_type AS ENUM ('desktop', 'tablet', 'mobile', 'other');
|
||||
CREATE TYPE country AS ENUM ('UN', 'RW', 'SO', 'YE', 'IQ', 'SA', 'IR', 'CY', 'TZ', 'SY', 'AM', 'KE', 'CD', 'DJ', 'UG', 'CF', 'SC', 'JO', 'LB', 'KW', 'OM', 'QA', 'BH', 'AE', 'IL', 'TR', 'ET', 'ER', 'EG', 'SD', 'GR', 'BI', 'EE', 'LV', 'AZ', 'LT', 'SJ', 'GE', 'MD', 'BY', 'FI', 'AX', 'UA', 'MK', 'HU', 'BG', 'AL', 'PL', 'RO', 'XK', 'ZW', 'ZM', 'KM', 'MW', 'LS', 'BW', 'MU', 'SZ', 'RE', 'ZA', 'YT', 'MZ', 'MG', 'AF', 'PK', 'BD', 'TM', 'TJ', 'LK', 'BT', 'IN', 'MV', 'IO', 'NP', 'MM', 'UZ', 'KZ', 'KG', 'TF', 'HM', 'CC', 'PW', 'VN', 'TH', 'ID', 'LA', 'TW', 'PH', 'MY', 'CN', 'HK', 'BN', 'MO', 'KH', 'KR', 'JP', 'KP', 'SG', 'CK', 'TL', 'RU', 'MN', 'AU', 'CX', 'MH', 'FM', 'PG', 'SB', 'TV', 'NR', 'VU', 'NC', 'NF', 'NZ', 'FJ', 'LY', 'CM', 'SN', 'CG', 'PT', 'LR', 'CI', 'GH', 'GQ', 'NG', 'BF', 'TG', 'GW', 'MR', 'BJ', 'GA', 'SL', 'ST', 'GI', 'GM', 'GN', 'TD', 'NE', 'ML', 'EH', 'TN', 'ES', 'MA', 'MT', 'DZ', 'FO', 'DK', 'IS', 'GB', 'CH', 'SE', 'NL', 'AT', 'BE', 'DE', 'LU', 'IE', 'MC', 'FR', 'AD', 'LI', 'JE', 'IM', 'GG', 'SK', 'CZ', 'NO', 'VA', 'SM', 'IT', 'SI', 'ME', 'HR', 'BA', 'AO', 'NA', 'SH', 'BV', 'BB', 'CV', 'GY', 'GF', 'SR', 'PM', 'GL', 'PY', 'UY', 'BR', 'FK', 'GS', 'JM', 'DO', 'CU', 'MQ', 'BS', 'BM', 'AI', 'TT', 'KN', 'DM', 'AG', 'LC', 'TC', 'AW', 'VG', 'VC', 'MS', 'MF', 'BL', 'GP', 'GD', 'KY', 'BZ', 'SV', 'GT', 'HN', 'NI', 'CR', 'VE', 'EC', 'CO', 'PA', 'HT', 'AR', 'CL', 'BO', 'PE', 'MX', 'PF', 'PN', 'KI', 'TK', 'TO', 'WF', 'WS', 'NU', 'MP', 'GU', 'PR', 'VI', 'UM', 'AS', 'CA', 'US', 'PS', 'RS', 'AQ', 'SX', 'CW', 'BQ', 'SS');
|
||||
CREATE TYPE country AS ENUM ('UN', 'RW', 'SO', 'YE', 'IQ', 'SA', 'IR', 'CY', 'TZ', 'SY', 'AM', 'KE', 'CD', 'DJ', 'UG', 'CF', 'SC', 'JO', 'LB', 'KW', 'OM', 'QA', 'BH', 'AE', 'IL', 'TR', 'ET', 'ER', 'EG', 'SD', 'GR', 'BI', 'EE', 'LV', 'AZ', 'LT', 'SJ', 'GE', 'MD', 'BY', 'FI', 'AX', 'UA', 'MK', 'HU', 'BG', 'AL', 'PL', 'RO', 'XK', 'ZW', 'ZM', 'KM', 'MW', 'LS', 'BW', 'MU', 'SZ', 'RE', 'ZA', 'YT', 'MZ', 'MG', 'AF', 'PK', 'BD', 'TM', 'TJ', 'LK', 'BT', 'IN', 'MV', 'IO', 'NP', 'MM', 'UZ', 'KZ', 'KG', 'TF', 'HM', 'CC', 'PW', 'VN', 'TH', 'ID', 'LA', 'TW', 'PH', 'MY', 'CN', 'HK', 'BN', 'MO', 'KH', 'KR', 'JP', 'KP', 'SG', 'CK', 'TL', 'RU', 'MN', 'AU', 'CX', 'MH', 'FM', 'PG', 'SB', 'TV', 'NR', 'VU', 'NC', 'NF', 'NZ', 'FJ', 'LY', 'CM', 'SN', 'CG', 'PT', 'LR', 'CI', 'GH', 'GQ', 'NG', 'BF', 'TG', 'GW', 'MR', 'BJ', 'GA', 'SL', 'ST', 'GI', 'GM', 'GN', 'TD', 'NE', 'ML', 'EH', 'TN', 'ES', 'MA', 'MT', 'DZ', 'FO', 'DK', 'IS', 'GB', 'CH', 'SE', 'NL', 'AT', 'BE', 'DE', 'LU', 'IE', 'MC', 'FR', 'AD', 'LI', 'JE', 'IM', 'GG', 'SK', 'CZ', 'NO', 'VA', 'SM', 'IT', 'SI', 'ME', 'HR', 'BA', 'AO', 'NA', 'SH', 'BV', 'BB', 'CV', 'GY', 'GF', 'SR', 'PM', 'GL', 'PY', 'UY', 'BR', 'FK', 'GS', 'JM', 'DO', 'CU', 'MQ', 'BS', 'BM', 'AI', 'TT', 'KN', 'DM', 'AG', 'LC', 'TC', 'AW', 'VG', 'VC', 'MS', 'MF', 'BL', 'GP', 'GD', 'KY', 'BZ', 'SV', 'GT', 'HN', 'NI', 'CR', 'VE', 'EC', 'CO', 'PA', 'HT', 'AR', 'CL', 'BO', 'PE', 'MX', 'PF', 'PN', 'KI', 'TK', 'TO', 'WF', 'WS', 'NU', 'MP', 'GU', 'PR', 'VI', 'UM', 'AS', 'CA', 'US', 'PS', 'RS', 'AQ', 'SX', 'CW', 'BQ', 'SS','AC','AN','BU','CP','CS','CT','DD','DG','DY','EA','FQ','FX','HV','IC','JT','MI','NH','NQ','NT','PC','PU','PZ','RH','SU','TA','TP','VD','WK','YD','YU','ZR');
|
||||
CREATE TYPE platform AS ENUM ('web','ios','android');
|
||||
|
||||
CREATE TABLE sessions
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue