tname.c 8.9 KB
Newer Older
S
common  
Shengliang Guan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
H
hjxilinx 已提交
15

S
common  
Shengliang Guan 已提交
16
#define _DEFAULT_SOURCE
S
slguan 已提交
17
#include "tname.h"
18 19
#include "tcommon.h"
#include "tstrbuild.h"
H
hjxilinx 已提交
20

21
#define VALID_NAME_TYPE(x)  ((x) == TSDB_DB_NAME_T || (x) == TSDB_TABLE_NAME_T)
H
hjxilinx 已提交
22

H
Haojun Liao 已提交
23 24
bool tscValidateTableNameLength(size_t len) {
  return len < TSDB_TABLE_NAME_LEN;
H
Haojun Liao 已提交
25 26
}

S
monitor  
Shengliang Guan 已提交
27
#if 0
28
// TODO refactor
29
SColumnFilterInfo* tFilterInfoDup(const SColumnFilterInfo* src, int32_t numOfFilters) {
W
wpan 已提交
30
  if (numOfFilters == 0 || src == NULL) {
H
Haojun Liao 已提交
31 32 33 34
    assert(src == NULL);
    return NULL;
  }

wafwerar's avatar
wafwerar 已提交
35
  SColumnFilterInfo* pFilter = taosMemoryCalloc(1, numOfFilters * sizeof(SColumnFilterInfo));
H
Haojun Liao 已提交
36 37 38 39 40

  memcpy(pFilter, src, sizeof(SColumnFilterInfo) * numOfFilters);
  for (int32_t j = 0; j < numOfFilters; ++j) {
    if (pFilter[j].filterstr) {
      size_t len = (size_t) pFilter[j].len + 1 * TSDB_NCHAR_SIZE;
wafwerar's avatar
wafwerar 已提交
41
      pFilter[j].pz = (int64_t) taosMemoryCalloc(1, len);
H
Haojun Liao 已提交
42

H
Haojun Liao 已提交
43
      memcpy((char*)pFilter[j].pz, (char*)src[j].pz, (size_t) pFilter[j].len);
H
Haojun Liao 已提交
44 45 46 47
    }
  }

  assert(src->filterstr == 0 || src->filterstr == 1);
D
dapan1121 已提交
48
  assert(!(src->lowerRelOptr == 0 && src->upperRelOptr == 0));
H
Haojun Liao 已提交
49 50 51

  return pFilter;
}
S
monitor  
Shengliang Guan 已提交
52
#endif
B
Bomin Zhang 已提交
53
#if 0
H
Haojun Liao 已提交
54 55 56 57
int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t slidingTime, int64_t intervalTime, char timeUnit, int16_t precision) {
  if (slidingTime == 0) {
    return startTime;
  }
58 59 60 61 62 63 64 65
  int64_t start = startTime;
  if (timeUnit == 'n' || timeUnit == 'y') {
    start /= 1000;
    if (precision == TSDB_TIME_PRECISION_MICRO) {
      start /= 1000;
    }
    struct tm tm;
    time_t t = (time_t)start;
wafwerar's avatar
wafwerar 已提交
66
    taosLocalTime(&t, &tm);
67 68 69 70 71 72 73
    tm.tm_sec = 0;
    tm.tm_min = 0;
    tm.tm_hour = 0;
    tm.tm_mday = 1;

    if (timeUnit == 'y') {
      tm.tm_mon = 0;
S
Shengliang Guan 已提交
74
      tm.tm_year = (int)(tm.tm_year / slidingTime * slidingTime);
75 76
    } else {
      int mon = tm.tm_year * 12 + tm.tm_mon;
S
Shengliang Guan 已提交
77
      mon = (int)(mon / slidingTime * slidingTime);
78 79 80
      tm.tm_year = mon / 12;
      tm.tm_mon = mon % 12;
    }
H
Haojun Liao 已提交
81

82 83 84 85 86
    start = mktime(&tm) * 1000L;
    if (precision == TSDB_TIME_PRECISION_MICRO) {
      start *= 1000L;
    }
  } else {
H
Haojun Liao 已提交
87 88 89 90
    int64_t delta = startTime - intervalTime;
    int32_t factor = delta > 0? 1:-1;

    start = (delta / slidingTime + factor) * slidingTime;
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107

    if (timeUnit == 'd' || timeUnit == 'w') {
      /*
      * here we revised the start time of day according to the local time zone,
      * but in case of DST, the start time of one day need to be dynamically decided.
      */
      // todo refactor to extract function that is available for Linux/Windows/Mac platform
  #if defined(WINDOWS) && _MSC_VER >= 1900
      // see https://docs.microsoft.com/en-us/cpp/c-runtime-library/daylight-dstbias-timezone-and-tzname?view=vs-2019
      int64_t timezone = _timezone;
      int32_t daylight = _daylight;
      char**  tzname = _tzname;
  #endif

      int64_t t = (precision == TSDB_TIME_PRECISION_MILLI) ? MILLISECOND_PER_SECOND : MILLISECOND_PER_SECOND * 1000L;
      start += timezone * t;
    }
H
Haojun Liao 已提交
108

109 110 111 112
    int64_t end = start + intervalTime - 1;
    if (end < startTime) {
      start += slidingTime;
    }
H
Haojun Liao 已提交
113 114 115 116
  }

  return start;
}
H
Haojun Liao 已提交
117

B
Bomin Zhang 已提交
118 119
#endif

120 121 122 123
int32_t tNameExtractFullName(const SName* name, char* dst) {
  assert(name != NULL && dst != NULL);

  // invalid full name format, abort
H
Haojun Liao 已提交
124
  if (!tNameIsValid(name)) {
125 126 127
    return -1;
  }

128
  int32_t len = snprintf(dst, TSDB_DB_FNAME_LEN, "%d.%s", name->acctId, name->dbname);
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143

  size_t tnameLen = strlen(name->tname);
  if (tnameLen > 0) {
    assert(name->type == TSDB_TABLE_NAME_T);
    dst[len] = TS_PATH_DELIMITER[0];

    memcpy(dst + len + 1, name->tname, tnameLen);
    dst[len + tnameLen + 1] = 0;
  }

  return 0;
}

int32_t tNameLen(const SName* name) {
  assert(name != NULL);
144 145 146

  char tmp[12] = {0};
  int32_t len = sprintf(tmp, "%d", name->acctId);
147 148 149 150 151
  int32_t len1 = (int32_t) strlen(name->dbname);
  int32_t len2 = (int32_t) strlen(name->tname);

  if (name->type == TSDB_DB_NAME_T) {
    assert(len2 == 0);
152
    return len + len1 + TSDB_NAME_DELIMITER_LEN;
153 154
  } else {
    assert(len2 > 0);
155
    return len + len1 + len2 + TSDB_NAME_DELIMITER_LEN * 2;
156 157 158
  }
}

H
Haojun Liao 已提交
159
bool tNameIsValid(const SName* name) {
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
  assert(name != NULL);

  if (!VALID_NAME_TYPE(name->type)) {
    return false;
  }

  if (name->type == TSDB_DB_NAME_T) {
    return strlen(name->dbname) > 0;
  } else {
    return strlen(name->dbname) > 0 && strlen(name->tname) > 0;
  }
}

SName* tNameDup(const SName* name) {
  assert(name != NULL);

wafwerar's avatar
wafwerar 已提交
176
  SName* p = taosMemoryMalloc(sizeof(SName));
177 178 179 180 181 182 183 184 185 186 187 188
  memcpy(p, name, sizeof(SName));
  return p;
}

int32_t tNameGetDbName(const SName* name, char* dst) {
  assert(name != NULL && dst != NULL);
  strncpy(dst, name->dbname, tListLen(name->dbname));
  return 0;
}

int32_t tNameGetFullDbName(const SName* name, char* dst) {
  assert(name != NULL && dst != NULL);
189
  snprintf(dst, TSDB_DB_FNAME_LEN, "%d.%s", name->acctId, name->dbname);
190 191 192 193 194
  return 0;
}

bool tNameIsEmpty(const SName* name) {
  assert(name != NULL);
H
Haojun Liao 已提交
195
  return name->type == 0 || name->acctId == 0;
196 197 198 199 200 201 202 203 204 205 206
}

const char* tNameGetTableName(const SName* name) {
  assert(name != NULL && name->type == TSDB_TABLE_NAME_T);
  return &name->tname[0];
}

void tNameAssign(SName* dst, const SName* src) {
  memcpy(dst, src, sizeof(SName));
}

H
Haojun Liao 已提交
207 208
int32_t tNameSetDbName(SName* dst, int32_t acct, const char* dbName, size_t nameLen) {
  assert(dst != NULL && dbName != NULL && nameLen > 0);
209 210

  // too long account id or too long db name
H
Haojun Liao 已提交
211
  if (nameLen >= tListLen(dst->dbname)) {
212 213 214
    return -1;
  }

H
Haojun Liao 已提交
215 216 217 218 219
  dst->type = TSDB_DB_NAME_T;
  dst->acctId = acct;
  tstrncpy(dst->dbname, dbName, nameLen + 1);
  return 0;
}
D
dapan1121 已提交
220

H
Haojun Liao 已提交
221
int32_t tNameSetAcctId(SName* dst, int32_t acctId) {
222
  assert(dst != NULL);
H
Haojun Liao 已提交
223
  dst->acctId = acctId;
224 225 226
  return 0;
}

D
dapan1121 已提交
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
bool tNameDBNameEqual(SName* left, SName* right) {
  if (NULL == left) {
    if (NULL == right) {
      return true;
    }

    return false;
  }

  if (NULL == right) {
    return false;
  }

  if (left->acctId != right->acctId) {
    return false;
  }

  return (0 == strcmp(left->dbname, right->dbname));
}


248 249 250 251 252 253 254 255 256 257
int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
  assert(dst != NULL && str != NULL && strlen(str) > 0);

  char* p = NULL;
  if ((type & T_NAME_ACCT) == T_NAME_ACCT) {
    p = strstr(str, TS_PATH_DELIMITER);
    if (p == NULL) {
      return -1;
    }

H
Haojun Liao 已提交
258
    dst->acctId = strtoll(str, NULL, 10);
259 260 261 262 263 264 265 266 267
  }

  if ((type & T_NAME_DB) == T_NAME_DB) {
    dst->type = TSDB_DB_NAME_T;
    char* start = (char*)((p == NULL)? str:(p+1));

    int32_t len = 0;
    p = strstr(start, TS_PATH_DELIMITER);
    if (p == NULL) {
H
Haojun Liao 已提交
268
      len = (int32_t) strlen(start);
269
    } else {
H
Haojun Liao 已提交
270
      len = (int32_t) (p - start);
271 272 273
    }

    // too long account id or too long db name
D
dapan1121 已提交
274
    if ((len >= tListLen(dst->dbname)) || (len <= 0)) {
275 276 277 278 279 280 281 282 283 284 285 286
      return -1;
    }

    memcpy (dst->dbname, start, len);
    dst->dbname[len] = 0;
  }

  if ((type & T_NAME_TABLE) == T_NAME_TABLE) {
    dst->type = TSDB_TABLE_NAME_T;
    char* start = (char*) ((p == NULL)? str: (p+1));

    // too long account id or too long db name
287
    int32_t len = (int32_t) strlen(start);
D
dapan1121 已提交
288
    if ((len >= tListLen(dst->tname)) || (len <= 0)) {
289 290 291 292 293 294 295 296 297
      return -1;
    }

    memcpy (dst->tname, start, len);
    dst->tname[len] = 0;
  }

  return 0;
}
H
Haojun Liao 已提交
298

299 300 301 302 303 304 305 306 307 308 309 310
static int compareKv(const void* p1, const void* p2) {
  SSmlKv* kv1 = *(SSmlKv**)p1;
  SSmlKv* kv2 = *(SSmlKv**)p2;
  int32_t kvLen1 = kv1->keyLen;
  int32_t kvLen2 = kv2->keyLen;
  int32_t res = strncasecmp(kv1->key, kv2->key, TMIN(kvLen1, kvLen2));
  if (res != 0) {
    return res;
  } else {
    return kvLen1-kvLen2;
  }
}
H
Haojun Liao 已提交
311

312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338
/*
 * use stable name and tags to grearate child table name
 */
void buildChildTableName(RandTableName *rName) {
  int32_t size = taosArrayGetSize(rName->tags);
  ASSERT(size > 0);
  taosArraySort(rName->tags, compareKv);

  SStringBuilder sb = {0};
  taosStringBuilderAppendStringLen(&sb, rName->sTableName, rName->sTableNameLen);
  for (int j = 0; j < size; ++j) {
    SSmlKv *tagKv = taosArrayGetP(rName->tags, j);
    taosStringBuilderAppendStringLen(&sb, tagKv->key, tagKv->keyLen);
    taosStringBuilderAppendStringLen(&sb, tagKv->value, tagKv->valueLen);
  }
  size_t len = 0;
  char* keyJoined = taosStringBuilderGetResult(&sb, &len);
  T_MD5_CTX context;
  tMD5Init(&context);
  tMD5Update(&context, (uint8_t *)keyJoined, (uint32_t)len);
  tMD5Final(&context);
  uint64_t digest1 = *(uint64_t*)(context.digest);
  uint64_t digest2 = *(uint64_t*)(context.digest + 8);
  snprintf(rName->childTableName, TSDB_TABLE_NAME_LEN, "t_%016"PRIx64"%016"PRIx64, digest1, digest2);
  taosStringBuilderDestroy(&sb);
  rName->uid = digest1;
}